@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.
- package/README.md +6 -5
- package/data/harness-index.json +1 -5
- package/data/harnesses/code/CLAUDE.md +8 -19
- 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 +15 -15
- 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 +3 -3
- 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 +26 -34
- 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/discover/CLAUDE.md +60 -113
- 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/cartography-coverage.md +94 -0
- package/data/harnesses/discover/rules/cartography-flows.md +99 -0
- package/data/harnesses/discover/rules/cartography-ia.md +88 -0
- package/data/harnesses/discover/rules/cartography.md +109 -0
- package/data/harnesses/discover/rules/discovery.md +73 -182
- package/data/harnesses/discover/rules/evaluation.md +92 -98
- package/data/harnesses/discover/rules/ingestion.md +123 -322
- package/data/harnesses/discover/rules/self-correction.md +94 -107
- 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
- package/data/harnesses/code-fable/.prettierignore +0 -12
- package/data/harnesses/code-fable/.prettierrc.json +0 -3
- package/data/harnesses/code-fable/.vscode/settings.json +0 -10
- package/data/harnesses/code-fable/CLAUDE.md +0 -135
- package/data/harnesses/code-fable/agents/brainstorm.md +0 -35
- package/data/harnesses/code-fable/agents/change-review.md +0 -248
- package/data/harnesses/code-fable/agents/harness-manager.md +0 -181
- package/data/harnesses/code-fable/agents/maintenance.md +0 -115
- package/data/harnesses/code-fable/agents/performance-review.md +0 -218
- package/data/harnesses/code-fable/agents/spec-mode.md +0 -56
- package/data/harnesses/code-fable/harness.json +0 -12
- package/data/harnesses/code-fable/hooks/hooks.json +0 -27
- package/data/harnesses/code-fable/hooks/lib/redact.mjs +0 -35
- package/data/harnesses/code-fable/hooks/prompt-recall.mjs +0 -155
- package/data/harnesses/code-fable/hooks/session-reflect.mjs +0 -285
- package/data/harnesses/code-fable/rules/general.md +0 -79
- package/data/harnesses/code-fable/rules/nomenclature.md +0 -30
- package/data/harnesses/code-fable/rules/typescript.md +0 -19
- package/data/harnesses/code-fable/skills/boundary/SKILL.md +0 -76
- package/data/harnesses/code-fable/skills/boundary/references/boundary-taxonomy.md +0 -734
- package/data/harnesses/code-fable/skills/brainstorm/README.md +0 -136
- package/data/harnesses/code-fable/skills/brainstorm/SKILL.md +0 -135
- package/data/harnesses/code-fable/skills/brainstorm/harvest.md +0 -26
- package/data/harnesses/code-fable/skills/brainstorm/templates/backlog.md +0 -39
- package/data/harnesses/code-fable/skills/brainstorm/templates/build.md +0 -37
- package/data/harnesses/code-fable/skills/brainstorm/templates/decisions.md +0 -29
- package/data/harnesses/code-fable/skills/brainstorm/templates/doctrine.md +0 -31
- package/data/harnesses/code-fable/skills/brainstorm/templates/domain-model.md +0 -25
- package/data/harnesses/code-fable/skills/brainstorm/templates/glossary.md +0 -19
- package/data/harnesses/code-fable/skills/brainstorm/templates/milestones.md +0 -43
- package/data/harnesses/code-fable/skills/brainstorm/templates/non-goals.md +0 -21
- package/data/harnesses/code-fable/skills/brainstorm/templates/plan-doc.md +0 -61
- package/data/harnesses/code-fable/skills/brainstorm/templates/questions.md +0 -35
- package/data/harnesses/code-fable/skills/brainstorm/templates/references.md +0 -28
- package/data/harnesses/code-fable/skills/brainstorm/templates/rejected.md +0 -29
- package/data/harnesses/code-fable/skills/brainstorm/templates/state.md +0 -8
- package/data/harnesses/code-fable/skills/brainstorm/templates/tech.md +0 -23
- package/data/harnesses/code-fable/skills/brainstorm/templates/thesis.md +0 -21
- package/data/harnesses/code-fable/skills/distiller/SKILL.md +0 -219
- package/data/harnesses/code-fable/skills/distiller/references/docs-mode.md +0 -526
- package/data/harnesses/code-fable/skills/distiller/references/method.md +0 -166
- package/data/harnesses/code-fable/skills/documentation/SKILL.md +0 -125
- package/data/harnesses/code-fable/skills/documentation/references/examples.md +0 -193
- package/data/harnesses/code-fable/skills/documentation/references/style-guide.md +0 -288
- package/data/harnesses/code-fable/skills/documentation/references/templates.md +0 -865
- package/data/harnesses/code-fable/skills/workflow-mapper/SKILL.md +0 -430
- 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?** →
|
|
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.18.
|
|
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,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.
|