๐Ÿ— KeyzHub
19Keys ยท community archive
7283 bytes raw
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
# AGENTS.md โ€” email-marketing harness (email-strategist)

This is the working harness for the `email-strategist` master. `MANUAL.md` in
this directory holds the deep knowledge (the science, the schools, the
architecture, the failure modes). This file is the operating discipline โ€”
read the manual for *what to know*, read this for *how to work*.

## Startup Workflow (every session, in order)

1. Read `progress.md` โ€” the active feature, current status, and last verified state.
2. Read `feature_list.json` โ€” the single source of truth for what's done and what's next.
3. Read `session-handoff.md` if present โ€” anything not obvious from the two files above.
4. Run `./init.sh` โ€” **the gate.** Never trust a prior "done" claim; re-run it every session. It re-proves the linter catches bullshit (passes `samples/good/*`, fails `samples/bad/*`) before you touch anything.
5. Pick up the **one** feature whose `status` is `in_progress`, or the first `todo` whose `dependencies` are all `done`.

## Working rules

- **One feature at a time.** Do not start a second deliverable type until the current one is `done` with evidence.
- **Stay in scope.** You are building this master's deliverable types (ยง8.1 of `MANUAL.md`), not the CRM schema, not the copy voice engine, not the funnel offer architecture โ€” those belong to `crm-automation`, `copywriting`, and `funnel-psychology`. Consume their outputs; don't rebuild them.
- **Build deliverables inside `workspace/`.** Every artifact you produce for a feature goes in `workspace/<feature-id>.md` (or a dated variant). Never touch `MANUAL.md` โ€” it's the fixed reference.
- **Reference `MANUAL.md`, do not inline it.** When building a deliverable, cite the section (`ยง8.1`, `ยง6.1`, etc.) and the playbook file โ€” don't paste manual content into the artifact.
- **Reference the playbook, don't freelance the method.** Every deliverable type maps to a named playbook in `playbooks/` (see the table below). Follow its step-by-step build; it exists so you don't reinvent โ€” or worse, cargo-cult โ€” a school you don't fully understand.

## Definition of Done (per feature)

A feature is `done` only when ALL are true:

1. Its `verify` command in `feature_list.json` exits 0 against a real `workspace/` artifact (or the sample, for the harness's own bootstrap feature).
2. `./init.sh` still passes end-to-end โ€” the anti-theater gate holds (good samples pass, bad samples fail).
3. `feature_list.json` is updated: `status: "done"` + a one-line `evidence` string naming the artifact path and the command that proved it.
4. `progress.md` "Last verified" line is updated.

**No evidence = NOT done.** If you cannot produce a passing `verify` run against a real artifact, leave the feature `in_progress` (or `todo`) and write the blocker in `progress.md`. Do not mark a feature done because the copy "looks right" โ€” the linter is the judge, not your read of the prose.

## End of Session routine

1. Update `feature_list.json` status/evidence for anything you touched.
2. Update `progress.md`: active feature, last verified command + result, next step.
3. Write/refresh `session-handoff.md` with anything the next session needs that isn't obvious from the state files.
4. Leave the tree in a runnable state โ€” `./init.sh` should pass when the next session starts.

---

## Deliverable types โ†’ playbooks (the multiple ways to run each one)

| Feature (deliverable type) | Playbook(s) | Primary source |
|---|---|---|
| `welcome-sequence` | `playbooks/soap-opera-sequence.md`, `playbooks/dinner-party-onboarding.md` | Chaperon (SOS), Geisler (onboarding frame) |
| `launch-sequence` | `playbooks/plf-launch-sequence.md` | Jeff Walker's Product Launch Formula |
| `ecom-flow-set` | `playbooks/klaviyo-flow-stack.md` | Klaviyo flow-stack canon |
| `daily-email` | `playbooks/daily-email.md` | Ben Settle / Matt Furey infotainment |
| `reactivation-campaign` | `playbooks/nine-word-reactivation.md` | Dean Jackson |
| `deliverability-audit` | `playbooks/deliverability-warmup.md` | SPF/DKIM/DMARC + Gmail/Yahoo 2024 rules |
| (meta, consulted by all) | `playbooks/rfm-segmented-sending.md` | Marshall's 80/20 + Rogers' adopter waves |
| (meta, consulted by all) | `playbooks/newsletter-growth-engine.md` | Morning Brew model (scaling the list itself) |

Every deliverable also answers to the decision frameworks in `MANUAL.md` ยง5
(segment gate โ†’ awareness gate โ†’ channel/trigger gate โ†’ price-point gate โ†’
**permission/law gate, which has veto power over all the others**). Run the
permission/law gate first for any real send: if the postal address isn't
set, DMARC isn't published, or the domain isn't warmed, no deliverable in
this harness is cleared to actually fire, no matter how well it's built.

## The verify gate: `verify_email_marketing.py`

`verify_email_marketing.py <path/to/deliverable.md>` is the real linter. It:
- reads a `type:` value from the file's frontmatter to pick the right rubric,
- checks the concrete, enforceable rules from `MANUAL.md` ยง8.1 (counts, word
  limits, goal tags, single-CTA-target, loop closure, compliance merge tags,
  urgency tagging, missing evidence lines, etc.),
- prints every named check that failed, and exits 0 (pass) or 1 (fail).

`./init.sh` proves the linter itself is honest: it runs the linter against
`samples/good/*` (must PASS) and `samples/bad/*` (must FAIL). If either
direction breaks, `init.sh` exits nonzero โ€” treat that as a stop-everything
signal and fix the linter before building anything on top of it.

## House-voice and compliance are non-negotiable

- The `daily-email` rubric enforces the brand-bible banned-vocabulary list
  (mirrored in `verify_email_marketing.py`'s `BANNED_VOCAB`) as a hard fail โ€”
  see `~/.claude/skills/brand-bible/skill.md` for the full list and the "why."
- Every deliverable type carries CAN-SPAM compliance tags (`{{unsubscribe_link}}`,
  `{{postal_address}}`) on every single email. This is not a style choice โ€”
  it is the law (`MANUAL.md` ยง2.8) and it is enforced mechanically.
- Never report an open rate as a success metric in any artifact โ€” Apple MPP
  inflates it into near-uselessness (`MANUAL.md` ยง2.6). Lead with clicks, RPR,
  reply rate, and complaint rate.
- Never leave urgency/scarcity language untagged. Every claim of the form
  "cart closes," "only 3 left," "price rises" must carry an explicit
  `Urgency: real:<mechanism>` tag naming the actual enforcing mechanism โ€”
  fake scarcity is the #3 tell in `MANUAL.md` ยง8.2 and the linter hard-fails
  untagged urgency language in `launch-sequence` deliverables.

## Bridge to the live 19Keys stack (context, not a blocker on this harness)

The real-world critical path (`MANUAL.md` ยง9.6) is: file the CAN-SPAM
postal-address + DMARC P0s with `owner-action-chaser` โ†’ run
`deliverability-warmup` โ†’ segment via `rfm-segmented-sending` โ†’ warm the
hottest buyers โ†’ stand up `daily-email` โ†’ launch ZIION Passport to the whale
wave โ†’ instrument on clicks/RPR. This harness's `deliverability-audit`
feature tracks that real blocker state; do not mark it `done` with an
optimistic checklist โ€” mark each item `[verified|failed|todo]` honestly, with
real evidence, exactly as `playbooks/deliverability-warmup.md`'s worked
example does.