@nurix/etna 0.19.19 → 0.19.21

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 (83) hide show
  1. package/data/harness-index.json +1 -1
  2. package/data/harnesses/code/.prettierignore +6 -0
  3. package/data/harnesses/code/CLAUDE.md +17 -16
  4. package/data/harnesses/code/agents/maintenance.md +1 -1
  5. package/data/harnesses/code/codex/agents/maintenance.toml +1 -1
  6. package/data/harnesses/code/harness.json +2 -2
  7. package/data/harnesses/code/skills/documentation/SKILL.md +64 -107
  8. package/data/harnesses/code/skills/documentation/references/examples.md +83 -7
  9. package/data/harnesses/code/skills/documentation/references/frontmatter.md +44 -0
  10. package/data/harnesses/code/skills/documentation/references/style-guide.md +44 -19
  11. package/data/harnesses/code/skills/documentation/references/untemplated.md +38 -0
  12. package/data/harnesses/code/skills/documentation/scripts/doc-lint.mjs +117 -0
  13. package/data/harnesses/code/skills/documentation/templates/Readme.md +31 -0
  14. package/data/harnesses/code/skills/documentation/templates/api-reference.md +20 -0
  15. package/data/harnesses/code/skills/documentation/templates/architecture-decision.md +121 -0
  16. package/data/harnesses/code/skills/documentation/templates/backlog.md +33 -0
  17. package/data/harnesses/code/skills/documentation/templates/changelog-entry.md +62 -0
  18. package/data/harnesses/code/skills/documentation/templates/changelog-index.md +41 -0
  19. package/data/harnesses/code/skills/documentation/templates/docs-readme.md +70 -0
  20. package/data/harnesses/code/skills/documentation/templates/domain-model.md +30 -0
  21. package/data/harnesses/code/skills/documentation/templates/environment-registry.md +15 -0
  22. package/data/harnesses/code/skills/documentation/templates/feature.md +149 -0
  23. package/data/harnesses/code/skills/documentation/templates/glossary.md +11 -0
  24. package/data/harnesses/code/skills/documentation/templates/memory-main.md +25 -0
  25. package/data/harnesses/code/skills/documentation/templates/migration-runbook.md +34 -0
  26. package/data/harnesses/code/skills/documentation/templates/non-goals.md +11 -0
  27. package/data/harnesses/code/skills/documentation/templates/operations-procedure.md +36 -0
  28. package/data/harnesses/code/skills/documentation/templates/plan.md +64 -0
  29. package/data/harnesses/code/skills/documentation/templates/protected-files.md +37 -0
  30. package/data/harnesses/code/skills/documentation/templates/root-readme.md +104 -0
  31. package/data/harnesses/code/skills/documentation/templates/security-overview.md +27 -0
  32. package/data/harnesses/code/skills/documentation/templates/structure.md +65 -0
  33. package/data/harnesses/code/skills/documentation/templates/system-overview.md +32 -0
  34. package/data/harnesses/code/skills/documentation/templates/testing-strategy.md +29 -0
  35. package/data/harnesses/discover/.prettierignore +6 -0
  36. package/data/harnesses/discover/CLAUDE.md +13 -12
  37. package/data/harnesses/discover/harness.json +2 -2
  38. package/data/harnesses/discover/tooling-recommendations.md +10 -10
  39. package/data/harnesses/discussion/.prettierignore +6 -0
  40. package/data/harnesses/discussion/CLAUDE.md +4 -0
  41. package/data/harnesses/discussion/harness.json +2 -2
  42. package/data/harnesses/etna/.prettierignore +6 -0
  43. package/data/harnesses/etna/CLAUDE.md +16 -15
  44. package/data/harnesses/etna/agents/maintenance.md +1 -1
  45. package/data/harnesses/etna/codex/agents/maintenance.toml +1 -1
  46. package/data/harnesses/etna/harness.json +2 -2
  47. package/data/harnesses/etna/skills/documentation/SKILL.md +64 -107
  48. package/data/harnesses/etna/skills/documentation/references/examples.md +83 -7
  49. package/data/harnesses/etna/skills/documentation/references/frontmatter.md +44 -0
  50. package/data/harnesses/etna/skills/documentation/references/style-guide.md +44 -19
  51. package/data/harnesses/etna/skills/documentation/references/untemplated.md +38 -0
  52. package/data/harnesses/etna/skills/documentation/scripts/doc-lint.mjs +117 -0
  53. package/data/harnesses/etna/skills/documentation/templates/Readme.md +31 -0
  54. package/data/harnesses/etna/skills/documentation/templates/api-reference.md +20 -0
  55. package/data/harnesses/etna/skills/documentation/templates/architecture-decision.md +121 -0
  56. package/data/harnesses/etna/skills/documentation/templates/backlog.md +33 -0
  57. package/data/harnesses/etna/skills/documentation/templates/changelog-entry.md +62 -0
  58. package/data/harnesses/etna/skills/documentation/templates/changelog-index.md +41 -0
  59. package/data/harnesses/etna/skills/documentation/templates/docs-readme.md +70 -0
  60. package/data/harnesses/etna/skills/documentation/templates/domain-model.md +30 -0
  61. package/data/harnesses/etna/skills/documentation/templates/environment-registry.md +15 -0
  62. package/data/harnesses/etna/skills/documentation/templates/feature.md +149 -0
  63. package/data/harnesses/etna/skills/documentation/templates/glossary.md +11 -0
  64. package/data/harnesses/etna/skills/documentation/templates/memory-main.md +25 -0
  65. package/data/harnesses/etna/skills/documentation/templates/migration-runbook.md +34 -0
  66. package/data/harnesses/etna/skills/documentation/templates/non-goals.md +11 -0
  67. package/data/harnesses/etna/skills/documentation/templates/operations-procedure.md +36 -0
  68. package/data/harnesses/etna/skills/documentation/templates/plan.md +64 -0
  69. package/data/harnesses/etna/skills/documentation/templates/protected-files.md +37 -0
  70. package/data/harnesses/etna/skills/documentation/templates/root-readme.md +104 -0
  71. package/data/harnesses/etna/skills/documentation/templates/security-overview.md +27 -0
  72. package/data/harnesses/etna/skills/documentation/templates/structure.md +65 -0
  73. package/data/harnesses/etna/skills/documentation/templates/system-overview.md +32 -0
  74. package/data/harnesses/etna/skills/documentation/templates/testing-strategy.md +29 -0
  75. package/data/harnesses/hr/.prettierignore +6 -0
  76. package/data/harnesses/hr/CLAUDE.md +23 -23
  77. package/data/harnesses/hr/harness.json +2 -2
  78. package/data/harnesses/kb-agi/.prettierignore +6 -0
  79. package/data/harnesses/kb-agi/CLAUDE.md +16 -12
  80. package/data/harnesses/kb-agi/harness.json +2 -2
  81. package/package.json +1 -1
  82. package/data/harnesses/code/skills/documentation/references/templates.md +0 -1091
  83. package/data/harnesses/etna/skills/documentation/references/templates.md +0 -1091
@@ -0,0 +1,65 @@
1
+ # docs/structure.md (Authority Map)
2
+
3
+ Truth document. Use for: defining which folder owns which topic and how docs are maintained.
4
+
5
+ ```
6
+ ---
7
+ harness-version: 1.0.0
8
+ ---
9
+
10
+ # Documentation Structure
11
+
12
+ > This file is the entry point for understanding the docs folder.
13
+ > `harness-version` above is the repo's single baseline/version sentinel — the `maintenance` agent (baseline mode) owns it and stamps the installed harness version (semver) on every reconcile.
14
+
15
+ ## Authority Map
16
+
17
+ Each topic has one canonical location. Read from here, not from plans or changelogs.
18
+
19
+ | Topic | Authority | Key Files |
20
+ | ----- | --------- | --------- |
21
+ | Code-path ownership (path → doc + module) | feature `owns:` frontmatter | the generated ownership index |
22
+ | System overview | `docs/architecture/` | system-design.md |
23
+ | Steering (domain model, glossary, non-goals) | `docs/architecture/` | domain-model.md, glossary.md, non-goals.md |
24
+ | Architecture decisions (ADs) | `docs/architecture/decisions/` | AD-NNN-*.md |
25
+ | API surface | `docs/architecture/` | api.md |
26
+ | Security | `docs/architecture/` | security.md |
27
+ | Feature behavior | `docs/features/` | {key files} |
28
+ | Setup & development | `docs/operations/` | {key files} |
29
+ | Environment / config surface | `docs/operations/` | environment.md |
30
+ | Testing strategy | `docs/tests/` | strategy.md |
31
+ | Historical plans | `docs/history/plans/` | YYYY-MM-DD-name.md |
32
+ | Change records | `docs/history/changelog/` | Individual entries |
33
+ | Migration runbooks | `docs/history/migrations/` | YYYY-MM-DD-name.md |
34
+ | Deep-research artifacts | `docs/history/research/{topic}/` | README.md + findings.md + sources.md |
35
+ | Brainstorm design records | `docs/research/{topic}-brainstorm/` (active; legacy `-brainstorming/`) → `docs/history/brainstorms/{topic}/` (harvested; user deletes or commits) | thesis.md + forks.md + ledger.md + state.md |
36
+ | Backlog | `docs/history/` | backlog.md |
37
+
38
+ ## The Two Natures
39
+
40
+ Every doc is a **truth document** (states current absolutes, topic-named, updated in place) or a **record** (dated account of activity, frozen or append-only). `architecture/`, `features/`, `operations/`, `tests/` hold truth; `history/`, `research/`, `memory/` hold records.
41
+
42
+ - Truth documents are rewritten in place when reality changes — the change-story goes to a changelog entry, never into the truth doc's body.
43
+ - Records freeze: plans at `Complete`/`Abandoned`, changelog entries and migration runbooks once written/executed. A scope change is a new dated record that links back.
44
+ - Feature docs are the living reference for implemented features; an AD is the living truth for one decision subject, with its dated journey confined to its Decision Changelog tail.
45
+
46
+ ## Folder Rules
47
+
48
+ - `docs/features/`: Living reference for implemented features. Each feature doc **carries** the `owns:` / `module:` / `keywords:` / `status:` frontmatter — `owns:` declares the code-path globs it owns (the only ownership key), `module:` is an optional bounded-context label, `keywords:` are discovery terms, `status:` is `active`/`draft`/`deprecated`. The SessionStart hook unions every feature's `owns:` globs into the injected ownership index.
49
+ - `docs/architecture/`: The truth layer for system-wide shape: overview, domain model, glossary, non-goals, API surface, security, and `decisions/` (ADs — one per subject, updated in place, journey in each AD's Decision Changelog). Update when cross-cutting reality changes.
50
+ - `docs/operations/`: How-to procedures for setup, development, and deployment, plus the environment registry. Update when workflows change. One-shot migrations do NOT live here — they are records (`docs/history/migrations/`).
51
+ - `docs/tests/`: Testing strategy and test docs. Present when the repo has a test posture worth documenting.
52
+ - `docs/history/plans/`: Records. Must have `Status:` field. Never modify after completion.
53
+ - `docs/history/changelog/`: Records. Append-only.
54
+ - `docs/history/migrations/`: Records. One-shot migration/upgrade runbooks — authored before execution, outcome-stamped and frozen after.
55
+ - `docs/history/research/{topic}/`: Deep-research artifacts — the dumped output of a research pass, one folder per topic (conventionally `README.md` synthesis + `findings.md` verified claims & citations + `sources.md`). A point-in-time, cited record — **not** a living authority doc: it owns no code (no `owns:` frontmatter) and is never edited to "stay current." A spec/plan links to it for grounding; a new question gets a new topic folder.
56
+ - `docs/research/{topic}-brainstorm/` → `docs/history/brainstorms/{topic}/`: Brainstorm design records — the Brainstorming-Mode session for a topic (working surface `thesis.md` + `forks.md` + `ledger.md` + `state.md` + `basis/` + `fragments/`, plus an untracked `ops/` capture layer deleted at stop), written by the `brainstorm` skill and its twin agent. An active session lives under `docs/research/` (legacy folders carry the older `-brainstorming/` suffix); on a **passed harvest** it **moves** to `docs/history/brainstorms/` — the completion marker — and the **user decides whether the moved folder is deleted or committed** as provenance. Each of the two folders carries a `Readme.md` index (the skill reads it at start instead of scanning). Author-created (never scaffolded empty), one folder per design conversation. Owns no code (no `owns:` frontmatter); the harvest routes its conclusions into `architecture/`/`features/`/`history/`. (Distinct from `docs/history/research/{topic}/` above — that is a frozen deep-research record, not a brainstorm session.)
57
+ - `docs/history/backlog.md`: Tracked work items. Append new items under appropriate priority.
58
+
59
+ ## Health Log
60
+
61
+ <!-- Updated by maintenance agent — the sanctioned dated tail in this truth doc (SKILL.md § The Two Natures names the two bridges) -->
62
+ | Date | Review Summary |
63
+ | ---- | -------------- |
64
+ | {today} | Initial baseline — v{harness-version} structure established |
65
+ ```
@@ -0,0 +1,32 @@
1
+ # System Overview (docs/architecture/system-design.md)
2
+
3
+ Truth document. Use for: the bird's-eye view — what the system is, its subsystems, and how they connect. The first doc a new reader opens after the README; austere and short (two screens max). Depth lives in feature docs — this doc maps, it doesn't explain.
4
+
5
+ Required: **What this is**, **Subsystem map**. Optional: Key flows, Where the truth lives.
6
+
7
+ ```
8
+ # System Overview
9
+
10
+ ## What this is
11
+
12
+ {Two or three sentences: what the system does, for whom, in what environment it runs.}
13
+
14
+ ## Subsystem map
15
+
16
+ ┌──────────┐ ┌──────────┐ ┌──────────┐
17
+ │ Frontend │────▶│ API │────▶│ DB │
18
+ └──────────┘ └──────────┘ └──────────┘
19
+ {One box per subsystem; label the arrows with the contract that crosses them.}
20
+
21
+ - **{Subsystem}** — one line: what it owns. → [owning doc](../features/{feature}.md)
22
+
23
+ ## Key flows
24
+
25
+ {At most two or three ASCII flow diagrams for the flows everything else hangs off — request lifecycle, auth, the core domain operation.}
26
+
27
+ ## Where the truth lives
28
+
29
+ | Area | Canonical doc |
30
+ | ---- | ------------- |
31
+ | {area} | [{doc}](path) |
32
+ ```
@@ -0,0 +1,29 @@
1
+ # Testing Strategy (docs/tests/strategy.md)
2
+
3
+ Truth document. Use for: the repo's test posture — what is tested at which level, how to run it, and what is deliberately untested. The framework choices come from the harness testing rule; this doc records how *this repo* applies them.
4
+
5
+ Required: **Levels**, **Running**. Optional: Deliberately untested, Adding a test.
6
+
7
+ ```
8
+ # Testing Strategy
9
+
10
+ ## Levels
11
+
12
+ | Layer | Runner | Lives in | Covers |
13
+ | ----- | ------ | -------- | ------ |
14
+ | Unit / integration | {runner} | `tests/` | {what} |
15
+ | E2E | {runner} | `e2e/` | {what} |
16
+
17
+ ## Running
18
+
19
+ - `{pm} test` — the whole unit suite (CI gate)
20
+ - `{pm} run test:e2e` — {when to run}
21
+
22
+ ## Deliberately untested
23
+
24
+ - {Area} — {why, and what verifies it instead (typecheck, boot check, manual journey)}
25
+
26
+ ## Adding a test
27
+
28
+ 1. {Where the file goes, what it's named, where fixtures live}
29
+ ```
@@ -10,3 +10,9 @@ yarn.lock
10
10
 
11
11
  # Harness-managed agent/skill definitions (installed under .claude/)
12
12
  .claude
13
+
14
+ # Source catalogs — authored markdown; prettier collapses template/example blocks
15
+ skills
16
+ rules
17
+ agents
18
+ harness
@@ -4,6 +4,8 @@ This is the **policy** half of the `discover` harness. The plugin ships the capa
4
4
 
5
5
  A run is five modes, in order: **Discovery → Ingestion → Evaluation → Cartography → Self-correction.** The main session drives all five — Ingestion and Evaluation fan out parallel sub-agents (dispatch each via the Agent/Task tool with `model: opus`); Cartography re-enters the live product (the browser singleton) to walk + screenshot it and may fan out doc-drafting sub-agents; a sub-agent cannot spawn further sub-agents.
6
6
 
7
+ **Fan-out is a tool, not a default** — the main session does the work and its own reasoning; a delegated result comes back as a summary, not verifiable ground truth. Delegate **only when** the work is large, independent, or repetitive enough that a self-contained hand-off (the sub-agent sees none of the conversation) costs less than the work — broad research, wide sweeps, audits — and run independent delegations in parallel. **Never delegate judgment by reflex**: a second opinion is for a high-stakes call or an explicit request. No dispatch mechanism ⇒ inline. (Ingestion is the sanctioned application: each dimension is large and independent, so its collectors are fanned out deliberately, never by reflex.)
8
+
7
9
  ---
8
10
 
9
11
  ## Access is a capability vector (the front gate)
@@ -43,7 +45,7 @@ Agent name = dimension name. ⚠ = gated (needs user authorization before dispat
43
45
  - **It exists** → tooling was already reviewed here — skip straight to Mode 1. **Never re-prompt in the same folder.**
44
46
  - **It's absent** → run the one-time check:
45
47
  1. Read [`tooling-recommendations.md`](tooling-recommendations.md) (beside this file at the project root) — the Tier 1 (clean) and Tier 2 (gated) tool lists + the AVOID list.
46
- 2. **Validate what's already installed before recommending anything** — `command -v <tool>` per recommended tool (`npm ls -g <pkg>` for the Node libraries that ship no binary, e.g. `chrome-remote-interface`). Detection only — install nothing yourself.
48
+ 2. **Validate what's already installed before recommending anything** — `command -v <tool>` per recommended tool (`npm ls -g <pkg>` for the Node libraries that ship no binary, e.g. `chrome-remote-interface`). Detection only — nothing is installed at this step.
47
49
  3. **Recommend only the missing tools**, grouped **clean** (safe to install freely — offer the Tier-1 one-paste block) vs **gated** (first-party / user-owned / opt-in — surface the command but **never run it for the user**; these need the user in the loop). Never suggest anything on the AVOID list. If nothing is missing, say so in one line.
48
50
  4. **Write `.claude/discover-tooling.json`** so the harness never asks again in this folder:
49
51
  ```json
@@ -130,16 +132,15 @@ For spec-writing, integration planning, and competitive analysis — **not** cre
130
132
 
131
133
  Output lives under the **resolved corpus root** (default `research/`; chosen per Mode 1 step 0):
132
134
 
133
- ```
134
- <corpus>/<target>/ ← default corpus root: research/
135
- ├── 00-scope-verdict.md ← Discovery: accept/narrow/redirect/refuse
136
- ├── 00-recon-plan.md ← Discovery: access_grade + scope + dimension plan
137
- ├── dimensions/<dim>/{_summary.md, raw/} ← Ingestion (session & wire-capture also: captures/, curls.md)
138
- ├── dimensions/session/captures/screens/ ← Cartography: redacted per-surface screenshots (+ _index.md)
139
- ├── evaluation/{technology-architecture, product-features, data-model-api-surface, competitive-positioning}.md ← Evaluation
140
- ├── evaluation/{information-architecture, ux-flows, feature-coverage}.md ← Cartography (Mode 4)
141
- ├── README.md ← Evaluation: run story + headline findings
142
- └── 05-self-correction-proposal.md ← Self-correction (Mode 5): proposed harness fixes (approval-gated)
143
- ```
135
+ | Artifact (under `<corpus>/<target>/`) | Written by | Contents |
136
+ | --- | --- | --- |
137
+ | `00-scope-verdict.md` | Discovery | accept / narrow / redirect / refuse |
138
+ | `00-recon-plan.md` | Discovery | `access_grade` + scope + dimension plan |
139
+ | `dimensions/<dim>/{_summary.md, raw/}` | Ingestion | per-dimension collection (`session` & `wire-capture` also: `captures/`, `curls.md`) |
140
+ | `dimensions/session/captures/screens/` | Cartography | redacted per-surface screenshots (+ `_index.md`) |
141
+ | `evaluation/{technology-architecture, product-features, data-model-api-surface, competitive-positioning}.md` | Evaluation | the four rollups |
142
+ | `evaluation/{information-architecture, ux-flows, feature-coverage}.md` | Cartography (Mode 4) | the three cartography artifacts |
143
+ | `README.md` | Evaluation | run story + headline findings |
144
+ | `05-self-correction-proposal.md` | Self-correction (Mode 5) | proposed harness fixes (approval-gated) |
144
145
 
145
146
  Cloned repos live in `source/<target>/`. Provenance is the "self-aware" layer: each collector records _how_ it was obtained; Evaluation weights claims by it. Detailed shapes live in the rules.
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "harness": "discover",
3
3
  "name": "discover",
4
- "version": "0.1.10",
4
+ "version": "0.1.12",
5
5
  "files": [
6
6
  ".prettierignore",
7
7
  ".prettierrc.json",
8
8
  ".vscode/settings.json",
9
9
  "tooling-recommendations.md"
10
10
  ],
11
- "digest": "4e7fa848fe93"
11
+ "digest": "3b747e869c3a"
12
12
  }
@@ -1,13 +1,13 @@
1
1
  # Tooling recommendations — what to install to improve capture & synthesis
2
2
 
3
- > The `discover` harness reads this file on **first run** (Step 0 in [`CLAUDE.md`](CLAUDE.md)): it detects which of these tools are already on the host, recommends only the **missing** ones (the gated ones only with you in the loop), and records the result in `.claude/discover-tooling.json` so it never re-prompts in this folder. Nothing here is installed automatically — the harness recommends, you decide.
3
+ > The `discover` harness reads this file on **first run** (Step 0 in [`CLAUDE.md`](CLAUDE.md)): it detects which of these tools are already on the host, recommends only the **missing** ones (the gated ones only with the user in the loop), and records the result in `.claude/discover-tooling.json` so it never re-prompts in this folder. Nothing here is installed automatically — the harness recommends, the user decides.
4
4
 
5
5
  The host almost always arrives strong on languages and package managers (node, pnpm, python, uv, cargo, gh, jq, ripgrep) but **bare on capture/analysis tooling** — the tools below are what turn a shallow capture into a deep one.
6
6
 
7
7
  ## How to read this
8
8
 
9
9
  - **clean** — passive / local-only; always in-bounds. Install freely.
10
- - **gated** — fine, but only **first-party / user-owned / opt-in** (you install the CA, you route _your own_ client, you own the keys). mitmproxy, websocat, CDP, subfinder/tlsx, frida-on-your-own-device.
10
+ - **gated** — fine, but only **first-party / user-owned / opt-in** (the user installs the CA, routes _their own_ client, owns the keys). mitmproxy, websocat, CDP, subfinder/tlsx, frida on the user's own device.
11
11
  - **avoid** — crosses the harness bright line (active scanning / exploitation / third-party packet capture). Listed so they're _not_ added by reflex.
12
12
 
13
13
  The harness is for **spec-writing / integration / competitive analysis** — passive or first-party only, respect TOS/robots. No tool below changes that; the gated ones just need the user in the loop.
@@ -27,7 +27,7 @@ cargo install htmlq
27
27
  uv tool install trafilatura && uv tool install griffe
28
28
  # Node global (JS/TS surface + bundle de-obfuscation + spec lint)
29
29
  npm i -g webcrack source-map-explorer @arethetypeswrong/cli publint @electron/asar typescript @stoplight/spectral-cli
30
- # Headless browser for JS-rendered docs/marketing (clean — your own headless instance)
30
+ # Headless browser for JS-rendered docs/marketing (clean — the user's own headless instance)
31
31
  npm i -g playwright && npx playwright install chromium
32
32
  ```
33
33
 
@@ -53,26 +53,26 @@ npm i -g playwright && npx playwright install chromium
53
53
 
54
54
  ## Tier 2 — install when a run needs them (gated: first-party / passive-care)
55
55
 
56
- The capture lanes. In-bounds **only** for your own session / first-party clients / passive sources.
56
+ The capture lanes. In-bounds **only** for the user's own session / first-party clients / passive sources.
57
57
 
58
58
  ```bash
59
59
  brew install mitmproxy websocat grpcurl subfinder tlsx testssl jadx apktool
60
60
  npm i -g chrome-remote-interface get-graphql-schema
61
- # one-time, user-run: expose a CDP port on your own Chrome (closes the WS-frame blind spot)
61
+ # one-time, user-run: expose a CDP port on the user's own Chrome (closes the WS-frame blind spot)
62
62
  # open -na "Google Chrome" --args --remote-debugging-port=9222
63
- # mobile-only, your own device + opt-in: uv tool install frida-tools
63
+ # mobile-only, the user's own device + opt-in: uv tool install frida-tools
64
64
  ```
65
65
 
66
66
  | Tool | Unlocks | Ethics note |
67
67
  | --- | --- | --- |
68
68
  | **mitmproxy** | decode full HTTPS + WebSocket flows of any **first-party** client (CLI/desktop/mobile/SDK) — wire-capture rung 3 keystone | user installs CA + routes _their own_ client only |
69
- | **chrome-remote-interface** | raw CDP client → `Network.webSocketFrameReceived`/`Created`, SSE, full bodies — **captures the on-load WS frames the browser MCP's HTTP-only `read_network_requests` drops** | your own logged-in session |
69
+ | **chrome-remote-interface** | raw CDP client → `Network.webSocketFrameReceived`/`Created`, SSE, full bodies — **captures the on-load WS frames the browser MCP's HTTP-only `read_network_requests` drops** | the user's own logged-in session |
70
70
  | **websocat** | curl-for-WebSockets: connect/frame/replay/hexdump a realtime endpoint outside the browser | first-party endpoint |
71
71
  | **grpcurl** | list services + invoke RPCs via gRPC server reflection → readable op/message catalog | first-party endpoint |
72
72
  | **get-graphql-schema** | introspect a first-party GraphQL endpoint → full SDL | first-party endpoint |
73
73
  | **subfinder / tlsx / testssl.sh** | passive CT/DNS subdomain breadth + structured TLS posture (vs hand-rolled crt.sh + openssl text) | passive aggregation; respect rate limits |
74
74
  | **jadx / apktool** | decompile Android `.apk`/`.dex` → Java + decode `AndroidManifest`/resources (capability map) | public binary, read EULA |
75
- | **frida-tools** | cert-pinning bypass to capture **your own** mobile client's wire | your own device + opt-in only |
75
+ | **frida-tools** | cert-pinning bypass to capture **the user's own** mobile client's wire | the user's own device + opt-in only |
76
76
 
77
77
  **The single biggest unlock** for realtime targets: `chrome-remote-interface` + a Chrome `--remote-debugging-port` + `websocat` + `mitmproxy` together give `session`/`wire-capture` a real WebSocket/SSE capture path, instead of a client-side-remount workaround. The browser-MCP `read_network_requests` is HTTP-only — that's _why_ a realtime tap comes back empty until the remount trick.
78
78
 
@@ -86,7 +86,7 @@ Out-of-bounds for a spec-writing/competitive-analysis harness — listed so they
86
86
  - **`nuclei`** — template-based remote vuln scanning.
87
87
  - **`sqlmap`** — injection/exploitation.
88
88
  - **`amass` (active mode)** — active DNS brute-forcing (its _passive_ mode overlaps subfinder; prefer subfinder).
89
- - **third-party `mitmproxy`, `frida` on devices you don't own, `socat` as a public relay** — third-party traffic interception is the line this harness will not cross.
89
+ - **third-party `mitmproxy`, `frida` on devices the user doesn't own, `socat` as a public relay** — third-party traffic interception is the line this harness will not cross.
90
90
 
91
91
  These stay absent by design; the recon ethics depend on it.
92
92
 
@@ -116,4 +116,4 @@ These stay absent by design; the recon ethics depend on it.
116
116
  - **`webcrack` needs Node 22.** Its hard dependency `isolated-vm` is a native (node-gyp) addon that fails to build against Node 26 (and `--omit=optional` doesn't help — the dep is non-optional). If it won't install, run it under a Node 22 LTS shim (`npx -y webcrack@latest …` in a Node-22 env), or lean on the already-clean `source-map-explorer` (the preferred `source-map-reassembly` path whenever the SPA ships `.map` files) + `ast-grep`. De-obfuscation of a _no-maps, minified_ bundle is the only gap this leaves.
117
117
  - **`chrome-remote-interface` is a library, not a CLI** — it installs as a Node module and is invoked from a script, not a shell binary. Detect it with `npm ls -g chrome-remote-interface`, not `command -v`.
118
118
  - **`pipx` is typically absent; use `uv tool install`** for Python CLIs (uv is present) — simpler than adding pipx.
119
- - **`playwright` is clean** (your own headless instance) and unblocks JS-rendered docs/marketing for `docs`+`website` without contending for the gated `session` Chrome.
119
+ - **`playwright` is clean** (the user's own headless instance) and unblocks JS-rendered docs/marketing for `docs`+`website` without contending for the gated `session` Chrome.
@@ -10,3 +10,9 @@ yarn.lock
10
10
 
11
11
  # Harness-managed agent/skill definitions (installed under .claude/)
12
12
  .claude
13
+
14
+ # Source catalogs — authored markdown; prettier collapses template/example blocks
15
+ skills
16
+ rules
17
+ agents
18
+ harness
@@ -19,3 +19,7 @@ Strictly separated — never mix them:
19
19
  **The operator layer**: `metadata/lessons/` — read `DIGEST.md` at session start alongside the routing files; it is **prior, not canon** (its reading-protocol block governs). Everything else under `lessons/` (append-only `log/`, `forecasts.md`) loads on demand only. The `lessons-maintenance` agent (instruction set: `metadata/lessons/distillation.md`) runs **only during user sessions** — spawn it in the background when the `metadata/ops/` cursor falls a session behind.
20
20
 
21
21
  The rules are the method — portable, abstract, generic examples; nothing depends on any local topic. Live exemplars are reached through `metadata/TOPICS.md`. Workspace-local method notes go to `metadata/method-changelog.md`; the harness itself is versioned by `.claude/harness.json` and documented in the etna forge (`docs/architecture/harness/discussion/`).
22
+
23
+ ## Fan-out
24
+
25
+ **Fan-out is a tool, not a default** — the main session does the work and its own reasoning; a delegated result comes back as a summary, not verifiable ground truth. Delegate **only when** the work is large, independent, or repetitive enough that a self-contained hand-off (the sub-agent sees none of the conversation) costs less than the work — broad research, wide sweeps, audits — and run independent delegations in parallel. **Never delegate judgment by reflex**: a second opinion is for a high-stakes call or an explicit request. No dispatch mechanism ⇒ inline.
@@ -1,11 +1,11 @@
1
1
  {
2
2
  "harness": "discussion",
3
3
  "name": "discussion",
4
- "version": "0.4.1",
4
+ "version": "0.4.2",
5
5
  "files": [
6
6
  ".prettierignore",
7
7
  ".prettierrc.json",
8
8
  ".vscode/settings.json"
9
9
  ],
10
- "digest": "51812973828b"
10
+ "digest": "fa5d8b4fa816"
11
11
  }
@@ -10,3 +10,9 @@ yarn.lock
10
10
 
11
11
  # Harness-managed agent/skill definitions (installed under .claude/)
12
12
  .claude
13
+
14
+ # Source catalogs — authored markdown; prettier collapses template/example blocks
15
+ skills
16
+ rules
17
+ agents
18
+ harness
@@ -1,6 +1,6 @@
1
1
  # Agent Instructions
2
2
 
3
- This repo is **etna — the forge** where every Nurix harness is authored: skills, agents, rules, and harness definitions, composed into plugins and shipped to consumer repos by the `@nurix/etna` CLI. Working here means editing **authoring artifacts** — almost all markdown, plus the CLI and hook scripts (ESM JS) — not application source. etna has no `src/` app, no database, and no runtime API of its own; the code-project scaffolding you may expect (schema, wire contracts, a test suite) mostly doesn't apply, and where a rule below would in a normal repo, it's reframed for the forge.
3
+ This repo is **etna — the forge** where every Nurix harness is authored: skills, agents, rules, and harness definitions, composed into plugins and shipped to consumer repos by the `@nurix/etna` CLI. Working here means editing **authoring artifacts** — almost all markdown, plus the CLI and hook scripts (ESM JS) — not application source. etna has no `src/` app, no database, and no runtime API of its own; the usual code-project scaffolding (schema, wire contracts, a test suite) mostly doesn't apply, and where a rule below would in a normal repo, it's reframed for the forge.
4
4
 
5
5
  etna governs itself with the **`etna`** harness — deliberately forked from the **`code`** harness it ships, so a capability added to `code` (a new mode, a new agent) never silently lands in the forge's own governance. Rules marked **[override]** deliberately replace a Claude Code default; the rule here wins.
6
6
 
@@ -8,7 +8,7 @@ etna governs itself with the **`etna`** harness — deliberately forked from the
8
8
 
9
9
  ## Maintenance
10
10
 
11
- Invoke the `maintenance` agent whenever you judge the docs need it — not just at first setup: a `harness-version` marker behind the installed version, docs contradicting the components they describe, unowned source paths, or drift you notice while working. Never reconcile these by hand — the agent auto-selects its mode (baseline when the marker is missing or behind, coherence audit otherwise) and hands back; if it returns a follow-up (typically the module proposal), re-invoke it to finish. Each component's internals live in the component, not here.
11
+ Invoke the `maintenance` agent whenever the docs look like they need it — not just at first setup: a missing `docs/structure.md` (the repo isn't reconciled — baseline before applying anything below), a `harness-version` marker behind the installed version, docs contradicting the components they describe, unowned source paths, or drift noticed while working. Never reconcile these by hand — the agent auto-selects its mode (baseline when the marker is missing or behind, coherence audit otherwise) and hands back; if it returns a follow-up (typically the module proposal), re-invoke it to finish. Each component's internals live in the component, not here.
12
12
 
13
13
  ---
14
14
 
@@ -23,7 +23,7 @@ Invoke the `maintenance` agent whenever you judge the docs need it — not just
23
23
 
24
24
  ## Authoring & Distribution
25
25
 
26
- etna authors the components it also runs and ships, so **three copies of every component exist** — know which you are editing:
26
+ etna authors the components it also runs and ships, so **three copies of every component exist** — know which copy an edit lands in:
27
27
 
28
28
  | Copy | Where | Role |
29
29
  | --- | --- | --- |
@@ -31,7 +31,7 @@ etna authors the components it also runs and ships, so **three copies of every c
31
31
  | **Dogfood** | `.claude/skills/`, `.claude/agents/`, `.claude/rules/`, `.claude/hooks/` (git-tracked) | The subset the `etna` harness installs on itself — the copy this repo actually runs this session. |
32
32
  | **Shipped bundle** | `packages/cli/data/harnesses/*/` (git-tracked build artifact, regenerated by `packages/cli/scripts/build-data.js`) | Generated — never hand-edit. |
33
33
 
34
- - **Keep source and dogfood in sync.** When you edit a component etna dogfoods, mirror the change into its `.claude/` copy in the same change — otherwise the skill this session runs diverges from the one you authored.
34
+ - **Keep source and dogfood in sync.** When a dogfooded component's source changes, mirror the edit into its `.claude/` copy in the same change — otherwise the skill this session runs diverges from the authored one.
35
35
  - **A component edit ships.** On push to `dev`, CI fingerprints the payload, patch-bumps, and publishes to the marketplace and `@nurix/etna` npm — reaching every consumer repo. Weigh catalog edits with that blast radius in mind. The pipeline authority is **[`docs/architecture/distribution.md`](docs/architecture/distribution.md)** — link, don't restate.
36
36
 
37
37
  ---
@@ -60,20 +60,20 @@ Three peer modes plus a Completion step — enter wherever the user's thinking a
60
60
 
61
61
  ## Ownership, Boundaries & Documentation
62
62
 
63
- These three mechanisms keep the repo self-updating: **ownership** routes you to the canonical doc before you touch a component, the **boundary** check reads both sides of every contract your change participates in so you can't ship one side of it, and **documentation** closes the loop so the next session inherits the truth. Skipping any leg breaks the other two.
63
+ These three mechanisms keep the repo self-updating: **ownership** routes an edit to the canonical doc before the component is touched, the **boundary** check reads both sides of every contract a change participates in so one side never ships alone, and **documentation** closes the loop so the next session inherits the truth. Skipping any leg breaks the other two.
64
64
 
65
- ### Ownership — route before you edit
65
+ ### Ownership — route before editing
66
66
 
67
- Which doc is canonical for which paths is the **feature doc's own frontmatter**. A feature doc (flat in `docs/features/`) carries `owns:` (path globs — the only ownership key, pointing at `skills/**`, `harness/**`, `packages/cli/**`, …), an optional `module:` label, `keywords:`, and `status:`. Path → doc ownership is the union of every feature doc's `owns:` globs, surfaced as the generated ownership index at session start. Architecture docs describe cross-cutting patterns and own nothing; operations docs describe procedures.
67
+ Which doc is canonical for which paths is the **feature doc's own frontmatter**. A feature doc (flat in `docs/features/`) carries `owns:` (path globs — the only ownership key, pointing at `skills/**`, `harness/**`, `packages/cli/**`, …), an optional `module:` label, `keywords:`, and `status:`. Path → doc ownership is the union of every feature doc's `owns:` globs, surfaced as the generated ownership index at session start. A module is tied to its components by the `owns:` globs of the docs carrying its `module:` label — not a folder, not a separate map. Architecture docs describe cross-cutting patterns and own nothing; operations docs describe procedures.
68
68
 
69
69
  Before modifying a component in an unfamiliar area:
70
70
 
71
- 1. Consult the **injected ownership index** — the `glob → doc · module · keywords · status` map. Match your path or topic to the owning feature doc and read it first. (No index in context ⇒ the repo isn't reconciled — see Maintenance.)
71
+ 1. Consult the **injected ownership index** — the `glob → doc · module · keywords · status` map. Match the path or topic to the owning feature doc and read it first. (No index in context ⇒ the repo isn't reconciled — see Maintenance.)
72
72
  2. If a `docs/memory/` file exists for the area, read it for domain knowledge and failure modes.
73
73
 
74
74
  The `lld-mode` agent checks for ownership conflicts during LLD research — feature docs whose `owns:` globs overlap at equal specificity. Resolve them in the LLD before proceeding.
75
75
 
76
- ### Boundaries — check while you change
76
+ ### Boundaries — check while changing
77
77
 
78
78
  etna has no db schema, wire envelope, or auth of its own — the `boundary` skill's stack mechanisms describe the contracts of the **rules etna ships**, checked in the consumer's repo, not here. etna's **own** live contracts are authoring and distribution ones, each with no static link between the two sides:
79
79
 
@@ -86,9 +86,10 @@ Invoke the `boundary` skill after a plan is approved and before its first implem
86
86
 
87
87
  ### Documentation — close the loop
88
88
 
89
+ - **Every markdown document goes through the `documentation` skill.** Before creating or substantively editing any `.md` document — a doc, a README, an index, a record — invoke the `documentation` skill and apply its templates and `references/style-guide.md` (truth documents present-tense; history only in records). Instruction files — `CLAUDE.md`, rules, agents, skills — follow [`docs/architecture/writing-style.md`](docs/architecture/writing-style.md) instead.
89
90
  - **[override]** Keep `docs/` updated when a change alters documented behaviour — creating and updating docs is part of the work.
90
91
  - After plan completion **[override]**: add a `docs/history/changelog/` entry + update `docs/history/CHANGELOG.md`, no confirmation needed (include `Commits:` if multi-commit). Non-plan changes (refactors, fixes): prompt first.
91
- - When you move or rename a component: update the `owns:` globs of the feature doc that owns it so the ownership index stays accurate. A new doc that owns code declares its paths in its own `owns:` frontmatter.
92
+ - When moving or renaming a component: update the `owns:` globs of the feature doc that owns it so the ownership index stays accurate. A new doc that owns code declares its paths in its own `owns:` frontmatter.
92
93
  - `docs/structure.md` is the authority on what belongs where — read it before adding or moving a doc; one canonical source per topic, link don't copy. Only `CLAUDE.md`, `AGENTS.md`, and `README.md` live at the repo root.
93
94
 
94
95
  > 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.
@@ -111,11 +112,11 @@ Override the auto-memory default for project-relevant facts. When recording a le
111
112
 
112
113
  ## Out-of-Scope Discovery
113
114
 
114
- When implementing a plan, if you discover work that is important but outside the current plan's scope:
115
+ When a plan's implementation surfaces work that is important but outside the plan's scope:
115
116
 
116
117
  - Append it to `docs/history/backlog.md` under the appropriate priority (P0-P3)
117
118
  - Format: `- **[P1]** Description — discovered by [plan-name or agent-name]`
118
- - Do NOT ask permission. Just append and mention it in your response.
119
+ - Do NOT ask permission. Just append and mention it in the reply.
119
120
 
120
121
  ---
121
122
 
@@ -128,8 +129,8 @@ When implementing a plan, if you discover work that is important but outside the
128
129
  - ❌ **Compatibility** — never maintain backward compatibility unless specified.
129
130
  - ❌ **Branches & Worktrees [override]** — never self-create git branches or worktrees; commit straight to the checked-out branch. This replaces any built-in "branch first on the default branch" default. Exception: when the user asks for a pull request, create the branch the PR requires before committing its changes.
130
131
  - ❌ **Protected Files** — before editing, if `docs/operations/protected-files.md` exists, read it and never modify any path it lists; never modify `AGENTS.md` or that file itself.
131
- - ✅ **Browser Automation** — Claude in Chrome / CDP browser tools only when the user explicitly asks.
132
- - ✅ **Delegate at scale** — offload large, independent, or parallelizable work (broad research, audits, multi-file sweeps) to sub-agents with self-contained prompts; keep small, well-understood edits inline. Sub-agents can run skills and spawn their own sub-agents; keep work that needs the user's voice or the browser in the main session.
132
+ - ✅ **Browser Automation** — Claude in Chrome / CDP browser tools: use freely when useful, no need to ask first.
133
+ - ✅ **Fan-out is a tool, not a default** — the main session does the work and its own reasoning; a delegated result comes back as a summary, not verifiable ground truth. Delegate **only when** the work is large, independent, or repetitive enough that a self-contained hand-off (the sub-agent sees none of the conversation) costs less than the work — broad research, wide sweeps, audits — and run independent delegations in parallel. **Never delegate judgment by reflex**: a second opinion is for a high-stakes call or an explicit request. No dispatch mechanism ⇒ inline.
133
134
  - ⚠️ **Plans** — created directly in `docs/history/plans/` (see Workflows). Once `Status: Complete` or `Abandoned`, frozen — never edited. If scope changes after completion, write a new dated plan linking back.
134
135
  - ⚠️ **Tool Issues** — if any CLI tool, shell alias, or MCP tool behaves unexpectedly (syntax errors, silent failures, wrong defaults), report the exact tool, command, and error to the user so they can fix the underlying library.
135
136
 
@@ -148,4 +149,4 @@ For real code (the CLI under `packages/`, hook scripts):
148
149
 
149
150
  ## Runtime Notes
150
151
 
151
- etna runs in Claude Code. Sub-agent dispatch is the Agent tool; sub-agents can run skills and spawn their own sub-agents (probe-verified; re-verify on runtime updates), but cannot hold the browser connection (browser work is Claude in Chrome, main session only). The user-level memory store is `~/.claude/` (auto-memory under `~/.claude/projects/...`). The ownership index and skill/agent descriptions are injected at session start; skills are invoked as slash commands (e.g. `/brainstorm start`). Dispatch tiers: mechanical fan-out pins the fast tier (sonnet-class); a user-requested judgment-heavy dispatch takes the strong tier (opus-class) — tier names go stale, re-check on model releases.
152
+ etna runs in Claude Code. Sub-agent dispatch is the Agent tool; sub-agents can run skills and spawn their own sub-agents (probe-verified; re-verify on runtime updates), but cannot hold the browser connection (browser work is Claude in Chrome, main session only). The user-level memory store is `~/.claude/` (auto-memory under `~/.claude/projects/...`). The ownership index and skill/agent descriptions are injected at session start; skills are invoked as slash commands (e.g. `/brainstorm start`). Dispatch tiers: mechanical fan-out runs on the cheapest capable tier; a user-requested second opinion takes the strongest — pick by capability at dispatch, since model names go stale.
@@ -180,7 +180,7 @@ On approval, execute: create the folder structure; move/fold/merge/delete per th
180
180
 
181
181
  Scaffold missing mandated files **by calling the `documentation` skill for each template** — you orchestrate, the skill supplies templates:
182
182
 
183
- - `docs/structure.md` (with `harness-version`), `docs/history/CHANGELOG.md`, `docs/history/backlog.md`, `docs/memory/index.md`, `docs/memory/main.md`, and the repo-root `README.md` (filled from the real lockfile/scripts/layout — **never overwrite an existing root README**).
183
+ - `docs/structure.md` (with `harness-version`), `docs/history/CHANGELOG.md`, `docs/history/backlog.md`, `docs/memory/main.md`, and the repo-root `README.md` (filled from the real lockfile/scripts/layout — **never overwrite an existing root README**).
184
184
 
185
185
  ### Step B4 — Stamp the version
186
186
 
@@ -177,7 +177,7 @@ On approval, execute: create the folder structure; move/fold/merge/delete per th
177
177
 
178
178
  Scaffold missing mandated files **by calling the `documentation` skill for each template** — you orchestrate, the skill supplies templates:
179
179
 
180
- - `docs/structure.md` (with `harness-version`), `docs/history/CHANGELOG.md`, `docs/history/backlog.md`, `docs/memory/index.md`, `docs/memory/main.md`, and the repo-root `README.md` (filled from the real lockfile/scripts/layout — **never overwrite an existing root README**).
180
+ - `docs/structure.md` (with `harness-version`), `docs/history/CHANGELOG.md`, `docs/history/backlog.md`, `docs/memory/main.md`, and the repo-root `README.md` (filled from the real lockfile/scripts/layout — **never overwrite an existing root README**).
181
181
 
182
182
  ### Step B4 — Stamp the version
183
183
 
@@ -1,11 +1,11 @@
1
1
  {
2
2
  "harness": "etna",
3
3
  "name": "etna",
4
- "version": "1.1.9",
4
+ "version": "1.1.11",
5
5
  "files": [
6
6
  ".prettierignore",
7
7
  ".prettierrc.json",
8
8
  ".vscode/settings.json"
9
9
  ],
10
- "digest": "dbc9b25ecc8f"
10
+ "digest": "8834d630e6dc"
11
11
  }