@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.
- package/agents/w1-recon.md +9 -4
- package/agents/w2-decide.md +51 -28
- package/agents/w3-edit.md +70 -78
- package/agents/w4-verify.md +164 -69
- package/commands/browser.md +98 -35
- package/commands/cc-connect.md +6 -0
- package/commands/chat.md +13 -1
- package/commands/close.md +45 -19
- package/commands/create.md +20 -10
- package/commands/db-sync.md +5 -1
- package/commands/deploy.md +174 -87
- package/commands/do-autonomous.md +31 -20
- package/commands/do-improve.md +4 -4
- package/commands/do-show.md +4 -3
- package/commands/do.md +53 -13
- package/commands/go.md +75 -0
- package/commands/improve.md +4 -2
- package/commands/kill.md +6 -8
- package/commands/notify.md +15 -2
- package/commands/oo-push.md +24 -9
- package/commands/rag.md +6 -0
- package/commands/release.md +46 -25
- package/commands/restart.md +5 -4
- package/commands/see.md +45 -35
- package/commands/skill-create.md +38 -5
- package/commands/sync.md +21 -11
- package/hooks/scripts/auto-continue.sh +70 -0
- package/hooks/scripts/branch-pin.sh +85 -0
- package/hooks/scripts/git-add-guard.sh +16 -5
- package/hooks/scripts/post-edit-check.sh +16 -0
- package/hooks/scripts/session-start.sh +13 -8
- package/hooks/scripts/sync-priority-todo.sh +5 -0
- package/package.json +1 -1
- package/rules/api.md +9 -0
- package/rules/design.md +13 -3
- package/rules/documentation.md +30 -71
- package/rules/engine.md +8 -1
- package/rules/ui.md +5 -1
- package/scripts/__pycache__/do-rank.cpython-313.pyc +0 -0
- package/scripts/browser-check.mjs +44 -103
- package/scripts/cc-events-proof.sh +13 -12
- package/scripts/chrome.mjs +381 -0
- package/scripts/do-analyze.sh +109 -4
- package/scripts/do-auto.sh +350 -43
- package/scripts/do-consumer-sweep.sh +72 -0
- package/scripts/do-derives-check.sh +88 -0
- package/scripts/do-fleet.sh +50 -1
- package/scripts/do-killswitch-audit.py +33 -14
- package/scripts/do-promise-lint.sh +150 -4
- package/scripts/do-promise-settle.sh +131 -9
- package/scripts/do-prove.sh +197 -17
- package/scripts/do-rank.py +606 -20
- package/scripts/do-rubric.py +21 -2
- package/scripts/do-signal.sh +157 -17
- package/scripts/do-smoke.sh +9 -0
- package/scripts/do-substrate-check.sh +49 -0
- package/scripts/do-tasks-wire-check.sh +81 -0
- package/scripts/do-tier.sh +90 -5
- package/scripts/do-ui-gate.sh +332 -0
- package/scripts/do-untracked-gate.sh +231 -0
- package/scripts/do-walk.sh +344 -0
- package/scripts/factory-check.sh +747 -0
- package/scripts/factory-repo.sh +1361 -0
- package/scripts/factory-tasks-check.sh +85 -0
- package/scripts/outcome-pull.ts +279 -0
- package/scripts/promise-manifest.mjs +167 -0
- package/scripts/reconcile-allow.txt +5 -0
- package/scripts/rubric-weights.json +64 -0
- package/scripts/spine-canary.sh +20 -0
- package/scripts/typedb-cluster-status.sh +128 -0
- package/scripts/typedb-env.sh +182 -0
- package/scripts/typedb-flap-recorder.sh +85 -0
- package/scripts/typedb-probes/containment-probe.py +88 -0
- package/scripts/typedb-probes/panic-probe-version.py +92 -0
- package/scripts/typedb-probes/panic-probe.py +77 -0
- package/scripts/typedb-scratch.sh +73 -0
- package/scripts/urls-lint.sh +58 -0
- package/scripts/w4-rubric.ts +96 -12
- package/scripts/wf-check.mjs +75 -0
- package/skills/ai-ui/SKILL.md +1 -1
- package/skills/astro/SKILL.md +177 -132
- package/skills/astro/add-content-collection.md +29 -13
- package/skills/astro/check-build.md +19 -13
- package/skills/astro/create-component.md +36 -9
- package/skills/astro/create-page.md +39 -10
- package/skills/astro/optimize-performance.md +36 -8
- package/skills/cli/SKILL.md +254 -220
- package/skills/dev/SKILL.md +1 -1
- package/skills/directory-autofill/SKILL.md +68 -0
- package/skills/docs/SKILL.md +4 -4
- package/skills/mcp/SKILL.md +186 -156
- package/skills/promise-make/SKILL.md +2 -2
- package/skills/puck/SKILL.md +465 -250
- package/skills/react19/SKILL.md +196 -296
- package/skills/reactflow/SKILL.md +387 -412
- package/skills/sdk/SKILL.md +167 -106
- package/skills/shadcn/SKILL.md +245 -201
- package/skills/signal/SKILL.md +5 -0
- package/skills/sui/SKILL.md +6 -1
- package/skills/tutorial/SKILL.md +15 -0
- package/skills/typedb/SKILL.md +427 -217
- package/skills/typedb/examples/python-patterns.py +11 -4
- package/skills/typedb/examples/query-patterns.tql +8 -3
- package/skills/typedb/examples/schema-patterns.tql +4 -2
- package/skills/typedb/reference/migration-2x-3x.md +19 -1
- package/skills/typedb/reference/python-driver.md +17 -1
- package/skills/voice/SKILL.md +117 -0
- package/skills/writer/SKILL.md +29 -12
- package/templates/template-feature.md +26 -1
- package/templates/template-tests.md +4 -0
- package/templates/template-todo.md +65 -10
|
@@ -1,6 +1,13 @@
|
|
|
1
1
|
"""
|
|
2
|
-
TypeDB
|
|
3
|
-
|
|
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.
|
|
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.
|
|
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.
|
|
2
|
-
#
|
|
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.
|
|
2
|
-
#
|
|
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.
|
package/skills/writer/SKILL.md
CHANGED
|
@@ -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
|
-
|
|
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
|
-
**
|
|
313
|
-
[`text/writing-style-guide.md`](
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
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
|
|
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` —
|
|
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:
|
|
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
|
-
# -
|
|
34
|
-
#
|
|
35
|
-
#
|
|
36
|
-
#
|
|
37
|
-
# -
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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
|
-
**
|
|
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}
|