๐Ÿ— KeyzHub
19Keys ยท community archive
3419 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
# 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.