@nurix/etna 0.20.36 → 0.20.38

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 (212) hide show
  1. package/data/catalog/rules/frontend.md +5 -5
  2. package/data/catalog/rules/pnpm.md +2 -2
  3. package/data/catalog/skills/nustack/SKILL.md +2 -2
  4. package/data/catalog/skills/nustack/references/cli-design.md +35 -35
  5. package/data/catalog/skills/nustack/references/monorepo-master-list.md +6 -6
  6. package/data/catalog/skills/nustack/references/monorepo-setup.md +13 -13
  7. package/data/catalog/skills/nustack/references/publishing.md +40 -39
  8. package/data/harness-index.json +1 -1
  9. package/data/harnesses/code/harness.json +2 -2
  10. package/data/harnesses/code/hooks/approved-packages.md +1 -2
  11. package/data/harnesses/code/rules/frontend.md +5 -5
  12. package/data/harnesses/code/rules/pnpm.md +2 -2
  13. package/data/harnesses/code/skills/boundary/SKILL.md +33 -22
  14. package/data/harnesses/code/skills/boundary/references/index.md +2 -4
  15. package/data/harnesses/code/skills/boundary/references/mechanisms.md +3 -10
  16. package/data/harnesses/code/skills/boundary/references/packs/build-config-runtime.md +1 -1
  17. package/data/harnesses/code/skills/boundary/references/packs/frontend.md +17 -17
  18. package/data/harnesses/code/skills/boundary/references/packs/generic-tail.md +1 -1
  19. package/data/harnesses/code/skills/brainstorm/README.md +11 -13
  20. package/data/harnesses/code/skills/brainstorm/SKILL.md +150 -132
  21. package/data/harnesses/code/skills/brainstorm/references/doctrine.md +48 -51
  22. package/data/harnesses/code/skills/brainstorm/references/harvest.md +51 -56
  23. package/data/harnesses/code/skills/brainstorm/references/session-schema.md +48 -42
  24. package/data/harnesses/code/skills/design/SKILL.md +31 -35
  25. package/data/harnesses/code/skills/design/components/charts.md +121 -43
  26. package/data/harnesses/code/skills/design/components/collections.md +209 -41
  27. package/data/harnesses/code/skills/design/components/feedback.md +86 -25
  28. package/data/harnesses/code/skills/design/components/hooks.md +198 -12
  29. package/data/harnesses/code/skills/design/components/index.md +93 -71
  30. package/data/harnesses/code/skills/design/components/inputs.md +249 -157
  31. package/data/harnesses/code/skills/design/components/layout.md +98 -38
  32. package/data/harnesses/code/skills/design/components/media.md +46 -25
  33. package/data/harnesses/code/skills/design/components/motion.md +56 -46
  34. package/data/harnesses/code/skills/design/components/navigation.md +54 -15
  35. package/data/harnesses/code/skills/design/components/overlays.md +51 -41
  36. package/data/harnesses/code/skills/design/components/setup.md +84 -5
  37. package/data/harnesses/code/skills/design/components/typography.md +72 -22
  38. package/data/harnesses/code/skills/design/components/utils.md +47 -13
  39. package/data/harnesses/code/skills/design/data/chrome/board-column.md +12 -12
  40. package/data/harnesses/code/skills/design/data/chrome/data-table.md +6 -6
  41. package/data/harnesses/code/skills/design/data/chrome/side-panel.md +15 -15
  42. package/data/harnesses/code/skills/design/data/chrome/sidebar.md +25 -25
  43. package/data/harnesses/code/skills/design/data/chrome/stat-cards.md +22 -22
  44. package/data/harnesses/code/skills/design/data/chrome/topbar.md +12 -12
  45. package/data/harnesses/code/skills/design/data/iconography.md +2 -2
  46. package/data/harnesses/code/skills/design/references/compose.md +14 -16
  47. package/data/harnesses/code/skills/design/references/emission.md +6 -6
  48. package/data/harnesses/code/skills/design/references/foundations.md +5 -5
  49. package/data/harnesses/code/skills/design/references/intake.md +6 -6
  50. package/data/harnesses/code/skills/design/references/object-pass.md +1 -1
  51. package/data/harnesses/code/skills/design/references/ship-gate.md +5 -5
  52. package/data/harnesses/code/skills/design/references/ux-patterns/Readme.md +4 -4
  53. package/data/harnesses/code/skills/design/references/ux-patterns/ai-layer.md +1 -1
  54. package/data/harnesses/code/skills/design/references/ux-patterns/container-choice.md +1 -1
  55. package/data/harnesses/code/skills/design/references/ux-patterns/dashboards.md +1 -1
  56. package/data/harnesses/code/skills/design/references/ux-patterns/modes.md +1 -1
  57. package/data/harnesses/code/skills/design/references/ux-patterns/object-model.md +2 -2
  58. package/data/harnesses/code/skills/design/references/ux-patterns/promotion-demotion.md +1 -1
  59. package/data/harnesses/code/skills/design/references/ux-patterns/settings.md +1 -1
  60. package/data/harnesses/code/skills/design/references/ux-patterns/standard-pages.md +1 -1
  61. package/data/harnesses/code/skills/design/scripts/README-validator.md +20 -8
  62. package/data/harnesses/code/skills/design/scripts/validate-design-md.mjs +15 -10
  63. package/data/harnesses/code/skills/documentation/SKILL.md +5 -5
  64. package/data/harnesses/code/skills/documentation/references/examples.md +22 -22
  65. package/data/harnesses/code/skills/documentation/references/frontmatter.md +3 -3
  66. package/data/harnesses/code/skills/documentation/references/instruction-style.md +3 -3
  67. package/data/harnesses/code/skills/documentation/references/source-comments.md +3 -3
  68. package/data/harnesses/code/skills/documentation/references/style-guide.md +5 -5
  69. package/data/harnesses/code/skills/documentation/references/untemplated.md +8 -8
  70. package/data/harnesses/code/skills/documentation/scripts/doc-lint.mjs +3 -2
  71. package/data/harnesses/code/skills/documentation/templates/Readme.md +1 -1
  72. package/data/harnesses/code/skills/documentation/templates/acceptance-criteria.md +1 -1
  73. package/data/harnesses/code/skills/documentation/templates/api-reference.md +1 -1
  74. package/data/harnesses/code/skills/documentation/templates/architecture-decision.md +3 -7
  75. package/data/harnesses/code/skills/documentation/templates/behavioral-checklist.md +1 -1
  76. package/data/harnesses/code/skills/documentation/templates/changelog-entry.md +1 -1
  77. package/data/harnesses/code/skills/documentation/templates/changelog-index.md +1 -1
  78. package/data/harnesses/code/skills/documentation/templates/docs-readme.md +3 -3
  79. package/data/harnesses/code/skills/documentation/templates/doctrine.md +1 -1
  80. package/data/harnesses/code/skills/documentation/templates/domain-model.md +1 -1
  81. package/data/harnesses/code/skills/documentation/templates/environment-registry.md +1 -1
  82. package/data/harnesses/code/skills/documentation/templates/feature.md +3 -3
  83. package/data/harnesses/code/skills/documentation/templates/handover.md +2 -2
  84. package/data/harnesses/code/skills/documentation/templates/implementation-map.md +1 -1
  85. package/data/harnesses/code/skills/documentation/templates/migration-runbook.md +1 -1
  86. package/data/harnesses/code/skills/documentation/templates/non-goals.md +1 -1
  87. package/data/harnesses/code/skills/documentation/templates/operations-procedure.md +2 -2
  88. package/data/harnesses/code/skills/documentation/templates/package.md +1 -1
  89. package/data/harnesses/code/skills/documentation/templates/protected-files.md +1 -1
  90. package/data/harnesses/code/skills/documentation/templates/root-readme.md +1 -1
  91. package/data/harnesses/code/skills/documentation/templates/security-overview.md +1 -1
  92. package/data/harnesses/code/skills/documentation/templates/system-overview.md +1 -1
  93. package/data/harnesses/code/skills/documentation/templates/system.md +1 -1
  94. package/data/harnesses/code/skills/documentation/templates/testing-strategy.md +1 -1
  95. package/data/harnesses/code/skills/documentation/templates/ux-behavior.md +3 -5
  96. package/data/harnesses/code/skills/issue-bridge/SKILL.md +51 -16
  97. package/data/harnesses/code/skills/issue-bridge/references/trackers/github.md +5 -5
  98. package/data/harnesses/code/skills/issue-bridge/references/trackers/jira.md +11 -8
  99. package/data/harnesses/code/skills/issue-bridge/references/trackers/linear.md +16 -11
  100. package/data/harnesses/code/skills/nustack-graph/SKILL.md +38 -29
  101. package/data/harnesses/code/skills/polygraph/references/dispatch.md +31 -18
  102. package/data/harnesses/code/skills/polygraph/references/rows.md +11 -6
  103. package/data/harnesses/code/skills/schema-design/SKILL.md +39 -41
  104. package/data/harnesses/code/skills/test/SKILL.md +38 -42
  105. package/data/harnesses/code/skills/testing/SKILL.md +83 -73
  106. package/data/harnesses/code/skills/workflow-mapper/SKILL.md +156 -193
  107. package/data/harnesses/code/skills/workflow-mapper/references/patterns.md +15 -15
  108. package/data/harnesses/delivery/harness.json +2 -2
  109. package/data/harnesses/delivery/skills/brainstorm/README.md +11 -13
  110. package/data/harnesses/delivery/skills/brainstorm/SKILL.md +150 -132
  111. package/data/harnesses/delivery/skills/brainstorm/references/doctrine.md +48 -51
  112. package/data/harnesses/delivery/skills/brainstorm/references/harvest.md +51 -56
  113. package/data/harnesses/delivery/skills/brainstorm/references/session-schema.md +48 -42
  114. package/data/harnesses/delivery/skills/cost-report/SKILL.md +10 -10
  115. package/data/harnesses/delivery/skills/documentation/SKILL.md +5 -5
  116. package/data/harnesses/delivery/skills/documentation/references/examples.md +22 -22
  117. package/data/harnesses/delivery/skills/documentation/references/frontmatter.md +3 -3
  118. package/data/harnesses/delivery/skills/documentation/references/instruction-style.md +3 -3
  119. package/data/harnesses/delivery/skills/documentation/references/source-comments.md +3 -3
  120. package/data/harnesses/delivery/skills/documentation/references/style-guide.md +5 -5
  121. package/data/harnesses/delivery/skills/documentation/references/untemplated.md +8 -8
  122. package/data/harnesses/delivery/skills/documentation/scripts/doc-lint.mjs +3 -2
  123. package/data/harnesses/delivery/skills/documentation/templates/Readme.md +1 -1
  124. package/data/harnesses/delivery/skills/documentation/templates/acceptance-criteria.md +1 -1
  125. package/data/harnesses/delivery/skills/documentation/templates/api-reference.md +1 -1
  126. package/data/harnesses/delivery/skills/documentation/templates/architecture-decision.md +3 -7
  127. package/data/harnesses/delivery/skills/documentation/templates/behavioral-checklist.md +1 -1
  128. package/data/harnesses/delivery/skills/documentation/templates/changelog-entry.md +1 -1
  129. package/data/harnesses/delivery/skills/documentation/templates/changelog-index.md +1 -1
  130. package/data/harnesses/delivery/skills/documentation/templates/docs-readme.md +3 -3
  131. package/data/harnesses/delivery/skills/documentation/templates/doctrine.md +1 -1
  132. package/data/harnesses/delivery/skills/documentation/templates/domain-model.md +1 -1
  133. package/data/harnesses/delivery/skills/documentation/templates/environment-registry.md +1 -1
  134. package/data/harnesses/delivery/skills/documentation/templates/feature.md +3 -3
  135. package/data/harnesses/delivery/skills/documentation/templates/handover.md +2 -2
  136. package/data/harnesses/delivery/skills/documentation/templates/implementation-map.md +1 -1
  137. package/data/harnesses/delivery/skills/documentation/templates/migration-runbook.md +1 -1
  138. package/data/harnesses/delivery/skills/documentation/templates/non-goals.md +1 -1
  139. package/data/harnesses/delivery/skills/documentation/templates/operations-procedure.md +2 -2
  140. package/data/harnesses/delivery/skills/documentation/templates/package.md +1 -1
  141. package/data/harnesses/delivery/skills/documentation/templates/protected-files.md +1 -1
  142. package/data/harnesses/delivery/skills/documentation/templates/root-readme.md +1 -1
  143. package/data/harnesses/delivery/skills/documentation/templates/security-overview.md +1 -1
  144. package/data/harnesses/delivery/skills/documentation/templates/system-overview.md +1 -1
  145. package/data/harnesses/delivery/skills/documentation/templates/system.md +1 -1
  146. package/data/harnesses/delivery/skills/documentation/templates/testing-strategy.md +1 -1
  147. package/data/harnesses/delivery/skills/documentation/templates/ux-behavior.md +3 -5
  148. package/data/harnesses/delivery/skills/escalate/SKILL.md +11 -11
  149. package/data/harnesses/delivery/skills/prompt-eval/SKILL.md +8 -8
  150. package/data/harnesses/delivery/skills/prompt-library/SKILL.md +30 -9
  151. package/data/harnesses/delivery/skills/route/SKILL.md +8 -8
  152. package/data/harnesses/etna/harness.json +2 -2
  153. package/data/harnesses/etna/skills/boundary/SKILL.md +33 -22
  154. package/data/harnesses/etna/skills/boundary/references/index.md +2 -4
  155. package/data/harnesses/etna/skills/boundary/references/mechanisms.md +3 -10
  156. package/data/harnesses/etna/skills/boundary/references/packs/build-config-runtime.md +1 -1
  157. package/data/harnesses/etna/skills/boundary/references/packs/frontend.md +17 -17
  158. package/data/harnesses/etna/skills/boundary/references/packs/generic-tail.md +1 -1
  159. package/data/harnesses/etna/skills/brainstorm/README.md +11 -13
  160. package/data/harnesses/etna/skills/brainstorm/SKILL.md +150 -132
  161. package/data/harnesses/etna/skills/brainstorm/references/doctrine.md +48 -51
  162. package/data/harnesses/etna/skills/brainstorm/references/harvest.md +51 -56
  163. package/data/harnesses/etna/skills/brainstorm/references/session-schema.md +48 -42
  164. package/data/harnesses/etna/skills/documentation/SKILL.md +5 -5
  165. package/data/harnesses/etna/skills/documentation/references/examples.md +22 -22
  166. package/data/harnesses/etna/skills/documentation/references/frontmatter.md +3 -3
  167. package/data/harnesses/etna/skills/documentation/references/instruction-style.md +3 -3
  168. package/data/harnesses/etna/skills/documentation/references/source-comments.md +3 -3
  169. package/data/harnesses/etna/skills/documentation/references/style-guide.md +5 -5
  170. package/data/harnesses/etna/skills/documentation/references/untemplated.md +8 -8
  171. package/data/harnesses/etna/skills/documentation/scripts/doc-lint.mjs +3 -2
  172. package/data/harnesses/etna/skills/documentation/templates/Readme.md +1 -1
  173. package/data/harnesses/etna/skills/documentation/templates/acceptance-criteria.md +1 -1
  174. package/data/harnesses/etna/skills/documentation/templates/api-reference.md +1 -1
  175. package/data/harnesses/etna/skills/documentation/templates/architecture-decision.md +3 -7
  176. package/data/harnesses/etna/skills/documentation/templates/behavioral-checklist.md +1 -1
  177. package/data/harnesses/etna/skills/documentation/templates/changelog-entry.md +1 -1
  178. package/data/harnesses/etna/skills/documentation/templates/changelog-index.md +1 -1
  179. package/data/harnesses/etna/skills/documentation/templates/docs-readme.md +3 -3
  180. package/data/harnesses/etna/skills/documentation/templates/doctrine.md +1 -1
  181. package/data/harnesses/etna/skills/documentation/templates/domain-model.md +1 -1
  182. package/data/harnesses/etna/skills/documentation/templates/environment-registry.md +1 -1
  183. package/data/harnesses/etna/skills/documentation/templates/feature.md +3 -3
  184. package/data/harnesses/etna/skills/documentation/templates/handover.md +2 -2
  185. package/data/harnesses/etna/skills/documentation/templates/implementation-map.md +1 -1
  186. package/data/harnesses/etna/skills/documentation/templates/migration-runbook.md +1 -1
  187. package/data/harnesses/etna/skills/documentation/templates/non-goals.md +1 -1
  188. package/data/harnesses/etna/skills/documentation/templates/operations-procedure.md +2 -2
  189. package/data/harnesses/etna/skills/documentation/templates/package.md +1 -1
  190. package/data/harnesses/etna/skills/documentation/templates/protected-files.md +1 -1
  191. package/data/harnesses/etna/skills/documentation/templates/root-readme.md +1 -1
  192. package/data/harnesses/etna/skills/documentation/templates/security-overview.md +1 -1
  193. package/data/harnesses/etna/skills/documentation/templates/system-overview.md +1 -1
  194. package/data/harnesses/etna/skills/documentation/templates/system.md +1 -1
  195. package/data/harnesses/etna/skills/documentation/templates/testing-strategy.md +1 -1
  196. package/data/harnesses/etna/skills/documentation/templates/ux-behavior.md +3 -5
  197. package/data/harnesses/etna/skills/workflow-mapper/SKILL.md +156 -193
  198. package/data/harnesses/etna/skills/workflow-mapper/references/patterns.md +15 -15
  199. package/data/harnesses/hr/harness.json +2 -2
  200. package/data/harnesses/hr/skills/evaluator/SKILL.md +71 -73
  201. package/data/harnesses/hr/skills/evaluator/criteria/code-quality.md +28 -47
  202. package/data/harnesses/hr/skills/evaluator/criteria/deployment-readiness.md +33 -43
  203. package/data/harnesses/hr/skills/evaluator/criteria/maintainability.md +34 -46
  204. package/data/harnesses/hr/skills/evaluator/criteria/mechanical-ambition.md +13 -13
  205. package/data/harnesses/hr/skills/evaluator/criteria/problem-substantiveness.md +7 -7
  206. package/data/harnesses/hr/skills/evaluator/criteria/testing.md +36 -41
  207. package/data/harnesses/hr/skills/evaluator/criteria/ux-mechanics.md +25 -11
  208. package/data/harnesses/hr/skills/evaluator/criteria/value-articulation.md +7 -7
  209. package/data/harnesses/hr/skills/evaluator/preflight.md +27 -46
  210. package/data/harnesses/hr/skills/interview-eval/SKILL.md +37 -42
  211. package/data/harnesses/hr/skills/interview-eval/rubric.md +21 -23
  212. package/package.json +2 -2
@@ -6,27 +6,26 @@ this reference carries the routing judgment.
6
6
 
7
7
  The pipeline, end to end:
8
8
 
9
- ```
10
- converge → final sync/compose → manifest (Status: proposed)
11
- → ONE user approval (Status: approved)
12
- → apply, reading both sides of every destination (Status: applied)
13
- → uselessness test → gaps? new Round, back to approval
14
- → move to docs/history/brainstorms/{topic}/ ← the completion marker
15
- → offer: delete or commit — the user decides
16
- ```
17
-
18
- **Harvest fails loud, never silent.** The move happens only after the full apply passes the
19
- uselessness test. A partial apply — twin death, session kill, anything — leaves the folder
20
- visibly unfinished in `docs/research/` and the user restarts the stop. The pipeline never resumes
21
- silently from a half-applied state, and canonical docs are never written without an approved
22
- manifest (gap-round fixes included).
9
+ 1. Converge.
10
+ 2. Final sync and compose → manifest (`Status: proposed`).
11
+ 3. **One** user approval (`Status: approved`).
12
+ 4. Apply, reading both sides of every destination (`Status: applied`).
13
+ 5. Uselessness test — gaps open a new `Round` and return to step 3.
14
+ 6. Move to `docs/history/brainstorms/{topic}/` — the completion marker.
15
+ 7. Offer: delete or commit — the user decides.
16
+
17
+ **Harvest fails loud, never silent.** The move happens **only** after the full apply passes the
18
+ uselessness test. A partial apply — twin death, session kill, anything — leaves the folder visibly
19
+ unfinished in `docs/research/`, and the user restarts the stop. The pipeline **never** resumes
20
+ silently from a half-applied state, and **never** writes a canonical doc without an approved
21
+ manifest, gap-round fixes included.
23
22
 
24
23
  ## The routing map
25
24
 
26
- Route each piece of the surface by scope. Format every artifact via the `documentation` skill;
27
- where it is unavailable, fall back to own formatting and record which path ran in the manifest.
28
- Read **both sides** of every destination before writing — the destination's current content is a
29
- contract, not a blank page.
25
+ Route each piece of the surface by scope. Format every artifact through the `documentation` skill;
26
+ where it is unavailable, format it yourself and record in the manifest which path ran. Read **both
27
+ sides** of every destination before writing — the destination's current content is a contract, not
28
+ a blank page.
30
29
 
31
30
  | What | Goes to | Shape |
32
31
  | --- | --- | --- |
@@ -36,7 +35,7 @@ contract, not a blank page.
36
35
  | **Domain-model changes** | The living domain-model doc | The information-architecture contract the `boundary` skill reads at the next plan check |
37
36
  | **Still-open (parked) forks** | The repo's open-questions home | Each with a *resolution-lands-in* pointer |
38
37
  | **Backlog items** | The repo backlog | See the scope-guard trio below |
39
- | **Fragments** | Their destinations — they were drafted in destination format precisely so this is a move, not a translation | Merge per the destination's existing structure |
38
+ | **Fragments** | Their destinations — drafted in destination format, so this is a move, not a translation | Merge per the destination's existing structure |
40
39
 
41
40
  **The scope-guard trio** disambiguates everything that isn't a commitment:
42
41
 
@@ -47,13 +46,12 @@ contract, not a blank page.
47
46
 
48
47
  **Directional steering is not feature truth.** A harvested principle informs many decisions and
49
48
  changes slowly; a feature fact belongs to its feature doc and changes at code speed. The harvest
50
- **links** between the steering layer and feature docs — it never duplicates prose across them,
51
- and it never invents a new top-level home for principles (they land in the *existing* living
52
- docs).
49
+ **links** between the steering layer and feature docs — **never** duplicates prose across them, and
50
+ **never** invents a new top-level home for principles; they land in the *existing* living docs.
53
51
 
54
- Rejection rationale and reasoning chains must have explicit destinations — options-considered
55
- sections, decision changelogs — or the uselessness test fails: the folder may never be deleted
56
- into a knowledge loss.
52
+ Rejection rationale and reasoning chains **must** have explicit destinations — options-considered
53
+ sections, decision changelogs — or the uselessness test fails: the folder is **never** deleted into
54
+ a knowledge loss.
57
55
 
58
56
  ## The uselessness test
59
57
 
@@ -68,48 +66,53 @@ The deletion-safety gate: after the apply, the post-harvest living docs alone mu
68
66
  - **The task:** reconstruct the design — thesis, commitments, reasoning, declined branches — from
69
67
  the allowed paths only.
70
68
  - **Grading:** the twin diffs the reconstruction against the ledger and thesis and names every
71
- gap; the session-replay evals audit the grading itself. Anything unrecoverable is a named
72
- harvest gap → recorded in the manifest (`Result: fail`), fixes enter a new manifest `Round`,
73
- approved like the first. Iterate until the folder is redundant.
69
+ gap; the session-replay evals audit the grading itself. Anything unrecoverable is a named harvest
70
+ gap, recorded in the manifest (`Result: fail`); its fixes enter a new manifest `Round`, approved
71
+ like the first. Iterate until the folder is redundant.
74
72
 
75
73
  ## The move, and the offer
76
74
 
77
- When the detector's move gate is clean: delete `ops/` entirely (transcript-grade residue never
78
- enters git), `git mv` the folder to `docs/history/brainstorms/{topic}/`, set
79
- and `Status: harvested`; no index is updated, because none keeps a row per session. The move is the completion marker — a folder still under
75
+ When the detector's move gate is clean:
76
+
77
+ 1. Delete `ops/` entirely — transcript-grade residue **never** enters git.
78
+ 2. `git mv` the folder to `docs/history/brainstorms/{topic}/`.
79
+ 3. Set `Status: harvested` in `state.md`.
80
+
81
+ Update no index — none keeps a row per session. The move is the completion marker: a folder under
80
82
  `docs/research/` is by definition unfinished, which is exactly what the maintenance census reads.
81
83
 
82
84
  Then the offer, relayed by the facilitator: **delete the moved folder, or commit it.** The user
83
- decides; the design assumes deletion — nothing anywhere may depend on the folder surviving.
84
- Committing is the explicit way to keep git-history forensics; an uncommitted folder deleted here
85
- is gone, and that residual is accepted by design.
85
+ decides; the design assumes deletion — **nothing** anywhere may depend on the folder surviving.
86
+ Committing is the explicit way to keep git-history forensics; an uncommitted folder deleted here is
87
+ gone, and that loss is accepted by design.
86
88
 
87
89
  ## Field lessons — apply
88
90
 
89
- Measured on live harvests; each is the rule, distilled.
91
+ Each is a rule measured on live harvests.
90
92
 
91
93
  - **Run the move gate clean immediately before the move and treat that as the verdict** — the
92
94
  gate's checks read `ops/`, which the move deletes, so a post-move re-run fails by construction.
93
- Verify the post-move state by hand: `Status: harvested`, no `ops/`, both index rows,
94
- `check-links` clean. And **distil the process record into `state.md` before the move** — the
95
- sync log dies with `ops/`, and a ten-line dispatch summary is what separates a record that shows
96
- its workings from one that asserts its commitments from nowhere.
95
+ Verify the post-move state by hand: `Status: harvested`, no `ops/`, `check-links` clean.
96
+ - **Distil the process record into `state.md` before the move** — the sync log dies with `ops/`,
97
+ and a ten-line dispatch summary separates a record that shows its workings from one that asserts
98
+ its commitments from nowhere.
97
99
  - **Uncommitted harvest artifacts are deleted, not deprecated** — deprecate-in-place protects
98
100
  readers holding a pointer, and a never-committed file has none; a tombstone for a
99
101
  twenty-minute-old file is ceremony.
100
- - **Audit the *other* decision records for impact at manifest time** — the manifest routes
101
- through the docs the commitments name and will not think of the neighbours. The test is
102
- commitment-level, not textual (grep finds nothing); read each AD's Decision and Open Questions
103
- against the new commitments, and report the unimpacted verdicts with evidence too.
104
- - **A manifest enumerates sites; the file you open contains more of them.** Fix every
105
- same-doctrine site inside a file the manifest already opens — a self-contradicting document is
106
- worse than a wider diff — but never wander into an unnamed file: that becomes a backlog row.
107
- Say which you did, per row, in the application record.
102
+ - **At manifest time, read every existing AD's Decision and Open Questions against the new
103
+ commitments.** A harvest routes only through the docs its commitments name, and the test is
104
+ commitment-level, not textual — grep finds nothing, because the ledger never names the
105
+ neighbours. Report the unimpacted verdicts with their evidence too.
106
+ - **A manifest row names one site; the file you open holds more.** Fix every same-doctrine site
107
+ inside a file the manifest already opens — a self-contradicting document is worse than a wider
108
+ diff — but **never** wander into an unnamed file: that becomes a backlog row, because a canonical
109
+ doc is not rewritten outside an approved scope. Say which you did, per row, in the application
110
+ record.
108
111
  - **Re-run the uselessness test when the destination *set* changes**, not only when content does —
109
112
  a consolidation that moves referrers produces a document set no cold reader has graded. The
110
113
  recurring find: a truth doc stating a decided-but-unbuilt mechanism in the present tense; the
111
114
  fix is one clause naming the unbuilt prerequisite.
112
- - **Retirement wording beats suppression.** doc-lint's heuristics block the honest retirement
115
+ - **Retirement wording beats suppression.** `doc-lint`'s heuristics block the honest retirement
113
116
  sentence (`superseded by`, `no longer`); rephrase with no loss of meaning — "retired by
114
117
  AD-00N", "is not the product's position", "lives in a package that is gone" — and reach for
115
118
  `doc-lint-disable` only when the banned phrase is itself the claim.
@@ -134,14 +137,6 @@ Measured on live harvests; each is the rule, distilled.
134
137
  keeping its Decision, Why and Declined table — and a separate AD only for a genuinely different
135
138
  subject. Link with section anchors where a bare pointer loses precision, and verify anchors by
136
139
  hand: the link checker strips them before resolving.
137
- - **At manifest time, read every existing AD's Decision and Open Questions against the new
138
- commitments.** A harvest routes only through the docs its commitments name, and grep finds
139
- nothing because the ledger never names the others; report the unimpacted verdicts with their
140
- evidence too.
141
- - **A manifest row names one site; the file you open holds more.** Fix the same-doctrine sites
142
- inside a file the manifest already opens, but never wander into an unnamed file — that becomes a
143
- backlog row, because a canonical doc is not rewritten outside an approved scope. Say which you did,
144
- per row, in the application record.
145
140
  - **The per-file lint hook reads intermediate states.** It appends queue rows from mid-edit files;
146
141
  run the linter over the whole edited set before declaring the apply done, and leave the stale
147
142
  rows for the facilitator rather than draining them.
@@ -2,35 +2,36 @@
2
2
 
3
3
  Load when: bootstrapping a session, writing any working-surface file, dispatching the twin, or
4
4
  interpreting detector output. The detector (`scripts/detector.mjs`) is the mechanical half of this
5
- contract — every rule below that carries a rule ID is machine-checked; everything else is the
6
- twin's semantic judgment.
5
+ contract: every rule below carrying a rule ID is machine-checked; everything else is the twin's
6
+ semantic judgment.
7
7
 
8
8
  ## Folder layout
9
9
 
10
- ```
11
- docs/research/{topic}-brainstorm/ ← open session (kebab-case topic slug)
12
- ├── state.md ← anchor + aspect map (twin-written)
13
- ├── thesis.md ← composed claim → argument → what changed (twin-written)
14
- ├── forks.md ← open questions with close conditions (twin-written)
15
- ├── ledger.md ← commitments (twin-written)
16
- ├── basis/ ← frozen entry material (facilitator-written once, at intake)
17
- ├── fragments/ ← harvest-native fragments (twin-written; materialize on
18
- │ first real content, drafted in destination format)
19
- └── ops/ ← untracked capture layer (deleted at stop)
20
- ├── .gitignore ← contains `*` — ops/ never enters git [BS-OPS-01/02]
21
- ├── capture.md ← facilitator's raw append ledger (its ONLY write)
22
- ├── sync-log.md ← paired twin-dispatch log
23
- └── manifest.md ← harvest manifest (created by the stop pipeline)
24
- ```
25
-
26
- On a passed harvest the folder **moves** to `docs/history/brainstorms/{topic}/` (ops/ deleted
27
- first) — the move is the completion marker; the user then deletes or commits it. A folder still
10
+ An open session is `docs/research/{topic}-brainstorm/` (kebab-case topic slug):
11
+
12
+ | Path | Holds | Writer |
13
+ | --- | --- | --- |
14
+ | `state.md` | anchor + aspect map | twin |
15
+ | `thesis.md` | composed claim → argument → what changed | twin |
16
+ | `forks.md` | open questions with close conditions | twin |
17
+ | `ledger.md` | commitments | twin |
18
+ | `basis/` | frozen entry material | facilitator, once, at intake |
19
+ | `fragments/` | harvest-native fragments, drafted in destination format; created on first real content | twin |
20
+ | `ops/` | the untracked capture layer, deleted at stop | — |
21
+ | `ops/.gitignore` | `*` — `ops/` **never** enters git [BS-OPS-01/02] | facilitator |
22
+ | `ops/capture.md` | the facilitator's raw append ledger | facilitator |
23
+ | `ops/sync-log.md` | the paired twin-dispatch log | both (see below) |
24
+ | `ops/manifest.md` | the harvest manifest | twin, in the stop pipeline |
25
+
26
+ On a passed harvest the folder **moves** to `docs/history/brainstorms/{topic}/`, `ops/` deleted
27
+ first. The move is the completion marker; the user then deletes or commits the folder. A folder
28
28
  under `docs/research/` is by definition unfinished.
29
29
 
30
- **Write protocol (one writer per file):** the facilitator appends to `ops/capture.md` and writes
31
- the initial `basis/` copy plus the sync-log *dispatch* lines — nothing else, ever. The twin writes
32
- every other file, at gates. The user may hand-edit anything; the twin diffs each file against its
33
- own last compose before rewriting and folds foreign edits as first-class user signal.
30
+ **Write protocol (one writer per file; the sync log is paired):** the facilitator bootstraps `ops/` at intake, appends to
31
+ `ops/capture.md`, and writes the initial `basis/` copy plus the sync-log *dispatch* lines —
32
+ **nothing else, ever**. The twin writes every other file, at gates. The user may hand-edit anything;
33
+ the twin diffs each file against its own last compose before rewriting and folds foreign edits in
34
+ as first-class user signal.
34
35
 
35
36
  ## state.md
36
37
 
@@ -50,8 +51,8 @@ own last compose before rewriting and folds foreign edits as first-class user si
50
51
  - risks — failure modes and mitigations → none yet
51
52
  ```
52
53
 
53
- - `Status` transitions only forward: `open → stopping → harvested` (the twin flips `stopping` when
54
- the stop pipeline begins, `harvested` at the move). [BS-STATE-01]
54
+ - `Status` moves **only** forward: `open → stopping → harvested` — the twin sets `stopping` when the
55
+ stop pipeline begins and `harvested` at the move [BS-STATE-01].
55
56
  - The aspect map is derived per idea from the basis and edited by the user. Each aspect carries
56
57
  `→` refs to the content covering it: fork IDs (`F#`), ledger IDs (`D#`), `thesis`,
57
58
  `fragment:{name}`, or `none yet` (an open coverage gap — informational mid-session
@@ -70,8 +71,8 @@ Current as of: 2026-07-08T14:30Z
70
71
  ## What changed
71
72
  ```
72
73
 
73
- Composed prose, rewritten whole at every compose, never appended. The three sections and the
74
- stamp are mandatory [BS-THESIS-01]; the stamp must equal state.md's `Last compose`
74
+ Composed prose, rewritten whole at every compose, **never** appended. The three sections and the
75
+ stamp are mandatory [BS-THESIS-01]; the stamp must equal `state.md`'s `Last compose`
75
76
  [BS-COMPOSE-01]. At the manifest gate, `Last compose` must be later than the newest
76
77
  `ops/capture.md` entry — a compose over unsynced capture is stale [BS-COMPOSE-02].
77
78
 
@@ -89,8 +90,8 @@ Full self-contained prose in the user's framing.
89
90
  - IDs `F1, F2, …` unique, never reused [BS-FORK-01]. Status marker: `[open]` or
90
91
  `[parked → {destination}]`. Every fork carries `Closes when:` [BS-FORK-01].
91
92
  - `Raised by: twin (S#)` must cite a reconciled sync-log entry [BS-SYNC-02].
92
- - **A resolved fork's entry is deleted** by the twin — the resolving ledger entry's `Resolves:`
93
- field is the record. forks.md holds only open and parked forks; a ledger `Resolves: F3`
93
+ - **The twin deletes a resolved fork's entry** — the resolving ledger entry's `Resolves:` field is
94
+ the record. `forks.md` holds only open and parked forks; a ledger `Resolves: F3`
94
95
  coexisting with an open F3 is an inconsistency [BS-FORK-02]. Parked forks survive to the
95
96
  manifest, which must route each one [BS-MANIFEST-01].
96
97
  - The manifest gate requires zero `[open]` forks [BS-FORK-03].
@@ -115,10 +116,10 @@ Full self-contained prose in the user's framing.
115
116
 
116
117
  ## ops/capture.md
117
118
 
118
- The facilitator's per-turn append — its one write duty. Lowest possible bar: raw, unpolished,
119
- everything session-relevant from *both* sides (user substance and facilitator substance —
120
- diagnoses, informed rejections, definitions, reasoning chains), including residue judged not
121
- worth pillar filing. Format:
119
+ The facilitator's per-turn append. Lowest possible bar: raw, unpolished, everything
120
+ session-relevant from *both* sides (user substance and facilitator substance — diagnoses, informed
121
+ rejections, definitions, reasoning chains), including residue judged not worth pillar filing.
122
+ Format:
122
123
 
123
124
  ```markdown
124
125
  ---
@@ -127,8 +128,8 @@ worth pillar filing. Format:
127
128
  <raw notes for this turn>
128
129
  ```
129
130
 
130
- Turn IDs `T#` ascending with an ISO timestamp — the timestamp is what compose-freshness checks
131
- against [BS-COMPOSE-02]. Never distill here; distillation is the twin's job.
131
+ Turn IDs `T#` ascend, each with an ISO timestamp — the timestamp compose-freshness checks against
132
+ [BS-COMPOSE-02]. **Never** distill here; distillation is the twin's.
132
133
 
133
134
  ## ops/sync-log.md
134
135
 
@@ -140,7 +141,7 @@ S4 → reconciled | 2026-07-08T14:29Z | 4 edits · 2 new forks · 6 open · unto
140
141
  ```
141
142
 
142
143
  The **facilitator** writes the dispatch line as it dispatches; the **twin** appends the result
143
- line (`reconciled` or `failed`) on return — no single author holds both sides. Every dispatch
144
+ line (`reconciled` or `failed`) on return — **never** one author for both sides. Every dispatch
144
145
  line must acquire a result line; only the newest entry may be unpaired (in flight) [BS-SYNC-01].
145
146
  A `failed` result is surfaced to the user at the next turn break and re-run at the next gate.
146
147
 
@@ -181,8 +182,13 @@ the move to history requires a recorded passing uselessness test [BS-USELESS-01]
181
182
  - `move` — adds the post-apply gates (manifest applied, uselessness pass recorded, no links into
182
183
  scaffolding); the folder may not move while any fail.
183
184
 
184
- Exit code 0 = clean, 1 = violations (listed with rule IDs), 2 = unusable input. A run always
185
- prints output — per-rule lines plus a `clean`/`failing` summary (or a usage/error message);
186
- **exit 0 with empty output means the detector never executed** and is a failure, never a pass. Rules degrade
187
- gracefully: no git context ⇒ BS-OPS-02 reports `skipped`, never blocks. Rule IDs are stable —
188
- consumers (the twin, the evals, the maintenance census) key on them.
185
+ | Exit | Meaning |
186
+ | --- | --- |
187
+ | `0` | clean |
188
+ | `1` | violations, listed with rule IDs |
189
+ | `2` | unusable input |
190
+
191
+ A run always prints output — per-rule lines plus a `clean`/`failing` summary, or a usage/error
192
+ message. **Exit 0 with empty output means the detector never executed** — a failure, **never** a
193
+ pass. Rules degrade gracefully: with no git context, `BS-OPS-02` reports `skipped` and never blocks.
194
+ Rule IDs are stable — the twin, the evals, and the maintenance census key on them.
@@ -3,7 +3,7 @@ name: documentation
3
3
  description: "Use when creating or substantively editing ANY markdown doc — invoke BEFORE writing. Genre registry, templates and style authority for technical docs: LLDs, ADs, plans, changelogs, READMEs, runbooks. Owns the tense rule: truth docs state the present; history only in dated records. Baselining is the maintenance agent."
4
4
  ---
5
5
 
6
- # Technical Documentation Skill
6
+ # Technical documentation skill
7
7
 
8
8
  This skill writes one document at a time: the genre registry says what kind of document it is, a template gives its shape, the style guide its prose, and `doc-lint` checks the mechanical half. It does not baseline, audit or reconcile a repo's doc tree; that is the `maintenance` agent, which calls this skill once per document it scaffolds.
9
9
 
@@ -67,7 +67,7 @@ The full strip-list and the record-side rules: `references/style-guide.md` § Th
67
67
  - **Intent and promises; facts are the graph's.** An owning document (feature, package, system) says why the product is shaped this way and what it promises, and names the objects it designs in `objects:`. Every computable fact (a table's columns, which function writes which column, which route sits behind which guard, which file holds what) is the code's, and a hand-typed copy is wrong the day the code moves. `doc-lint` blocks the retired mechanism sections (`mechanism-section`) and an owning document with no `objects:`.
68
68
  - **Read by people, pointed at by the footer.** Sharp bullets under noun-phrase headings, each a bold label, a colon, one or two plain sentences; code named only where a person types or sees it, or at a cross-cutting seam; every other pointer in the closing **For the agent** footer (style guide § Owning documents — the body and the footer).
69
69
  - **The stability test.** A sentence that would change when a function is renamed, a file moves, or a route, column or error code changes is the code's, not the document's. The code is the authority on *what*; the document on *why* (style guide § Shape).
70
- - **Unbuilt work has one home per kind.** Decided design the code does not yet do sits in the body, wrapped in an `UNBUILT` marker; a shortfall in what is built is one bullet under Gaps; the work that would close either is a backlog row, which the document never tracks (style guide § The stability test).
70
+ - **Unbuilt work has one home per kind.** Decided, unbuilt design sits in the body, wrapped in an `UNBUILT` marker; a shortfall in what is built is one bullet under Gaps; the work that would close either is a backlog row, which the document never tracks (style guide § The stability test).
71
71
  - **No empty stubs.** Omit a section with nothing real to say. Write "None" only where the absence is itself information, such as a plan's Cross-Module Contracts Affected.
72
72
  - **No redirect documents.** Moving a document deletes the old file and repoints every inbound link; a "Moved to X" stub rots and creates false search hits.
73
73
 
@@ -78,9 +78,9 @@ The full strip-list and the record-side rules: `references/style-guide.md` § Th
78
78
  - **The links an index may carry:** a sibling folder's `Readme.md`, the mandated scaffolds (`structure.md`, `operations/setup.md`, `history/CHANGELOG.md`, `history/backlog.md`, `history/journal.md`, `history/health-log.md`, `memory/main.md`), and the root `CLAUDE.md` and `AGENTS.md`. `doc-lint` blocks the rest under `docs/` as `index-lists-files`, a drawn tree as `index-file-tree`, a named file or record as `index-names-records`.
79
79
  - **Routing documents point at truth.** A "read first" row names the topic's truth document, never a plan or changelog entry. An index of the records themselves (a History section naming `plans/` and `changelog/`) is sanctioned.
80
80
 
81
- ### Ownership today
81
+ ### Ownership edges
82
82
 
83
- A document names the objects it designs in `objects:`, and a source file names the document that speaks for it in its path header. The harness's ownership scan reads one edge today: the transitional `owns:` region glob on each feature, package, system and surface-owning UX document, the narrower glob winning. Write the header pointer anyway, so the scan can switch to it and to the object closure without a second pass over the code. Where a repository has no `docs/architecture/systems/knowledge-layer.md`, this skill and `references/frontmatter.md` are the whole authority on document–code edges. `docs/structure.md` is harness-owned: the installer writes it, and the `maintenance` agent stamps only its `harness-version`.
83
+ A document names the objects it designs in `objects:`, and a source file names the document that speaks for it in its path header. The harness's ownership scan reads one edge: the transitional `owns:` region glob on each feature, package, system and surface-owning UX document, the narrower glob winning. **Always write the header pointer as well** — the scan switches to it and to the object closure, and pointers already in place spare that switch a second pass over the code. Where a repository has no `docs/architecture/systems/knowledge-layer.md`, this skill and `references/frontmatter.md` are the whole authority on document–code edges. `docs/structure.md` is harness-owned: the installer writes it, and the `maintenance` agent stamps only its `harness-version`.
84
84
 
85
85
  ---
86
86
 
@@ -113,7 +113,7 @@ A document names the objects it designs in `objects:`, and a source file names t
113
113
  | Scaffold a standard doc (docs index, changelog guide, backlog, memory) | The registry's § Baseline scaffolds |
114
114
  | Frontmatter keys (`objects:`, `verifies:`, the transitional `owns:`) | [`references/frontmatter.md`](references/frontmatter.md) |
115
115
  | Source-file comments: what stays, what moves to a doc, proving a sweep | [`references/source-comments.md`](references/source-comments.md) |
116
- | Instruction file (`CLAUDE.md`, a rule, an agent, skill prose) | [`references/instruction-style.md`](references/instruction-style.md): every-load prose stays lean; the present-tense rule still applies |
116
+ | Instruction file (`CLAUDE.md`, a rule, an agent, skill prose) | [`references/instruction-style.md`](references/instruction-style.md): every-load prose stays lean; the present-tense rule applies too |
117
117
  | Author or restructure a skill | The skill-authoring field guide in the etna repo (`nurixlabs/etna`), `docs/playbooks/skills/`. No etna checkout ⇒ ask the user for access, or proceed from first principles with `references/instruction-style.md` governing the prose |
118
118
  | No template matches | [`references/untemplated.md`](references/untemplated.md) |
119
119
 
@@ -1,12 +1,12 @@
1
- # Documentation Examples
1
+ # Documentation examples
2
2
 
3
- Good vs bad examples showing the key differences.
3
+ Good and bad documentation side by side; `style-guide.md` cites each example by number.
4
4
 
5
5
  ---
6
6
 
7
- ## Example 1: Function Documentation
7
+ ## Example 1: Function documentation
8
8
 
9
- ### Bad: Full Implementation
9
+ ### Bad: full implementation
10
10
 
11
11
  ```markdown
12
12
  ### mergeData
@@ -14,9 +14,9 @@ Good vs bad examples showing the key differences.
14
14
  function mergeData(server, local, changes) { const result = {}; const serverMap = new Map(server.map((i) => [i.id, i])); // ... 30 more lines return result; }
15
15
  ```
16
16
 
17
- **Problems:** Will become obsolete, focuses on HOW not WHAT.
17
+ **Problems:** goes stale with the first refactor; shows *how* instead of *what*.
18
18
 
19
- ### Good: Contract Only
19
+ ### Good: contract only
20
20
 
21
21
  ```markdown
22
22
  ### `mergeData(serverData, localData, changes)`
@@ -40,9 +40,9 @@ function mergeData(server, local, changes) { const result = {}; const serverMap
40
40
 
41
41
  ---
42
42
 
43
- ## Example 2: State Documentation
43
+ ## Example 2: State documentation
44
44
 
45
- ### Bad: State Everywhere
45
+ ### Bad: state everywhere
46
46
 
47
47
  ```markdown
48
48
  ## Component State
@@ -58,9 +58,9 @@ const [items, setItems] = useState([]);
58
58
  { items: [], loading: false, error: null }
59
59
  ```
60
60
 
61
- **Problems:** Documents transient state, repeats shapes.
61
+ **Problems:** documents transient state and repeats shapes.
62
62
 
63
- ### Good: Persistence Points Only, in the API reference
63
+ ### Good: persistence points only, in the API reference
64
64
 
65
65
  Persisted shapes live in the API reference (`docs/architecture/api.md`), never in a feature document, where `## State` is a retired mechanism section.
66
66
 
@@ -89,7 +89,7 @@ export const items = pgTable('items', {
89
89
 
90
90
  ## Example 3: Changelog
91
91
 
92
- ### Bad: Vague
92
+ ### Bad: vague
93
93
 
94
94
  ```markdown
95
95
  # 2025-01-05 - Updates
@@ -105,7 +105,7 @@ export const items = pgTable('items', {
105
105
  - Various files in src/
106
106
  ```
107
107
 
108
- ### Good: Behavior First, Refinement Context Kept
108
+ ### Good: behavior first, refinement context kept
109
109
 
110
110
  ```markdown
111
111
  # 2025-01-05 · data-sync — Local edits survive a sync only when versions match
@@ -123,7 +123,7 @@ export const items = pgTable('items', {
123
123
 
124
124
  ## Example 4: Flow
125
125
 
126
- ### Bad: Mechanism narrated in a paragraph
126
+ ### Bad: mechanism narrated in a paragraph
127
127
 
128
128
  ```markdown
129
129
  ## Data Flow
@@ -133,7 +133,7 @@ When the page loads, the useAppInit hook calls the syncData function. This funct
133
133
 
134
134
  **Problems:** names a hook, a function and a store that a rename would invalidate (the stability test); runs parallel cases together in one paragraph; gives a scanning reader no label to land on; "Data Flow" is a retired mechanism section.
135
135
 
136
- ### Good: Labelled bullets, a role-level diagram beside them
136
+ ### Good: labelled bullets, a role-level diagram beside them
137
137
 
138
138
  ````markdown
139
139
  ## Flows
@@ -161,7 +161,7 @@ sequenceDiagram
161
161
 
162
162
  ## Example 5: Architecture Decision revision
163
163
 
164
- ### Bad: Supersession chain
164
+ ### Bad: supersession chain
165
165
 
166
166
  ```
167
167
  docs/architecture/decisions/
@@ -170,9 +170,9 @@ docs/architecture/decisions/
170
170
  └── AD-011-auth-better-auth-v2.md (status: Accepted, "supersedes AD-006")
171
171
  ```
172
172
 
173
- **Problems:** Three files hold one subject; the reader must diff a chain to learn the current truth; two of the three are wrong-but-present (the same pathology as keeping `report_v1.sql` beside the live `report_v2.sql`); the reasoning that killed Keycloak is stranded in a dead file nobody opens.
173
+ **Problems:** three files hold one subject; the reader must diff a chain to learn the current truth; two of the three are wrong-but-present (the same pathology as keeping `report_v1.sql` beside the live `report_v2.sql`); the reasoning that killed Keycloak is stranded in a dead file nobody opens.
174
174
 
175
- ### Good: One subject, updated in place
175
+ ### Good: one subject, updated in place
176
176
 
177
177
  ```
178
178
  docs/architecture/decisions/
@@ -195,15 +195,15 @@ We use Better Auth with one-shot credential issuance… ← current truth, no
195
195
  - 2026-01-10 — Initial decision accepted. Implemented by [plan](…).
196
196
  ```
197
197
 
198
- **Why it works:** The body answers "how does auth work and why" without archaeology; the tail preserves every reversal with its trigger; the rejected alternatives stay findable in the one file a reader actually opens.
198
+ **Why it works:** the body answers "how does auth work and why" without archaeology; the tail preserves every reversal with its trigger; the rejected alternatives stay findable in the one file a reader actually opens.
199
199
 
200
200
  ---
201
201
 
202
202
  ## Example 6: Stripping history from a truth doc
203
203
 
204
- The move agents fumble: deleting narration is only half the job — the story must land in a record.
204
+ Deleting narration is only half the move; the story **must** land in a record.
205
205
 
206
- ### Bad: The journey narrated in place
206
+ ### Bad: the journey narrated in place
207
207
 
208
208
  ```markdown
209
209
  ## Export Pipeline
@@ -214,7 +214,7 @@ output is not yet implemented. Treat any reference to `reports/export.js` as
214
214
  stale — it was superseded by `src/export/run.js`.
215
215
  ```
216
216
 
217
- ### Good: Present-tense truth doc + a dated record carrying the story
217
+ ### Good: present-tense truth doc + a dated record carrying the story
218
218
 
219
219
  The feature doc states only what is:
220
220
 
@@ -243,7 +243,7 @@ And the change-story goes to `docs/history/changelog/2026-06-02-export-extractio
243
243
 
244
244
  ---
245
245
 
246
- ## Quick Comparison
246
+ ## Quick comparison
247
247
 
248
248
  | Aspect | Bad | Good |
249
249
  | ---------- | -------------------- | --------------------------- |
@@ -6,7 +6,7 @@ This reference states how a document joins the knowledge graph, and it is kept i
6
6
 
7
7
  ## The model
8
8
 
9
- A document names the product objects it designs. Every other edge between a document and the code is either authored on the code's side or computed, never typed into the document. The harness's ownership scan reads one edge today, the transitional `owns:` region glob (§ `owns:`); principles 2 and 3 are the edges it switches to, and the header pointer is written now so the switch needs no second pass over the code.
9
+ A document names the product objects it designs. Every other edge between a document and the code is either authored on the code's side or computed, never typed into the document. The harness's ownership scan reads one edge, the transitional `owns:` region glob (§ `owns:` — transitional); principles 2 and 3 are the edges it switches to, and the header pointer is written alongside it so the switch needs no second pass over the code.
10
10
 
11
11
  ### Principles
12
12
 
@@ -63,7 +63,7 @@ Tooling keys sit beside these on any genre: `rev:` (a generator's generation sta
63
63
 
64
64
  ### `owns:` — transitional
65
65
 
66
- - **Reason for the key:** the harness's ownership scan (`.claude/hooks/lib/ownership.mjs`) keys on `owns:` until it switches to the header pointers and the object closure, which is the knowledge layer's recorded gap. Until then the key keeps the session's ownership index and the doc-debt detectors working.
66
+ - **Reason for the key:** the harness's ownership scan (`.claude/hooks/lib/ownership.mjs`) keys on `owns:` until it switches to the header pointers and the object closure, which is the knowledge layer's recorded gap. The key is what keeps the session's ownership index and the doc-debt detectors working.
67
67
  - **Form:** region globs only, one per region the document speaks for: `packages/{name}/**` on a package document, the machine's subtrees on a system document, a feature's own directory on a feature document. Never a list of individual files, and never a shared file several features import.
68
68
  - **Growth:** none. A new document carries the region glob its genre needs and nothing more; an edit never adds file-level entries.
69
69
  - **Retirement:** removed from every document in the same change that switches the scan, and this section with it.
@@ -73,7 +73,7 @@ Tooling keys sit beside these on any genre: `rev:` (a generator's generation sta
73
73
  | Key | Retired because | What replaces it |
74
74
  | --- | --- | --- |
75
75
  | `applies:` | A list of governing documents is a hand-kept copy of a relationship the graph computes through the objects both documents name, and it drifts the way any copy does | The objects the doctrine and the surface share, computed; for people, the document's Scope section (a UX document's Purpose) names its governing doctrine and what each settles |
76
- | `keywords:` | An object's name and aliases are its discovery terms | `objects:`. The ownership scan still shows a document's `keywords:` in the index when it names no `objects:`, so removing the key without adding `objects:` empties that entry |
76
+ | `keywords:` | An object's name and aliases are its discovery terms | `objects:`. The ownership scan shows a document's `keywords:` in the index when it names no `objects:`, so removing the key without adding `objects:` empties that entry |
77
77
  | A file-level `owns:` list | The header pointers and the object closure compute it | Region globs only, until the scan switches (above) |
78
78
 
79
79
  An edit to a document that carries a retired key removes the key in the same edit.
@@ -1,4 +1,4 @@
1
- # Instruction-File Style
1
+ # Instruction-file style
2
2
 
3
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
4
 
@@ -6,11 +6,11 @@ The shared style for every file an agent obeys — a `CLAUDE.md`, a rule, an age
6
6
 
7
7
  An instruction file is paid for whenever it loads, scaled by its load class: `CLAUDE.md` and unscoped rules load on **every turn of every session** — the most expensive prose in a repo per word; a `paths:`-scoped rule loads on those same terms from its first matching file read on; 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
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.
9
+ **On a rewrite, 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
10
 
11
11
  ## Coherence
12
12
 
13
- A rewrite is not only a trim — read the file as one artifact and fix what disagrees or is missing:
13
+ A rewrite is not only a trim. Read the file as one artifact and fix what disagrees or is missing:
14
14
 
15
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
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.
@@ -2,17 +2,17 @@
2
2
 
3
3
  Load when: writing or sweeping source-file comments, or cutting a comment whose claim belongs in a document. Not needed to write a document.
4
4
 
5
- **In `docs/`, never in the file's comments** — and this skill is the half of that rule that makes it safe. A source file carries a repo-relative path header of two or three present-tense sentences and one third-person sentence above each non-obvious function; the shape is the harness's `CLAUDE.md` § File Structure, which is canonical and is not restated here. That header's `docs/…` path is also the file's edge into the knowledge graph: the header pointer names the document that speaks for the file, which is how ownership is computed ([`frontmatter.md`](frontmatter.md)). What lands **here** is everything that shape displaces: design rationale, the alternatives weighed, the measurement behind a constant, the reason an obvious-looking change is wrong.
5
+ **In `docs/`, never in the file's comments** — and this skill is the half of that rule that makes it safe. A source file carries a repo-relative path header of two or three present-tense sentences and one third-person sentence above each non-obvious function; the canonical shape is the harness's `CLAUDE.md` § File Structure. That header's `docs/…` path is also the file's edge into the knowledge graph: the header pointer names the document that speaks for the file, which is how ownership is computed ([`frontmatter.md`](frontmatter.md)). What lands **here** is everything that shape displaces: design rationale, the alternatives weighed, the measurement behind a constant, the reason an obvious-looking change is wrong.
6
6
 
7
7
  **Cutting a comment is a move, not a deletion.** A claim taken out of a source file is owed one of two things before the cut is done, and the choice is per claim, not per file:
8
8
 
9
9
  | The claim is | What it earns |
10
10
  | --- | --- |
11
11
  | Worth keeping, and its doc does not state it | A section in the **owning feature doc** (the ownership index resolves which), carrying the claim and the argument for why the codebase is worse without it — never the comment's wording, which was written for a reader holding the code |
12
- | Already stated in its doc | Nothing — but you **open that doc and find the sentence** before saying so. An assumed duplicate is how a claim is lost |
12
+ | Already stated in its doc | Nothing, once you **open that doc and find the sentence**. An assumed duplicate is how a claim is lost |
13
13
  | History, a ticket or decision-record reference, a dated note, a divider, or narration of code that no longer exists | Nothing, and no record. A record lives in `docs/history/`; these are not claims about the present |
14
14
 
15
- **Count what you cut, and prove the cut was only comments.** A comment sweep states comment lines before and after per file, so a drop nobody accounted for is visible as a number rather than as a feeling. [`scripts/comment-strip.mjs`](../scripts/comment-strip.mjs) turns that from a claim into a check: it strips comments from both revisions — honouring strings, template and character literals, regex literals, raw strings and JSX comment braces — and diffs what is left, so a sweep that quietly changed executable code cannot pass as a cleanup. `comment-strip.mjs --rev <before> --to <after> <paths…>` exits 0 for "no executable code changed" and 1 naming the file and the first diverging line. Run it over any pass that touches more than a handful of files; a sweep without it is an assertion.
15
+ **Count what you cut, and prove the cut was only comments.** A comment sweep states comment lines before and after per file, so an unaccounted drop shows as a number. [`scripts/comment-strip.mjs`](../scripts/comment-strip.mjs) turns that from a claim into a check: it strips comments from both revisions — honouring strings, template and character literals, regex literals, raw strings and JSX comment braces — and diffs what is left, so a sweep that quietly changed executable code cannot pass as a cleanup. `comment-strip.mjs --rev <before> --to <after> <paths…>` exits 0 for "no executable code changed" and 1 naming the file and the first diverging line. Run it over any pass that touches more than a handful of files; a sweep without it is an assertion.
16
16
 
17
17
  **The mechanical half of the shape is checked, not remembered.** [`scripts/source-lint.mjs`](../scripts/source-lint.mjs) `--changed` reports a header that names another path or none, a change whose added lines are over a quarter comments, and the four shapes the convention deletes outright — narration, ALL-CAPS emphasis, an over-long header, a comment block that has become a document. Block-severity findings must be fixed; the escape hatch is a `source-lint-disable: <id>` comment with the reason in a second comment beside it, and the only finding that legitimately takes one is a booby trap. The harness detector raises a bookkeeping row for the same condition, so an unfixed breach outlives the session that wrote it.
18
18