@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.
- package/README.md +19 -9
- package/bin/etna.js +56 -28
- package/data/harness-index.json +21 -6
- package/data/harnesses/code/CLAUDE.md +7 -18
- package/data/harnesses/code/agents/brainstorm.md +3 -3
- package/data/harnesses/code/agents/change-review.md +13 -10
- package/data/harnesses/code/agents/harness-manager.md +16 -16
- package/data/harnesses/code/agents/maintenance.md +10 -3
- package/data/harnesses/code/agents/performance-review.md +5 -0
- package/data/harnesses/code/harness.json +1 -1
- package/data/harnesses/code/rules/general.md +40 -36
- package/data/harnesses/code/skills/boundary/SKILL.md +15 -42
- package/data/harnesses/code/skills/boundary/references/boundary-taxonomy.md +366 -304
- package/data/harnesses/code/skills/brainstorm/README.md +9 -9
- package/data/harnesses/code/skills/brainstorm/SKILL.md +15 -15
- package/data/harnesses/code/skills/brainstorm/harvest.md +2 -2
- package/data/harnesses/code/skills/brainstorm/templates/backlog.md +2 -2
- package/data/harnesses/code/skills/brainstorm/templates/build.md +6 -6
- package/data/harnesses/code/skills/brainstorm/templates/decisions.md +3 -3
- package/data/harnesses/code/skills/brainstorm/templates/doctrine.md +2 -2
- package/data/harnesses/code/skills/brainstorm/templates/domain-model.md +2 -2
- package/data/harnesses/code/skills/brainstorm/templates/glossary.md +2 -1
- package/data/harnesses/code/skills/brainstorm/templates/non-goals.md +3 -7
- package/data/harnesses/code/skills/brainstorm/templates/questions.md +6 -5
- package/data/harnesses/code/skills/brainstorm/templates/state.md +1 -8
- package/data/harnesses/code/skills/brainstorm/templates/tech.md +6 -6
- package/data/harnesses/code/skills/brainstorm/templates/thesis.md +2 -2
- package/data/harnesses/code/skills/distiller/SKILL.md +48 -177
- package/data/harnesses/code/skills/distiller/references/docs-mode.md +116 -343
- package/data/harnesses/code/skills/distiller/references/method.md +37 -109
- package/data/harnesses/code/skills/documentation/SKILL.md +9 -6
- package/data/harnesses/code/skills/documentation/references/examples.md +30 -61
- package/data/harnesses/code/skills/documentation/references/style-guide.md +59 -62
- package/data/harnesses/code/skills/documentation/references/templates.md +25 -33
- package/data/harnesses/code/skills/workflow-mapper/SKILL.md +32 -11
- package/data/harnesses/code/skills/workflow-mapper/references/patterns.md +1 -1
- package/data/harnesses/code-fable/CLAUDE.md +12 -23
- package/data/harnesses/code-fable/agents/brainstorm.md +3 -3
- package/data/harnesses/code-fable/agents/change-review.md +13 -10
- package/data/harnesses/code-fable/agents/harness-manager.md +16 -16
- package/data/harnesses/code-fable/agents/maintenance.md +10 -3
- package/data/harnesses/code-fable/agents/performance-review.md +5 -0
- package/data/harnesses/code-fable/harness.json +1 -1
- package/data/harnesses/code-fable/rules/general.md +40 -36
- package/data/harnesses/code-fable/skills/boundary/SKILL.md +15 -42
- package/data/harnesses/code-fable/skills/boundary/references/boundary-taxonomy.md +366 -304
- package/data/harnesses/code-fable/skills/brainstorm/README.md +9 -9
- package/data/harnesses/code-fable/skills/brainstorm/SKILL.md +15 -15
- package/data/harnesses/code-fable/skills/brainstorm/harvest.md +2 -2
- package/data/harnesses/code-fable/skills/brainstorm/templates/backlog.md +2 -2
- package/data/harnesses/code-fable/skills/brainstorm/templates/build.md +6 -6
- package/data/harnesses/code-fable/skills/brainstorm/templates/decisions.md +3 -3
- package/data/harnesses/code-fable/skills/brainstorm/templates/doctrine.md +2 -2
- package/data/harnesses/code-fable/skills/brainstorm/templates/domain-model.md +2 -2
- package/data/harnesses/code-fable/skills/brainstorm/templates/glossary.md +2 -1
- package/data/harnesses/code-fable/skills/brainstorm/templates/non-goals.md +3 -7
- package/data/harnesses/code-fable/skills/brainstorm/templates/questions.md +6 -5
- package/data/harnesses/code-fable/skills/brainstorm/templates/state.md +1 -8
- package/data/harnesses/code-fable/skills/brainstorm/templates/tech.md +6 -6
- package/data/harnesses/code-fable/skills/brainstorm/templates/thesis.md +2 -2
- package/data/harnesses/code-fable/skills/distiller/SKILL.md +48 -177
- package/data/harnesses/code-fable/skills/distiller/references/docs-mode.md +116 -343
- package/data/harnesses/code-fable/skills/distiller/references/method.md +37 -109
- package/data/harnesses/code-fable/skills/documentation/SKILL.md +9 -6
- package/data/harnesses/code-fable/skills/documentation/references/examples.md +30 -61
- package/data/harnesses/code-fable/skills/documentation/references/style-guide.md +59 -62
- package/data/harnesses/code-fable/skills/documentation/references/templates.md +25 -33
- package/data/harnesses/code-fable/skills/workflow-mapper/SKILL.md +32 -11
- package/data/harnesses/code-fable/skills/workflow-mapper/references/patterns.md +1 -1
- package/data/harnesses/discover/CLAUDE.md +41 -109
- package/data/harnesses/discover/agents/api.md +11 -28
- package/data/harnesses/discover/agents/codebase.md +12 -30
- package/data/harnesses/discover/agents/community.md +9 -21
- package/data/harnesses/discover/agents/deployed-client-bundle.md +16 -67
- package/data/harnesses/discover/agents/distribution-artifacts.md +21 -59
- package/data/harnesses/discover/agents/docs.md +11 -20
- package/data/harnesses/discover/agents/infra-backend-fingerprint.md +28 -68
- package/data/harnesses/discover/agents/packages.md +12 -28
- package/data/harnesses/discover/agents/session.md +18 -50
- package/data/harnesses/discover/agents/website.md +9 -19
- package/data/harnesses/discover/agents/wire-capture.md +22 -72
- package/data/harnesses/discover/harness.json +1 -1
- package/data/harnesses/discover/rules/discovery.md +73 -182
- package/data/harnesses/discover/rules/evaluation.md +90 -98
- package/data/harnesses/discover/rules/ingestion.md +123 -322
- package/data/harnesses/discover/rules/self-correction.md +67 -92
- package/data/harnesses/discover/rules/tradecraft.md +201 -172
- package/data/harnesses/hr/CLAUDE.md +21 -51
- package/data/harnesses/hr/harness.json +1 -1
- package/data/harnesses/hr/skills/interview-eval/SKILL.md +23 -11
- package/data/harnesses/hr/skills/interview-eval/TEMPLATE.md +49 -29
- package/data/harnesses/hr/skills/interview-eval/rubric.md +30 -30
- package/data/harnesses/kb-agi/CLAUDE.md +8 -8
- package/data/harnesses/kb-agi/agents/kb-agi-init.md +31 -22
- package/data/harnesses/kb-agi/agents/kb-catch-stale.md +1 -1
- package/data/harnesses/kb-agi/agents/kb-find-gaps.md +1 -1
- package/data/harnesses/kb-agi/agents/kb-fix-links.md +1 -1
- package/data/harnesses/kb-agi/agents/kb-refresh-summaries.md +2 -2
- package/data/harnesses/kb-agi/agents/kb-sync-metadata.md +2 -2
- package/data/harnesses/kb-agi/harness.json +1 -1
- 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?** →
|
|
20
|
-
2. **Your user-type (genre):** →
|
|
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
|
|
33
|
-
2. **Traverse the note graph both ways** —
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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 (
|
|
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
|
|
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
|
|
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
|
|
72
|
-
maturity: synthesized
|
|
73
|
-
canonical: true
|
|
74
|
-
visibility: 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
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
188
|
+
```markdown
|
|
187
189
|
# genre — Contributor
|
|
188
190
|
|
|
189
|
-
The reader is here to
|
|
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
|
|
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
|
-
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@nurix/etna",
|
|
3
|
-
"version": "0.
|
|
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": {
|