# 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.
