@nurix/etna 0.19.35 → 0.19.36
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/data/harness-index.json +1 -1
- package/data/harnesses/code/CLAUDE.md +17 -18
- package/data/harnesses/code/harness.json +1 -1
- package/data/harnesses/code/rules/verification.md +22 -9
- package/data/harnesses/code/skills/documentation/SKILL.md +3 -1
- package/data/harnesses/code/skills/documentation/references/instruction-style.md +49 -0
- package/data/harnesses/code/skills/documentation/references/style-guide.md +11 -0
- package/data/harnesses/code/skills/documentation/templates/changelog-entry.md +1 -1
- package/data/harnesses/code/skills/documentation/templates/plan.md +11 -4
- package/data/harnesses/code/skills/test-plan/SKILL.md +4 -4
- package/data/harnesses/delivery/harness.json +1 -1
- package/data/harnesses/delivery/skills/documentation/SKILL.md +3 -1
- package/data/harnesses/delivery/skills/documentation/references/instruction-style.md +49 -0
- package/data/harnesses/delivery/skills/documentation/references/style-guide.md +11 -0
- package/data/harnesses/delivery/skills/documentation/templates/changelog-entry.md +1 -1
- package/data/harnesses/delivery/skills/documentation/templates/plan.md +11 -4
- package/data/harnesses/etna/CLAUDE.md +1 -1
- package/data/harnesses/etna/harness.json +1 -1
- package/data/harnesses/etna/skills/documentation/SKILL.md +3 -1
- package/data/harnesses/etna/skills/documentation/references/instruction-style.md +49 -0
- package/data/harnesses/etna/skills/documentation/references/style-guide.md +11 -0
- package/data/harnesses/etna/skills/documentation/templates/changelog-entry.md +1 -1
- package/data/harnesses/etna/skills/documentation/templates/plan.md +11 -4
- package/package.json +1 -1
package/data/harness-index.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Agent Instructions
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
How AI coding agents — any vendor, any runtime — work on this project. Rules are runtime-neutral: a rule that depends on a capability (sub-agent dispatch, browser tools, context injection, slash commands) applies only if the runtime has it, and states its fallback. Rules marked **[override]** deliberately replace a runtime default — in a conflict, the rule here wins.
|
|
4
4
|
|
|
5
5
|
---
|
|
6
6
|
|
|
@@ -21,23 +21,22 @@ Invoke the `maintenance` agent whenever the docs look like they need it — not
|
|
|
21
21
|
|
|
22
22
|
## Workflows
|
|
23
23
|
|
|
24
|
-
Three peer modes
|
|
24
|
+
Three peer modes, then a verification gate and a Completion step — enter wherever the user's thinking already is. Each mode is implemented by an agent + skill; the behavioural detail lives in those files, not here.
|
|
25
25
|
|
|
26
26
|
| Mode | Enter when | Implemented by | Exits to |
|
|
27
27
|
| --- | --- | --- | --- |
|
|
28
28
|
| **Brainstorming** | explicit ask (`/brainstorm start`); or offer a session — never auto-enter — when the user brings a large piece of work (name what makes it big) or an utterance contradicts a recorded pillar (name the principle) | `brainstorm` agent + skill | LLD, Plan, or close + harvest |
|
|
29
29
|
| **LLD** (low-level design) | new feature work | `lld-mode` agent + `documentation` skill | Plan |
|
|
30
|
-
| **Plan** | an LLD is approved | `documentation` skill → `docs/history/plans/YYYY-MM-DD-{slug}.md` | Completion |
|
|
30
|
+
| **Plan** | an LLD is approved | `documentation` skill → `docs/history/plans/YYYY-MM-DD-{slug}.md` | Verification gate → Completion |
|
|
31
31
|
|
|
32
32
|
> Brainstorm entry needs a **basis** — a reference document or a one-shot brain dump; drip-sized asks (a bug fix, one button) are too small and get redirected. A **pillar** is a recorded strategic principle from a past brainstorm: in-progress sessions live under `docs/research/`, harvested ones under `docs/history/brainstorms/`, harvested doctrine under `docs/architecture/`. The LLD is the feature doc itself — `docs/features/{feature}.md`, design intent first, extended in place at Completion.
|
|
33
33
|
|
|
34
34
|
**On Plan Completion:**
|
|
35
35
|
|
|
36
|
-
1. **The verification gate passes first** —
|
|
36
|
+
1. **The verification gate passes first** — user-triggered: when implementation completes, report it and offer the gate; never run it unbidden. It requires the plan's Test Obligations ledger to exist (proof the plan gates ran) and discharges every row, driving the real surface before pinning tests — `.claude/rules/verification.md`. A plan with outstanding obligations stays open, whatever the code does.
|
|
37
37
|
2. Freeze the plan — `Status: Complete`, fill the Completed date. The file is now frozen.
|
|
38
38
|
3. Flip the feature LLD to `status: active`; extend it in place with the how-it-works sections; confirm its `owns:` globs against the actual code.
|
|
39
|
-
4.
|
|
40
|
-
5. Derive/update the behavioral checklist at `docs/tests/{feature}.md` via the `documentation` skill (a truth document — present-tense, referencing the LLD's promises, restating no intent), and record the gate's results in the changelog entry.
|
|
39
|
+
4. Derive/update the behavioral checklist at `docs/tests/{feature}.md` via the `documentation` skill (a truth document — present-tense, referencing the LLD's promises, restating no intent), and record the gate's results in the changelog entry.
|
|
41
40
|
|
|
42
41
|
**On Brainstorm Close** (when a session ends, not when a plan completes): close + harvest is the skill's `stop` procedure — converge, a user-approved harvest manifest, apply, then a uselessness test; conclusions disperse by scope (architecture docs, decision records, backlog), the record moves from `docs/research/{topic}-brainstorm/` to `docs/history/brainstorms/{topic}/`, and the user decides whether the moved folder is deleted or committed.
|
|
43
42
|
|
|
@@ -49,14 +48,14 @@ These four mechanisms work in tandem to keep the repo self-updating and to preve
|
|
|
49
48
|
|
|
50
49
|
### Ownership — route before editing
|
|
51
50
|
|
|
52
|
-
Which doc is canonical for which code paths is the **feature doc's own frontmatter**. A feature doc (flat in `docs/features/`) carries `owns:` (code-path globs — the only ownership key), `module:` (a bounded-context label, omitted when cross-cutting), `keywords:` (discovery), and `status:`. Code → doc ownership is the union of every feature doc's `owns:` globs, surfaced as the generated ownership index at session start. A module is tied to code by the `owns:` globs of the docs carrying its `module:` label — not a folder, not a separate map. Architecture docs describe cross-cutting patterns and
|
|
51
|
+
Which doc is canonical for which code paths is the **feature doc's own frontmatter**. A feature doc (flat in `docs/features/`) carries `owns:` (code-path globs — the only ownership key), `module:` (a bounded-context label, omitted when cross-cutting), `keywords:` (discovery), and `status:`. Code → doc ownership is the union of every feature doc's `owns:` globs, surfaced as the generated ownership index at session start. A module is tied to code by the `owns:` globs of the docs carrying its `module:` label — not a folder, not a separate map. Architecture docs describe cross-cutting patterns and own no files; operations docs describe procedures.
|
|
53
52
|
|
|
54
53
|
Before modifying code in an unfamiliar area:
|
|
55
54
|
|
|
56
55
|
1. Consult the **injected ownership index** (`glob → doc · module · keywords · status`). Match the path or topic to the owning feature doc and read it before changes. (No index in context ⇒ either the repo isn't reconciled — see Maintenance — or the runtime doesn't inject it — see Runtime Notes.)
|
|
57
56
|
2. If a `docs/memory/` file exists for the domain, read it for domain knowledge and failure modes.
|
|
58
57
|
|
|
59
|
-
The `lld-mode` agent checks for ownership conflicts during LLD research — feature docs whose `owns:` globs overlap at equal specificity.
|
|
58
|
+
The `lld-mode` agent checks for ownership conflicts during LLD research — feature docs whose `owns:` globs overlap at equal specificity. Resolve them in the LLD before proceeding.
|
|
60
59
|
|
|
61
60
|
### Boundaries — check while changing
|
|
62
61
|
|
|
@@ -66,15 +65,15 @@ Boundaries are **diagnosed, not documented** — the `boundary` skill derives th
|
|
|
66
65
|
|
|
67
66
|
### Test obligations — specify before implementing
|
|
68
67
|
|
|
69
|
-
**After `boundary` passes and its amendments are folded, invoke the `test-plan` skill** — same plan gate, ordered second. It derives the tests the plan owes from its Proposed Changes and the owning LLD, and writes
|
|
68
|
+
**After `boundary` passes and its amendments are folded, invoke the `test-plan` skill** — same plan gate, ordered second. It derives the tests the plan owes from its Proposed Changes and the owning LLD, and writes the **Test Obligations** ledger into the plan (one row per promised behavior: layer · target file · oracle · fixtures). It writes no test files — the ledger is what the verification gate discharges, and because it lives in the plan file it survives dispatch to an executor that sees only the plan. On a boundary **BLOCK** it does not run — re-plan first. Layer rules and the e2e altitude gate live in the skill.
|
|
70
69
|
|
|
71
70
|
### Verification — prove before completing
|
|
72
71
|
|
|
73
|
-
**Deferring tests is what keeps the build loop fast, and the ledger is what makes deferring safe.** A plan-driven build writes no test files while the code is taking shape;
|
|
72
|
+
**Deferring tests is what keeps the build loop fast, and the ledger is what makes deferring safe.** A plan-driven build writes no new test files while the code is taking shape; obligations accumulate in the plan and are discharged in one pass at the **verification gate** — user-triggered, offered when implementation completes, mandatory before `Status: Complete`. The gate, the two regimes, the mid-loop rules, and what earns a durable test are `.claude/rules/verification.md`.
|
|
74
73
|
|
|
75
|
-
- **Only a plan may defer.** A bug fix and any ad-hoc change ship their test immediately — deferral needs a ledger and a gate, and non-plan work has neither.
|
|
74
|
+
- **Only a plan may defer.** A bug fix in shipped behavior and any ad-hoc change ship their test immediately — deferral needs a ledger and a gate, and non-plan work has neither.
|
|
76
75
|
- **Drive the real surface before pinning tests.** Browser automation for web UI, the real CLI, HTTP against the running worker; the suite pins what must not regress afterward.
|
|
77
|
-
- **The gate
|
|
76
|
+
- **The gate's verdict is never delegated** — a sub-agent's summary is not verifiable ground truth (the Fan-out guardrail), and browser work is main-session-only where Runtime Notes say so.
|
|
78
77
|
|
|
79
78
|
### Documentation — close the loop
|
|
80
79
|
|
|
@@ -104,7 +103,7 @@ When recording a learning, ask: _is this true of this project, or true of this u
|
|
|
104
103
|
|
|
105
104
|
## Changelog
|
|
106
105
|
|
|
107
|
-
|
|
106
|
+
The working session is the last holder of the refinement context that produced a change — asks, iterations, rejections, skill outcomes, discoveries. The changelog captures it; the `retro` agent distills it on demand. A commit marks the user's acceptance of the work it carries — for plan work, behavioral verification is the gate's job, and a mid-plan commit is a checkpoint (the `verification` rule). The `changelog` rule carries the trigger and the lifecycle; this is the policy:
|
|
108
107
|
|
|
109
108
|
- **Every non-mechanical commit is covered by an entry** at `docs/history/changelog/YYYY-MM-DD-{three-words}.md`, staged inside the commit it describes — whatever tool or session performs the commit — plus a row in `docs/history/CHANGELOG.md`. Format, required fields, and the closed exemption list are the `documentation` skill's `templates/changelog-entry.md`; the failure fields (rejected attempts, overridden skill output) and verbatim taste quotes are required, not optional — the entry's value concentrates there.
|
|
110
109
|
- **An entry may exist before its commit.** A plan reaching `Status: Complete` writes its entry as a **draft** immediately, while the context is fresh; the commit fills what the draft left open. **Immutability begins at commit, not creation** — a draft is mutable, a committed entry never is, and a correction is a new entry that links back. Doc-health passes skip the genre.
|
|
@@ -117,7 +116,7 @@ A commit marks the user's behavioral verification of the work, and the working s
|
|
|
117
116
|
|
|
118
117
|
## Out-of-Scope Discovery
|
|
119
118
|
|
|
120
|
-
When a plan's implementation surfaces work that is important but outside the plan's scope:
|
|
119
|
+
When a plan's implementation surfaces work that is important but outside the plan's scope and is not being done now (a pre-existing bug being fixed on the spot is the bug-fix regime — the `verification` rule — not a backlog item):
|
|
121
120
|
|
|
122
121
|
- Append it to `docs/history/backlog.md` under the appropriate priority (P0-P3)
|
|
123
122
|
- Format: `- **[P1]** Description — discovered by [plan-name or agent-name]`
|
|
@@ -129,10 +128,10 @@ When a plan's implementation surfaces work that is important but outside the pla
|
|
|
129
128
|
|
|
130
129
|
Defaults — ❌ prohibitions hold unless the user explicitly asks otherwise; ✅ and ⚠️ items are standing policy:
|
|
131
130
|
|
|
132
|
-
- ✅ **Verification — batched at a gate, not continuous.** A plan-driven build loop ships code without
|
|
133
|
-
- **Only a plan defers**: a bug fix and any ad-hoc change ship their test immediately — a regression test that fails before the change and passes after.
|
|
131
|
+
- ✅ **Verification — batched at a gate, not continuous.** A plan-driven build loop ships code without new test files; the tests and the driven checks land together at the **verification gate** — user-triggered, offered when implementation completes, mandatory before a plan reaches `Status: Complete`. The gate, the regimes, and the mechanism ladder are `.claude/rules/verification.md`; framework, test-tree placement, and shared fixtures are `.claude/rules/testing.md` — the repo's existing runner and layout always win.
|
|
132
|
+
- **Only a plan defers**: a bug fix in shipped behavior and any ad-hoc change ship their test immediately — a regression test that fails before the change and passes after.
|
|
134
133
|
- **Drive before pinning**: prove the change in the real product first — browser automation for web UI, the real CLI, HTTP against the running worker — then pin as suite tests only the behaviors that must not regress.
|
|
135
|
-
- **Discipline**: run the affected part of the suite at the gate and report results honestly.
|
|
134
|
+
- **Discipline**: run the affected part of the suite at the gate and report results honestly. Never weaken, skip, or delete a test to mask an unexplained failure — when a plan or LLD intentionally changes behavior, updating the affected tests to the new contract is part of the change.
|
|
136
135
|
- **Throwaway checks are not tests**: temporary verification scripts go to scratch space and are deleted, never committed into the test tree.
|
|
137
136
|
- ❌ **Dependencies** – Never upgrade frameworks, libraries, or dependencies.
|
|
138
137
|
- ❌ **Compatibility** – Never maintain backward compatibility unless specified.
|
|
@@ -140,7 +139,7 @@ Defaults — ❌ prohibitions hold unless the user explicitly asks otherwise;
|
|
|
140
139
|
- ❌ **Protected Files** – Before editing, if `docs/operations/protected-files.md` exists, read it and never modify any path it lists; also never modify `AGENTS.md` or the `protected-files.md` file itself.
|
|
141
140
|
- ✅ **Browser Automation** – If the runtime provides browser automation, use it freely; no need to ask first. If it doesn't — or the executing agent can't hold the browser connection (see Runtime Notes) — return a browser-verification checklist (URLs, actions, expected outcomes) for the orchestrating session or the user to run.
|
|
142
141
|
- ✅ **Fan-out is a tool, not a default** — the main session does the work and its own reasoning; a delegated result comes back as a summary, not verifiable ground truth. Delegate **only when** the work is large, independent, or repetitive enough that a self-contained hand-off (the sub-agent sees none of the conversation) costs less than the work — broad research, wide sweeps, audits — and run independent delegations in parallel. **Never delegate judgment by reflex**: a second opinion is for a high-stakes call or an explicit request. No dispatch mechanism ⇒ inline.
|
|
143
|
-
- ⚠️ **Plans** – Plans are created directly in `docs/history/plans/` (see Workflows). Once `Status: Complete` or `Status: Abandoned`, the file is frozen — never edited. If scope changes after completion, write a new dated plan that links back to the old one.
|
|
142
|
+
- ⚠️ **Plans** – Plans are created directly in `docs/history/plans/` (see Workflows). Once `Status: Complete` or `Status: Abandoned`, the file is frozen — never edited. Abandoning a plan whose code was committed first converts its undischarged Test Obligations into backlog items (the `verification` rule). If scope changes after completion, write a new dated plan that links back to the old one.
|
|
144
143
|
- ⚠️ **Tool Issues** – If any CLI tool, shell alias, or MCP tool behaves unexpectedly (syntax errors, silent failures, wrong defaults), report the exact tool name, command, and error to the user so they can fix or remove the underlying library.
|
|
145
144
|
|
|
146
145
|
---
|
|
@@ -8,19 +8,31 @@
|
|
|
8
8
|
|
|
9
9
|
| Regime | During the work | Proven |
|
|
10
10
|
| --- | --- | --- |
|
|
11
|
-
| **Plan-driven build** | No test files. Code only — the loop stays fast | At the verification gate, before `Status: Complete` |
|
|
12
|
-
| **Bug fix** | The regression test ships with the fix | Immediately — it fails before the change, passes after |
|
|
11
|
+
| **Plan-driven build** | No new test files. Code only — the loop stays fast | At the verification gate, before `Status: Complete` |
|
|
12
|
+
| **Bug fix** — a defect in shipped behavior | The regression test ships with the fix | Immediately — it fails before the change, passes after |
|
|
13
13
|
| **Ad-hoc / non-plan change** | The test ships with the change | Immediately, same discipline as a bug fix |
|
|
14
14
|
|
|
15
|
-
- **A bug fix cannot defer, because
|
|
16
|
-
- **Ad-hoc work cannot defer, because there is no ledger to defer into.** An obligation recorded nowhere is an obligation forgotten
|
|
15
|
+
- **A bug fix cannot defer, because "fails before, passes after" is provable afterward only by reverting to the pre-fix ref** — a cost nobody pays, so the property is captured at fix time or lost.
|
|
16
|
+
- **Ad-hoc work cannot defer, because there is no ledger to defer into.** An obligation recorded nowhere is an obligation forgotten. A non-plan change that alters no promised behavior — a pure refactor, a rename — owes no test: the implementer applies § What earns a durable test directly.
|
|
17
|
+
|
|
18
|
+
## During the loop
|
|
19
|
+
|
|
20
|
+
Rules for the plan regime between the plan gate and the verification gate:
|
|
21
|
+
|
|
22
|
+
- **No new test files** — obligations wait in the ledger.
|
|
23
|
+
- **Existing tests broken by the plan's intended behavior change are updated to the new contract before any mid-plan commit** — the shared branch never carries a red suite, and an update is never a weakening (§ What earns a durable test).
|
|
24
|
+
- **A defect in the plan's own in-flux code is the loop iterating** — no test, no ledger row; the behavior it belongs to is already in the ledger. **A pre-existing bug in shipped behavior is the bug-fix regime even mid-plan**: fix it with its regression test now — deferring it to the gate loses "fails before", the property the regime exists to capture — or, when not fixing it now, send it to the backlog via Out-of-Scope Discovery. Never fix silently.
|
|
25
|
+
- **The ledger is amendable while the plan is open** — a boundary finding or a newly promised behavior appends a row; the gate discharges whatever the ledger holds at gate time.
|
|
26
|
+
- **A mid-plan commit is a checkpoint, not a verification claim.** It may ship deliberately unverified code; the gate, not the commit, is the verification event for plan work.
|
|
17
27
|
|
|
18
28
|
## The gate
|
|
19
29
|
|
|
20
|
-
**The gate is a discrete
|
|
30
|
+
**The gate is a discrete, user-triggered step.** When implementation is complete, report it and offer the gate — never run it unbidden, and never flip `Status: Complete` without it. A plan with outstanding obligations stays open, whatever the code does.
|
|
21
31
|
|
|
22
|
-
- **
|
|
23
|
-
- **
|
|
32
|
+
- **Precondition: the ledger exists.** A plan with no Test Obligations section is blocked at the gate — run the `test-plan` skill on it first. Without this check an empty ledger passes vacuously and the gap surfaces only after the file is frozen.
|
|
33
|
+
- **Every row is discharged into exactly one outcome**: **satisfied** (the test exists and is green, or the driven check passed), **owes nothing** (with the reason — compiler-guarded, covered elsewhere), or **blocked** (the missing infrastructure named, the row converted to a backlog item so the debt outlives the frozen plan). A row left unexamined blocks the gate.
|
|
34
|
+
- **The gate's verdict is never delegated.** A sub-agent's summary is not verifiable ground truth, and where browser work is main-session-only (the root `CLAUDE.md` § Runtime Notes), the driving is too. Fan-out may prepare fixtures or draft test bodies; the driving and the verdict stay inline.
|
|
35
|
+
- **Abandonment does not erase debt.** Before `Status: Abandoned` freezes a plan whose code was committed, convert its undischarged rows into backlog items; uncommitted code owes nothing.
|
|
24
36
|
- **Report what happened, including failures.** A gate that reports green while a suite is red is worse than no gate; state the failing test and its output.
|
|
25
37
|
|
|
26
38
|
## The mechanism ladder
|
|
@@ -31,9 +43,10 @@
|
|
|
31
43
|
| --- | --- | --- |
|
|
32
44
|
| 1 | **Drive the real surface** — browser automation for web UI, the actual CLI binary, HTTP against the running worker | The change works in the product, against real wiring |
|
|
33
45
|
| 2 | **Pin the durable behaviors** as suite tests per [`testing.md`](testing.md) | The behavior survives the next change |
|
|
34
|
-
| 3 | **Run the affected suite
|
|
46
|
+
| 3 | **Run the affected suite**, plus the project's e2e smoke gate where one is wired | Nothing else broke |
|
|
35
47
|
|
|
36
|
-
- **Browser automation is the default for a web surface, and needs no permission to use** — a rendered page driven through real interaction is the only oracle that catches wiring, styling, and state defects together.
|
|
48
|
+
- **Browser automation is the default for a web surface, and needs no permission to use** — a rendered page driven through real interaction is the only oracle that catches wiring, styling, and state defects together.
|
|
49
|
+
- **Where the runtime offers no browser automation**, rung 1's verdict belongs to the user: emit a browser-verification checklist (URLs, actions, expected outcomes), the user runs it and reports, the result lands in the changelog entry — and `Status: Complete` waits for it.
|
|
37
50
|
- **A driven check is evidence, not an artifact.** It proves the change works today; it leaves nothing behind. That is why rung 2 exists.
|
|
38
51
|
|
|
39
52
|
## What earns a durable test
|
|
@@ -78,7 +78,8 @@ The two guarantees are complementary and both break on mixing: a reader holding
|
|
|
78
78
|
| Scaffold a standard doc (docs index, `structure.md`, CHANGELOG, backlog, memory) | [`templates/Readme.md`](templates/Readme.md) — the index names each scaffold file |
|
|
79
79
|
| Derive/update a feature doc's `owns:` | [`references/frontmatter.md`](references/frontmatter.md) |
|
|
80
80
|
| Update existing doc | § Editing an existing doc (below) |
|
|
81
|
-
| Instruction file (`CLAUDE.md`, a rule, an agent, skill prose) |
|
|
81
|
+
| Instruction file (`CLAUDE.md`, a rule, an agent, skill prose) | [`references/instruction-style.md`](references/instruction-style.md) — not these templates; every-load prose stays lean, and the present-tense rule still applies |
|
|
82
|
+
| Author or restructure a **skill** (fit, triggers, shape, anatomy, shipping) | The skill-authoring field guide — the `etna` repo (`nurixlabs/etna`), folder `docs/architecture/skills/playbook/`, chapters `00`–`10`. **No etna checkout available ⇒ ask the user for access to the etna repo, or proceed from first principles** with [`references/instruction-style.md`](references/instruction-style.md) governing the prose. This row is the only place the playbook is referenced |
|
|
82
83
|
| **No template matches** | [`references/untemplated.md`](references/untemplated.md) — shape decisions + the co-authoring workflow |
|
|
83
84
|
|
|
84
85
|
---
|
|
@@ -123,6 +124,7 @@ A feature doc carries ownership frontmatter — `owns:` (required), `module:` (o
|
|
|
123
124
|
| --- | --- |
|
|
124
125
|
| `templates/` | One file per template, indexed by [`Readme.md`](templates/Readme.md) — feature (LLD), changelog, plan, AD, steering docs, API reference, environment registry, operations procedure, migration runbook, protected files, READMEs, and the baseline scaffolds |
|
|
125
126
|
| `references/style-guide.md` | Writing rules, formatting conventions, the two-natures tense rules |
|
|
127
|
+
| `references/instruction-style.md` | The style for instruction files (`CLAUDE.md`, rules, agents, skill prose) — the every-line test, armor vs. narration, voice, negative space |
|
|
126
128
|
| `references/frontmatter.md` | Deriving a feature doc's `owns:` / `module:` / `keywords:` / `status:` from code |
|
|
127
129
|
| `references/untemplated.md` | How to write a document no template covers (nature, placement, shape) + the co-authoring workflow |
|
|
128
130
|
| `references/examples.md` | Good vs bad documentation examples |
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
# Instruction-File Style
|
|
2
|
+
|
|
3
|
+
The shared style for every file an agent obeys — a `CLAUDE.md`, a rule, an agent definition, skill prose. Prose style only: frontmatter is metadata, not style. Docs-tree documents follow the skill's templates and [`style-guide.md`](style-guide.md) instead.
|
|
4
|
+
|
|
5
|
+
## The test for every line
|
|
6
|
+
|
|
7
|
+
An instruction file is paid for whenever it loads, scaled by its load class: `CLAUDE.md` and rules load on **every turn of every session** — the most expensive prose in a repo per word; an agent definition loads per dispatch, a skill per invocation. The bar is not "is this true?" but **"must this be in front of the agent whenever this file loads?"** Measure weight in tokens, not lines; trim biggest-first on every edit.
|
|
8
|
+
|
|
9
|
+
**Rewriting, the test is armor vs. narration.** A reason clause either blocks a move an agent would otherwise make — the failure is counter-intuitive, the wrong fix looks correct, or the rule reads as arbitrary tidiness and gets "improved away" — or it explains the self-evident. Ask of each: *does the forbidden move look correct to an agent mid-task?* Keep the first kind, cut the second. **A constraint may lose its explanation; it may never lose its existence** — compression is fewer words for the same constraints, so a passage that cannot shrink without dropping one stays long.
|
|
10
|
+
|
|
11
|
+
## Coherence
|
|
12
|
+
|
|
13
|
+
A rewrite is not only a trim — read the file as one artifact and fix what disagrees or is missing:
|
|
14
|
+
|
|
15
|
+
- **Two statements of one fact agree, or become one.** A defaults block vs. the worked example beside it, a table row vs. a bullet — reconcile against the code the rule governs and keep one canonical statement; a silent disagreement is worse than either version alone, because each reader picks a different one.
|
|
16
|
+
- **Every cross-reference resolves** — the cited `§`, sibling file, or command exists and still says what the citation claims. Section numbers are a public surface other files cite: append, never reshuffle.
|
|
17
|
+
- **The body delivers what the scope line promises, and nothing it disclaims.** A topic named then left to guesswork is a hole; material the scope routes elsewhere is a leak.
|
|
18
|
+
- **Report what you cannot fix.** A defect outside the file — a stale sibling, an unshipped copy — is named in the handback, never fixed by widening the edit.
|
|
19
|
+
|
|
20
|
+
## Two genres, one style
|
|
21
|
+
|
|
22
|
+
Policy files (`CLAUDE.md`, rules) are declarative — assertion bullets and tables, no second person. Agent and skill bodies are procedures — second person, numbered steps, one observable action per step. The genre sets the shape; everything below applies to both.
|
|
23
|
+
|
|
24
|
+
## Routing
|
|
25
|
+
|
|
26
|
+
- **Link, don't copy — one canonical source per topic.** `CLAUDE.md` is a **router, not a manual**: per workflow, when to enter, what to dispatch, where the output lands — mechanics live in the agent or skill file, which loads only when it runs.
|
|
27
|
+
- **Cut generic engineering advice.** Agents already know how to code; keep only what is true of *this* stack and not derivable by looking at it.
|
|
28
|
+
- **Keep load-bearing rules even when project-specific.** Genericizing is for reference material, not guardrails — deleting a hard rule removes a constraint the agent will otherwise violate.
|
|
29
|
+
|
|
30
|
+
## Voice
|
|
31
|
+
|
|
32
|
+
- **Assertion — reason, in one breath.** "**Never name a deployed-value file `.env`** — the dev server auto-loads a root `.env` as local vars, so a prod-valued `.env` silently becomes the local environment." The reason is the rule's armor: an agent that knows the failure mode won't "improve" the rule away; a bare imperative invites second-guessing.
|
|
33
|
+
- **A reason appears once — at the rule it armors.** "One breath" caps a reason's length, not its multiplicity: the same rationale in the scope line, a section intro, and a bullet is the restatement trimming exists to remove. A convention whose only reason is consistency states that once, in the scope line.
|
|
34
|
+
- **One example, carrying every point it can — never a second example of the same point.** An example calibrates a rule an agent would otherwise read loosely; a second one demonstrating the same rule is restatement in costume. Prefer one worked case rich enough for several rules to cite over a fresh citation per bullet.
|
|
35
|
+
- **Grade the bindingness with words.** Bold **never / always / only / must** for hard constraints; "prefer", "default", "acceptable when" for defaults — and every escape hatch states its trigger and its price.
|
|
36
|
+
- **Absolute present tense.** Describe the current design as if it had always been the plan — no "previously", no version narration, no stale-reference tripwires, no progress markers. When something moves or is removed, fix every reference and state only the present fact; the journey lives in git history and `docs/history/`. (Docs-tree tense rules: [`style-guide.md`](style-guide.md) § The Two Natures.)
|
|
37
|
+
|
|
38
|
+
## Negative space
|
|
39
|
+
|
|
40
|
+
- **Name the rejected alternative.** A package table carries a **Don't use** column because an agent that knows the popular alternative reaches for it unless the file closes the door by name.
|
|
41
|
+
- **Pre-empt the workaround.** Where a failure predictably triggers improvisation, spell out the forbidden moves and the exact stop-and-report. The umbrella: **no silent fallback** — fail loudly rather than route around.
|
|
42
|
+
|
|
43
|
+
## Material & mechanics
|
|
44
|
+
|
|
45
|
+
- **Tables for enumerable facts, prose for judgment.** One row per item kills the urge to explain; anything that needs a *because* lives in prose around the table, never inside a cell.
|
|
46
|
+
- **No ASCII diagrams.** A box-and-arrow diagram costs many tokens for what a sentence or a small table carries.
|
|
47
|
+
- Inline-code every identifier, filename, command, and config key.
|
|
48
|
+
- ❌ / ✅ only inside banned/blessed lists, not as general decoration.
|
|
49
|
+
- `>` blockquotes set off interruptions — cross-pointers, callouts, agent guards — not the main line.
|
|
@@ -229,6 +229,17 @@ Use for structured info:
|
|
|
229
229
|
|
|
230
230
|
---
|
|
231
231
|
|
|
232
|
+
## Self-Contained Documents & References
|
|
233
|
+
|
|
234
|
+
Two verbosity regimes, split by who pays for the words. **Instruction files** (`CLAUDE.md`, rules, agents, skill prose) load into an agent's context on every turn or invocation — they stay lean, per [`instruction-style.md`](instruction-style.md). **Documents** are read on demand, by humans and agents alike — they are written **verbose and self-contained**, and the cost of a reader hopping files exceeds the cost of extra words on the page.
|
|
235
|
+
|
|
236
|
+
- **The body reads whole without opening another file.** Restate the one or two sentences of context a borrowed concept needs, right where it's used — a reader forced mid-paragraph into a second document loses the thread of the first.
|
|
237
|
+
- **Restate for readability, cite for authority — never fork the fact.** A changing detail (a version, a count, a path list) keeps one canonical home; the restatement carries what the page needs to be understood and points at the authority for the rest. Link-don't-copy governs where a fact is *owned*, not how readable the page that uses it must be.
|
|
238
|
+
- **Inline links are the minimum that action requires.** Link mid-prose only where the reader must go there to act on this page. Every other sister document — everything the topic touches — belongs in one **Related** (or **References**) section at the document's end.
|
|
239
|
+
- **The Related tail is the document's entire link surface.** Deep relative paths (`../../../../…`) are fragile — a folder move breaks every one — so they are confined to that one block, where a path change touches one place; body mentions use the plain name (`the boundary skill`, `structure.md`) instead of a link.
|
|
240
|
+
|
|
241
|
+
---
|
|
242
|
+
|
|
232
243
|
## The Two Natures — Tense & History
|
|
233
244
|
|
|
234
245
|
Every document is a **truth document** (states current absolutes, updated in place) or a **record** (dated account of activity, frozen or append-only) — see `SKILL.md` § The Two Natures. The tense rules follow directly:
|
|
@@ -15,7 +15,7 @@ An entry is not a summary line. Its value concentrates in the fields a diff cann
|
|
|
15
15
|
- **Ask:** {what the user asked, compressed — taste and preference statements quoted verbatim}
|
|
16
16
|
- **Iterations:** {N} · rejected: {what was rejected and why} | none
|
|
17
17
|
- **Skills:** {skill}@{version} — survived | partially survived | overridden ({why, briefly}) | none used
|
|
18
|
-
- **Change:** {added/changed X, which does Y, because Z — behavior first, mechanism second}
|
|
18
|
+
- **Change:** {added/changed X, which does Y, because Z — behavior first, mechanism second. Plan-linked entries also carry the verification gate's results here: rows discharged, suite outcome, anything blocked}
|
|
19
19
|
- **Discovered:** {non-obvious fact learned by running the product — environment quirk, platform ceiling, seam behavior, dependency constraint} | none
|
|
20
20
|
- **Class:** {one or more keywords — suggestive vocabulary, not a closed enum; see Field rules}
|
|
21
21
|
- **Pin:** {enforced artifact written in this entry's commit: test / token / guardrail / schema} | none — candidate: {what should hold it}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
# Plan (docs/history/plans/YYYY-MM-DD-feature-name.md)
|
|
2
2
|
|
|
3
|
-
Record. Use for: every implementation plan. Plans are created here directly with `Status: Draft`,
|
|
3
|
+
Record. Use for: every implementation plan. Plans are created here directly with `Status: Draft`; after approval the plan gates (`boundary`, then `test-plan`) run against the still-`Draft` file, the status flips to `Status: In Progress` at the first implementation step, and the file freezes at `Status: Complete` or `Status: Abandoned`. Once frozen, never edit — write a new dated plan if scope changes. The plan records the journey; the truth it implemented lives on in the feature doc and any AD it touched.
|
|
4
4
|
|
|
5
|
-
The `boundary` skill parses the **Proposed Changes** sections to check boundary impact before execution. Keep that structure stable — section headings and bullet shape are load-bearing for the
|
|
5
|
+
The `boundary` skill parses the **Proposed Changes** sections to check boundary impact before execution, and the `test-plan` skill writes a **Test Obligations** section into the plan at the same gate. Keep that structure stable — section headings and bullet shape are load-bearing for the parsers, and the Test Obligations table is the ledger the verification gate discharges before the plan may reach `Status: Complete`.
|
|
6
6
|
|
|
7
7
|
```
|
|
8
8
|
# {Feature Name}
|
|
@@ -47,11 +47,18 @@ Why this work is happening *now*. Link to the spec for *what* we're building; th
|
|
|
47
47
|
2. Each step ends with something verifiable
|
|
48
48
|
3. ...
|
|
49
49
|
|
|
50
|
+
## Test Obligations
|
|
51
|
+
|
|
52
|
+
<!-- Written by the `test-plan` skill at the plan gate (after `boundary`). One row per
|
|
53
|
+
promised behavior: layer · target file · oracle · fixtures. Amendable while the
|
|
54
|
+
plan is open; discharged at the verification gate. Do not hand-author. -->
|
|
55
|
+
|
|
50
56
|
## Done Criteria
|
|
51
57
|
|
|
52
|
-
- [ ] Implementation complete
|
|
58
|
+
- [ ] Implementation complete
|
|
59
|
+
- [ ] Verification gate passed — every Test Obligations row discharged (satisfied / owes nothing / blocked → backlog), gate run date and results noted here
|
|
53
60
|
- [ ] Affected docs updated (use the injected ownership index to find them)
|
|
54
|
-
- [ ] Changelog entry created in `docs/history/changelog
|
|
61
|
+
- [ ] Changelog entry created in `docs/history/changelog/`, carrying the gate's results
|
|
55
62
|
- [ ] Plan marked `Status: Complete`, **Completed:** date filled
|
|
56
63
|
|
|
57
64
|
## Open Questions
|
|
@@ -5,7 +5,7 @@ description: "Use when deriving the tests a plan owes. Test-obligation diagnosti
|
|
|
5
5
|
|
|
6
6
|
# Test-Obligation Diagnostic
|
|
7
7
|
|
|
8
|
-
You derive the tests an implementation plan owes, and pin them into the plan as an explicit, reviewable manifest — at the same gate `boundary` runs, ordered second. You never write a test file; you
|
|
8
|
+
You derive the tests an implementation plan owes, and pin them into the plan as an explicit, reviewable manifest — at the same gate `boundary` runs, ordered second. You never write a test file; you write the **ledger the verification gate discharges** (`.claude/rules/verification.md`), so the gate proves a checklist instead of a vibe, and so a later doc-health pass can prove the tests match the promises.
|
|
9
9
|
|
|
10
10
|
**The litmus is "which promise, at which altitude, proven by what?"** A plan promises behavior (an LLD's `owns:` surface does X); each promise earns exactly one test at the cheapest layer that can actually prove it. Spend your reading deciding the *layer* and the *oracle*, not on prose.
|
|
11
11
|
|
|
@@ -34,7 +34,7 @@ Assign each behavior the **cheapest layer that can prove it**, then name the ora
|
|
|
34
34
|
|
|
35
35
|
- **unit** — a pure function / reducer / validator. Oracle: return value, thrown error.
|
|
36
36
|
- **component** — a UI unit's behavior in isolation (a widget, form, panel). Oracle: rendered role/text, emitted event. Runner: the stack's component runner per `testing.md`.
|
|
37
|
-
- **integration** — a route/handler against a real in-memory datastore via the app instance (not a mock of what you own). Oracle: response envelope shape, status code, the row actually written. **This is the default for server behavior** — most obligations land here, and this layer is the one the
|
|
37
|
+
- **integration** — a route/handler against a real in-memory datastore via the app instance (not a mock of what you own). Oracle: response envelope shape, status code, the row actually written. **This is the default for server behavior** — most obligations land here, and this layer is the one the `test` script / CI runs.
|
|
38
38
|
- **e2e** — see the altitude gate below.
|
|
39
39
|
|
|
40
40
|
Error paths, races, and idempotency are obligations too, and they belong at **integration** with injected faults (network mock, the runner's fake timers, a forced constraint) — a process driving a live product cannot reliably *produce* them, so they are never an e2e obligation.
|
|
@@ -48,7 +48,7 @@ An e2e obligation (a scenario in the project's e2e tree per `testing.md`) is ear
|
|
|
48
48
|
|
|
49
49
|
## Run
|
|
50
50
|
|
|
51
|
-
**Input:** a plan path (given, or the newest in `docs/history/plans/`), already boundary-checked with amendments folded. For a non-plan diff in test-worthy code, the hunks stand in for Proposed Changes.
|
|
51
|
+
**Input:** a plan path (given, or the newest in `docs/history/plans/`), already boundary-checked with amendments folded. For a non-plan diff in test-worthy code, the hunks stand in for Proposed Changes — but the derived obligations are paid **immediately**, not deferred: only a plan has a ledger and a gate, so for a diff your output is the checklist the implementer satisfies now.
|
|
52
52
|
|
|
53
53
|
1. **Build the behavior list.** From the plan's Proposed Changes + the owning LLD's promised behavior, list the behaviors this plan introduces or changes. Fold in each HIGH/CRITICAL boundary finding as a regression obligation. Note behaviors a type or the compiler already guards — those owe **no** test (the boundary litmus, inverted: if it can't ship green-but-broken, it needs no test).
|
|
54
54
|
|
|
@@ -74,7 +74,7 @@ An e2e obligation (a scenario in the project's e2e tree per `testing.md`) is ear
|
|
|
74
74
|
|
|
75
75
|
## Rules
|
|
76
76
|
|
|
77
|
-
- **Manifest only.** You write the Test Obligations section into the plan and a chat summary. You write **no** test files and **no** `docs/tests/` checklist — those are
|
|
77
|
+
- **Manifest only.** You write the Test Obligations section into the plan and a chat summary. You write **no** test files and **no** `docs/tests/` checklist — those are verification-gate-time and Completion-time, owned by others.
|
|
78
78
|
- **Every obligation names its LLD promise.** No promise, no obligation source — trace it or drop it. This is the anti-drift pin.
|
|
79
79
|
- **Cheapest proving layer wins.** Do not obligate an e2e scenario for what an integration test proves, or an integration test for what a unit test proves.
|
|
80
80
|
- **e2e only above the cross-process bar, and only while the smoke gate runs.** Otherwise the obligation is a blocked row naming the missing gate.
|
|
@@ -78,7 +78,8 @@ The two guarantees are complementary and both break on mixing: a reader holding
|
|
|
78
78
|
| Scaffold a standard doc (docs index, `structure.md`, CHANGELOG, backlog, memory) | [`templates/Readme.md`](templates/Readme.md) — the index names each scaffold file |
|
|
79
79
|
| Derive/update a feature doc's `owns:` | [`references/frontmatter.md`](references/frontmatter.md) |
|
|
80
80
|
| Update existing doc | § Editing an existing doc (below) |
|
|
81
|
-
| Instruction file (`CLAUDE.md`, a rule, an agent, skill prose) |
|
|
81
|
+
| Instruction file (`CLAUDE.md`, a rule, an agent, skill prose) | [`references/instruction-style.md`](references/instruction-style.md) — not these templates; every-load prose stays lean, and the present-tense rule still applies |
|
|
82
|
+
| Author or restructure a **skill** (fit, triggers, shape, anatomy, shipping) | The skill-authoring field guide — the `etna` repo (`nurixlabs/etna`), folder `docs/architecture/skills/playbook/`, chapters `00`–`10`. **No etna checkout available ⇒ ask the user for access to the etna repo, or proceed from first principles** with [`references/instruction-style.md`](references/instruction-style.md) governing the prose. This row is the only place the playbook is referenced |
|
|
82
83
|
| **No template matches** | [`references/untemplated.md`](references/untemplated.md) — shape decisions + the co-authoring workflow |
|
|
83
84
|
|
|
84
85
|
---
|
|
@@ -123,6 +124,7 @@ A feature doc carries ownership frontmatter — `owns:` (required), `module:` (o
|
|
|
123
124
|
| --- | --- |
|
|
124
125
|
| `templates/` | One file per template, indexed by [`Readme.md`](templates/Readme.md) — feature (LLD), changelog, plan, AD, steering docs, API reference, environment registry, operations procedure, migration runbook, protected files, READMEs, and the baseline scaffolds |
|
|
125
126
|
| `references/style-guide.md` | Writing rules, formatting conventions, the two-natures tense rules |
|
|
127
|
+
| `references/instruction-style.md` | The style for instruction files (`CLAUDE.md`, rules, agents, skill prose) — the every-line test, armor vs. narration, voice, negative space |
|
|
126
128
|
| `references/frontmatter.md` | Deriving a feature doc's `owns:` / `module:` / `keywords:` / `status:` from code |
|
|
127
129
|
| `references/untemplated.md` | How to write a document no template covers (nature, placement, shape) + the co-authoring workflow |
|
|
128
130
|
| `references/examples.md` | Good vs bad documentation examples |
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
# Instruction-File Style
|
|
2
|
+
|
|
3
|
+
The shared style for every file an agent obeys — a `CLAUDE.md`, a rule, an agent definition, skill prose. Prose style only: frontmatter is metadata, not style. Docs-tree documents follow the skill's templates and [`style-guide.md`](style-guide.md) instead.
|
|
4
|
+
|
|
5
|
+
## The test for every line
|
|
6
|
+
|
|
7
|
+
An instruction file is paid for whenever it loads, scaled by its load class: `CLAUDE.md` and rules load on **every turn of every session** — the most expensive prose in a repo per word; an agent definition loads per dispatch, a skill per invocation. The bar is not "is this true?" but **"must this be in front of the agent whenever this file loads?"** Measure weight in tokens, not lines; trim biggest-first on every edit.
|
|
8
|
+
|
|
9
|
+
**Rewriting, the test is armor vs. narration.** A reason clause either blocks a move an agent would otherwise make — the failure is counter-intuitive, the wrong fix looks correct, or the rule reads as arbitrary tidiness and gets "improved away" — or it explains the self-evident. Ask of each: *does the forbidden move look correct to an agent mid-task?* Keep the first kind, cut the second. **A constraint may lose its explanation; it may never lose its existence** — compression is fewer words for the same constraints, so a passage that cannot shrink without dropping one stays long.
|
|
10
|
+
|
|
11
|
+
## Coherence
|
|
12
|
+
|
|
13
|
+
A rewrite is not only a trim — read the file as one artifact and fix what disagrees or is missing:
|
|
14
|
+
|
|
15
|
+
- **Two statements of one fact agree, or become one.** A defaults block vs. the worked example beside it, a table row vs. a bullet — reconcile against the code the rule governs and keep one canonical statement; a silent disagreement is worse than either version alone, because each reader picks a different one.
|
|
16
|
+
- **Every cross-reference resolves** — the cited `§`, sibling file, or command exists and still says what the citation claims. Section numbers are a public surface other files cite: append, never reshuffle.
|
|
17
|
+
- **The body delivers what the scope line promises, and nothing it disclaims.** A topic named then left to guesswork is a hole; material the scope routes elsewhere is a leak.
|
|
18
|
+
- **Report what you cannot fix.** A defect outside the file — a stale sibling, an unshipped copy — is named in the handback, never fixed by widening the edit.
|
|
19
|
+
|
|
20
|
+
## Two genres, one style
|
|
21
|
+
|
|
22
|
+
Policy files (`CLAUDE.md`, rules) are declarative — assertion bullets and tables, no second person. Agent and skill bodies are procedures — second person, numbered steps, one observable action per step. The genre sets the shape; everything below applies to both.
|
|
23
|
+
|
|
24
|
+
## Routing
|
|
25
|
+
|
|
26
|
+
- **Link, don't copy — one canonical source per topic.** `CLAUDE.md` is a **router, not a manual**: per workflow, when to enter, what to dispatch, where the output lands — mechanics live in the agent or skill file, which loads only when it runs.
|
|
27
|
+
- **Cut generic engineering advice.** Agents already know how to code; keep only what is true of *this* stack and not derivable by looking at it.
|
|
28
|
+
- **Keep load-bearing rules even when project-specific.** Genericizing is for reference material, not guardrails — deleting a hard rule removes a constraint the agent will otherwise violate.
|
|
29
|
+
|
|
30
|
+
## Voice
|
|
31
|
+
|
|
32
|
+
- **Assertion — reason, in one breath.** "**Never name a deployed-value file `.env`** — the dev server auto-loads a root `.env` as local vars, so a prod-valued `.env` silently becomes the local environment." The reason is the rule's armor: an agent that knows the failure mode won't "improve" the rule away; a bare imperative invites second-guessing.
|
|
33
|
+
- **A reason appears once — at the rule it armors.** "One breath" caps a reason's length, not its multiplicity: the same rationale in the scope line, a section intro, and a bullet is the restatement trimming exists to remove. A convention whose only reason is consistency states that once, in the scope line.
|
|
34
|
+
- **One example, carrying every point it can — never a second example of the same point.** An example calibrates a rule an agent would otherwise read loosely; a second one demonstrating the same rule is restatement in costume. Prefer one worked case rich enough for several rules to cite over a fresh citation per bullet.
|
|
35
|
+
- **Grade the bindingness with words.** Bold **never / always / only / must** for hard constraints; "prefer", "default", "acceptable when" for defaults — and every escape hatch states its trigger and its price.
|
|
36
|
+
- **Absolute present tense.** Describe the current design as if it had always been the plan — no "previously", no version narration, no stale-reference tripwires, no progress markers. When something moves or is removed, fix every reference and state only the present fact; the journey lives in git history and `docs/history/`. (Docs-tree tense rules: [`style-guide.md`](style-guide.md) § The Two Natures.)
|
|
37
|
+
|
|
38
|
+
## Negative space
|
|
39
|
+
|
|
40
|
+
- **Name the rejected alternative.** A package table carries a **Don't use** column because an agent that knows the popular alternative reaches for it unless the file closes the door by name.
|
|
41
|
+
- **Pre-empt the workaround.** Where a failure predictably triggers improvisation, spell out the forbidden moves and the exact stop-and-report. The umbrella: **no silent fallback** — fail loudly rather than route around.
|
|
42
|
+
|
|
43
|
+
## Material & mechanics
|
|
44
|
+
|
|
45
|
+
- **Tables for enumerable facts, prose for judgment.** One row per item kills the urge to explain; anything that needs a *because* lives in prose around the table, never inside a cell.
|
|
46
|
+
- **No ASCII diagrams.** A box-and-arrow diagram costs many tokens for what a sentence or a small table carries.
|
|
47
|
+
- Inline-code every identifier, filename, command, and config key.
|
|
48
|
+
- ❌ / ✅ only inside banned/blessed lists, not as general decoration.
|
|
49
|
+
- `>` blockquotes set off interruptions — cross-pointers, callouts, agent guards — not the main line.
|
|
@@ -229,6 +229,17 @@ Use for structured info:
|
|
|
229
229
|
|
|
230
230
|
---
|
|
231
231
|
|
|
232
|
+
## Self-Contained Documents & References
|
|
233
|
+
|
|
234
|
+
Two verbosity regimes, split by who pays for the words. **Instruction files** (`CLAUDE.md`, rules, agents, skill prose) load into an agent's context on every turn or invocation — they stay lean, per [`instruction-style.md`](instruction-style.md). **Documents** are read on demand, by humans and agents alike — they are written **verbose and self-contained**, and the cost of a reader hopping files exceeds the cost of extra words on the page.
|
|
235
|
+
|
|
236
|
+
- **The body reads whole without opening another file.** Restate the one or two sentences of context a borrowed concept needs, right where it's used — a reader forced mid-paragraph into a second document loses the thread of the first.
|
|
237
|
+
- **Restate for readability, cite for authority — never fork the fact.** A changing detail (a version, a count, a path list) keeps one canonical home; the restatement carries what the page needs to be understood and points at the authority for the rest. Link-don't-copy governs where a fact is *owned*, not how readable the page that uses it must be.
|
|
238
|
+
- **Inline links are the minimum that action requires.** Link mid-prose only where the reader must go there to act on this page. Every other sister document — everything the topic touches — belongs in one **Related** (or **References**) section at the document's end.
|
|
239
|
+
- **The Related tail is the document's entire link surface.** Deep relative paths (`../../../../…`) are fragile — a folder move breaks every one — so they are confined to that one block, where a path change touches one place; body mentions use the plain name (`the boundary skill`, `structure.md`) instead of a link.
|
|
240
|
+
|
|
241
|
+
---
|
|
242
|
+
|
|
232
243
|
## The Two Natures — Tense & History
|
|
233
244
|
|
|
234
245
|
Every document is a **truth document** (states current absolutes, updated in place) or a **record** (dated account of activity, frozen or append-only) — see `SKILL.md` § The Two Natures. The tense rules follow directly:
|
|
@@ -15,7 +15,7 @@ An entry is not a summary line. Its value concentrates in the fields a diff cann
|
|
|
15
15
|
- **Ask:** {what the user asked, compressed — taste and preference statements quoted verbatim}
|
|
16
16
|
- **Iterations:** {N} · rejected: {what was rejected and why} | none
|
|
17
17
|
- **Skills:** {skill}@{version} — survived | partially survived | overridden ({why, briefly}) | none used
|
|
18
|
-
- **Change:** {added/changed X, which does Y, because Z — behavior first, mechanism second}
|
|
18
|
+
- **Change:** {added/changed X, which does Y, because Z — behavior first, mechanism second. Plan-linked entries also carry the verification gate's results here: rows discharged, suite outcome, anything blocked}
|
|
19
19
|
- **Discovered:** {non-obvious fact learned by running the product — environment quirk, platform ceiling, seam behavior, dependency constraint} | none
|
|
20
20
|
- **Class:** {one or more keywords — suggestive vocabulary, not a closed enum; see Field rules}
|
|
21
21
|
- **Pin:** {enforced artifact written in this entry's commit: test / token / guardrail / schema} | none — candidate: {what should hold it}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
# Plan (docs/history/plans/YYYY-MM-DD-feature-name.md)
|
|
2
2
|
|
|
3
|
-
Record. Use for: every implementation plan. Plans are created here directly with `Status: Draft`,
|
|
3
|
+
Record. Use for: every implementation plan. Plans are created here directly with `Status: Draft`; after approval the plan gates (`boundary`, then `test-plan`) run against the still-`Draft` file, the status flips to `Status: In Progress` at the first implementation step, and the file freezes at `Status: Complete` or `Status: Abandoned`. Once frozen, never edit — write a new dated plan if scope changes. The plan records the journey; the truth it implemented lives on in the feature doc and any AD it touched.
|
|
4
4
|
|
|
5
|
-
The `boundary` skill parses the **Proposed Changes** sections to check boundary impact before execution. Keep that structure stable — section headings and bullet shape are load-bearing for the
|
|
5
|
+
The `boundary` skill parses the **Proposed Changes** sections to check boundary impact before execution, and the `test-plan` skill writes a **Test Obligations** section into the plan at the same gate. Keep that structure stable — section headings and bullet shape are load-bearing for the parsers, and the Test Obligations table is the ledger the verification gate discharges before the plan may reach `Status: Complete`.
|
|
6
6
|
|
|
7
7
|
```
|
|
8
8
|
# {Feature Name}
|
|
@@ -47,11 +47,18 @@ Why this work is happening *now*. Link to the spec for *what* we're building; th
|
|
|
47
47
|
2. Each step ends with something verifiable
|
|
48
48
|
3. ...
|
|
49
49
|
|
|
50
|
+
## Test Obligations
|
|
51
|
+
|
|
52
|
+
<!-- Written by the `test-plan` skill at the plan gate (after `boundary`). One row per
|
|
53
|
+
promised behavior: layer · target file · oracle · fixtures. Amendable while the
|
|
54
|
+
plan is open; discharged at the verification gate. Do not hand-author. -->
|
|
55
|
+
|
|
50
56
|
## Done Criteria
|
|
51
57
|
|
|
52
|
-
- [ ] Implementation complete
|
|
58
|
+
- [ ] Implementation complete
|
|
59
|
+
- [ ] Verification gate passed — every Test Obligations row discharged (satisfied / owes nothing / blocked → backlog), gate run date and results noted here
|
|
53
60
|
- [ ] Affected docs updated (use the injected ownership index to find them)
|
|
54
|
-
- [ ] Changelog entry created in `docs/history/changelog
|
|
61
|
+
- [ ] Changelog entry created in `docs/history/changelog/`, carrying the gate's results
|
|
55
62
|
- [ ] Plan marked `Status: Complete`, **Completed:** date filled
|
|
56
63
|
|
|
57
64
|
## Open Questions
|
|
@@ -101,7 +101,7 @@ Invoke the `boundary` skill after a plan is approved and before its first implem
|
|
|
101
101
|
|
|
102
102
|
### Documentation — close the loop
|
|
103
103
|
|
|
104
|
-
- **Every markdown document goes through the `documentation` skill.** Before creating or substantively editing any `.md` document — a doc, a README, an index, a record — invoke the `documentation` skill and apply its templates and `references/style-guide.md` (truth documents present-tense; history only in records). Instruction files — `CLAUDE.md`, rules, agents, skills — follow [`
|
|
104
|
+
- **Every markdown document goes through the `documentation` skill.** Before creating or substantively editing any `.md` document — a doc, a README, an index, a record — invoke the `documentation` skill and apply its templates and `references/style-guide.md` (truth documents present-tense; history only in records). Instruction files — `CLAUDE.md`, rules, agents, skills — follow the skill's [`references/instruction-style.md`](skills/documentation/references/instruction-style.md) instead.
|
|
105
105
|
- **[override]** Keep `docs/` updated when a change alters documented behaviour — creating and updating docs is part of the work.
|
|
106
106
|
- After plan completion **[override]**: write the `docs/history/changelog/` entry as a **draft** immediately, while the context is fresh — no confirmation needed — and append its `docs/history/CHANGELOG.md` row; the commit fills what the draft left open and freezes it. Non-plan work needs no separate prompt: every non-exempt commit carries its own entry (the `changelog` rule).
|
|
107
107
|
- When moving or renaming a component: update the `owns:` globs of the feature doc that owns it so the ownership index stays accurate. A new doc that owns code declares its paths in its own `owns:` frontmatter.
|
|
@@ -78,7 +78,8 @@ The two guarantees are complementary and both break on mixing: a reader holding
|
|
|
78
78
|
| Scaffold a standard doc (docs index, `structure.md`, CHANGELOG, backlog, memory) | [`templates/Readme.md`](templates/Readme.md) — the index names each scaffold file |
|
|
79
79
|
| Derive/update a feature doc's `owns:` | [`references/frontmatter.md`](references/frontmatter.md) |
|
|
80
80
|
| Update existing doc | § Editing an existing doc (below) |
|
|
81
|
-
| Instruction file (`CLAUDE.md`, a rule, an agent, skill prose) |
|
|
81
|
+
| Instruction file (`CLAUDE.md`, a rule, an agent, skill prose) | [`references/instruction-style.md`](references/instruction-style.md) — not these templates; every-load prose stays lean, and the present-tense rule still applies |
|
|
82
|
+
| Author or restructure a **skill** (fit, triggers, shape, anatomy, shipping) | The skill-authoring field guide — the `etna` repo (`nurixlabs/etna`), folder `docs/architecture/skills/playbook/`, chapters `00`–`10`. **No etna checkout available ⇒ ask the user for access to the etna repo, or proceed from first principles** with [`references/instruction-style.md`](references/instruction-style.md) governing the prose. This row is the only place the playbook is referenced |
|
|
82
83
|
| **No template matches** | [`references/untemplated.md`](references/untemplated.md) — shape decisions + the co-authoring workflow |
|
|
83
84
|
|
|
84
85
|
---
|
|
@@ -123,6 +124,7 @@ A feature doc carries ownership frontmatter — `owns:` (required), `module:` (o
|
|
|
123
124
|
| --- | --- |
|
|
124
125
|
| `templates/` | One file per template, indexed by [`Readme.md`](templates/Readme.md) — feature (LLD), changelog, plan, AD, steering docs, API reference, environment registry, operations procedure, migration runbook, protected files, READMEs, and the baseline scaffolds |
|
|
125
126
|
| `references/style-guide.md` | Writing rules, formatting conventions, the two-natures tense rules |
|
|
127
|
+
| `references/instruction-style.md` | The style for instruction files (`CLAUDE.md`, rules, agents, skill prose) — the every-line test, armor vs. narration, voice, negative space |
|
|
126
128
|
| `references/frontmatter.md` | Deriving a feature doc's `owns:` / `module:` / `keywords:` / `status:` from code |
|
|
127
129
|
| `references/untemplated.md` | How to write a document no template covers (nature, placement, shape) + the co-authoring workflow |
|
|
128
130
|
| `references/examples.md` | Good vs bad documentation examples |
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
# Instruction-File Style
|
|
2
|
+
|
|
3
|
+
The shared style for every file an agent obeys — a `CLAUDE.md`, a rule, an agent definition, skill prose. Prose style only: frontmatter is metadata, not style. Docs-tree documents follow the skill's templates and [`style-guide.md`](style-guide.md) instead.
|
|
4
|
+
|
|
5
|
+
## The test for every line
|
|
6
|
+
|
|
7
|
+
An instruction file is paid for whenever it loads, scaled by its load class: `CLAUDE.md` and rules load on **every turn of every session** — the most expensive prose in a repo per word; an agent definition loads per dispatch, a skill per invocation. The bar is not "is this true?" but **"must this be in front of the agent whenever this file loads?"** Measure weight in tokens, not lines; trim biggest-first on every edit.
|
|
8
|
+
|
|
9
|
+
**Rewriting, the test is armor vs. narration.** A reason clause either blocks a move an agent would otherwise make — the failure is counter-intuitive, the wrong fix looks correct, or the rule reads as arbitrary tidiness and gets "improved away" — or it explains the self-evident. Ask of each: *does the forbidden move look correct to an agent mid-task?* Keep the first kind, cut the second. **A constraint may lose its explanation; it may never lose its existence** — compression is fewer words for the same constraints, so a passage that cannot shrink without dropping one stays long.
|
|
10
|
+
|
|
11
|
+
## Coherence
|
|
12
|
+
|
|
13
|
+
A rewrite is not only a trim — read the file as one artifact and fix what disagrees or is missing:
|
|
14
|
+
|
|
15
|
+
- **Two statements of one fact agree, or become one.** A defaults block vs. the worked example beside it, a table row vs. a bullet — reconcile against the code the rule governs and keep one canonical statement; a silent disagreement is worse than either version alone, because each reader picks a different one.
|
|
16
|
+
- **Every cross-reference resolves** — the cited `§`, sibling file, or command exists and still says what the citation claims. Section numbers are a public surface other files cite: append, never reshuffle.
|
|
17
|
+
- **The body delivers what the scope line promises, and nothing it disclaims.** A topic named then left to guesswork is a hole; material the scope routes elsewhere is a leak.
|
|
18
|
+
- **Report what you cannot fix.** A defect outside the file — a stale sibling, an unshipped copy — is named in the handback, never fixed by widening the edit.
|
|
19
|
+
|
|
20
|
+
## Two genres, one style
|
|
21
|
+
|
|
22
|
+
Policy files (`CLAUDE.md`, rules) are declarative — assertion bullets and tables, no second person. Agent and skill bodies are procedures — second person, numbered steps, one observable action per step. The genre sets the shape; everything below applies to both.
|
|
23
|
+
|
|
24
|
+
## Routing
|
|
25
|
+
|
|
26
|
+
- **Link, don't copy — one canonical source per topic.** `CLAUDE.md` is a **router, not a manual**: per workflow, when to enter, what to dispatch, where the output lands — mechanics live in the agent or skill file, which loads only when it runs.
|
|
27
|
+
- **Cut generic engineering advice.** Agents already know how to code; keep only what is true of *this* stack and not derivable by looking at it.
|
|
28
|
+
- **Keep load-bearing rules even when project-specific.** Genericizing is for reference material, not guardrails — deleting a hard rule removes a constraint the agent will otherwise violate.
|
|
29
|
+
|
|
30
|
+
## Voice
|
|
31
|
+
|
|
32
|
+
- **Assertion — reason, in one breath.** "**Never name a deployed-value file `.env`** — the dev server auto-loads a root `.env` as local vars, so a prod-valued `.env` silently becomes the local environment." The reason is the rule's armor: an agent that knows the failure mode won't "improve" the rule away; a bare imperative invites second-guessing.
|
|
33
|
+
- **A reason appears once — at the rule it armors.** "One breath" caps a reason's length, not its multiplicity: the same rationale in the scope line, a section intro, and a bullet is the restatement trimming exists to remove. A convention whose only reason is consistency states that once, in the scope line.
|
|
34
|
+
- **One example, carrying every point it can — never a second example of the same point.** An example calibrates a rule an agent would otherwise read loosely; a second one demonstrating the same rule is restatement in costume. Prefer one worked case rich enough for several rules to cite over a fresh citation per bullet.
|
|
35
|
+
- **Grade the bindingness with words.** Bold **never / always / only / must** for hard constraints; "prefer", "default", "acceptable when" for defaults — and every escape hatch states its trigger and its price.
|
|
36
|
+
- **Absolute present tense.** Describe the current design as if it had always been the plan — no "previously", no version narration, no stale-reference tripwires, no progress markers. When something moves or is removed, fix every reference and state only the present fact; the journey lives in git history and `docs/history/`. (Docs-tree tense rules: [`style-guide.md`](style-guide.md) § The Two Natures.)
|
|
37
|
+
|
|
38
|
+
## Negative space
|
|
39
|
+
|
|
40
|
+
- **Name the rejected alternative.** A package table carries a **Don't use** column because an agent that knows the popular alternative reaches for it unless the file closes the door by name.
|
|
41
|
+
- **Pre-empt the workaround.** Where a failure predictably triggers improvisation, spell out the forbidden moves and the exact stop-and-report. The umbrella: **no silent fallback** — fail loudly rather than route around.
|
|
42
|
+
|
|
43
|
+
## Material & mechanics
|
|
44
|
+
|
|
45
|
+
- **Tables for enumerable facts, prose for judgment.** One row per item kills the urge to explain; anything that needs a *because* lives in prose around the table, never inside a cell.
|
|
46
|
+
- **No ASCII diagrams.** A box-and-arrow diagram costs many tokens for what a sentence or a small table carries.
|
|
47
|
+
- Inline-code every identifier, filename, command, and config key.
|
|
48
|
+
- ❌ / ✅ only inside banned/blessed lists, not as general decoration.
|
|
49
|
+
- `>` blockquotes set off interruptions — cross-pointers, callouts, agent guards — not the main line.
|
|
@@ -229,6 +229,17 @@ Use for structured info:
|
|
|
229
229
|
|
|
230
230
|
---
|
|
231
231
|
|
|
232
|
+
## Self-Contained Documents & References
|
|
233
|
+
|
|
234
|
+
Two verbosity regimes, split by who pays for the words. **Instruction files** (`CLAUDE.md`, rules, agents, skill prose) load into an agent's context on every turn or invocation — they stay lean, per [`instruction-style.md`](instruction-style.md). **Documents** are read on demand, by humans and agents alike — they are written **verbose and self-contained**, and the cost of a reader hopping files exceeds the cost of extra words on the page.
|
|
235
|
+
|
|
236
|
+
- **The body reads whole without opening another file.** Restate the one or two sentences of context a borrowed concept needs, right where it's used — a reader forced mid-paragraph into a second document loses the thread of the first.
|
|
237
|
+
- **Restate for readability, cite for authority — never fork the fact.** A changing detail (a version, a count, a path list) keeps one canonical home; the restatement carries what the page needs to be understood and points at the authority for the rest. Link-don't-copy governs where a fact is *owned*, not how readable the page that uses it must be.
|
|
238
|
+
- **Inline links are the minimum that action requires.** Link mid-prose only where the reader must go there to act on this page. Every other sister document — everything the topic touches — belongs in one **Related** (or **References**) section at the document's end.
|
|
239
|
+
- **The Related tail is the document's entire link surface.** Deep relative paths (`../../../../…`) are fragile — a folder move breaks every one — so they are confined to that one block, where a path change touches one place; body mentions use the plain name (`the boundary skill`, `structure.md`) instead of a link.
|
|
240
|
+
|
|
241
|
+
---
|
|
242
|
+
|
|
232
243
|
## The Two Natures — Tense & History
|
|
233
244
|
|
|
234
245
|
Every document is a **truth document** (states current absolutes, updated in place) or a **record** (dated account of activity, frozen or append-only) — see `SKILL.md` § The Two Natures. The tense rules follow directly:
|
|
@@ -15,7 +15,7 @@ An entry is not a summary line. Its value concentrates in the fields a diff cann
|
|
|
15
15
|
- **Ask:** {what the user asked, compressed — taste and preference statements quoted verbatim}
|
|
16
16
|
- **Iterations:** {N} · rejected: {what was rejected and why} | none
|
|
17
17
|
- **Skills:** {skill}@{version} — survived | partially survived | overridden ({why, briefly}) | none used
|
|
18
|
-
- **Change:** {added/changed X, which does Y, because Z — behavior first, mechanism second}
|
|
18
|
+
- **Change:** {added/changed X, which does Y, because Z — behavior first, mechanism second. Plan-linked entries also carry the verification gate's results here: rows discharged, suite outcome, anything blocked}
|
|
19
19
|
- **Discovered:** {non-obvious fact learned by running the product — environment quirk, platform ceiling, seam behavior, dependency constraint} | none
|
|
20
20
|
- **Class:** {one or more keywords — suggestive vocabulary, not a closed enum; see Field rules}
|
|
21
21
|
- **Pin:** {enforced artifact written in this entry's commit: test / token / guardrail / schema} | none — candidate: {what should hold it}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
# Plan (docs/history/plans/YYYY-MM-DD-feature-name.md)
|
|
2
2
|
|
|
3
|
-
Record. Use for: every implementation plan. Plans are created here directly with `Status: Draft`,
|
|
3
|
+
Record. Use for: every implementation plan. Plans are created here directly with `Status: Draft`; after approval the plan gates (`boundary`, then `test-plan`) run against the still-`Draft` file, the status flips to `Status: In Progress` at the first implementation step, and the file freezes at `Status: Complete` or `Status: Abandoned`. Once frozen, never edit — write a new dated plan if scope changes. The plan records the journey; the truth it implemented lives on in the feature doc and any AD it touched.
|
|
4
4
|
|
|
5
|
-
The `boundary` skill parses the **Proposed Changes** sections to check boundary impact before execution. Keep that structure stable — section headings and bullet shape are load-bearing for the
|
|
5
|
+
The `boundary` skill parses the **Proposed Changes** sections to check boundary impact before execution, and the `test-plan` skill writes a **Test Obligations** section into the plan at the same gate. Keep that structure stable — section headings and bullet shape are load-bearing for the parsers, and the Test Obligations table is the ledger the verification gate discharges before the plan may reach `Status: Complete`.
|
|
6
6
|
|
|
7
7
|
```
|
|
8
8
|
# {Feature Name}
|
|
@@ -47,11 +47,18 @@ Why this work is happening *now*. Link to the spec for *what* we're building; th
|
|
|
47
47
|
2. Each step ends with something verifiable
|
|
48
48
|
3. ...
|
|
49
49
|
|
|
50
|
+
## Test Obligations
|
|
51
|
+
|
|
52
|
+
<!-- Written by the `test-plan` skill at the plan gate (after `boundary`). One row per
|
|
53
|
+
promised behavior: layer · target file · oracle · fixtures. Amendable while the
|
|
54
|
+
plan is open; discharged at the verification gate. Do not hand-author. -->
|
|
55
|
+
|
|
50
56
|
## Done Criteria
|
|
51
57
|
|
|
52
|
-
- [ ] Implementation complete
|
|
58
|
+
- [ ] Implementation complete
|
|
59
|
+
- [ ] Verification gate passed — every Test Obligations row discharged (satisfied / owes nothing / blocked → backlog), gate run date and results noted here
|
|
53
60
|
- [ ] Affected docs updated (use the injected ownership index to find them)
|
|
54
|
-
- [ ] Changelog entry created in `docs/history/changelog
|
|
61
|
+
- [ ] Changelog entry created in `docs/history/changelog/`, carrying the gate's results
|
|
55
62
|
- [ ] Plan marked `Status: Complete`, **Completed:** date filled
|
|
56
63
|
|
|
57
64
|
## Open Questions
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@nurix/etna",
|
|
3
|
-
"version": "0.19.
|
|
3
|
+
"version": "0.19.36",
|
|
4
4
|
"description": "Bootstrap a project with a Nurix harness — copies the harness's CLAUDE.md, skills, agents, rules, and hooks directly into the project from a bundled payload (no marketplace fetch, no network).",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|