# Session handoff โ master-copywriter
Update this at the end of every session. Keep it to what the next session can't infer from
`progress.md` + `feature_list.json`.
## State at last handoff
- Harness scaffolded: `AGENTS.md`, `feature_list.json`, `init.sh`, `verify_copywriting.py`,
`samples/good/sales-page.md`, `samples/bad/sales-page.md`, `playbooks/`, `progress.md`.
- `./init.sh` passes: the anti-theater gate is proven โ the linter accepts the good sample and
rejects the bad one on named checks.
- No deliverable has been drafted in `workspace/` yet. All five features are `todo`.
- `verify_copywriting.py` fully implements rubrics for all five deliverable types (`sales-page`,
`vsl-script`, `ad-set`, `email-subject-bank`, `landing-hero-variants`), but only `sales-page` has
fixture samples under `samples/good/` and `samples/bad/`. The other four types are gate-ready but
un-fixtured โ if you build one, consider adding a matching sample pair later (not required by
`init.sh`, which only gates on the sales-page pair).
## What the next session should do first
1. Read `progress.md`, then `feature_list.json`.
2. Run `./init.sh` โ expect the anti-theater gate to pass; do not skip this even though it "should"
still pass โ that's the whole point of re-running it.
3. Start the `sales-page` feature: get a real awareness/sophistication brief (or request one), pick
a playbook, draft `workspace/sales-page.md`, run the linter, fix named failures, mark done.
## Gotchas / notes
- **The linter's section parser is header-driven**, not free-text: it looks for `## Headline`,
`## Lede`, `## Mechanism`, `## Proof`, `## Offer`, `## Objections`, `## CTA`, `## PS` (sales-page)
in that exact order. Tags like `[LEAD: Story]` and `[AWARENESS: Problem-Aware]` must be **inside**
the `## Headline` section body, not above it in a document title โ see
`samples/good/sales-page.md` for the exact working shape.
- **Proof-block tagging is strict**: any bullet line in the `## Proof` section that contains a digit
but no `[testimonial|data|demo|authority|story]` tag fails. Attribute sources with parentheticals
`(source)`, not em dashes โ em-dash density is itself a separate gate (โค1 per 200 words) and a
tag-then-em-dash-attribution habit blows through it fast (this bit the first draft of the good
sample during harness-build).
- **Paragraph-length check treats bullet/numbered lists as a run of one-line "paragraphs"**, not one
giant blob โ so a 4-item list doesn't falsely trip the 90-word cap. Prose blocks (Lede, Mechanism
body) are still checked as whole paragraphs.
- **macOS ships bash 3.2** (no associative arrays) โ `init.sh`'s informational workspace-scan uses
plain `"key:value"` string pairs, not `declare -A`. Keep it that way if you touch `init.sh`.
- **Forbidden-vocabulary and hype lists in `verify_copywriting.py` are a local stand-in** for the
live `brand-bible` skill's list. When drafting real 19Keys-brand copy, load `brand-bible` directly
in addition to running the linter โ the linter's list is not guaranteed to be the full canonical
one.
## Open questions for the user
- None currently. First real brief (awareness stage, sophistication stage, offer terms) needed from
`funnel-psychology` before drafting the first real `sales-page` deliverable โ flag if that hand-off
channel doesn't exist yet as a concrete artifact.