@nurix/etna 0.20.7 → 0.20.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (35) hide show
  1. package/README.md +1 -1
  2. package/data/harness-index.json +1 -1
  3. package/data/harnesses/code/agents/lld-mode.md +3 -3
  4. package/data/harnesses/code/agents/maintenance.md +3 -3
  5. package/data/harnesses/code/codex/agents/lld-mode.toml +2 -2
  6. package/data/harnesses/code/codex/agents/maintenance.toml +3 -3
  7. package/data/harnesses/code/harness.json +2 -2
  8. package/data/harnesses/code/skills/brainstorm/README.md +1 -1
  9. package/data/harnesses/code/skills/design/SKILL.md +1 -1
  10. package/data/harnesses/code/skills/design/components/index.md +1 -1
  11. package/data/harnesses/code/skills/documentation/SKILL.md +1 -1
  12. package/data/harnesses/delivery/agents/lld-mode.md +3 -3
  13. package/data/harnesses/delivery/agents/maintenance.md +3 -3
  14. package/data/harnesses/delivery/codex/agents/lld-mode.toml +2 -2
  15. package/data/harnesses/delivery/codex/agents/maintenance.toml +3 -3
  16. package/data/harnesses/delivery/harness.json +2 -2
  17. package/data/harnesses/delivery/skills/brainstorm/README.md +1 -1
  18. package/data/harnesses/delivery/skills/documentation/SKILL.md +1 -1
  19. package/data/harnesses/discover/harness.json +1 -1
  20. package/data/harnesses/discussion/CLAUDE.md +1 -1
  21. package/data/harnesses/discussion/harness.json +2 -2
  22. package/data/harnesses/etna/CLAUDE.md +16 -16
  23. package/data/harnesses/etna/agents/lld-mode.md +3 -3
  24. package/data/harnesses/etna/agents/maintenance.md +3 -3
  25. package/data/harnesses/etna/codex/agents/lld-mode.toml +2 -2
  26. package/data/harnesses/etna/codex/agents/maintenance.toml +3 -3
  27. package/data/harnesses/etna/harness.json +2 -2
  28. package/data/harnesses/etna/hooks/generate-ownership-index.mjs +11 -5
  29. package/data/harnesses/etna/skills/brainstorm/README.md +1 -1
  30. package/data/harnesses/etna/skills/documentation/SKILL.md +1 -1
  31. package/data/harnesses/hr/harness.json +1 -1
  32. package/data/harnesses/kb-agi/harness.json +1 -1
  33. package/lib/codex/README.md +1 -1
  34. package/lib/codex/validate-codex-agents.mjs +1 -1
  35. package/package.json +2 -2
package/README.md CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  CLI to bootstrap a project with a Nurix harness. Copies the harness's `CLAUDE.md`, skills, agents, rules, and hooks (plus scripts, if the harness ships any) into the project so they live with the code — version-controllable, editable per project, and visible without leaving the repo.
4
4
 
5
- A second install path also exists and is fully supported: `/plugin install <plugin>@nurixlabs` from inside Claude Code, which installs the harness as a plugin from the `nurixlabs/skills` marketplace. The two paths are first-class equals — pick the one that matches how you want to manage the harness. See [`docs/architecture/harness/Readme.md`](../../docs/architecture/harness/Readme.md#the-install-model) for the comparison.
5
+ A second install path also exists and is fully supported: `/plugin install <plugin>@nurixlabs` from inside Claude Code, which installs the harness as a plugin from the `nurixlabs/skills` marketplace. The two paths are first-class equals — pick the one that matches how you want to manage the harness. See [`docs/playbooks/harness/Readme.md`](../../docs/playbooks/harness/Readme.md#the-install-model) for the comparison.
6
6
 
7
7
  ## Usage
8
8
 
@@ -1,5 +1,5 @@
1
1
  {
2
- "fingerprint": "a844979f260e",
2
+ "fingerprint": "bcf04d8d525c",
3
3
  "harnesses": {
4
4
  "code": {
5
5
  "plugin": "code",
@@ -18,10 +18,10 @@ You do NOT write the LLD — you return structured research that the main agent
18
18
  Map the documentation landscape — what exists, what is adjacent, how detailed the LLD should be, and what code paths are already owned:
19
19
 
20
20
  1. Read `./docs/structure.md` to understand the documentation structure
21
- 2. If `./docs/features/README.md` exists, read it to see existing feature LLDs and where the new one fits; otherwise glob the feature docs directly
21
+ 2. Locate the repo's feature-doc layer from `structure.md` — the standard shape is `./docs/features/`, but a repo may document components under their own subject folders. Read that layer's index if it has one; otherwise glob for docs carrying `owns:` frontmatter
22
22
  3. If `./docs/memory/lld-mode.md` exists (or the legacy `./docs/memory/spec-mode.md`), read it for feature doc inventory, ownership conflict zones, and lessons from previous research
23
- 4. Read 1-2 existing feature LLDs in `./docs/features/` to calibrate format and depth
24
- 5. Consult the **injected ownership index** (the generated `glob → doc · module · keywords · status` map — the union of every feature doc's `owns:` frontmatter) to build the ownership map. It is the source of truth for what code paths are already owned. If the index isn't present in context, glob `docs/features/**/*.md` and read each doc's `owns:` frontmatter directly.
23
+ 4. Read 1-2 existing feature LLDs from that layer to calibrate format and depth
24
+ 5. Consult the **injected ownership index** (the generated `glob → doc · module · keywords · status` map — the union of every feature doc's `owns:` frontmatter) to build the ownership map. It is the source of truth for what code paths are already owned. If the index isn't present in context, glob the docs tree (excluding `docs/history/`) and read the `owns:` frontmatter of every doc that declares it.
25
25
 
26
26
  ## What You Research
27
27
 
@@ -44,15 +44,15 @@ Decide the mode once, up front, from the version marker — then run.
44
44
 
45
45
  ## Part A — Coherence audit (always runs)
46
46
 
47
- The ownership source of truth is the **union of every feature doc's `owns:` frontmatter** — the same source the SessionStart ownership index derives from. There is no `docs/routing.md` and no precomputed file to regenerate; you rebuild the map by globbing `docs/features/`.
47
+ The ownership source of truth is the **union of every doc's `owns:` frontmatter** — the same source the SessionStart ownership index derives from. There is no `docs/routing.md` and no precomputed file to regenerate; you rebuild the map by globbing the docs tree for docs that declare `owns:`.
48
48
 
49
49
  ### Step 1: Build the ownership map
50
50
 
51
51
  1. Read `docs/structure.md` for the authority map.
52
- 2. Glob `docs/features/**/*.md`, ignoring `*.bkp.*` files (installer backups awaiting the fold); for each, parse the frontmatter `owns:` globs and `module:` label.
52
+ 2. Glob the docs tree for markdown carrying `owns:` frontmatter, ignoring `*.bkp.*` files (installer backups awaiting the fold) and anything under `docs/history/` (frozen records quote retired globs as provenance). **Ownership is declared, not positional** — the standard shape files these docs under `docs/features/`, but a repo may declare ownership on any doc, and the index reads them all. For each, parse the `owns:` globs and `module:` label.
53
53
  3. Build a map: glob → owning doc + module. Narrower glob wins on overlap. **This IS the source of truth.**
54
54
 
55
- **Architecture-first fallback.** If no feature doc carries `owns:` yet (a fresh-baseline repo can carry thousands of LOC and zero feature docs), drive this pass's ownership/drift surface off `docs/architecture/**` file-references instead — they become the **primary** ownership map for Steps 2–5. The `owns:` map becomes primary the moment any feature doc declares ownership — this is a fallback, not a replacement.
55
+ **Architecture-first fallback.** If no doc carries `owns:` yet (a fresh-baseline repo can carry thousands of LOC and zero feature docs), drive this pass's ownership/drift surface off `docs/architecture/**` file-references instead — they become the **primary** ownership map for Steps 2–5. The `owns:` map becomes primary the moment any feature doc declares ownership — this is a fallback, not a replacement.
56
56
 
57
57
  ### Step 2: Validate ownership
58
58
 
@@ -14,9 +14,9 @@ You do NOT write the LLD — you return structured research that the main agent
14
14
  Map the documentation landscape — what exists, what is adjacent, how detailed the LLD should be, and what code paths are already owned:
15
15
 
16
16
  1. Read `./docs/structure.md` to understand the documentation structure
17
- 2. If `./docs/features/README.md` exists, read it to see existing feature LLDs and where the new one fits; otherwise glob the feature docs directly
17
+ 2. Locate the repo's feature-doc layer from `structure.md` — the standard shape is `./docs/features/`, but a repo may document components under their own subject folders. Read that layer's index if it has one; otherwise glob for docs carrying `owns:` frontmatter
18
18
  3. If `./docs/memory/lld-mode.md` exists (or the legacy `./docs/memory/spec-mode.md`), read it for feature doc inventory, ownership conflict zones, and lessons from previous research
19
- 4. Read 1-2 existing feature LLDs in `./docs/features/` to calibrate format and depth
19
+ 4. Read 1-2 existing feature LLDs from that layer to calibrate format and depth
20
20
  5. Consult the **injected ownership index** (the generated `glob → doc · module · keywords · status` map — the union of every feature doc's `owns:` frontmatter) to build the ownership map. It is the source of truth for what code paths are already owned. If the index isn't present in context, glob `docs/features/**/*.md` and read each doc's `owns:` frontmatter directly.
21
21
 
22
22
  ## What You Research
@@ -42,15 +42,15 @@ Decide the mode once, up front, from the version marker — then run.
42
42
 
43
43
  ## Part A — Coherence audit (always runs)
44
44
 
45
- The ownership source of truth is the **union of every feature doc's `owns:` frontmatter** — the same source the SessionStart ownership index derives from. There is no `docs/routing.md` and no precomputed file to regenerate; you rebuild the map by globbing `docs/features/`.
45
+ The ownership source of truth is the **union of every doc's `owns:` frontmatter** — the same source the SessionStart ownership index derives from. There is no `docs/routing.md` and no precomputed file to regenerate; you rebuild the map by globbing `docs/features/`.
46
46
 
47
47
  ### Step 1: Build the ownership map
48
48
 
49
49
  1. Read `docs/structure.md` for the authority map.
50
- 2. Glob `docs/features/**/*.md`, ignoring `*.bkp.*` files (installer backups awaiting the fold); for each, parse the frontmatter `owns:` globs and `module:` label.
50
+ 2. Glob the docs tree for markdown carrying `owns:` frontmatter, ignoring `*.bkp.*` files and anything under `docs/history/`. **Ownership is declared, not positional** — the standard shape files these under `docs/features/`, but a repo may declare ownership on any doc. For each, parse the `owns:` globs and `module:` label.
51
51
  3. Build a map: glob → owning doc + module. Narrower glob wins on overlap. **This IS the source of truth.**
52
52
 
53
- **Architecture-first fallback.** If no feature doc carries `owns:` yet (a fresh-baseline repo can carry thousands of LOC and zero feature docs), drive this pass's ownership/drift surface off `docs/architecture/**` file-references instead — they become the **primary** ownership map for Steps 2–5. The `owns:` map becomes primary the moment any feature doc declares ownership — this is a fallback, not a replacement.
53
+ **Architecture-first fallback.** If no doc carries `owns:` yet (a fresh-baseline repo can carry thousands of LOC and zero feature docs), drive this pass's ownership/drift surface off `docs/architecture/**` file-references instead — they become the **primary** ownership map for Steps 2–5. The `owns:` map becomes primary the moment any feature doc declares ownership — this is a fallback, not a replacement.
54
54
 
55
55
  ### Step 2: Validate ownership
56
56
 
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "harness": "code",
3
3
  "name": "code",
4
- "version": "3.14.5",
4
+ "version": "3.14.6",
5
5
  "files": [
6
6
  ".prettierignore",
7
7
  ".prettierrc.json",
@@ -25,5 +25,5 @@
25
25
  }
26
26
  ],
27
27
  "docsRoot": "docs",
28
- "digest": "7a8223d16c7b"
28
+ "digest": "ec29198342ff"
29
29
  }
@@ -6,7 +6,7 @@ correctly, the record stays readable at any pause, and the session ends with a h
6
6
  complete that the session folder is useless — it moves to history and the user deletes or
7
7
  commits it.
8
8
 
9
- > Spec (single source of truth): `docs/architecture/skills/brainstorm/` in the etna repo. The etna
9
+ > Spec (single source of truth): `docs/skills/brainstorm/` in the etna repo. The etna
10
10
  > copy of this skill (`skills/brainstorm/`) is canonical; the user-level path
11
11
  > `~/.claude/skills/brainstorm/` is a symlink to it.
12
12
 
@@ -118,4 +118,4 @@ skills/design/
118
118
  # elevation/ motion/ iconography.md · tells.csv · charts/ (census)
119
119
  ```
120
120
 
121
- This folder is the shipped skill, byte-for-byte. The six taste dictionaries are served by the design MCP; their authored source lives in the etna design record (`docs/architecture/skills/design-skill/`), which a run never reads.
121
+ This folder is the shipped skill, byte-for-byte. The six taste dictionaries are served by the design MCP; their authored source lives in the etna design record (`docs/skills/design/`), which a run never reads.
@@ -1,6 +1,6 @@
1
1
  # Component catalog — the fused index
2
2
 
3
- > **Generated folder — never hand-edit.** Everything under `skills/design/components/` is emitted by the components-repo regen instruction set (`docs/architecture/skills/case-studies/components-regen-spec.md`, run against the `@nurix/components` library checkout). Regeneration may reshape any file beneath this one; the design skill's only seam with this folder is this index.
3
+ > **Generated folder — never hand-edit.** Everything under `skills/design/components/` is emitted by the components-repo regen instruction set (`docs/playbooks/skills/case-studies/components-regen-spec.md`, run against the `@nurix/components` library checkout). Regeneration may reshape any file beneath this one; the design skill's only seam with this folder is this index.
4
4
 
5
5
  **Load contract.** This index loads in **both** positions of the project's `primitives` switch (`design.md`, `primitives: nurix | native`) — it is how the skill knows what chrome *exists* to compose with. The per-category deep references beside it ([inputs](inputs.md), [overlays](overlays.md), [collections](collections.md), [navigation](navigation.md), [layout](layout.md), [feedback](feedback.md), [charts](charts.md), [typography](typography.md), [media](media.md), [motion](motion.md), [hooks](hooks.md), [utils](utils.md), plus [setup](setup.md) for install/Tailwind wiring) load **only under `primitives: nurix`**, and only when that category is touched.
6
6
 
@@ -85,7 +85,7 @@ The two guarantees are complementary and both break on mixing: a reader holding
85
85
  | Derive/update a feature doc's `owns:` | [`references/frontmatter.md`](references/frontmatter.md) |
86
86
  | Update existing doc | § Editing an existing doc (below) |
87
87
  | 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 |
88
- | 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 |
88
+ | Author or restructure a **skill** (fit, triggers, shape, anatomy, shipping) | The skill-authoring field guide — the `etna` repo (`nurixlabs/etna`), folder `docs/playbooks/skills/`, 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 |
89
89
  | **No template matches** | [`references/untemplated.md`](references/untemplated.md) — shape decisions + the co-authoring workflow |
90
90
 
91
91
  ---
@@ -18,10 +18,10 @@ You do NOT write the LLD — you return structured research that the main agent
18
18
  Map the documentation landscape — what exists, what is adjacent, how detailed the LLD should be, and what code paths are already owned:
19
19
 
20
20
  1. Read `./docs/structure.md` to understand the documentation structure
21
- 2. If `./docs/features/README.md` exists, read it to see existing feature LLDs and where the new one fits; otherwise glob the feature docs directly
21
+ 2. Locate the repo's feature-doc layer from `structure.md` — the standard shape is `./docs/features/`, but a repo may document components under their own subject folders. Read that layer's index if it has one; otherwise glob for docs carrying `owns:` frontmatter
22
22
  3. If `./docs/memory/lld-mode.md` exists (or the legacy `./docs/memory/spec-mode.md`), read it for feature doc inventory, ownership conflict zones, and lessons from previous research
23
- 4. Read 1-2 existing feature LLDs in `./docs/features/` to calibrate format and depth
24
- 5. Consult the **injected ownership index** (the generated `glob → doc · module · keywords · status` map — the union of every feature doc's `owns:` frontmatter) to build the ownership map. It is the source of truth for what code paths are already owned. If the index isn't present in context, glob `docs/features/**/*.md` and read each doc's `owns:` frontmatter directly.
23
+ 4. Read 1-2 existing feature LLDs from that layer to calibrate format and depth
24
+ 5. Consult the **injected ownership index** (the generated `glob → doc · module · keywords · status` map — the union of every feature doc's `owns:` frontmatter) to build the ownership map. It is the source of truth for what code paths are already owned. If the index isn't present in context, glob the docs tree (excluding `docs/history/`) and read the `owns:` frontmatter of every doc that declares it.
25
25
 
26
26
  ## What You Research
27
27
 
@@ -44,15 +44,15 @@ Decide the mode once, up front, from the version marker — then run.
44
44
 
45
45
  ## Part A — Coherence audit (always runs)
46
46
 
47
- The ownership source of truth is the **union of every feature doc's `owns:` frontmatter** — the same source the SessionStart ownership index derives from. There is no `docs/routing.md` and no precomputed file to regenerate; you rebuild the map by globbing `docs/features/`.
47
+ The ownership source of truth is the **union of every doc's `owns:` frontmatter** — the same source the SessionStart ownership index derives from. There is no `docs/routing.md` and no precomputed file to regenerate; you rebuild the map by globbing the docs tree for docs that declare `owns:`.
48
48
 
49
49
  ### Step 1: Build the ownership map
50
50
 
51
51
  1. Read `docs/structure.md` for the authority map.
52
- 2. Glob `docs/features/**/*.md`, ignoring `*.bkp.*` files (installer backups awaiting the fold); for each, parse the frontmatter `owns:` globs and `module:` label.
52
+ 2. Glob the docs tree for markdown carrying `owns:` frontmatter, ignoring `*.bkp.*` files (installer backups awaiting the fold) and anything under `docs/history/` (frozen records quote retired globs as provenance). **Ownership is declared, not positional** — the standard shape files these docs under `docs/features/`, but a repo may declare ownership on any doc, and the index reads them all. For each, parse the `owns:` globs and `module:` label.
53
53
  3. Build a map: glob → owning doc + module. Narrower glob wins on overlap. **This IS the source of truth.**
54
54
 
55
- **Architecture-first fallback.** If no feature doc carries `owns:` yet (a fresh-baseline repo can carry thousands of LOC and zero feature docs), drive this pass's ownership/drift surface off `docs/architecture/**` file-references instead — they become the **primary** ownership map for Steps 2–5. The `owns:` map becomes primary the moment any feature doc declares ownership — this is a fallback, not a replacement.
55
+ **Architecture-first fallback.** If no doc carries `owns:` yet (a fresh-baseline repo can carry thousands of LOC and zero feature docs), drive this pass's ownership/drift surface off `docs/architecture/**` file-references instead — they become the **primary** ownership map for Steps 2–5. The `owns:` map becomes primary the moment any feature doc declares ownership — this is a fallback, not a replacement.
56
56
 
57
57
  ### Step 2: Validate ownership
58
58
 
@@ -14,9 +14,9 @@ You do NOT write the LLD — you return structured research that the main agent
14
14
  Map the documentation landscape — what exists, what is adjacent, how detailed the LLD should be, and what code paths are already owned:
15
15
 
16
16
  1. Read `./docs/structure.md` to understand the documentation structure
17
- 2. If `./docs/features/README.md` exists, read it to see existing feature LLDs and where the new one fits; otherwise glob the feature docs directly
17
+ 2. Locate the repo's feature-doc layer from `structure.md` — the standard shape is `./docs/features/`, but a repo may document components under their own subject folders. Read that layer's index if it has one; otherwise glob for docs carrying `owns:` frontmatter
18
18
  3. If `./docs/memory/lld-mode.md` exists (or the legacy `./docs/memory/spec-mode.md`), read it for feature doc inventory, ownership conflict zones, and lessons from previous research
19
- 4. Read 1-2 existing feature LLDs in `./docs/features/` to calibrate format and depth
19
+ 4. Read 1-2 existing feature LLDs from that layer to calibrate format and depth
20
20
  5. Consult the **injected ownership index** (the generated `glob → doc · module · keywords · status` map — the union of every feature doc's `owns:` frontmatter) to build the ownership map. It is the source of truth for what code paths are already owned. If the index isn't present in context, glob `docs/features/**/*.md` and read each doc's `owns:` frontmatter directly.
21
21
 
22
22
  ## What You Research
@@ -42,15 +42,15 @@ Decide the mode once, up front, from the version marker — then run.
42
42
 
43
43
  ## Part A — Coherence audit (always runs)
44
44
 
45
- The ownership source of truth is the **union of every feature doc's `owns:` frontmatter** — the same source the SessionStart ownership index derives from. There is no `docs/routing.md` and no precomputed file to regenerate; you rebuild the map by globbing `docs/features/`.
45
+ The ownership source of truth is the **union of every doc's `owns:` frontmatter** — the same source the SessionStart ownership index derives from. There is no `docs/routing.md` and no precomputed file to regenerate; you rebuild the map by globbing `docs/features/`.
46
46
 
47
47
  ### Step 1: Build the ownership map
48
48
 
49
49
  1. Read `docs/structure.md` for the authority map.
50
- 2. Glob `docs/features/**/*.md`, ignoring `*.bkp.*` files (installer backups awaiting the fold); for each, parse the frontmatter `owns:` globs and `module:` label.
50
+ 2. Glob the docs tree for markdown carrying `owns:` frontmatter, ignoring `*.bkp.*` files and anything under `docs/history/`. **Ownership is declared, not positional** — the standard shape files these under `docs/features/`, but a repo may declare ownership on any doc. For each, parse the `owns:` globs and `module:` label.
51
51
  3. Build a map: glob → owning doc + module. Narrower glob wins on overlap. **This IS the source of truth.**
52
52
 
53
- **Architecture-first fallback.** If no feature doc carries `owns:` yet (a fresh-baseline repo can carry thousands of LOC and zero feature docs), drive this pass's ownership/drift surface off `docs/architecture/**` file-references instead — they become the **primary** ownership map for Steps 2–5. The `owns:` map becomes primary the moment any feature doc declares ownership — this is a fallback, not a replacement.
53
+ **Architecture-first fallback.** If no doc carries `owns:` yet (a fresh-baseline repo can carry thousands of LOC and zero feature docs), drive this pass's ownership/drift surface off `docs/architecture/**` file-references instead — they become the **primary** ownership map for Steps 2–5. The `owns:` map becomes primary the moment any feature doc declares ownership — this is a fallback, not a replacement.
54
54
 
55
55
  ### Step 2: Validate ownership
56
56
 
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "harness": "delivery",
3
3
  "name": "delivery",
4
- "version": "0.2.26",
4
+ "version": "0.2.27",
5
5
  "files": [
6
6
  ".prettierignore",
7
7
  ".prettierrc.json",
@@ -10,5 +10,5 @@
10
10
  "seeds": [],
11
11
  "tools": [],
12
12
  "docsRoot": "docs",
13
- "digest": "532fc80a4ad6"
13
+ "digest": "b36abb3f2f60"
14
14
  }
@@ -6,7 +6,7 @@ correctly, the record stays readable at any pause, and the session ends with a h
6
6
  complete that the session folder is useless — it moves to history and the user deletes or
7
7
  commits it.
8
8
 
9
- > Spec (single source of truth): `docs/architecture/skills/brainstorm/` in the etna repo. The etna
9
+ > Spec (single source of truth): `docs/skills/brainstorm/` in the etna repo. The etna
10
10
  > copy of this skill (`skills/brainstorm/`) is canonical; the user-level path
11
11
  > `~/.claude/skills/brainstorm/` is a symlink to it.
12
12
 
@@ -85,7 +85,7 @@ The two guarantees are complementary and both break on mixing: a reader holding
85
85
  | Derive/update a feature doc's `owns:` | [`references/frontmatter.md`](references/frontmatter.md) |
86
86
  | Update existing doc | § Editing an existing doc (below) |
87
87
  | 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 |
88
- | 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 |
88
+ | Author or restructure a **skill** (fit, triggers, shape, anatomy, shipping) | The skill-authoring field guide — the `etna` repo (`nurixlabs/etna`), folder `docs/playbooks/skills/`, 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 |
89
89
  | **No template matches** | [`references/untemplated.md`](references/untemplated.md) — shape decisions + the co-authoring workflow |
90
90
 
91
91
  ---
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "harness": "discover",
3
3
  "name": "discover",
4
- "version": "0.1.17",
4
+ "version": "0.1.18",
5
5
  "files": [
6
6
  ".prettierignore",
7
7
  ".prettierrc.json",
@@ -18,7 +18,7 @@ Strictly separated — never mix them:
18
18
 
19
19
  **The operator layer**: `metadata/lessons/` — read `DIGEST.md` at session start alongside the routing files; it is **prior, not canon** (its reading-protocol block governs). Everything else under `lessons/` (append-only `log/`, `forecasts.md`) loads on demand only. The `lessons-maintenance` agent (instruction set: `metadata/lessons/distillation.md`) runs **only during user sessions** — spawn it in the background when the `metadata/ops/` cursor falls a session behind.
20
20
 
21
- The rules are the method — portable, abstract, generic examples; nothing depends on any local topic. Live exemplars are reached through `metadata/TOPICS.md`. Workspace-local method notes go to `metadata/method-changelog.md`; the harness itself is versioned by `.claude/harness.json` and documented in the etna forge (`docs/architecture/harness/discussion/`).
21
+ The rules are the method — portable, abstract, generic examples; nothing depends on any local topic. Live exemplars are reached through `metadata/TOPICS.md`. Workspace-local method notes go to `metadata/method-changelog.md`; the harness itself is versioned by `.claude/harness.json` and documented in the etna forge (`docs/harness/discussion/`).
22
22
 
23
23
  ## Delegation
24
24
 
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "harness": "discussion",
3
3
  "name": "discussion",
4
- "version": "0.6.0",
4
+ "version": "0.6.1",
5
5
  "files": [
6
6
  ".prettierignore",
7
7
  ".prettierrc.json",
@@ -10,5 +10,5 @@
10
10
  "seeds": [],
11
11
  "tools": [],
12
12
  "docsRoot": "docs",
13
- "digest": "f1c6d3f61e3e"
13
+ "digest": "a3de25b70367"
14
14
  }
@@ -29,7 +29,8 @@ Invoke the `maintenance` agent whenever the docs look like they need it — not
29
29
 
30
30
  ## Getting Started
31
31
 
32
- - Read **[`docs/structure.md`](docs/structure.md)** — the documentation authority map (what belongs in `architecture/`, `features/`, `operations/`, `skills/`, `history/`, `memory/`). Don't restate it here.
32
+ - Read **[`docs/structure.md`](docs/structure.md)** — the documentation authority map. The top level mirrors the source roots the forge ships from (`skills/`, `harness/`, `rules/`, `packages/`), plus `playbooks/` for the craft guides and `architecture/` for truth spanning two or more subjects. Don't restate it here.
33
+ - Read **[`docs/writing-style.md`](docs/writing-style.md)** before writing anything — the single style authority for this repo.
33
34
  - Read **[`docs/memory/`](docs/memory/)** for agent memory files (one per agent).
34
35
  - Prefer `docs/` over `README.md` — `docs/` is canonical for agents.
35
36
  - The CLI and hooks are the only real code — detect the package manager from the lockfile (see `.claude/rules/general.md`) for anything under `packages/`.
@@ -61,7 +62,7 @@ Three peer modes plus a Completion step — enter wherever the user's thinking a
61
62
  | **LLD** (low-level design) | new component/feature work | `lld-mode` agent + `documentation` skill | Plan |
62
63
  | **Plan** | an LLD is approved | `documentation` skill → `docs/history/plans/YYYY-MM-DD-{slug}.md` | Completion |
63
64
 
64
- > Brainstorm entry needs a **basis** — a reference document or a one-shot brain dump; drip-sized asks (a one-line fix) are too small and get redirected. A **pillar** is a recorded strategic principle from a past brainstorm: in-progress sessions 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.
65
+ > Brainstorm entry needs a **basis** — a reference document or a one-shot brain dump; drip-sized asks (a one-line fix) are too small and get redirected. A **pillar** is a recorded strategic principle from a past brainstorm: in-progress sessions under `docs/research/`, harvested ones under `docs/history/brainstorms/`, harvested doctrine under `docs/architecture/`. The LLD is the component's own doc — `docs/skills/{name}/`, `docs/harness/{name}/`, or `docs/packages/{name}.md` — design intent first, extended in place at Completion.
65
66
 
66
67
  **On Plan Completion:**
67
68
 
@@ -79,14 +80,14 @@ These three mechanisms keep the repo self-updating: **ownership** routes an edit
79
80
 
80
81
  ### Ownership — route before editing
81
82
 
82
- Which doc is canonical for which paths is the **feature doc's own frontmatter**. A feature doc (flat in `docs/features/`) carries `owns:` (path globs — the only ownership key, pointing at `skills/**`, `harness/**`, `packages/cli/**`, …), an optional `module:` label, `keywords:`, and `status:`. Path → 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 its components 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 nothing; operations docs describe procedures.
83
+ **Ownership is declared, not positional.** Any document under `docs/` carrying `owns:` frontmatter claims those code paths — path globs pointing at `skills/**`, `harness/**`, `packages/**`, … — plus an optional `module:` label, `keywords:`, and `status:`. The SessionStart hook scans the whole tree and builds the injected index from the union, so a component's own record claims its path directly and a doc's location is a browsing decision, never an ownership one. Where two docs overlap, the **narrower glob wins**. A module is tied to its components by the `owns:` globs of the docs carrying its `module:` label — not a folder, not a separate map. Indexes, chapters, and explainers carry no `owns:`, so a subject claims its path exactly once.
83
84
 
84
85
  Before modifying a component in an unfamiliar area:
85
86
 
86
- 1. Consult the **injected ownership index** — the `glob → doc · module · keywords · status` map. Match the path or topic to the owning feature doc and read it first. (No index in context ⇒ the repo isn't reconciled — see Maintenance.)
87
+ 1. Consult the **injected ownership index** — the `glob → doc · module · keywords · status` map. Match the path or topic to the owning doc and read it first. (No index in context ⇒ the repo isn't reconciled — see Maintenance.)
87
88
  2. If a `docs/memory/` file exists for the area, read it for domain knowledge and failure modes.
88
89
 
89
- 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.
90
+ The `lld-mode` agent checks for ownership conflicts during LLD research — docs whose `owns:` globs overlap at equal specificity. Resolve them in the LLD before proceeding.
90
91
 
91
92
  ### Boundaries — check while changing
92
93
 
@@ -101,10 +102,11 @@ Invoke the `boundary` skill after a plan is approved and before its first implem
101
102
 
102
103
  ### Documentation — close the loop
103
104
 
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
+ - **Everything written in this repo follows [`docs/writing-style.md`](docs/writing-style.md) — no exceptions.** It is the single style authority for both genres: instruction files (`CLAUDE.md`, rules, agents, skill prose) and documents. Read it before writing prose here, not after. Its load-bearing rule is the Two Natures — truth documents state the present and narrate no history; records are dated and never edited to match the present.
106
+ - **Every markdown document also goes through the `documentation` skill** for its *genre* — invoke it before creating or substantively editing any `.md` file and apply the matching template. The skill supplies structure; `writing-style.md` supplies the prose.
105
107
  - **[override]** Keep `docs/` updated when a change alters documented behaviour — creating and updating docs is part of the work.
106
108
  - 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
- - 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.
109
+ - When moving or renaming a component: update the `owns:` globs of the doc that owns it so the ownership index stays accurate. A new doc that owns code declares its paths in its own `owns:` frontmatter.
108
110
  - `docs/structure.md` is the authority on what belongs where — read it before adding or moving a doc; one canonical source per topic, link don't copy. Only `CLAUDE.md`, `AGENTS.md`, and `README.md` live at the repo root.
109
111
 
110
112
  > Agents and skills live under `.claude/agents/` and `.claude/skills/`. Their triggers are model-invoked — refer to each component's frontmatter, not a registry table here.
@@ -120,7 +122,7 @@ A commit marks the user's behavioral verification of the work, and the working s
120
122
  - **A commit is the smallest unit an entry may describe**; above that the mapping is judgment. Work exceeding a draft's scope gets a *second* entry rather than stretching the first.
121
123
  - **Distillation is the `retro` agent** — run on demand (before a brainstorm or LLD, before a new project, after a refinement arc), it converts accumulated entries into a typed punch list (doc content, doc structure, skill evolution, pins, harness rules), appends actionable items to the backlog, and proposes only — application runs through the normal documentation loop.
122
124
 
123
- **One-shot migrations are a different genre.** Work that runs **once** against a live system — a harness rollout across consumer repos, a catalog-wide cutover, a data backfill — is a **migration runbook** at `docs/history/migrations/YYYY-MM-DD-{slug}.md` (template: the `documentation` skill's `templates/migration-runbook.md`), authored **before** execution and outcome-stamped after. A changelog entry says what changed in this repo; a runbook says what was executed against the world and how to verify or undo it. A repeatable procedure is neither — that is `docs/operations/`. When a runbook defers targets, it records **why** and the **trigger to re-evaluate them**, so the next run re-checks rather than inheriting the skip.
125
+ **One-shot migrations are a different genre.** Work that runs **once** against a live system — a harness rollout across consumer repos, a catalog-wide cutover, a data backfill — is a **migration runbook** at `docs/history/migrations/YYYY-MM-DD-{slug}.md` (template: the `documentation` skill's `templates/migration-runbook.md`), authored **before** execution and outcome-stamped after. A changelog entry says what changed in this repo; a runbook says what was executed against the world and how to verify or undo it. A repeatable procedure is neither — that belongs with the component it operates. When a runbook defers targets, it records **why** and the **trigger to re-evaluate them**, so the next run re-checks rather than inheriting the skip.
124
126
 
125
127
  ---
126
128
 
@@ -164,12 +166,10 @@ The single policy for sub-agent dispatch — when to fan out, at what tier, and
164
166
 
165
167
  ❌ prohibitions hold unless the user explicitly asks otherwise; ✅ and ⚠️ items are standing policy:
166
168
 
167
- - ❌ **Tests** — etna is a markdown-authoring repo plus a small CLI with no test suite; never generate, update, or modify test files unless the user explicitly asks. (The `code` harness ships a gated-verification posture for the projects it governs — that is a shipped rule, not etna's own.)
169
+ - ❌ **Tests** — etna authors markdown; the only suite is the CLI's, under `packages/cli/`. Never generate, update, or modify test files unless the user explicitly asks. (The `code` harness ships a gated-verification posture for the projects it governs — that is a shipped rule, not etna's own.)
168
170
  - ❌ **Dependencies** — never upgrade frameworks, libraries, or dependencies.
169
- - ❌ **Compatibility** — never maintain backward compatibility unless specified.
170
171
  - ❌ **Branches & Worktrees [override]** — never self-create git branches or worktrees; commit straight to the checked-out branch. This replaces any built-in "branch first on the default branch" default. Exception: when the user asks for a pull request, create the branch the PR requires before committing its changes.
171
- - ❌ **Protected Files** — before editing, if `docs/operations/protected-files.md` exists, read it and never modify any path it lists; never modify `AGENTS.md` or that file itself.
172
- - ✅ **Browser Automation** — Claude in Chrome / CDP browser tools: use freely when useful, no need to ask first.
172
+ - ❌ **Protected Files** — never modify `AGENTS.md`.
173
173
  - ✅ **Delegation** — when to fan out, tiers, and trust are § Delegation.
174
174
  - ⚠️ **Plans** — created directly in `docs/history/plans/` (see Workflows). Once `Status: Complete` or `Abandoned`, frozen — never edited. If scope changes after completion, write a new dated plan linking back.
175
175
  - ⚠️ **Tool Issues** — if any CLI tool, shell alias, or MCP tool behaves unexpectedly (syntax errors, silent failures, wrong defaults), report the exact tool, command, and error to the user so they can fix the underlying library.
@@ -178,15 +178,15 @@ The single policy for sub-agent dispatch — when to fan out, at what tier, and
178
178
 
179
179
  ## Authoring Conventions
180
180
 
181
- Most artifacts are markdown — skills, agents, rules, docs. Follow the `kb` / `nomenclature` rules; markdown has no file-path-comment rule. Keep the `.claude/rules/*` reference docs frontmatter-free.
181
+ Almost everything here is markdown — skills, agents, rules, harness policies, docs. **The prose style for all of it is [`docs/writing-style.md`](docs/writing-style.md)**; the guides below add what is specific to each artifact class. Follow the `kb` / `nomenclature` rules; markdown has no file-path-comment rule. Keep the `.claude/rules/*` reference docs frontmatter-free.
182
182
 
183
183
  **Each artifact class has an authoring guide — read the one you are editing, before you edit it.** The forge is the only repo that authors these, so the guides live here and ship nowhere:
184
184
 
185
185
  | Editing | Guide |
186
186
  | --- | --- |
187
- | A **rule** (`rules/*.md`) | [`docs/architecture/rules.md`](docs/architecture/rules.md) — the catalog, the conventions, and the whole-file audit |
188
- | A **skill** (`skills/*/`) | [`docs/architecture/skills/playbook/`](docs/architecture/skills/playbook/Readme.md) — fit and scope through shipping and maintenance |
189
- | An **agent** (`agents/*.md`) | [`docs/architecture/harness/authoring-agents.md`](docs/architecture/harness/authoring-agents.md) |
187
+ | A **rule** (`rules/*.md`) | [`docs/rules/Readme.md`](docs/rules/Readme.md) — the catalog, the conventions, and the whole-file audit |
188
+ | A **skill** (`skills/*/`) | [`docs/playbooks/skills/`](docs/playbooks/skills/Readme.md) — fit and scope through shipping and maintenance |
189
+ | An **agent** (`agents/*.md`) | [`docs/playbooks/agents.md`](docs/playbooks/agents.md) |
190
190
 
191
191
  Authoring or updating an **agent** keeps both runtimes in sync: the `.md` is the single source, and its Codex `.codex.toml` twin is derived from it by the guide above, then checked with `node packages/cli/lib/codex/validate-codex-agents.mjs`.
192
192
 
@@ -18,10 +18,10 @@ You do NOT write the LLD — you return structured research that the main agent
18
18
  Map the documentation landscape — what exists, what is adjacent, how detailed the LLD should be, and what code paths are already owned:
19
19
 
20
20
  1. Read `./docs/structure.md` to understand the documentation structure
21
- 2. If `./docs/features/README.md` exists, read it to see existing feature LLDs and where the new one fits; otherwise glob the feature docs directly
21
+ 2. Locate the repo's feature-doc layer from `structure.md` — the standard shape is `./docs/features/`, but a repo may document components under their own subject folders. Read that layer's index if it has one; otherwise glob for docs carrying `owns:` frontmatter
22
22
  3. If `./docs/memory/lld-mode.md` exists (or the legacy `./docs/memory/spec-mode.md`), read it for feature doc inventory, ownership conflict zones, and lessons from previous research
23
- 4. Read 1-2 existing feature LLDs in `./docs/features/` to calibrate format and depth
24
- 5. Consult the **injected ownership index** (the generated `glob → doc · module · keywords · status` map — the union of every feature doc's `owns:` frontmatter) to build the ownership map. It is the source of truth for what code paths are already owned. If the index isn't present in context, glob `docs/features/**/*.md` and read each doc's `owns:` frontmatter directly.
23
+ 4. Read 1-2 existing feature LLDs from that layer to calibrate format and depth
24
+ 5. Consult the **injected ownership index** (the generated `glob → doc · module · keywords · status` map — the union of every feature doc's `owns:` frontmatter) to build the ownership map. It is the source of truth for what code paths are already owned. If the index isn't present in context, glob the docs tree (excluding `docs/history/`) and read the `owns:` frontmatter of every doc that declares it.
25
25
 
26
26
  ## What You Research
27
27
 
@@ -44,15 +44,15 @@ Decide the mode once, up front, from the version marker — then run.
44
44
 
45
45
  ## Part A — Coherence audit (always runs)
46
46
 
47
- The ownership source of truth is the **union of every feature doc's `owns:` frontmatter** — the same source the SessionStart ownership index derives from. There is no `docs/routing.md` and no precomputed file to regenerate; you rebuild the map by globbing `docs/features/`.
47
+ The ownership source of truth is the **union of every doc's `owns:` frontmatter** — the same source the SessionStart ownership index derives from. There is no `docs/routing.md` and no precomputed file to regenerate; you rebuild the map by globbing the docs tree for docs that declare `owns:`.
48
48
 
49
49
  ### Step 1: Build the ownership map
50
50
 
51
51
  1. Read `docs/structure.md` for the authority map.
52
- 2. Glob `docs/features/**/*.md`, ignoring `*.bkp.*` files (installer backups awaiting the fold); for each, parse the frontmatter `owns:` globs and `module:` label.
52
+ 2. Glob the docs tree for markdown carrying `owns:` frontmatter, ignoring `*.bkp.*` files (installer backups awaiting the fold) and anything under `docs/history/` (frozen records quote retired globs as provenance). **Ownership is declared, not positional** — the standard shape files these docs under `docs/features/`, but a repo may declare ownership on any doc, and the index reads them all. For each, parse the `owns:` globs and `module:` label.
53
53
  3. Build a map: glob → owning doc + module. Narrower glob wins on overlap. **This IS the source of truth.**
54
54
 
55
- **Architecture-first fallback.** If no feature doc carries `owns:` yet (a fresh-baseline repo can carry thousands of LOC and zero feature docs), drive this pass's ownership/drift surface off `docs/architecture/**` file-references instead — they become the **primary** ownership map for Steps 2–5. The `owns:` map becomes primary the moment any feature doc declares ownership — this is a fallback, not a replacement.
55
+ **Architecture-first fallback.** If no doc carries `owns:` yet (a fresh-baseline repo can carry thousands of LOC and zero feature docs), drive this pass's ownership/drift surface off `docs/architecture/**` file-references instead — they become the **primary** ownership map for Steps 2–5. The `owns:` map becomes primary the moment any feature doc declares ownership — this is a fallback, not a replacement.
56
56
 
57
57
  ### Step 2: Validate ownership
58
58
 
@@ -14,9 +14,9 @@ You do NOT write the LLD — you return structured research that the main agent
14
14
  Map the documentation landscape — what exists, what is adjacent, how detailed the LLD should be, and what code paths are already owned:
15
15
 
16
16
  1. Read `./docs/structure.md` to understand the documentation structure
17
- 2. If `./docs/features/README.md` exists, read it to see existing feature LLDs and where the new one fits; otherwise glob the feature docs directly
17
+ 2. Locate the repo's feature-doc layer from `structure.md` — the standard shape is `./docs/features/`, but a repo may document components under their own subject folders. Read that layer's index if it has one; otherwise glob for docs carrying `owns:` frontmatter
18
18
  3. If `./docs/memory/lld-mode.md` exists (or the legacy `./docs/memory/spec-mode.md`), read it for feature doc inventory, ownership conflict zones, and lessons from previous research
19
- 4. Read 1-2 existing feature LLDs in `./docs/features/` to calibrate format and depth
19
+ 4. Read 1-2 existing feature LLDs from that layer to calibrate format and depth
20
20
  5. Consult the **injected ownership index** (the generated `glob → doc · module · keywords · status` map — the union of every feature doc's `owns:` frontmatter) to build the ownership map. It is the source of truth for what code paths are already owned. If the index isn't present in context, glob `docs/features/**/*.md` and read each doc's `owns:` frontmatter directly.
21
21
 
22
22
  ## What You Research
@@ -42,15 +42,15 @@ Decide the mode once, up front, from the version marker — then run.
42
42
 
43
43
  ## Part A — Coherence audit (always runs)
44
44
 
45
- The ownership source of truth is the **union of every feature doc's `owns:` frontmatter** — the same source the SessionStart ownership index derives from. There is no `docs/routing.md` and no precomputed file to regenerate; you rebuild the map by globbing `docs/features/`.
45
+ The ownership source of truth is the **union of every doc's `owns:` frontmatter** — the same source the SessionStart ownership index derives from. There is no `docs/routing.md` and no precomputed file to regenerate; you rebuild the map by globbing `docs/features/`.
46
46
 
47
47
  ### Step 1: Build the ownership map
48
48
 
49
49
  1. Read `docs/structure.md` for the authority map.
50
- 2. Glob `docs/features/**/*.md`, ignoring `*.bkp.*` files (installer backups awaiting the fold); for each, parse the frontmatter `owns:` globs and `module:` label.
50
+ 2. Glob the docs tree for markdown carrying `owns:` frontmatter, ignoring `*.bkp.*` files and anything under `docs/history/`. **Ownership is declared, not positional** — the standard shape files these under `docs/features/`, but a repo may declare ownership on any doc. For each, parse the `owns:` globs and `module:` label.
51
51
  3. Build a map: glob → owning doc + module. Narrower glob wins on overlap. **This IS the source of truth.**
52
52
 
53
- **Architecture-first fallback.** If no feature doc carries `owns:` yet (a fresh-baseline repo can carry thousands of LOC and zero feature docs), drive this pass's ownership/drift surface off `docs/architecture/**` file-references instead — they become the **primary** ownership map for Steps 2–5. The `owns:` map becomes primary the moment any feature doc declares ownership — this is a fallback, not a replacement.
53
+ **Architecture-first fallback.** If no doc carries `owns:` yet (a fresh-baseline repo can carry thousands of LOC and zero feature docs), drive this pass's ownership/drift surface off `docs/architecture/**` file-references instead — they become the **primary** ownership map for Steps 2–5. The `owns:` map becomes primary the moment any feature doc declares ownership — this is a fallback, not a replacement.
54
54
 
55
55
  ### Step 2: Validate ownership
56
56
 
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "harness": "etna",
3
3
  "name": "etna",
4
- "version": "1.5.15",
4
+ "version": "1.5.16",
5
5
  "files": [
6
6
  ".prettierignore",
7
7
  ".prettierrc.json",
@@ -10,5 +10,5 @@
10
10
  "seeds": [],
11
11
  "tools": [],
12
12
  "docsRoot": "docs",
13
- "digest": "df84dac44a40"
13
+ "digest": "f836486a6ca4"
14
14
  }
@@ -1,4 +1,4 @@
1
- // harness/etna/hooks/generate-ownership-index.mjs — SessionStart hook: scan docs/features/**/*.md,
1
+ // harness/etna/hooks/generate-ownership-index.mjs — SessionStart hook: scan docs/**/*.md,
2
2
  // extract the focal frontmatter (owns / module / keywords / status), and inject a compact
3
3
  // code-path → owning-doc index via additionalContext. Fires on startup/resume/clear/compact so the
4
4
  // map survives /clear and /compact and is regenerated fresh every time. Writes no file.
@@ -115,10 +115,16 @@ function asList(v) {
115
115
 
116
116
  // Build the ownership index text from every feature doc's frontmatter.
117
117
  function buildIndex(projectDir) {
118
- const featuresDir = path.join(projectDir, "docs", "features");
119
- // *.bkp.* files are install-time backups awaiting the maintenance fold — a backed-up feature
118
+ // Ownership is DECLARED, not positional: any doc anywhere under docs/ that carries owns:
119
+ // claims those paths, so a component's record claims its own path instead of a stub doing it
120
+ // by proxy. docs/history/ is skipped — frozen plans and records quote old globs as provenance,
121
+ // and indexing them would resurrect retired ownership.
122
+ const docsDir = path.join(projectDir, "docs");
123
+ // *.bkp.* files are install-time backups awaiting the maintenance fold — a backed-up
120
124
  // doc double-owning every path it names is the drift this filter prevents (parity: lib/ownership.mjs).
121
- const files = listMarkdown(featuresDir).filter((f) => !f.includes(".bkp."));
125
+ const files = listMarkdown(docsDir)
126
+ .filter((f) => !f.includes(".bkp."))
127
+ .filter((f) => !f.split(path.sep).includes("history"));
122
128
  const lines = [];
123
129
  let deprecated = 0;
124
130
  let indexed = 0;
@@ -162,7 +168,7 @@ function buildIndex(projectDir) {
162
168
  if (deprecated > 0) notes.push(`${deprecated} deprecated`);
163
169
  if (skipped > 0) notes.push(`${skipped} with no owns:`);
164
170
  const footer = notes.length
165
- ? `\n# (${indexed}/${files.length} feature doc(s) indexed - ${notes.join(", ")})`
171
+ ? `\n# (${indexed}/${files.length} doc(s) claim ownership - ${notes.join(", ")})`
166
172
  : "";
167
173
  return header + lines.join("\n") + footer;
168
174
  }
@@ -6,7 +6,7 @@ correctly, the record stays readable at any pause, and the session ends with a h
6
6
  complete that the session folder is useless — it moves to history and the user deletes or
7
7
  commits it.
8
8
 
9
- > Spec (single source of truth): `docs/architecture/skills/brainstorm/` in the etna repo. The etna
9
+ > Spec (single source of truth): `docs/skills/brainstorm/` in the etna repo. The etna
10
10
  > copy of this skill (`skills/brainstorm/`) is canonical; the user-level path
11
11
  > `~/.claude/skills/brainstorm/` is a symlink to it.
12
12
 
@@ -85,7 +85,7 @@ The two guarantees are complementary and both break on mixing: a reader holding
85
85
  | Derive/update a feature doc's `owns:` | [`references/frontmatter.md`](references/frontmatter.md) |
86
86
  | Update existing doc | § Editing an existing doc (below) |
87
87
  | 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 |
88
- | 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 |
88
+ | Author or restructure a **skill** (fit, triggers, shape, anatomy, shipping) | The skill-authoring field guide — the `etna` repo (`nurixlabs/etna`), folder `docs/playbooks/skills/`, 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 |
89
89
  | **No template matches** | [`references/untemplated.md`](references/untemplated.md) — shape decisions + the co-authoring workflow |
90
90
 
91
91
  ---
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "harness": "hr",
3
3
  "name": "hr",
4
- "version": "0.1.14",
4
+ "version": "0.1.15",
5
5
  "files": [
6
6
  ".prettierignore",
7
7
  ".prettierrc.json",
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "harness": "kb-agi",
3
3
  "name": "kb-agi",
4
- "version": "1.0.2",
4
+ "version": "1.0.3",
5
5
  "files": [
6
6
  ".prettierignore",
7
7
  ".prettierrc.json",
@@ -32,7 +32,7 @@ The two channels do not install the same set. The **CLI** writes the full Codex
32
32
 
33
33
  ## Subagents are authored, not derived at install
34
34
 
35
- `.claude/agents/*.md → .codex/agents/*.toml` is a semantic conversion, so the twin is **authored from the `.md` by following** [`docs/architecture/harness/authoring-agents.md`](../../../../docs/architecture/harness/authoring-agents.md) — the model that writes or edits the agent produces the twin inline (frontmatter → `name`/`description`, body verbatim → `developer_instructions`, `tools:` dropped to a comment, Claude model aliases omitted), with **no external CLI**. The committed `agents/<name>.codex.toml` is checked by the validation gate:
35
+ `.claude/agents/*.md → .codex/agents/*.toml` is a semantic conversion, so the twin is **authored from the `.md` by following** [`docs/playbooks/agents.md`](../../../../docs/playbooks/agents.md) — the model that writes or edits the agent produces the twin inline (frontmatter → `name`/`description`, body verbatim → `developer_instructions`, `tools:` dropped to a comment, Claude model aliases omitted), with **no external CLI**. The committed `agents/<name>.codex.toml` is checked by the validation gate:
36
36
 
37
37
  ```bash
38
38
  node packages/cli/lib/codex/validate-codex-agents.mjs # or: npm run validate:codex-agents
@@ -1,6 +1,6 @@
1
1
  // packages/cli/lib/codex/validate-codex-agents.mjs
2
2
  // The Codex-twin validation gate — decoupled from any generator. A `<name>.codex.toml`
3
- // twin is now authored by the AI following docs/architecture/harness/authoring-agents.md,
3
+ // twin is now authored by the AI following docs/playbooks/agents.md,
4
4
  // so this is the check that keeps a malformed or Claude-only twin from shipping: the twins
5
5
  // are copied UNPARSED into the bundle (build-data.js) and a consumer's .codex/agents/, so
6
6
  // nothing else catches a bad one before Codex fails to load it in that repo. Run it after
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nurix/etna",
3
- "version": "0.20.7",
3
+ "version": "0.20.8",
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": {
@@ -42,5 +42,5 @@
42
42
  "agent",
43
43
  "plugin"
44
44
  ],
45
- "etnaFingerprint": "a844979f260e"
45
+ "etnaFingerprint": "bcf04d8d525c"
46
46
  }