@oneie/claude 0.6.0 → 0.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (111) hide show
  1. package/agents/w1-recon.md +9 -4
  2. package/agents/w2-decide.md +51 -28
  3. package/agents/w3-edit.md +70 -78
  4. package/agents/w4-verify.md +164 -69
  5. package/commands/browser.md +98 -35
  6. package/commands/cc-connect.md +6 -0
  7. package/commands/chat.md +13 -1
  8. package/commands/close.md +45 -19
  9. package/commands/create.md +20 -10
  10. package/commands/db-sync.md +5 -1
  11. package/commands/deploy.md +174 -87
  12. package/commands/do-autonomous.md +31 -20
  13. package/commands/do-improve.md +4 -4
  14. package/commands/do-show.md +4 -3
  15. package/commands/do.md +53 -13
  16. package/commands/go.md +75 -0
  17. package/commands/improve.md +4 -2
  18. package/commands/kill.md +6 -8
  19. package/commands/notify.md +15 -2
  20. package/commands/oo-push.md +24 -9
  21. package/commands/rag.md +6 -0
  22. package/commands/release.md +46 -25
  23. package/commands/restart.md +5 -4
  24. package/commands/see.md +45 -35
  25. package/commands/skill-create.md +38 -5
  26. package/commands/sync.md +21 -11
  27. package/hooks/scripts/auto-continue.sh +70 -0
  28. package/hooks/scripts/branch-pin.sh +85 -0
  29. package/hooks/scripts/git-add-guard.sh +16 -5
  30. package/hooks/scripts/post-edit-check.sh +16 -0
  31. package/hooks/scripts/session-start.sh +13 -8
  32. package/hooks/scripts/sync-priority-todo.sh +5 -0
  33. package/package.json +1 -1
  34. package/rules/api.md +9 -0
  35. package/rules/design.md +13 -3
  36. package/rules/documentation.md +30 -71
  37. package/rules/engine.md +8 -1
  38. package/rules/ui.md +5 -1
  39. package/scripts/__pycache__/do-rank.cpython-313.pyc +0 -0
  40. package/scripts/browser-check.mjs +44 -103
  41. package/scripts/cc-events-proof.sh +13 -12
  42. package/scripts/chrome.mjs +381 -0
  43. package/scripts/do-analyze.sh +109 -4
  44. package/scripts/do-auto.sh +350 -43
  45. package/scripts/do-consumer-sweep.sh +72 -0
  46. package/scripts/do-derives-check.sh +88 -0
  47. package/scripts/do-fleet.sh +50 -1
  48. package/scripts/do-killswitch-audit.py +33 -14
  49. package/scripts/do-promise-lint.sh +150 -4
  50. package/scripts/do-promise-settle.sh +131 -9
  51. package/scripts/do-prove.sh +197 -17
  52. package/scripts/do-rank.py +606 -20
  53. package/scripts/do-rubric.py +21 -2
  54. package/scripts/do-signal.sh +157 -17
  55. package/scripts/do-smoke.sh +9 -0
  56. package/scripts/do-substrate-check.sh +49 -0
  57. package/scripts/do-tasks-wire-check.sh +81 -0
  58. package/scripts/do-tier.sh +90 -5
  59. package/scripts/do-ui-gate.sh +332 -0
  60. package/scripts/do-untracked-gate.sh +231 -0
  61. package/scripts/do-walk.sh +344 -0
  62. package/scripts/factory-check.sh +747 -0
  63. package/scripts/factory-repo.sh +1361 -0
  64. package/scripts/factory-tasks-check.sh +85 -0
  65. package/scripts/outcome-pull.ts +279 -0
  66. package/scripts/promise-manifest.mjs +167 -0
  67. package/scripts/reconcile-allow.txt +5 -0
  68. package/scripts/rubric-weights.json +64 -0
  69. package/scripts/spine-canary.sh +20 -0
  70. package/scripts/typedb-cluster-status.sh +128 -0
  71. package/scripts/typedb-env.sh +182 -0
  72. package/scripts/typedb-flap-recorder.sh +85 -0
  73. package/scripts/typedb-probes/containment-probe.py +88 -0
  74. package/scripts/typedb-probes/panic-probe-version.py +92 -0
  75. package/scripts/typedb-probes/panic-probe.py +77 -0
  76. package/scripts/typedb-scratch.sh +73 -0
  77. package/scripts/urls-lint.sh +58 -0
  78. package/scripts/w4-rubric.ts +96 -12
  79. package/scripts/wf-check.mjs +75 -0
  80. package/skills/ai-ui/SKILL.md +1 -1
  81. package/skills/astro/SKILL.md +177 -132
  82. package/skills/astro/add-content-collection.md +29 -13
  83. package/skills/astro/check-build.md +19 -13
  84. package/skills/astro/create-component.md +36 -9
  85. package/skills/astro/create-page.md +39 -10
  86. package/skills/astro/optimize-performance.md +36 -8
  87. package/skills/cli/SKILL.md +254 -220
  88. package/skills/dev/SKILL.md +1 -1
  89. package/skills/directory-autofill/SKILL.md +68 -0
  90. package/skills/docs/SKILL.md +4 -4
  91. package/skills/mcp/SKILL.md +186 -156
  92. package/skills/promise-make/SKILL.md +2 -2
  93. package/skills/puck/SKILL.md +465 -250
  94. package/skills/react19/SKILL.md +196 -296
  95. package/skills/reactflow/SKILL.md +387 -412
  96. package/skills/sdk/SKILL.md +167 -106
  97. package/skills/shadcn/SKILL.md +245 -201
  98. package/skills/signal/SKILL.md +5 -0
  99. package/skills/sui/SKILL.md +6 -1
  100. package/skills/tutorial/SKILL.md +15 -0
  101. package/skills/typedb/SKILL.md +427 -217
  102. package/skills/typedb/examples/python-patterns.py +11 -4
  103. package/skills/typedb/examples/query-patterns.tql +8 -3
  104. package/skills/typedb/examples/schema-patterns.tql +4 -2
  105. package/skills/typedb/reference/migration-2x-3x.md +19 -1
  106. package/skills/typedb/reference/python-driver.md +17 -1
  107. package/skills/voice/SKILL.md +117 -0
  108. package/skills/writer/SKILL.md +29 -12
  109. package/templates/template-feature.md +26 -1
  110. package/templates/template-tests.md +4 -0
  111. package/templates/template-todo.md +65 -10
@@ -1,6 +1,13 @@
1
1
  """
2
- TypeDB 3.x Python Driver Patterns
3
- Complete examples for TypeDB Python SDK
2
+ TypeDB Python Driver Patterns — upstream reference only.
3
+
4
+ NOTHING IN THIS MONOREPO USES THE PYTHON DRIVER. There is no `typedb-driver`
5
+ dependency anywhere. The real Python path is `backup/scripts/typedb/dump.py`
6
+ and `replay.py`, which speak the `/v1/` HTTP API through `urllib`, and the
7
+ TypeScript path is `one.ie/web/src/lib/substrate.ts` -> `api/src/index.ts`.
8
+ Keep this file for reading upstream docs; do not model new code on it.
9
+
10
+ Server: TypeDB 3.12.1 (prod and local, since 2026-07-29).
4
11
  """
5
12
 
6
13
  import os
@@ -34,7 +41,7 @@ def connect_cloud():
34
41
  credentials = Credentials("admin", os.environ["TYPEDB_PASSWORD"])
35
42
  options = DriverOptions(is_tls_enabled=True)
36
43
  return TypeDB.driver(
37
- "https://cluster.cloud.typedb.com:80",
44
+ "https://flsiu1-0.cluster.typedb.com:1729", # port 1729, never :80
38
45
  credentials,
39
46
  options
40
47
  )
@@ -581,7 +588,7 @@ def main():
581
588
  options = DriverOptions(is_tls_enabled=True)
582
589
 
583
590
  with TypeDB.driver(
584
- "https://cluster.cloud.typedb.com:80",
591
+ "https://flsiu1-0.cluster.typedb.com:1729", # port 1729, never :80
585
592
  credentials,
586
593
  options
587
594
  ) as driver:
@@ -1,5 +1,9 @@
1
- # TypeQL 3.0 Query Patterns
2
- # Common patterns for TypeDB 3.x queries
1
+ # TypeQL Query Patterns — TypeDB 3.12.1 (prod + local, 2026-07-29)
2
+ # Generic teaching schema (user/friendship/employment), NOT the ONE substrate.
3
+ # For real substrate queries use schema/*.tql — see SKILL.md 'In-repo'.
4
+ # Syntax notes: no if/then/else expression; `return first <literal>` is a
5
+ # TQL0 error (bind a `let` first); stream returns are `-> { type }`, never
6
+ # `-> { $v: type }`; iterate a stream with `let $x in f(...)`.
3
7
 
4
8
  # ============================================================================
5
9
  # SCHEMA DEFINITION PATTERNS
@@ -407,7 +411,8 @@ select $friend, $age;
407
411
  with
408
412
  fun is_adult($u: user) -> boolean:
409
413
  match $u has age $a; $a >= 18;
410
- return first true;
414
+ let $ok = true; # `return first true` is a TQL0 syntax error
415
+ return first $ok;
411
416
  match
412
417
  $u isa user;
413
418
  let $adult = is_adult($u);
@@ -1,5 +1,7 @@
1
- # TypeQL 3.0 Schema Patterns
2
- # Common schema design patterns for TypeDB 3.x
1
+ # TypeQL Schema Patterns — TypeDB 3.12.1 (prod + local, 2026-07-29)
2
+ # Generic teaching schema, NOT the ONE substrate. schema/one.tql is canon.
3
+ # UNVERIFIED on 3.12.1 anywhere in this repo: struct, value string[], @index,
4
+ # @cascade, @subkey — zero occurrences in schema/*.tql and in the live dump.
3
5
 
4
6
  # ============================================================================
5
7
  # BASIC ENTITY PATTERNS
@@ -1,6 +1,24 @@
1
1
  # TypeDB 2.x to 3.x Migration Reference
2
2
 
3
- > Complete guide for migrating from TypeDB 2.x to 3.x
3
+ > Complete guide for migrating from TypeDB 2.x to 3.x.
4
+ >
5
+ > **Why this file still earns its place, and how to read it.** Nobody here is
6
+ > migrating a 2.x database — this repo has always been 3.x, and prod + local
7
+ > both run **3.12.1**. Its value is as the **rule→fun translation guide** and
8
+ > the *"why does this old snippet not work"* lookup: 2.x TypeQL is all over
9
+ > the public internet, older blog posts, and LLM training data, so the failure
10
+ > mode it prevents is real and recurring. `SKILL.md` used to point at
11
+ > `packages/typedb-inference-patterns/` for that translation; **that directory
12
+ > does not exist**, which leaves this file as the only place it lives.
13
+ >
14
+ > Read the "2.x" blocks as *things you will encounter and must reject*, never
15
+ > as things to run. The rule→fun section here is the mechanical table; the
16
+ > worked, live-verified examples are in `SKILL.md` § *Inference Rules
17
+ > (Emergence Patterns)*.
18
+ >
19
+ > Two corrections to apply as you read: `return first true` and any
20
+ > `if … then … else` expression are **rejected on 3.12.1** — bind a `let`
21
+ > first. See `SKILL.md`'s VERIFIED table.
4
22
 
5
23
  ---
6
24
 
@@ -1,6 +1,22 @@
1
1
  # TypeDB Python Driver Reference
2
2
 
3
- > Complete Python driver patterns for TypeDB 3.x
3
+ > Complete Python driver patterns for TypeDB 3.x.
4
+ >
5
+ > **Nothing in this monorepo uses the Python driver.** There is no
6
+ > `typedb-driver` dependency in any `package.json`, `requirements.txt` or
7
+ > `pyproject.toml`. Both real access paths speak the **`/v1/` HTTP API**:
8
+ > `one.ie/web/src/lib/substrate.ts` → `api/src/index.ts` (TypeScript), and
9
+ > `backup/scripts/typedb/{dump,replay}.py` (Python via `urllib`). Load this file
10
+ > when reading upstream TypeDB documentation or evaluating the driver — not as a
11
+ > model for new code here.
12
+ >
13
+ > Server is **3.12.1** (prod and local, since 2026-07-29). The driver API
14
+ > surface below is transcribed from upstream docs and has **not** been
15
+ > exercised against 3.12.1 from this repo. Where it disagrees with
16
+ > `SKILL.md`'s VERIFIED table, the VERIFIED table wins — it was probed live.
17
+ >
18
+ > Ports: this repo's prod endpoint is `:1729`, local is `:8000`. Ignore the
19
+ > `:80` in upstream connection snippets.
4
20
 
5
21
  ---
6
22
 
@@ -0,0 +1,117 @@
1
+ ---
2
+ name: voice
3
+ description: Write in Anthony O'Connell's voice. Use whenever prose will go out under Anthony's or ONE's name and must sound like him, not like a generic assistant — books, essays, whitepapers, manifestos, blog posts, landing-page and marketing copy, founder updates, social posts, newsletters, client emails, playbook chapters, README and doc prose, or any rewrite where the note is "this doesn't sound like me". Its first job is picking the register: book/essay (patient, observational, no visible author, never sells) or commercial (first person, receipts, product names, sells). Invoke AFTER `writer` (craft) and alongside `product-marketing.md` (product context). Triggers — "write this in my voice", "in Anthony's voice/tone", "make it sound like me", "this reads like AI", "too corporate", "sounds generic", "write the book/chapter/essay/whitepaper", "write the blog post/landing page", "rewrite this properly".
4
+ ---
5
+
6
+ # voice — Anthony O'Connell's register
7
+
8
+ He writes in two registers. **Picking the right one is this skill's main job**, and getting it wrong is the most expensive mistake available — the two contradict each other on narrator, on selling, and on whether jokes exist.
9
+
10
+ ---
11
+
12
+ ## Step 1 — pick the register
13
+
14
+ | Writing this | Register | Read |
15
+ |---|---|---|
16
+ | book · book chapter · essay · whitepaper · manifesto · long-form thought | **Book** | `text/voice-and-tone.md` — **complete, stop there** |
17
+ | landing page · blog post · promise (`text/<slug>.md`) · client email · social · newsletter · playbook chapter · doc prose | **Commercial** | `text/writing-style-guide.md` Parts 1, 3–8 + `.claude/product-marketing.md` |
18
+ | unsure | **Ask one question:** does it sell anything, and does it have a narrator? Both no → book. Either yes → commercial. |
19
+
20
+ The registers differ on five load-bearing points. Do not blend them:
21
+
22
+ | | Book | Commercial |
23
+ |---|---|---|
24
+ | "I" / "we" | **never** — no visible author | yes |
25
+ | Sells | **never** | yes, that's the job |
26
+ | Product / company names | **never** | yes |
27
+ | Code, file paths | **never** | yes, and always real |
28
+ | Headings inside a piece | **never** | yes |
29
+
30
+ Everything else — observe don't assert, specific numbers or none, short sentences, one-sentence paragraphs, never lecture, never apologise, never overreach, recognition not awe — holds in both. Those universals are Part 1 of the style guide.
31
+
32
+ ---
33
+
34
+ ## Step 2 — the sources, in order of authority
35
+
36
+ 1. **`text/voice-and-tone.md`** — the specification. **Authored by Anthony.** Vendored from `apps/ants/docs/book/files/01-voice-and-tone.md`; edit the original, re-vendor here. Demonstrated across 96,540 words in `apps/ants/docs/book/manuscript/`. **Senior to everything else. Where anything disagrees with it, it wins.**
37
+ 2. **`text/writing-style-guide.md`** — derived. Splits universal from book-only, and documents the commercial register the spec doesn't cover.
38
+ 3. **`.claude/product-marketing.md`** — product context: offer, audience, thesis, the measured-numbers table. Commercial only.
39
+
40
+ Read the whole of the relevant source when the piece is long-form, when it's the first piece in a new format, or when the user's note is about voice. For a short piece in a format you've already done this session, the checklists below are enough.
41
+
42
+ ---
43
+
44
+ ## The sentence test (both registers)
45
+
46
+ > *Would a careful, slightly amused, very patient person, who is in no hurry to convince anyone of anything but who has noticed something important, write this sentence?*
47
+
48
+ If it performs urgency, expertise, contrarianism, or aspiration — rewrite it.
49
+
50
+ **He does not joke.** *"It is amused, but never sarcastic … The voice does not joke."* There is dry pleasure at a pattern recurring where nobody expected it. There is no comedy, no snark, no bit. If a draft is being funny, it is not being him.
51
+
52
+ ---
53
+
54
+ ## Book-register checklist
55
+
56
+ - [ ] **Opens on a scene** — a place, a person, a moment, a number. Never on an argument.
57
+ - [ ] **No "I", no editorial "we", no visible author.** The camera is there; the camera is not the subject.
58
+ - [ ] **Observes; does not assert.** "The intelligence was not in any of the ants," not "intelligence is a property of substrates."
59
+ - [ ] **Sells nothing.** Names no company, product, or technology. Quotes no code.
60
+ - [ ] **No subheadings.** A horizontal rule may mark a shift in scene or scale, once or twice.
61
+ - [ ] **Specific numbers, or honest hedging** (*on the order of*, *approximately*). Never false specificity.
62
+ - [ ] **Never defines a technical term** — makes its meaning land through use.
63
+ - [ ] **Closes on a short concrete sentence** the reader carries, often a recontextualised return to the opening.
64
+ - [ ] **Passes both the "your mum" and the "Demis Hassabis" test.**
65
+ - [ ] **The emotion is recognition, not awe.** No "this changes everything."
66
+
67
+ ## Commercial-register checklist
68
+
69
+ - [ ] **Em dashes: 3 or fewer.** Count them.
70
+ - [ ] **Every quality adjective replaced by a number** — or the claim cut, or the gap stated.
71
+ - [ ] **No fabricated proof.** Every metric, quote, logo, benchmark, file path real or marked unproven.
72
+ - [ ] **Speed claims carry a measured number** from `product-marketing.md`'s table.
73
+ - [ ] **Opens with a scene or an orthodoxy, not the thesis.**
74
+ - [ ] **Closes on a verdict with its shadow** — name what's still broken. No "In conclusion."
75
+ - [ ] **No hedging, no throat-clearing.** (Honest uncertainty stated precisely is not hedging.)
76
+ - [ ] **Snark aimed at systems, never people.**
77
+ - [ ] **Substrate jargon stripped** from customer-facing copy — no `signal`, `mark`, `warn`, `path`, `substrate`. Customer's words instead.
78
+ - [ ] **Pub test** — read the cleverest sentence aloud. If you'd wince, cut it.
79
+ - [ ] **Status claims are true** — built means built, armed-red means armed-red.
80
+
81
+ ---
82
+
83
+ ## The five commercial moves
84
+
85
+ | Move | Example |
86
+ |---|---|
87
+ | **"X, not Y"** | "The threat model is a table, not a promise." |
88
+ | **The physics reframe** | "This is not a buyer problem. It is a physics problem." |
89
+ | **The uncomfortable truth** | "Here's the part nobody in marketing wants to say out loud …" |
90
+ | **Receipts, not adjectives** | "11 interactions, 55 to 65 seconds, plus DNS wait." |
91
+ | **The unpaid-debt close** | end on what's still broken, unresolved |
92
+
93
+ The uncomfortable-truth move is not contrarianism and not a hot take — the spec forbids performing either. It works because it is a conclusion reached reluctantly and reported flatly.
94
+
95
+ ---
96
+
97
+ ## The stack
98
+
99
+ ```
100
+ 1. writer craft — draft, cut, structure, polish
101
+ 2. voice (this skill) register — pick one, then apply it
102
+ 3. product-marketing.md context — offer, audience, measured numbers (commercial only)
103
+ 4. docs taxonomy — only for text/*.md doc types
104
+ ```
105
+
106
+ `writer` decides whether the sentence works. `voice` decides whether it's his. When they disagree, `voice` wins.
107
+
108
+ ---
109
+
110
+ ## Don't
111
+
112
+ - **Don't blend the registers.** A book chapter that names a product, or a landing page with no narrator, is the failure this skill exists to prevent.
113
+ - **Don't make him funny.** His own spec rules it out. Warmth is not comedy.
114
+ - **Don't invoke this instead of `writer`** — invoke it after. Craft first, register second.
115
+ - **Don't apply it to internal specs, TypeQL, migrations, or commit messages.** Those have their own registers and this one makes them worse.
116
+ - **Don't edit `text/voice-and-tone.md`.** It's a vendored copy. Edit `apps/ants/docs/book/files/01-voice-and-tone.md` and re-vendor.
117
+ - **Don't invent biography.** If a beat wants lived experience that isn't on record, use a corpus example or mark it constructed.
@@ -25,6 +25,22 @@ Every piece of writing — long or short — goes through this loop:
25
25
 
26
26
  If time is short, skip steps 5 and 6 and ship. Steps 1–4 are non-negotiable.
27
27
 
28
+ **Writing under Anthony's or ONE's name?** Invoke the `voice` skill. It picks
29
+ between his two registers — the book register
30
+ ([`text/voice-and-tone.md`](../../../text/voice-and-tone.md), his own writing
31
+ specification) and the commercial register
32
+ ([`text/writing-style-guide.md`](../../../text/writing-style-guide.md)).
33
+
34
+ **Order depends on the register.** For commercial work, run this loop first, then
35
+ `voice`. For **book** work, invoke `voice` first and use this skill only for
36
+ sentence-level polish — step 3 above ("aim to halve the word count") and step 4
37
+ ("move the strongest point to the top") are wrong for that register, which is
38
+ paced to walk at the reader's pace and never leads with its thesis. Applying
39
+ them to a chapter turns it into a landing page.
40
+
41
+ This skill decides whether the sentence works; `voice` decides whether it's *his*.
42
+ When they disagree, `voice` wins.
43
+
28
44
  ---
29
45
 
30
46
  ## Step 0: Audience, medium, goal
@@ -307,30 +323,31 @@ But: when in doubt, shorter. Almost no one ever wishes a piece of writing were l
307
323
 
308
324
  ## Project-specific voice
309
325
 
310
- Two voice documents layer on top of this skill. Read both before writing anything here.
326
+ Voice documents layer on top of this skill. **Which ones you read is the `voice`
327
+ skill's decision, not this one's** — it picks the register first, and the book
328
+ register reads `text/voice-and-tone.md` and stops there. Don't preload all of
329
+ them.
311
330
 
312
- **Personal essays, blog posts, tech pieces, opinion writing:**
313
- [`text/writing-style-guide.md`](../../../../text/writing-style-guide.md) — Anthony's
314
- personal writing style. Dry, sardonic, technically grounded. The sensibility
315
- (does this tool serve the work, or has it started serving itself?), the
316
- typography fingerprint (trailing ` …`, the em-dash ration, scare-quotes,
317
- capitalized Concepts), the sentence rhythm (punch / carrier / escalating list),
318
- and the recurring beats (received-wisdom turn, forensic descent, two-camps
319
- dismissal). This is the default voice for any personal piece. Apply it always.
331
+ **Commercial register blog posts, landing pages, client email, social, docs prose:**
332
+ [`text/writing-style-guide.md`](../../../text/writing-style-guide.md) — the
333
+ derived guide. The sensibility (does this tool serve the work, or has it started
334
+ serving itself?), the typography fingerprint (trailing ` …`, the em-dash ration,
335
+ scare-quotes, capitalized Concepts), the sentence rhythm (punch / carrier /
336
+ escalating list), and the recurring beats (received-wisdom turn, forensic
337
+ descent, two-camps dismissal).
320
338
 
321
339
  **Marketing, product, and landing-page copy:**
322
340
  [`/.claude/product-marketing.md`](../../product-marketing.md) — ONE's brand voice.
323
341
  Audience (CEOs + engineers), the speed/ease/simplicity thesis, banned vocabulary,
324
- headline patterns, and the data rule. Layers on top of the personal voice for
342
+ headline patterns, and the data rule. Layers on top of the style guide for
325
343
  anything that ships as ONE copy.
326
344
 
327
345
  ---
328
346
 
329
347
  ## Reference files
330
348
 
331
- - `text/writing-style-guide.md` — **Always read.** Anthony's personal writing voice: sensibility, typography fingerprint, sentence rhythm, recurring beats, vocabulary bank, anti-patterns, worked examples.
349
+ - `text/writing-style-guide.md` — the commercial register: sensibility, typography fingerprint, sentence rhythm, recurring beats, vocabulary bank, anti-patterns, worked examples. Read it when `voice` picks commercial; for the book register `voice` sends you to `text/voice-and-tone.md` instead.
332
350
  - `references/anti-patterns.md` — A longer catalogue of clichés, AI-prose tells, and corporate jargon to avoid, with replacements. Read this when editing marketing or corporate copy where the user wants to sound less like a press release.
333
- - `references/voice-matching.md` — How to read a writer's voice from sample text and match it. Read this when ghostwriting or editing on someone else's behalf.
334
351
  - `references/structures.md` — Concrete templates for common pieces (essay openings, founder updates, landing page sections, cold emails). Read this when the user asks for a format you want to handle well.
335
352
  - `references/copy-frameworks.md` — The canon: ten headline frameworks (JTBD, PAS, BAB, outcome+timeframe, hard-thing-without-pain, plain truth, numbered nouns, category-for-audience, Dunford positioning, attributed quote) with when-to-use, examples, traps; the specificity and sensory rules; the seven biases (anchoring, loss aversion, social proof, authority, reciprocity, scarcity, decoy) and which frameworks recruit which. Read this when writing or rewriting landing pages, pricing pages, hero sections, or any headline that has to convert.
336
353
 
@@ -81,6 +81,22 @@ proof: "" # THE ACCEPTANCE TEST — derived, not authored: the
81
81
  # RED BEFORE GREEN: at PROMISE this must EXIT NON-ZERO (the thing isn't
82
82
  # built yet). It goes green only at PROVE. Green at PROMISE = already
83
83
  # shipped (skip) or too weak to gate (rewrite it).
84
+ #
85
+ # THREE EXIT CODES, NOT TWO. A check that can only say ok/failed will
86
+ # report an outage as a broken promise:
87
+ # 0 ok — the thing is built and behaves
88
+ # 1 RED — the thing is genuinely missing or wrong
89
+ # 3 CANNOT RUN — the check could not reach its evidence (cluster
90
+ # down, no creds, network gone). NOT a red.
91
+ # Exit 3 must be distinguishable, because red and cannot-run send a
92
+ # human to opposite places: red means fix the build, cannot run means
93
+ # fix the environment. A board that paints cannot-run as failure will
94
+ # send someone to re-scope a correct migration. Make each accept:
95
+ # exit 3 when its evidence is unreachable, and say WHY in one line.
96
+ # And when the armed check goes red, confirm it is red for the RIGHT
97
+ # reason — a proof that false-fails on a dialect artifact or a missing
98
+ # binary gates nothing (recorded: a bare `node --check` that could
99
+ # never pass, so the kill-switch was decorative).
84
100
 
85
101
  derives: # the artifacts this promise spawns. /do backfills each down the spine
86
102
  # instead of re-deciding at DESIGN. true = spawn · false = skip.
@@ -91,11 +107,20 @@ derives: # the artifacts this promise spawns. /do backfills ea
91
107
  features: false # text/<slug>-features.md — WHAT — set true if scope spans ≥3 capabilities
92
108
  ui: false # text/<slug>-ui.md — screens/states — DEFAULT true whenever world: names views,
93
109
  # lifecycle stages, inbox spaces, or any route; false only with a stated reason
94
- # (mirror the engine's {"surface":"none","reason":…} escape)
110
+ # (mirror the engine's {"surface":"none","reason":…} escape). When true, this
111
+ # promise's proof: MUST invoke `bash .claude/scripts/do-ui-gate.sh <slug>` —
112
+ # do-promise-lint.sh's ui-coupling check enforces it, so a UI-bearing promise
113
+ # can't settle without its ```ui fence rows (text/template-ui.md) actually
114
+ # being gate-checked.
95
115
  tutorial: false # text/<slug>-tutorial.md — set true if there's a first-success worth its own page
96
116
  how-to: false # text/<slug>-how-to.md — set true if ≥2 recurring tasks users repeat
97
117
  reference: false # text/<slug>-reference.md — set true if the spec is too detailed for -docs.md
98
118
  agents: false # text/<slug>-agents-docs.md — set true if agents call this feature's receivers
119
+ walk: false # text/<slug>-humans.md + text/<slug>-agents.md — the deterministic verification
120
+ # walk (do-walk.sh); DEFAULT true whenever ui: is true or any route ships —
121
+ # one stop per deliverables: row, agents-mode asserts reuse the accept: checks
122
+ lifecycle: false # text/<slug>-lifecycle.md — the end-to-end journey for both audiences;
123
+ # set true when world: names lifecycle stages, workflow steps, or ≥2 surfaces
99
124
 
100
125
  rubric: # THE QUALITY CONTRACT — W4 scores every cycle against these
101
126
  # floors; the composite gates the cycle (≥ 0.65 AND goal-fit
@@ -40,6 +40,10 @@ Rules (from do.md testing policy):
40
40
  - ≤1 test file per cycle
41
41
  - Goal-based: assert shipped outcome, not implementation detail
42
42
  - Vitest-first; add requires_playwright: true in todo frontmatter if browser needed
43
+ - UI states: if the cycle has a text/<slug>-ui.md, EVERY row of its component-states
44
+ table gets a render test (vitest + @testing-library — empty/loading/error/populated),
45
+ and the todo outcome includes `do-prove.sh --route <path>` per route in the -ui.md's
46
+ Proof section. A table row with no test is a build gap.
43
47
  - N-variant split-test → winner mark(), losers warn(0.5)
44
48
  - One import per test file (avoid cross-cycle coupling)
45
49
  -->
@@ -2,7 +2,15 @@
2
2
  title: {Human-readable title}
3
3
  slug: {kebab-slug}
4
4
  type: plan
5
- tier: simple # trivial | simple | complex — /do reads this before W0
5
+ tier: feature # PATCH | FIX | FEATURE | SCHEMA the SPINE tier. /do reads this
6
+ # before W0 to prune the spine (do.md § "The pruned spine by tier").
7
+ # This is the vocabulary do-tier.sh emits; case-insensitive here.
8
+ classifier: complex # trivial | simple | complex — the BUILD classifier (how much
9
+ # machinery W0-W4 runs INSIDE a cycle). A SEPARATE AXIS from tier:.
10
+ # Conflating the two is the recorded root cause of 157 plans
11
+ # carrying `tier: complex` — a BUILD classifier in a field /do
12
+ # resolves the spine from. Spine tier answers "which stops run";
13
+ # classifier answers "how heavy is each cycle". Set both.
6
14
  mode: construction # discovery | construction | evolution | maintenance
7
15
  tags: [] # drives pheromone routing + W2 context triggers
8
16
  priority: 0 # 0 none · 1 should · 2 important · 3 critical — human override; do-rank.py reads it
@@ -27,14 +35,24 @@ depends_on: [] # [other-slug, …] — plans that must be DONE befor
27
35
 
28
36
  goal: "" # ONE sentence — what becomes true that wasn't before. Not "ship X" but "user can do Y" or "system enforces Z".
29
37
  outcome: "" # ONE bash command — exits 0 = goal achieved. Re-runs after every batch's W4. The kill-switch.
38
+ # If the plan ships anything user-visible, this command MUST include a page-load proof —
39
+ # e.g. `bash .claude/scripts/do-prove.sh --route /x && <other checks>`. grep/tsc alone
40
+ # can pass while the page 500s or the code is dead.
30
41
  outcome_asserts: "" # ONE sentence — what passing the outcome command proves (human-readable).
31
42
 
32
43
  deliverables: # Concrete artifacts that ship. Every entry maps to a cycle. If it isn't here, it doesn't ship.
33
- # - {route|component|cli-verb|api|migration|doc}: {path} {what the user sees / can do}
34
- # Example:
35
- # - route: /chat/memory user can read & edit company memory inline
36
- # - api: POST /api/memory/upsert agent writes memory facts
37
- # - cli: one memory add operator writes memory facts from terminal
44
+ # LAW — user-visible feature ⇒ must include a route/component row whose accept loads the page (do-prove.sh --route /path)
45
+ # QUOTE EVERY VALUE. The value is prose, and prose contains `:`, backticks, `{`, `#` and
46
+ # `—` every one of which is YAML syntax. An unquoted entry parses as a nested mapping
47
+ # or dies outright, and nothing warns you: /do survives today only because do-rank.py
48
+ # hand-rolls a regex parser instead of using YAML. 101 of 292 filled *-todo.md files in
49
+ # this repo already fail to parse. factory-check.sh templates asserts that count never
50
+ # RISES — it is a ratchet, not a cleanup.
51
+ # - {route|component|cli-verb|api|migration|doc}: "{path} — {what the user sees / can do}"
52
+ # Example (note: every value quoted, colons and backticks safe inside):
53
+ # - route: "/chat/memory — user can read & edit company memory inline"
54
+ # - api: "POST /api/memory/upsert — agent writes memory facts"
55
+ # - cli: "one memory add — operator writes memory facts from terminal"
38
56
 
39
57
  ux_before: "" # ONE sentence — what the user does TODAY (the current journey, friction included).
40
58
  ux_after: "" # ONE sentence — what the user does AFTER this plan ships (the new journey).
@@ -62,7 +80,20 @@ batches: # plan-level cycle DAG, flattened into batches.
62
80
  # Cycles inside the same batch run their waves IN PARALLEL.
63
81
  # The next batch fires the moment the previous batch's W4 closes.
64
82
  # Empty list → /do auto-derives from the cycle-level arrows below.
65
- - [C1] # batch 1: foundation
83
+ #
84
+ # DOCS GO IN BATCH 1, NOT LAST. `.claude/rules/documentation.md` is explicit:
85
+ # the doc set is authored at the DOCS stop, BEFORE any code, and the tests are
86
+ # drawn from it. Scheduling `<slug>-docs.md` as the final cycle inverts that —
87
+ # the code decides what the doc says, and the acceptance oracle ends up written
88
+ # by the thing it is supposed to judge. Author the docs in batch 1; keep a
89
+ # separate, narrower closing cycle that RECONCILES them to what shipped. Two
90
+ # different jobs: one writes the oracle, the other closes drift.
91
+ #
92
+ # An arrow into the docs cycle is almost always imaginary — a doc cycle reads
93
+ # the promise, not another cycle's output. Same test as every other arrow:
94
+ # name the file the later cycle reads that the earlier one writes, or delete
95
+ # the edge. "We'll know more after C4" is W2 learning, not a file dependency.
96
+ - [C1] # batch 1: foundation + the doc set (the spec)
66
97
  - [C2, C3, C4] # batch 2: independent siblings (concurrent)
67
98
  - [C5] # batch 3: composes C1-C4
68
99
  - [C6] # batch 4: polish across all
@@ -73,6 +104,7 @@ shared_recon: # files /do reads ONCE at plan start (W0.5), shared b
73
104
  # ─────────────────────────────────────────────────────────────────────
74
105
 
75
106
  source_of_truth: # ≤5 files — W2 auto-loads; only files that actually exist
107
+ # any plan with a cycle whose surface ≠ none MUST list text/<slug>-ui.md here
76
108
  - docs/relevant-spec.md
77
109
  - src/relevant/file.ts
78
110
  existing_primitives: # the components/libs this plan composes — NEVER reimplement these
@@ -376,7 +408,7 @@ Reject any of these as reasons to add an arrow or move cycles to later batches:
376
408
 
377
409
  ## Surface checklist contract (W2 output)
378
410
 
379
- W2 must fill in `.w2-surface-checklist.json` for every new route/page/component:
411
+ `.w2-surface-checklist.json` is **mandatory every cycle** — not just cycles that add routes. Either it lists the surface layers (routes, components, nav, inbound links, states) or it explicitly declares `{"surface": "none", "reason": "<why this cycle ships nothing user-visible>"}`. A missing file = W2 incomplete. For every new route/page/component the entry looks like:
380
412
 
381
413
  ```json
382
414
  {
@@ -501,6 +533,8 @@ Plan close
501
533
 
502
534
  **UX delta:** {ONE sentence — what the user can do after this cycle that they couldn't before. "Operator now sees company memory in the chat sidebar." If "no user-visible change," say so explicitly — internal-only cycles must justify why they ship before a user-visible one.}
503
535
 
536
+ **Surface:** {`/route` | `component:<Name>` | `none({reason})` — the user-visible surface this cycle ships; W2 copies this verbatim into `.w2-surface-checklist.json` (none requires the reason)}
537
+
504
538
  **Cycle outcome:** {verifiable — bash command / test name / API shape / Lighthouse score}
505
539
 
506
540
  ✓ valid: "`bun run verify` passes AND `GET /api/foo` returns `{id, name}`"
@@ -516,6 +550,17 @@ demo:
516
550
  budget: "<2s wall · <80 LOC test"
517
551
  ```
518
552
 
553
+ **Wave tracking** (mandatory — `do-auto.sh`'s `_sync_status` scans THIS `## C<n>` section for
554
+ `- [ ] W` lines to auto-derive the Status kanban's header tick; the kanban's own nested
555
+ `- [ ] W1 recon` lines are a summary view, not what the script reads. Omitting this block
556
+ means the section never has an open `- [ ] W` line, so `_sync_status` false-ticks the cycle
557
+ complete on the very first pass, before any work happens — verified failure, `live-edit` C1–C6,
558
+ 2026-07-23. One line per wave, updated to `[x]` as each completes):
559
+ - [ ] W1 recon — {one line: what was found}
560
+ - [ ] W2 decide — {one line: what was decided}
561
+ - [ ] W3 edit — {one line: what landed}
562
+ - [ ] W4 verify — {one line: what passed}
563
+
519
564
  ### W1 — Recon [Haiku · parallel · merged across batch]
520
565
 
521
566
  /do spawns recon agents for ALL files in this batch's W1 list in a **single message**, deduped against `shared_recon:` cache. List only cycle-specific files that exist now (shared files are already cached at plan start).
@@ -550,7 +595,7 @@ Every item below is a checkbox; `/do` ticks each as it resolves.
550
595
  - [ ] **Architectural questions** answered
551
596
  - [ ] **Diff specs output** for every W3 target
552
597
  - [ ] **Doc-plan** filed (`.w2-doc-plan.json`) if any trigger applies (new primitive · rename · public surface · directory contract)
553
- - [ ] **Surface checklist** (`.w2-surface-checklist.json`) — for every new route/page/component, document: nav parent, inbound links + source pages, SDK/MCP/CLI exports, UI states
598
+ - [ ] **Surface checklist** (`.w2-surface-checklist.json`) — MANDATORY every cycle: for every new route/page/component document nav parent, inbound links + source pages, SDK/MCP/CLI exports, UI states — or write an explicit `{"surface": "none", "reason": "…"}`
554
599
 
555
600
  **Compose-or-construct verdict (mandatory — top of W2, before any other decision):**
556
601
 
@@ -580,7 +625,9 @@ separately. Default to "compose"; "new" is the exception, not the default.
580
625
 
581
626
  W2 fills in the anchors AND the surface checklist. Mark which edits are independent vs dependent.
582
627
 
583
- **Surface build order (every cycle, in this order):**
628
+ **UI cycles (surface ≠ none):** name `text/<slug>-ui.md` as source_of_truth and load the `shadcn` / `puck` / `frontend-design` skills before editing; W4 then verifies each component-state row of the -ui.md renders, `do-prove.sh --route` passes, and light+dark screenshots are attached to the cycle close note.
629
+
630
+ **Surface build order (every cycle, in this order — driven by the mandatory `.w2-surface-checklist.json`; a cycle with `{"surface": "none"}` skips 5–8 but still files the checklist):**
584
631
  1. Schema (migration if needed)
585
632
  2. Types (TypeScript interfaces)
586
633
  3. Receiver/SDK (if new public method)
@@ -636,6 +683,7 @@ If all edits are independent, leave W3b empty — empty W3b = one fewer round-tr
636
683
  - [ ] MCP tool defined (if agent-facing; in `packages/mcp/src/tools/`)
637
684
  - [ ] CLI verb added (if operator-facing; in `packages/cli/src/commands/`)
638
685
  - [ ] All UI states rendered (empty, loading, error, edit modes exist in component)
686
+ - [ ] Page-load proof (surface ≠ none): `bash .claude/scripts/do-prove.sh --route {route}` exits 0 + each component-state row of `text/<slug>-ui.md` renders + light+dark screenshots attached to the close note
639
687
  - [ ] **Docs synchronized** (hard gate):
640
688
  - [ ] New terms added to `text/dictionary.md`
641
689
  - [ ] Feature doc section exists (`text/{feature}-plan.md` or appended to existing)
@@ -666,8 +714,15 @@ Report: `delta_tsc=±N delta_loc=±N compress_orphans=N new_files=N primitiv
666
714
  **Goal delta:** {one sentence}
667
715
  **Deliverable:** {one row from `deliverables:` table}
668
716
  **UX delta:** {one sentence — or "internal-only, justified by X"}
717
+ **Surface:** {`/route` | `component:<Name>` | `none({reason})` — W2 copies into `.w2-surface-checklist.json`}
669
718
  **Cycle outcome:** {verifiable}
670
719
 
720
+ **Wave tracking** (mandatory — see C1's note above for why):
721
+ - [ ] W1 recon — {one line}
722
+ - [ ] W2 decide — {one line}
723
+ - [ ] W3 edit — {one line}
724
+ - [ ] W4 verify — {one line}
725
+
671
726
  ### W1 — Recon [Haiku · parallel]
672
727
 
673
728
  - `{file}` — {what to find}