@nurix/etna 0.17.1 → 0.18.1

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 (101) hide show
  1. package/README.md +19 -9
  2. package/bin/etna.js +56 -28
  3. package/data/harness-index.json +21 -6
  4. package/data/harnesses/code/CLAUDE.md +7 -18
  5. package/data/harnesses/code/agents/brainstorm.md +3 -3
  6. package/data/harnesses/code/agents/change-review.md +13 -10
  7. package/data/harnesses/code/agents/harness-manager.md +16 -16
  8. package/data/harnesses/code/agents/maintenance.md +10 -3
  9. package/data/harnesses/code/agents/performance-review.md +5 -0
  10. package/data/harnesses/code/harness.json +1 -1
  11. package/data/harnesses/code/rules/general.md +40 -36
  12. package/data/harnesses/code/skills/boundary/SKILL.md +15 -42
  13. package/data/harnesses/code/skills/boundary/references/boundary-taxonomy.md +366 -304
  14. package/data/harnesses/code/skills/brainstorm/README.md +9 -9
  15. package/data/harnesses/code/skills/brainstorm/SKILL.md +15 -15
  16. package/data/harnesses/code/skills/brainstorm/harvest.md +2 -2
  17. package/data/harnesses/code/skills/brainstorm/templates/backlog.md +2 -2
  18. package/data/harnesses/code/skills/brainstorm/templates/build.md +6 -6
  19. package/data/harnesses/code/skills/brainstorm/templates/decisions.md +3 -3
  20. package/data/harnesses/code/skills/brainstorm/templates/doctrine.md +2 -2
  21. package/data/harnesses/code/skills/brainstorm/templates/domain-model.md +2 -2
  22. package/data/harnesses/code/skills/brainstorm/templates/glossary.md +2 -1
  23. package/data/harnesses/code/skills/brainstorm/templates/non-goals.md +3 -7
  24. package/data/harnesses/code/skills/brainstorm/templates/questions.md +6 -5
  25. package/data/harnesses/code/skills/brainstorm/templates/state.md +1 -8
  26. package/data/harnesses/code/skills/brainstorm/templates/tech.md +6 -6
  27. package/data/harnesses/code/skills/brainstorm/templates/thesis.md +2 -2
  28. package/data/harnesses/code/skills/distiller/SKILL.md +48 -177
  29. package/data/harnesses/code/skills/distiller/references/docs-mode.md +116 -343
  30. package/data/harnesses/code/skills/distiller/references/method.md +37 -109
  31. package/data/harnesses/code/skills/documentation/SKILL.md +9 -6
  32. package/data/harnesses/code/skills/documentation/references/examples.md +30 -61
  33. package/data/harnesses/code/skills/documentation/references/style-guide.md +59 -62
  34. package/data/harnesses/code/skills/documentation/references/templates.md +25 -33
  35. package/data/harnesses/code/skills/workflow-mapper/SKILL.md +32 -11
  36. package/data/harnesses/code/skills/workflow-mapper/references/patterns.md +1 -1
  37. package/data/harnesses/code-fable/CLAUDE.md +12 -23
  38. package/data/harnesses/code-fable/agents/brainstorm.md +3 -3
  39. package/data/harnesses/code-fable/agents/change-review.md +13 -10
  40. package/data/harnesses/code-fable/agents/harness-manager.md +16 -16
  41. package/data/harnesses/code-fable/agents/maintenance.md +10 -3
  42. package/data/harnesses/code-fable/agents/performance-review.md +5 -0
  43. package/data/harnesses/code-fable/harness.json +1 -1
  44. package/data/harnesses/code-fable/rules/general.md +40 -36
  45. package/data/harnesses/code-fable/skills/boundary/SKILL.md +15 -42
  46. package/data/harnesses/code-fable/skills/boundary/references/boundary-taxonomy.md +366 -304
  47. package/data/harnesses/code-fable/skills/brainstorm/README.md +9 -9
  48. package/data/harnesses/code-fable/skills/brainstorm/SKILL.md +15 -15
  49. package/data/harnesses/code-fable/skills/brainstorm/harvest.md +2 -2
  50. package/data/harnesses/code-fable/skills/brainstorm/templates/backlog.md +2 -2
  51. package/data/harnesses/code-fable/skills/brainstorm/templates/build.md +6 -6
  52. package/data/harnesses/code-fable/skills/brainstorm/templates/decisions.md +3 -3
  53. package/data/harnesses/code-fable/skills/brainstorm/templates/doctrine.md +2 -2
  54. package/data/harnesses/code-fable/skills/brainstorm/templates/domain-model.md +2 -2
  55. package/data/harnesses/code-fable/skills/brainstorm/templates/glossary.md +2 -1
  56. package/data/harnesses/code-fable/skills/brainstorm/templates/non-goals.md +3 -7
  57. package/data/harnesses/code-fable/skills/brainstorm/templates/questions.md +6 -5
  58. package/data/harnesses/code-fable/skills/brainstorm/templates/state.md +1 -8
  59. package/data/harnesses/code-fable/skills/brainstorm/templates/tech.md +6 -6
  60. package/data/harnesses/code-fable/skills/brainstorm/templates/thesis.md +2 -2
  61. package/data/harnesses/code-fable/skills/distiller/SKILL.md +48 -177
  62. package/data/harnesses/code-fable/skills/distiller/references/docs-mode.md +116 -343
  63. package/data/harnesses/code-fable/skills/distiller/references/method.md +37 -109
  64. package/data/harnesses/code-fable/skills/documentation/SKILL.md +9 -6
  65. package/data/harnesses/code-fable/skills/documentation/references/examples.md +30 -61
  66. package/data/harnesses/code-fable/skills/documentation/references/style-guide.md +59 -62
  67. package/data/harnesses/code-fable/skills/documentation/references/templates.md +25 -33
  68. package/data/harnesses/code-fable/skills/workflow-mapper/SKILL.md +32 -11
  69. package/data/harnesses/code-fable/skills/workflow-mapper/references/patterns.md +1 -1
  70. package/data/harnesses/discover/CLAUDE.md +41 -109
  71. package/data/harnesses/discover/agents/api.md +11 -28
  72. package/data/harnesses/discover/agents/codebase.md +12 -30
  73. package/data/harnesses/discover/agents/community.md +9 -21
  74. package/data/harnesses/discover/agents/deployed-client-bundle.md +16 -67
  75. package/data/harnesses/discover/agents/distribution-artifacts.md +21 -59
  76. package/data/harnesses/discover/agents/docs.md +11 -20
  77. package/data/harnesses/discover/agents/infra-backend-fingerprint.md +28 -68
  78. package/data/harnesses/discover/agents/packages.md +12 -28
  79. package/data/harnesses/discover/agents/session.md +18 -50
  80. package/data/harnesses/discover/agents/website.md +9 -19
  81. package/data/harnesses/discover/agents/wire-capture.md +22 -72
  82. package/data/harnesses/discover/harness.json +1 -1
  83. package/data/harnesses/discover/rules/discovery.md +73 -182
  84. package/data/harnesses/discover/rules/evaluation.md +90 -98
  85. package/data/harnesses/discover/rules/ingestion.md +123 -322
  86. package/data/harnesses/discover/rules/self-correction.md +67 -92
  87. package/data/harnesses/discover/rules/tradecraft.md +201 -172
  88. package/data/harnesses/hr/CLAUDE.md +21 -51
  89. package/data/harnesses/hr/harness.json +1 -1
  90. package/data/harnesses/hr/skills/interview-eval/SKILL.md +23 -11
  91. package/data/harnesses/hr/skills/interview-eval/TEMPLATE.md +49 -29
  92. package/data/harnesses/hr/skills/interview-eval/rubric.md +30 -30
  93. package/data/harnesses/kb-agi/CLAUDE.md +8 -8
  94. package/data/harnesses/kb-agi/agents/kb-agi-init.md +31 -22
  95. package/data/harnesses/kb-agi/agents/kb-catch-stale.md +1 -1
  96. package/data/harnesses/kb-agi/agents/kb-find-gaps.md +1 -1
  97. package/data/harnesses/kb-agi/agents/kb-fix-links.md +1 -1
  98. package/data/harnesses/kb-agi/agents/kb-refresh-summaries.md +2 -2
  99. package/data/harnesses/kb-agi/agents/kb-sync-metadata.md +2 -2
  100. package/data/harnesses/kb-agi/harness.json +1 -1
  101. package/package.json +1 -1
@@ -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.17.1",
3
+ "version": "0.18.1",
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": {