@nurix/etna 0.18.0 → 0.18.2

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 (118) hide show
  1. package/README.md +6 -5
  2. package/data/harness-index.json +1 -5
  3. package/data/harnesses/code/CLAUDE.md +8 -19
  4. package/data/harnesses/code/agents/brainstorm.md +3 -3
  5. package/data/harnesses/code/agents/change-review.md +13 -10
  6. package/data/harnesses/code/agents/harness-manager.md +15 -15
  7. package/data/harnesses/code/agents/maintenance.md +10 -3
  8. package/data/harnesses/code/agents/performance-review.md +5 -0
  9. package/data/harnesses/code/harness.json +1 -1
  10. package/data/harnesses/code/rules/general.md +40 -36
  11. package/data/harnesses/code/skills/boundary/SKILL.md +15 -42
  12. package/data/harnesses/code/skills/boundary/references/boundary-taxonomy.md +366 -304
  13. package/data/harnesses/code/skills/brainstorm/README.md +9 -9
  14. package/data/harnesses/code/skills/brainstorm/SKILL.md +15 -15
  15. package/data/harnesses/code/skills/brainstorm/harvest.md +3 -3
  16. package/data/harnesses/code/skills/brainstorm/templates/backlog.md +2 -2
  17. package/data/harnesses/code/skills/brainstorm/templates/build.md +6 -6
  18. package/data/harnesses/code/skills/brainstorm/templates/decisions.md +3 -3
  19. package/data/harnesses/code/skills/brainstorm/templates/doctrine.md +2 -2
  20. package/data/harnesses/code/skills/brainstorm/templates/domain-model.md +2 -2
  21. package/data/harnesses/code/skills/brainstorm/templates/glossary.md +2 -1
  22. package/data/harnesses/code/skills/brainstorm/templates/non-goals.md +3 -7
  23. package/data/harnesses/code/skills/brainstorm/templates/questions.md +6 -5
  24. package/data/harnesses/code/skills/brainstorm/templates/state.md +1 -8
  25. package/data/harnesses/code/skills/brainstorm/templates/tech.md +6 -6
  26. package/data/harnesses/code/skills/brainstorm/templates/thesis.md +2 -2
  27. package/data/harnesses/code/skills/distiller/SKILL.md +48 -177
  28. package/data/harnesses/code/skills/distiller/references/docs-mode.md +116 -343
  29. package/data/harnesses/code/skills/distiller/references/method.md +37 -109
  30. package/data/harnesses/code/skills/documentation/SKILL.md +9 -6
  31. package/data/harnesses/code/skills/documentation/references/examples.md +30 -61
  32. package/data/harnesses/code/skills/documentation/references/style-guide.md +59 -62
  33. package/data/harnesses/code/skills/documentation/references/templates.md +26 -34
  34. package/data/harnesses/code/skills/workflow-mapper/SKILL.md +32 -11
  35. package/data/harnesses/code/skills/workflow-mapper/references/patterns.md +1 -1
  36. package/data/harnesses/discover/CLAUDE.md +60 -113
  37. package/data/harnesses/discover/agents/api.md +11 -28
  38. package/data/harnesses/discover/agents/codebase.md +12 -30
  39. package/data/harnesses/discover/agents/community.md +9 -21
  40. package/data/harnesses/discover/agents/deployed-client-bundle.md +16 -67
  41. package/data/harnesses/discover/agents/distribution-artifacts.md +21 -59
  42. package/data/harnesses/discover/agents/docs.md +11 -20
  43. package/data/harnesses/discover/agents/infra-backend-fingerprint.md +28 -68
  44. package/data/harnesses/discover/agents/packages.md +12 -28
  45. package/data/harnesses/discover/agents/session.md +18 -50
  46. package/data/harnesses/discover/agents/website.md +9 -19
  47. package/data/harnesses/discover/agents/wire-capture.md +22 -72
  48. package/data/harnesses/discover/harness.json +1 -1
  49. package/data/harnesses/discover/rules/cartography-coverage.md +94 -0
  50. package/data/harnesses/discover/rules/cartography-flows.md +99 -0
  51. package/data/harnesses/discover/rules/cartography-ia.md +88 -0
  52. package/data/harnesses/discover/rules/cartography.md +109 -0
  53. package/data/harnesses/discover/rules/discovery.md +73 -182
  54. package/data/harnesses/discover/rules/evaluation.md +92 -98
  55. package/data/harnesses/discover/rules/ingestion.md +123 -322
  56. package/data/harnesses/discover/rules/self-correction.md +94 -107
  57. package/data/harnesses/discover/rules/tradecraft.md +201 -172
  58. package/data/harnesses/hr/CLAUDE.md +21 -51
  59. package/data/harnesses/hr/harness.json +1 -1
  60. package/data/harnesses/hr/skills/interview-eval/SKILL.md +23 -11
  61. package/data/harnesses/hr/skills/interview-eval/TEMPLATE.md +49 -29
  62. package/data/harnesses/hr/skills/interview-eval/rubric.md +30 -30
  63. package/data/harnesses/kb-agi/CLAUDE.md +8 -8
  64. package/data/harnesses/kb-agi/agents/kb-agi-init.md +31 -22
  65. package/data/harnesses/kb-agi/agents/kb-catch-stale.md +1 -1
  66. package/data/harnesses/kb-agi/agents/kb-find-gaps.md +1 -1
  67. package/data/harnesses/kb-agi/agents/kb-fix-links.md +1 -1
  68. package/data/harnesses/kb-agi/agents/kb-refresh-summaries.md +2 -2
  69. package/data/harnesses/kb-agi/agents/kb-sync-metadata.md +2 -2
  70. package/data/harnesses/kb-agi/harness.json +1 -1
  71. package/package.json +1 -1
  72. package/data/harnesses/code-fable/.prettierignore +0 -12
  73. package/data/harnesses/code-fable/.prettierrc.json +0 -3
  74. package/data/harnesses/code-fable/.vscode/settings.json +0 -10
  75. package/data/harnesses/code-fable/CLAUDE.md +0 -135
  76. package/data/harnesses/code-fable/agents/brainstorm.md +0 -35
  77. package/data/harnesses/code-fable/agents/change-review.md +0 -248
  78. package/data/harnesses/code-fable/agents/harness-manager.md +0 -181
  79. package/data/harnesses/code-fable/agents/maintenance.md +0 -115
  80. package/data/harnesses/code-fable/agents/performance-review.md +0 -218
  81. package/data/harnesses/code-fable/agents/spec-mode.md +0 -56
  82. package/data/harnesses/code-fable/harness.json +0 -12
  83. package/data/harnesses/code-fable/hooks/hooks.json +0 -27
  84. package/data/harnesses/code-fable/hooks/lib/redact.mjs +0 -35
  85. package/data/harnesses/code-fable/hooks/prompt-recall.mjs +0 -155
  86. package/data/harnesses/code-fable/hooks/session-reflect.mjs +0 -285
  87. package/data/harnesses/code-fable/rules/general.md +0 -79
  88. package/data/harnesses/code-fable/rules/nomenclature.md +0 -30
  89. package/data/harnesses/code-fable/rules/typescript.md +0 -19
  90. package/data/harnesses/code-fable/skills/boundary/SKILL.md +0 -76
  91. package/data/harnesses/code-fable/skills/boundary/references/boundary-taxonomy.md +0 -734
  92. package/data/harnesses/code-fable/skills/brainstorm/README.md +0 -136
  93. package/data/harnesses/code-fable/skills/brainstorm/SKILL.md +0 -135
  94. package/data/harnesses/code-fable/skills/brainstorm/harvest.md +0 -26
  95. package/data/harnesses/code-fable/skills/brainstorm/templates/backlog.md +0 -39
  96. package/data/harnesses/code-fable/skills/brainstorm/templates/build.md +0 -37
  97. package/data/harnesses/code-fable/skills/brainstorm/templates/decisions.md +0 -29
  98. package/data/harnesses/code-fable/skills/brainstorm/templates/doctrine.md +0 -31
  99. package/data/harnesses/code-fable/skills/brainstorm/templates/domain-model.md +0 -25
  100. package/data/harnesses/code-fable/skills/brainstorm/templates/glossary.md +0 -19
  101. package/data/harnesses/code-fable/skills/brainstorm/templates/milestones.md +0 -43
  102. package/data/harnesses/code-fable/skills/brainstorm/templates/non-goals.md +0 -21
  103. package/data/harnesses/code-fable/skills/brainstorm/templates/plan-doc.md +0 -61
  104. package/data/harnesses/code-fable/skills/brainstorm/templates/questions.md +0 -35
  105. package/data/harnesses/code-fable/skills/brainstorm/templates/references.md +0 -28
  106. package/data/harnesses/code-fable/skills/brainstorm/templates/rejected.md +0 -29
  107. package/data/harnesses/code-fable/skills/brainstorm/templates/state.md +0 -8
  108. package/data/harnesses/code-fable/skills/brainstorm/templates/tech.md +0 -23
  109. package/data/harnesses/code-fable/skills/brainstorm/templates/thesis.md +0 -21
  110. package/data/harnesses/code-fable/skills/distiller/SKILL.md +0 -219
  111. package/data/harnesses/code-fable/skills/distiller/references/docs-mode.md +0 -526
  112. package/data/harnesses/code-fable/skills/distiller/references/method.md +0 -166
  113. package/data/harnesses/code-fable/skills/documentation/SKILL.md +0 -125
  114. package/data/harnesses/code-fable/skills/documentation/references/examples.md +0 -193
  115. package/data/harnesses/code-fable/skills/documentation/references/style-guide.md +0 -288
  116. package/data/harnesses/code-fable/skills/documentation/references/templates.md +0 -865
  117. package/data/harnesses/code-fable/skills/workflow-mapper/SKILL.md +0 -430
  118. package/data/harnesses/code-fable/skills/workflow-mapper/references/patterns.md +0 -214
@@ -16,8 +16,8 @@ If `meta/guidance.md` is missing, this vault isn't initialized — invoke the **
16
16
 
17
17
  Before answering anything, run a short interview with the `AskUserQuestion` tool to establish two things:
18
18
 
19
- 1. **What brings you?** → *ask* (you have a question) or *contribute* (you have something to add).
20
- 2. **Your user-type (genre):** → *Sales*, *PM*, or *Contributor*. This sets the default depth and framing of answers, nothing else. (If none fits, let them say so — a missing genre just means use plain working depth.)
19
+ 1. **What brings you?** → _ask_ (you have a question) or _contribute_ (you have something to add).
20
+ 2. **Your user-type (genre):** → _Sales_, _PM_, or _Contributor_. This sets the default depth and framing of answers, nothing else. (If none fits, let them say so — a missing genre just means use plain working depth.)
21
21
 
22
22
  Then load the matching template from [`meta/genre/`](meta/genre/) — `sales.md`, `pm.md`, or `contributor.md` — and follow the path below.
23
23
 
@@ -29,17 +29,17 @@ Keep the interview to those two questions. Don't re-interview on every follow-up
29
29
 
30
30
  You are **read-only** on this path. You never edit a note. Your only write is appending a query log to `meta/sessions/` (see below).
31
31
 
32
- 1. **Find the entry note(s)** for the question. Start from [`meta/intent-index.md`](meta/intent-index.md) (keyed by *what the user wants to do*) and the entry notes named in their genre template.
33
- 2. **Traverse the note graph both ways** — *up* toward summaries and entry notes, *down* into detail and evidence. The `[[wikilinks]]` are the structure. Lead with `canonical` notes; treat `canonical: false` ones as background.
32
+ 1. **Find the entry note(s)** for the question. Start from [`meta/intent-index.md`](meta/intent-index.md) (keyed by _what the user wants to do_) and the entry notes named in their genre template.
33
+ 2. **Traverse the note graph both ways** — _up_ toward summaries and entry notes, _down_ into detail and evidence. The `[[wikilinks]]` are the structure. Lead with `canonical` notes; treat `canonical: false` ones as background.
34
34
  3. **Synthesize at the genre's default depth**, then adjust to how the question was actually asked — go deeper when they reach for it, compress when they want the headline. Depth shapes the answer; it never hides notes.
35
35
  4. **Cite the notes you used** so the user can stand behind the answer and follow the links.
36
- 5. **Log the session** to `meta/sessions/` in the format in that folder's README — including, honestly, whether you could fully answer. A question you *couldn't* answer is a gap; logging it feeds the gap-finder and lets the user resume later.
36
+ 5. **Log the session** to `meta/sessions/` in the format in that folder's README — including, honestly, whether you could fully answer. A question you _couldn't_ answer is a gap; logging it feeds the gap-finder and lets the user resume later.
37
37
 
38
38
  If the vault can't answer, say so plainly and log it as a gap. Don't invent an answer the notes don't support.
39
39
 
40
40
  ## The contribute path — the human steers
41
41
 
42
- Here the user is *adding* knowledge, not reading. This path is deliberately thin and grows with use. There are **no sub-agents** — it's you and the user in a normal session.
42
+ Here the user is _adding_ knowledge, not reading. This path is deliberately thin and grows with use. There are **no sub-agents** — it's you and the user in a normal session.
43
43
 
44
44
  1. **Orient them** with [`meta/guidance.md`](meta/guidance.md) (the note model and where things belong) and the target folder's `metadata.md` (what belongs there, what's already nearby).
45
45
  2. **What does the hub want next?** Run the `kb-find-gaps` agent (it reads `meta/sessions/` gaps + folder `metadata.md`) — that's the live content roadmap.
@@ -48,9 +48,9 @@ Here the user is *adding* knowledge, not reading. This path is deliberately thin
48
48
 
49
49
  ---
50
50
 
51
- ## What you do *not* do
51
+ ## What you do _not_ do
52
52
 
53
- - **You don't run upkeep.** The kb-agi upkeep agents (`kb-find-gaps`, `kb-sync-metadata`, `kb-catch-stale`, `kb-fix-links`, `kb-refresh-frontdoor`, `kb-refresh-summaries`) are the only writers of canon, invoked by name and only when *deliberately* run — not as a side effect of a question. Don't trigger them from the ask path.
53
+ - **You don't run upkeep.** The kb-agi upkeep agents (`kb-find-gaps`, `kb-sync-metadata`, `kb-catch-stale`, `kb-fix-links`, `kb-refresh-frontdoor`, `kb-refresh-summaries`) are the only writers of canon, invoked by name and only when _deliberately_ run — not as a side effect of a question. Don't trigger them from the ask path.
54
54
  - **You don't hand-edit `meta/_kg/`** — it's a derived graph, regenerated from the notes.
55
55
  - **You don't mutate notes on the ask path.** Read-only means read-only.
56
56
 
@@ -39,7 +39,7 @@ meta/
39
39
 
40
40
  # Templates
41
41
 
42
- Each block below is one file. The fences are 4-backtick (````` ```` `````) so the 3-backtick blocks inside the templates are preserved — strip the outer fence when you write the file.
42
+ Each block below is one file. The fences are 4-backtick (` ```` `) so the 3-backtick blocks inside the templates are preserved — strip the outer fence when you write the file.
43
43
 
44
44
  ## `meta/guidance.md`
45
45
 
@@ -48,7 +48,7 @@ Each block below is one file. The fences are 4-backtick (````` ```` `````) so th
48
48
 
49
49
  This file is the single contract the router (`CLAUDE.md`) and the upkeep agents both read. It defines what a note is, what the light frontmatter hints mean, how a folder describes itself, and who is allowed to write. When any of those agents needs a rule, the rule lives here.
50
50
 
51
- Everything in this file is a *hint or a convention*, not a schema enforced by code. Notes that omit a hint still work; the system degrades gracefully.
51
+ Everything in this file is a _hint or a convention_, not a schema enforced by code. Notes that omit a hint still work; the system degrades gracefully.
52
52
 
53
53
  ---
54
54
 
@@ -56,7 +56,7 @@ Everything in this file is a *hint or a convention*, not a schema enforced by co
56
56
 
57
57
  The vault is one flat Obsidian vault. Every note is the same kind of thing — a markdown note linked to other notes by `[[wikilinks]]`. There is **no per-document type label** and no altitude. Folders exist for human convenience; each folder says what it holds via a `metadata.md`.
58
58
 
59
- - **One idea per note.** Push deeper material into a *linked* note rather than bloating one note. The links carry the depth.
59
+ - **One idea per note.** Push deeper material into a _linked_ note rather than bloating one note. The links carry the depth.
60
60
  - **Links are the structure.** The note-link graph is the one graph. It is derived from the notes — the renderer (`docs-template`) builds it into `meta/_kg/` — never hand-maintained.
61
61
  - **Notes are the only canon.** Everything under `meta/` is control plane, not knowledge. The graph and any index are regenerable derivatives of the notes.
62
62
 
@@ -68,10 +68,10 @@ A note carries light frontmatter. All fields are optional; treat a missing field
68
68
 
69
69
  ```yaml
70
70
  ---
71
- title: Human-readable title # defaults to the H1 / filename
72
- maturity: synthesized # see ladder below — default: captured
73
- canonical: true # is this THE note on its topic? default: true
74
- visibility: public # public | hidden — default: public
71
+ title: Human-readable title # defaults to the H1 / filename
72
+ maturity: synthesized # see ladder below — default: captured
73
+ canonical: true # is this THE note on its topic? default: true
74
+ visibility: public # public | hidden — default: public
75
75
  ---
76
76
  ```
77
77
 
@@ -80,7 +80,7 @@ visibility: public # public | hidden — default: public
80
80
  How finished the thinking is. Shapes how the ask path frames an answer, never whether a note is shown.
81
81
 
82
82
  | value | meaning |
83
- |---|---|
83
+ | --- | --- |
84
84
  | `raw` | dumped in, unprocessed — a capture, a transcript, a paste |
85
85
  | `captured` | cleaned up, readable, but not yet reconciled with neighbours |
86
86
  | `synthesized` | reconciled into the vault's point of view, linked to its neighbours |
@@ -129,14 +129,14 @@ This is doctrine P3, restated as the contract:
129
129
 
130
130
  ## genre — the reader, not the document
131
131
 
132
- `genre` is the **user-type** of whoever is asking (Sales, PM, Contributor), established by the opening interview in `CLAUDE.md`. It is a label on the *reader*, never on a note. Its only effect is to set the **default depth and framing** of an answer — see `meta/genre/`. It never changes which notes exist or which are reachable.
132
+ `genre` is the **user-type** of whoever is asking (Sales, PM, Contributor), established by the opening interview in `CLAUDE.md`. It is a label on the _reader_, never on a note. Its only effect is to set the **default depth and framing** of an answer — see `meta/genre/`. It never changes which notes exist or which are reachable.
133
133
 
134
134
  ---
135
135
 
136
136
  ## The rest of the control plane
137
137
 
138
138
  | path | what it is |
139
- |---|---|
139
+ | --- | --- |
140
140
  | `meta/genre/` | user-type templates — default depth + entry points per reader |
141
141
  | `meta/intent-index.md` | "Read by need" — intent-keyed entry points into the vault |
142
142
  | `meta/sessions/` | query logs — every ask, and whether it could be answered |
@@ -147,7 +147,7 @@ Upkeep is run by the kb-agi agents (invoked by name); there is no `meta/goals/`
147
147
 
148
148
  ## `meta/genre/sales.md`
149
149
 
150
- ````markdown
150
+ ```markdown
151
151
  # genre — Sales
152
152
 
153
153
  The reader is positioning NuStack to someone else: a prospect, a partner, a teammate who needs the pitch. They want the claim and the proof behind it, not the implementation.
@@ -157,15 +157,16 @@ The reader is positioning NuStack to someone else: a prospect, a partner, a team
157
157
  **Framing.** Outcomes and differentiators over mechanism. Speak in capabilities and claims. When a claim has proof in the vault, cite the note so the reader can stand behind it. Flag honestly when something is aspiration rather than shipped — a claim the vault can't back is a gap, not an answer.
158
158
 
159
159
  **Start from.**
160
+
160
161
  - `meta/intent-index.md` → the "understand the product / what can it do" lanes
161
162
  - positioning, claims, and capability notes (lead with `canonical`, `published` ones)
162
163
 
163
164
  **Adjust.** If the reader keeps asking "how", hand them off toward the PM depth — follow the links down into the specs. If they want it shorter, compress to the headline claim plus one citation.
164
- ````
165
+ ```
165
166
 
166
167
  ## `meta/genre/pm.md`
167
168
 
168
- ````markdown
169
+ ```markdown
169
170
  # genre — PM
170
171
 
171
172
  The reader is shaping or building the product: a PM, designer, or engineer who needs scope, tradeoffs, and the state of a decision. They want the mechanism and the reasoning, not just the claim.
@@ -175,34 +176,36 @@ The reader is shaping or building the product: a PM, designer, or engineer who n
175
176
  **Framing.** Scope, contracts, and decisions. Distinguish what's shipped, what's specced, and what's still open. Surface the tension behind a choice, not just the choice. When the answer rests on a decision, cite the note that records it so the reader sees the why.
176
177
 
177
178
  **Start from.**
179
+
178
180
  - `meta/intent-index.md` → the "build / extend / model / runtime concern" lanes
179
181
  - spec, decision, and build-plan notes; the architecture notes that set the target
180
182
 
181
183
  **Adjust.** If the reader is scoping, summarize across notes and name the open questions. If they're implementing, go deep into the one note and its neighbours. If they ask "why this and not X", traverse to the decision and rejected-alternative notes.
182
- ````
184
+ ```
183
185
 
184
186
  ## `meta/genre/contributor.md`
185
187
 
186
- ````markdown
188
+ ```markdown
187
189
  # genre — Contributor
188
190
 
189
- The reader is here to *add* knowledge, not consume it. They have something the vault doesn't yet hold — a finding, a decision, a correction — and they want to land it where it belongs.
191
+ The reader is here to _add_ knowledge, not consume it. They have something the vault doesn't yet hold — a finding, a decision, a correction — and they want to land it where it belongs.
190
192
 
191
193
  **Default depth.** Orientation over synthesis. Show them where a note belongs, what's already nearby, and the convention to follow — then get out of the way and let them write. This genre usually means the **contribute path**, where the human steers Claude like a normal session to draft and place notes.
192
194
 
193
195
  **Framing.** Placement and convention. The questions that matter here: which folder does this belong in, what does its `metadata.md` say it should hold, what existing notes should it link to, is there already a canonical note on this topic. Links form naturally as the note is written.
194
196
 
195
197
  **Start from.**
198
+
196
199
  - the `kb-find-gaps` agent + `meta/sessions/` gap-logs — what the hub is missing / wants next
197
200
  - `meta/guidance.md` — the note model, frontmatter hints, and folder `metadata.md` shape
198
201
  - the target folder's `metadata.md` — what belongs there and what's missing
199
202
 
200
- **Adjust.** This path is deliberately thin and grows with use. No sub-agents — it's the human and Claude in a normal session. If the contributor instead wants to *read* before adding, switch to the Sales or PM framing.
201
- ````
203
+ **Adjust.** This path is deliberately thin and grows with use. No sub-agents — it's the human and Claude in a normal session. If the contributor instead wants to _read_ before adding, switch to the Sales or PM framing.
204
+ ```
202
205
 
203
206
  ## `meta/intent-index.md`
204
207
 
205
- ````markdown
208
+ ```markdown
206
209
  # intent-index — Read by need
207
210
 
208
211
  The front door to the vault, keyed on **what you're trying to do**, not who you are (doctrine P4). The router and the genre templates point here; each lane lists the entry notes to start from, and the links carry you the rest of the way.
@@ -212,43 +215,49 @@ This is a living index. It is hand-maintained today and kept fresh by the `kb-re
212
215
  ---
213
216
 
214
217
  ## "I want to understand the product"
218
+
215
219
  _What NuStack is, what it can do, the claims and their proof._
216
220
 
217
221
  - _populated on migration_
218
222
 
219
223
  ## "I want to start building"
224
+
220
225
  _Where to begin, how the pieces fit, the build sequence._
221
226
 
222
227
  - _populated on migration_
223
228
 
224
229
  ## "I want to extend a capability"
230
+
225
231
  _How to add to the catalog — a node, a connector, an integration._
226
232
 
227
233
  - _populated on migration_
228
234
 
229
235
  ## "I want to understand a runtime concern"
236
+
230
237
  _Execution, streaming, observability — how it behaves when it runs._
231
238
 
232
239
  - _populated on migration_
233
240
 
234
241
  ## "I want to model data"
242
+
235
243
  _The schema, the entities, the contracts they speak._
236
244
 
237
245
  - _populated on migration_
238
246
 
239
247
  ## "I want to add knowledge"
248
+
240
249
  _You have something the vault doesn't hold yet._
241
250
 
242
251
  - run `kb-find-gaps` (or read `meta/sessions/` gap-logs) — what the hub is missing
243
252
  - `meta/guidance.md` — the note model and where things belong
244
- ````
253
+ ```
245
254
 
246
255
  ## `meta/sessions/README.md`
247
256
 
248
257
  ````markdown
249
258
  # sessions — query logs
250
259
 
251
- Every ask the router handles is logged here. A log entry does double duty: it lets a reader resume a reattempt instead of starting cold, and a question the vault *couldn't* answer is a gap — the content roadmap the `kb-find-gaps` agent reads.
260
+ Every ask the router handles is logged here. A log entry does double duty: it lets a reader resume a reattempt instead of starting cold, and a question the vault _couldn't_ answer is a gap — the content roadmap the `kb-find-gaps` agent reads.
252
261
 
253
262
  This is the one thing the read-only ask path writes (doctrine P3). It never touches a note.
254
263
 
@@ -260,7 +269,7 @@ One file per session, named `YYYY-MM-DD-short-slug.md`:
260
269
  ---
261
270
  date: 2026-05-24
262
271
  genre: pm
263
- answered: partial # yes | partial | no
272
+ answered: partial # yes | partial | no
264
273
  ---
265
274
 
266
275
  ## Q: <the question, in the asker's words>
@@ -12,7 +12,7 @@ You are the **kb-catch-stale** goal-agent for the NuStack knowledge hub. One job
12
12
  ## Procedure
13
13
 
14
14
  1. Group notes by topic (shared `[[wikilinks]]`, near-identical titles). Flag any topic carrying more than one `canonical: true` note — one has likely superseded another without being demoted.
15
- 2. For each `synthesized`/`published` note, use `git log` to compare its last-commit date against the `raw`/`captured` notes it links *down* to. Flag summaries older than their sources.
15
+ 2. For each `synthesized`/`published` note, use `git log` to compare its last-commit date against the `raw`/`captured` notes it links _down_ to. Flag summaries older than their sources.
16
16
  3. Emit a ranked list: each suspect note, why (duplicate-canonical or behind-source), and the rival or changed source.
17
17
 
18
18
  ## Write rules (doctrine P3)
@@ -13,7 +13,7 @@ Before anything else, read `meta/guidance.md` — the note model, the frontmatte
13
13
 
14
14
  ## Procedure
15
15
 
16
- 1. **Read every content folder's `metadata.md`** and list what each says it *should contain*.
16
+ 1. **Read every content folder's `metadata.md`** and list what each says it _should contain_.
17
17
  2. **Diff against the note graph** (`meta/_kg/`, or by globbing the notes and scanning `[[wikilinks]]` if the graph isn't built yet). For each "should contain" item, find whether a `canonical` note covers it. Record what's absent, what's thin (a stub with no links down), and what's orphaned (no links in).
18
18
  3. **Fold in session gaps** — read `meta/sessions/` and pull entries with `answered: no | partial`. Each `Gap.` line is a hole a real reader hit. Rank these highest.
19
19
  4. **Emit a ranked gap list.** For each gap: the folder it belongs in, what it should cover, why it's a gap (metadata expectation, session miss, or both), and the neighbouring notes it would link to.
@@ -18,5 +18,5 @@ You are the **kb-fix-links** goal-agent for the NuStack knowledge hub. One job:
18
18
  ## Write rules (doctrine P3)
19
19
 
20
20
  - **Default: write nothing.** Output the two lists.
21
- - **On request only:** fix a dead link when the intended target is *unambiguous* (an exact rename), and add a link from a sensible neighbour to an orphan. Leave ambiguous cases in the report for a human.
21
+ - **On request only:** fix a dead link when the intended target is _unambiguous_ (an exact rename), and add a link from a sensible neighbour to an orphan. Leave ambiguous cases in the report for a human.
22
22
  - Every write is a git commit. Stay in your lane: you mend the plumbing, you don't rewrite note content or judge freshness.
@@ -11,12 +11,12 @@ You are the **kb-refresh-summaries** goal-agent for the NuStack knowledge hub. O
11
11
 
12
12
  ## Procedure
13
13
 
14
- 1. For each `synthesized`/`published` note, gather the `raw`/`captured` notes it links *down* to.
14
+ 1. For each `synthesized`/`published` note, gather the `raw`/`captured` notes it links _down_ to.
15
15
  2. Use `git log` to flag summaries whose sources changed more recently than the summary itself — the summary is behind.
16
16
  3. Emit the list: which summary, which new/changed sources it hasn't absorbed.
17
17
 
18
18
  ## Write rules (doctrine P3)
19
19
 
20
20
  - **Default: write nothing.** Output the behind-summaries list.
21
- - **On request only:** draft the refresh *into the summary note* — fold the new source material in, one idea per note, push overflow into a new linked note rather than bloating. Never invent a summary that doesn't exist (that's the `kb-find-gaps` agent).
21
+ - **On request only:** draft the refresh _into the summary note_ — fold the new source material in, one idea per note, push overflow into a new linked note rather than bloating. Never invent a summary that doesn't exist (that's the `kb-find-gaps` agent).
22
22
  - Every write is a git commit. Stay in your lane: you keep existing summaries current, nothing else.
@@ -9,14 +9,14 @@ You are the **kb-sync-metadata** goal-agent for the NuStack knowledge hub. One j
9
9
 
10
10
  **Read first:** `meta/guidance.md` (the note model + the fixed `metadata.md` shape) — the contract that governs you. The procedure below is this agent's full, self-contained definition.
11
11
 
12
- This is the upkeep that `kb-find-gaps` depends on: it reads `metadata.md` to know what a folder *should contain*. You keep that description truthful. You never invent missing content — that's the `kb-find-gaps` agent.
12
+ This is the upkeep that `kb-find-gaps` depends on: it reads `metadata.md` to know what a folder _should contain_. You keep that description truthful. You never invent missing content — that's the `kb-find-gaps` agent.
13
13
 
14
14
  ## Procedure
15
15
 
16
16
  1. For each content folder, read its `metadata.md` and the notes actually in the folder.
17
17
  2. Check: **Entry notes** still exist and are `canonical`; **Neighbours** match where the folder's notes really link (use the graph); the **About / Should-contain** still fit what's there.
18
18
  3. Emit per-folder drift: dead entry-note pointers, wrong/missing neighbours, an About line that no longer describes the folder.
19
- 4. A "this folder lacks a note on X" finding is a *content gap* — route it to `kb-find-gaps`, don't act on it here.
19
+ 4. A "this folder lacks a note on X" finding is a _content gap_ — route it to `kb-find-gaps`, don't act on it here.
20
20
 
21
21
  ## Write rules (doctrine P3)
22
22
 
@@ -8,5 +8,5 @@
8
8
  ".prettierignore",
9
9
  ".vscode/settings.json"
10
10
  ],
11
- "digest": "25e1cb993a7f"
11
+ "digest": "f0180d39f191"
12
12
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nurix/etna",
3
- "version": "0.18.0",
3
+ "version": "0.18.2",
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": {
@@ -1,12 +0,0 @@
1
- # Dependencies & build output
2
- node_modules
3
- dist
4
- build
5
-
6
- # Lockfiles
7
- pnpm-lock.yaml
8
- package-lock.json
9
- yarn.lock
10
-
11
- # Harness-managed agent/skill definitions (installed under .claude/)
12
- .claude
@@ -1,3 +0,0 @@
1
- {
2
- "proseWrap": "never"
3
- }
@@ -1,10 +0,0 @@
1
- {
2
- // Markdown: Prettier unwraps prose to one logical line per paragraph
3
- // (see .prettierrc → proseWrap:never) on save; the editor soft-wraps for
4
- // reading, so no hard line breaks get baked into the source.
5
- "[markdown]": {
6
- "editor.defaultFormatter": "esbenp.prettier-vscode",
7
- "editor.formatOnSave": true,
8
- "editor.wordWrap": "on"
9
- }
10
- }
@@ -1,135 +0,0 @@
1
- # Agent Instructions
2
-
3
- This file defines how AI agents (Claude, GPT, etc.) should work on this project. **This file is the harness** — it orchestrates the skills and agents that do the work. There is no separate "harness skill."
4
-
5
- ---
6
-
7
- ## Bootstrap
8
-
9
- > A missing `docs/structure.md` — or a `harness-version` behind the installed harness — is the **symptom** of a repo that isn't harnessed yet, or whose harness is out of date. Don't reconcile it by hand. Drive the **reconcile chain** — you (the main session) own it, because `harness-manager` is a sub-agent that can't run skills or spawn sub-agents:
10
- >
11
- > 1. Invoke **`harness-manager`** (`"baseline this repo"` / `"reconcile the harness"`). It reconciles `docs/`, stamps the version, then hands back.
12
- > 2. If it hands back with a follow-up (typically the module proposal), re-invoke it to finish.
13
- >
14
- > Then continue. Each component's internals live in the component, not here.
15
-
16
- This is the only step that runs **before** the harness exists; everything below assumes a reconciled repo.
17
-
18
- ---
19
-
20
- ## Getting Started
21
-
22
- - Read **[`docs/structure.md`](docs/structure.md)** for the documentation map and folder authority (architecture, features, operations)
23
- - Read **[`docs/memory/`](docs/memory/)** for agent memory files (one per agent)
24
- - Ignore **[`README.md`](README.md)** – it's for human reference only
25
- - Check **[`package.json`](package.json)** for available scripts. Detect the package manager from the lockfile (`pnpm-lock.yaml` → pnpm, `yarn.lock` → yarn, `package-lock.json` → npm) and use the matching command. Don't hardcode a specific manager.
26
-
27
- ---
28
-
29
- ## Workflows
30
-
31
- Three peer modes plus a Completion step — enter wherever the user's thinking already is. Each mode is implemented by an agent + skill; the behavioural detail lives in those files, not here.
32
-
33
- | Mode | Enter when | Implemented by | Exits to |
34
- | ----------------- | ------------------------------------------------------------------------------------------------------------------------------------------------ | ----------------------------------------------------------------- | ------------------------------ |
35
- | **Brainstorming** | explicit ask; or a user utterance challenges a loaded pillar headline → name the brushed principle and offer `/brainstorm start` (no auto-entry) | `brainstorm` agent + skill | Spec, Plan, or close + harvest |
36
- | **Spec** | new feature work | `spec-mode` agent + `documentation` skill | Plan |
37
- | **Plan** | a spec is approved | `documentation` skill → `docs/history/plans/YYYY-MM-DD-{slug}.md` | Completion |
38
-
39
- On **Completion**: freeze the plan (`Status: Complete`) and flip the feature spec to `Status: Active`, extending it with how-it-works sections; then distil the plan's trail — if the memory inbox (`docs/memory/inbox/`) holds entries, run `distiller facts` (inbox→fact-cards), then `distiller docs` for the just-completed feature's doc drafts any pending deltas for approval (presented, never auto-written). The `boundary` skill gates every approved plan before coding — it reads the source the plan touches and reports what would break (see **Boundaries** below); on brainstorm close, harvest by scope — module pillars → `docs/modules/{m}/pillars/`, cross-module doctrine + contract changes → `docs/architecture/` / ADRs, backlog → `docs/history/`. Open questions block close.
40
-
41
- ---
42
-
43
- ## Context Routing
44
-
45
- Before modifying code in an unfamiliar area:
46
-
47
- 1. If **[`docs/routing.md`](docs/routing.md)** exists, read it for file-pattern → module/doc/agent mapping. If it doesn't exist yet, skip.
48
- 2. Glob `docs/{features,modules/*/features}/**/*.md` and check `owns` frontmatter to find the owning feature doc (rolled up to its module); read it — and, if it rolled up to a declared module, that module's `CLAUDE.md` + `pillars/` — before changes.
49
- 3. If `qmd` is installed, `qmd query --format json -c <collection> "<topic>"` (repeat `-c` to span this repo's collections; `qmd collection list` names them) searches the indexed docs with their context attached — prefer it when entering an unfamiliar area; absent ⇒ skip.
50
- 4. If your change touches a cross-cutting contract area (entity model, db schema, wire envelope, auth/authz, event vocabulary, webhooks, env/config), run the **`boundary`** skill scoped to your change — it reads both sides of each touched contract in source and reports what would break.
51
- 5. If a `docs/memory/` file exists for the domain you're working in, read it for domain knowledge and failure modes
52
- 6. When you author a declared module's docs, its `docs/modules/{m}/CLAUDE.md` auto-loads (the pillar bootstrap) — follow it. For code work it's surfaced via step 2.
53
-
54
- For the protocol on _writing_ to memory (which file, what belongs there, what doesn't), see **Project Memory** below.
55
-
56
- ---
57
-
58
- ## Project Memory
59
-
60
- Project-specific learnings live in `docs/memory/` (git-tracked). Cross-project user preferences live in `~/.claude/` (untracked).
61
-
62
- | File | Owner | Contents |
63
- | ----------------------------- | ------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------ |
64
- | `docs/memory/main.md` | Main agent | Project-wide patterns, conventions confirmed in this codebase, recurring failure modes, decisions whose rationale isn't obvious from the code |
65
- | `docs/memory/{agent-name}.md` | The named sub-agent | Strategy memory for that agent — how to be more effective on this project (research patterns, taxonomy, ownership conflict zones). Never user-centric. |
66
- | `~/.claude/projects/...` | Auto-memory system | User preferences, role, communication style, cross-project habits |
67
-
68
- **Override the default auto-memory location for project-relevant facts.** When recording a learning, ask: _is this true of this project, or true of this user?_ Project facts → `docs/memory/`. User facts → `~/.claude/`.
69
-
70
- `docs/memory/main.md` is created on first write. Append entries dated `## YYYY-MM-DD — {topic}`; oldest at bottom is fine.
71
-
72
- ---
73
-
74
- ## Out-of-Scope Discovery
75
-
76
- When implementing a plan, if you discover work that is important but outside the current plan's scope:
77
-
78
- - Append it to `docs/history/backlog.md` under the appropriate priority (P0-P3)
79
- - Format: `- **[P1]** Description — discovered by [plan-name or agent-name]`
80
- - Do NOT ask permission. Just append and mention it in your response.
81
-
82
- ---
83
-
84
- ## Doc Ownership
85
-
86
- Feature docs (in `docs/modules/{m}/features/`, or flat `docs/features/` if the module isn't declared) must include YAML frontmatter with `owns`, `touches`, and `depends_on` fields. Architecture docs describe cross-cutting patterns and don't own specific files; boundary docs own cross-cutting shapes, not file paths; operations docs describe procedures. Only feature docs need frontmatter.
87
-
88
- The spec-mode agent checks for ownership conflicts during research. If conflicts are found, address them in the spec before proceeding.
89
-
90
- ---
91
-
92
- ## Boundaries
93
-
94
- A boundary is a horizontal cross-cutting contract — entity model, db schema, wire envelope, auth/authz, event vocabulary, webhooks, env/config — where editing one side silently breaks the other. Boundaries are **diagnosed, not documented**: the `boundary` skill reads them fresh from source whenever a check runs, so they are never persisted as docs and can never go stale.
95
-
96
- **Invoke the `boundary` skill after a plan is approved and before its first implementation step.** It parses the plan's Proposed Changes, reads the touched source files, identifies the contracts they participate in (its `references/boundary-taxonomy.md` is the catalog), traces the consumers on the other side, and reports severity-ranked violations with suggested plan amendments — in chat, read-only. Fold the amendments into the plan before coding. For non-plan edits in contract-heavy code, run the same diagnostic scoped to the diff.
97
-
98
- > 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.
99
-
100
- ---
101
-
102
- ## Boundaries & Defaults
103
-
104
- Unless explicitly requested:
105
-
106
- ❌ **Tests** – Never generate, update, or modify test files.
107
- ❌ **Dependencies** – Never upgrade frameworks, libraries, or dependencies.
108
- ❌ **Compatibility** – Never maintain backward compatibility unless specified.
109
- ❌ **Branches & Worktrees** – Never self-create git branches or worktrees. Commit straight to the checked-out branch; branch or create a worktree only when the user asks.
110
- ❌ **Protected Files** – Before editing, if `docs/operations/protected-files.md` exists, read it and never modify any path it lists; also never modify `AGENTS.md` or the `protected-files.md` file itself.
111
- ✅ **Browser Automation** – Use Chrome CDP / "Claude in Chrome" tools whenever they help (verifying UI, reproducing a flow, seeding or inspecting local data) — no need to ask first. **Main session only:** never drive the browser from a sub-agent or workflow executor — the session-bound Chrome connection destabilizes the sub-agent. A sub-agent that needs browser verification instead returns an explicit CDP checklist (exact URLs, actions, expected outcomes) for the orchestrator to execute in the main session.
112
- ✅ **Orchestrate via Sub-agents** – Run the main session as an orchestrator: delegate substantive work (research, implementation, audits) to sub-agents spawned via the Agent/Task tool with `model: opus` (Claude Opus), keeping the main context for dispatch, coordination, and synthesis. Give each sub-agent a self-contained prompt; parallelize independent dispatches.
113
- ✅ **Documentation** – Keep `docs/` updated when code changes affect documented behavior.
114
- ⚠️ **Plans** – Plans are created directly in `docs/history/plans/` (see Workflow → Plan Mode). Once `Status: Complete` or `Status: Abandoned`, the file is frozen — never edited. If scope changes after completion, write a new dated plan that links back to the old one.
115
- ⚠️ **Tool Issues** – If any CLI tool, shell alias, or MCP tool behaves unexpectedly (syntax errors, silent failures, wrong defaults), report the exact tool name, command, and error to the user so they can fix or remove the underlying library.
116
-
117
- ---
118
-
119
- ## File Structure
120
-
121
- - Add file path at top of each file:
122
- `// src/modules/example.js - Module for handling user authentication`
123
- - Add a 1-line function description as a comment above each function:
124
- `// Extract JWT token from request based on endpoint type`
125
-
126
- ---
127
-
128
- ## Documentation
129
-
130
- `docs/structure.md` is the authority on what belongs where — the folder map, naming, lifecycle, and the add-a-doc decision table. Read it before adding or moving a doc; don't restate it here. One canonical source per topic — link, don't copy. Only `CLAUDE.md`, `AGENTS.md`, and `README.md` live at the repo root.
131
-
132
- Maintenance triggers (act on these without re-reading `structure.md`):
133
-
134
- - After plan completion: add a `docs/history/changelog/` entry + update `docs/history/CHANGELOG.md` (no confirmation; include `Commits:` if multi-commit). Non-plan changes (refactors, fixes, API changes): prompt first.
135
- - When you add, move, or delete a doc: update `docs/routing.md` to match. When you move or rename source files: fix the `owns`/`touches` frontmatter in the owning doc; new docs that own code need `owns`/`touches`/`depends_on`.
@@ -1,35 +0,0 @@
1
- ---
2
- name: brainstorm
3
- description: Brainstorming-mode facilitator — a thin orchestrator over the self-contained `brainstorm` skill, which owns every session mechanic (the constant distill→abstract→sync→record loop, the four modes, the basis entry gate, the background sync reconciler, the complexity-scaled pillar surface, harvest). Use to recognize when a conversation belongs at the 30k-foot strategic-design altitude and drive it in the skill's voice. Triggers on an explicit ask to brainstorm/design strategically, or on recognizing that a user utterance challenges a loaded pillar headline — which you OFFER a session for (suggest `/brainstorm start`), never silently enter.
4
- tools: Read, Glob, Grep, AskUserQuestion, Write
5
- model: inherit
6
- ---
7
-
8
- # Brainstorm Agent
9
-
10
- You are the **facilitator persona** for Brainstorming Mode — the 30,000-foot peer of Spec and Plan. You shape the **pillars** that steer the repo through conversation, never by writing production code or feature specs. The pillar surface scales with the idea's complexity — see the skill's **Pillars** table rather than carrying a fixed list in your head.
11
-
12
- You are a **thin orchestrator.** Every mechanic — the constant loop, the four modes, the basis entry gate, the background sync reconciler, the complexity-scaled pillars, append-only decisions, and harvest — lives in the **`brainstorm` skill**, which is self-contained and runs standalone via `/brainstorm start|stop`. Your only jobs: recognize when a conversation belongs in Brainstorming Mode, and drive it in the skill's voice. **Defer to the skill's `SKILL.md` for every mechanic — read it rather than re-deriving, and never restate its rules here.**
13
-
14
- ## When to offer a session
15
-
16
- - An explicit ask to think through a design at a strategic level (not "fix this bug" / "add this button"). This is the user invoking the work; hand it to `/brainstorm start`.
17
- - A user utterance **challenges a loaded pillar headline.** To recognize this, hold the headlines in mind — skim `docs/architecture/` (`domain-model.md`, `glossary.md`, `non-goals.md`, `open-questions.md`) and any `docs/modules/*/pillars/`. In v9 the steering layer is dispersed there; there is no repo-wide `docs/pillars/`. When a proposal brushes an existing principle, **name that principle in plain English and offer a session** — suggest `/brainstorm start` and ask whether the proposal preserves or revises it. Detection is yours; entry is the user's. **Never auto-enter** — the skill admits only `/brainstorm start` and `/brainstorm stop`.
18
-
19
- If none of those steering files exist yet (a freshly-baselined repo), a session still runs from the skill's templates, and the basis gate seeds it from a reference doc or a one-shot brain dump.
20
-
21
- ## Modes and the close gate
22
-
23
- Four modes exist — **dump / interview / probe / converge** — and they change *who drives* and *how much gets asked*, not the loop, which never stops. The mode lives in the session's `state.md` and switches only on an explicit user word. The close gate is **open questions**, not decision state: questions are the single convergence currency, and the idea is coherent only when zero remain after a fresh sync. See the skill's **Modes** and **Coherence** sections — don't re-derive them here.
24
-
25
- ## How you facilitate
26
-
27
- - **Speak plain English; codes live in the files.** Name a pillar item by what it *is*, never by a bare code (`Q3`, `D7`); append the code in parentheses only if traceability needs it.
28
- - **Suggest, never seize.** Mode shifts, abstractions, and probes are one offer each; accept refusal without re-litigating.
29
- - **Never write production code** while a session is open — load-bearing snippets are illustration only, inside the session folder.
30
-
31
- You don't perform the harvest yourself, and you don't presume a destination. On close the session folder *is* the product by default; if the repo is v9-harnessed the skill **offers** the adapter routing into the doc tree. The skill's `## stop` section is the canonical harvest map — don't duplicate it.
32
-
33
- ## What you may write
34
-
35
- The transient session folder only (its pillars and `state.md`). Never edit the live docs directly — the harvest does that.