@nurix/etna 0.15.7 → 0.16.0

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 (86) hide show
  1. package/bin/etna.js +64 -13
  2. package/data/harness-index.json +7 -5
  3. package/data/harnesses/code/CLAUDE.md +3 -7
  4. package/data/harnesses/code/agents/harness-manager.md +4 -4
  5. package/data/harnesses/code/agents/maintenance.md +1 -1
  6. package/data/harnesses/code/harness.json +4 -3
  7. package/data/harnesses/code/hooks/hooks.json +3 -17
  8. package/data/harnesses/code/hooks/prompt-recall.js +157 -0
  9. package/data/harnesses/code/hooks/session-reflect.js +283 -0
  10. package/data/harnesses/code/skills/distiller/SKILL.md +62 -60
  11. package/data/harnesses/code/skills/distiller/references/docs-mode.md +21 -21
  12. package/data/harnesses/code/skills/distiller/references/method.md +41 -41
  13. package/data/harnesses/code/skills/documentation/references/templates.md +20 -27
  14. package/data/harnesses/code-fable/CLAUDE.md +138 -0
  15. package/data/harnesses/code-fable/agents/brainstorm.md +35 -0
  16. package/data/harnesses/code-fable/agents/change-review.md +249 -0
  17. package/data/harnesses/code-fable/agents/harness-manager.md +193 -0
  18. package/data/harnesses/code-fable/agents/maintenance.md +123 -0
  19. package/data/harnesses/code-fable/agents/performance-review.md +218 -0
  20. package/data/harnesses/code-fable/agents/spec-mode.md +56 -0
  21. package/data/harnesses/code-fable/harness.json +7 -0
  22. package/data/harnesses/code-fable/hooks/hooks.json +27 -0
  23. package/data/harnesses/code-fable/hooks/lib/redact.js +37 -0
  24. package/data/harnesses/code-fable/hooks/prompt-recall.js +157 -0
  25. package/data/harnesses/code-fable/hooks/session-reflect.js +283 -0
  26. package/data/harnesses/code-fable/rules/general.md +96 -0
  27. package/data/harnesses/code-fable/rules/nomenclature.md +34 -0
  28. package/data/harnesses/code-fable/skills/boundary/SKILL.md +262 -0
  29. package/data/harnesses/code-fable/skills/boundary/references/boundary-taxonomy.md +734 -0
  30. package/data/harnesses/code-fable/skills/brainstorm/README.md +136 -0
  31. package/data/harnesses/code-fable/skills/brainstorm/SKILL.md +135 -0
  32. package/data/harnesses/code-fable/skills/brainstorm/harvest.md +26 -0
  33. package/data/harnesses/code-fable/skills/brainstorm/templates/backlog.md +39 -0
  34. package/data/harnesses/code-fable/skills/brainstorm/templates/build.md +37 -0
  35. package/data/harnesses/code-fable/skills/brainstorm/templates/decisions.md +29 -0
  36. package/data/harnesses/code-fable/skills/brainstorm/templates/doctrine.md +31 -0
  37. package/data/harnesses/code-fable/skills/brainstorm/templates/domain-model.md +25 -0
  38. package/data/harnesses/code-fable/skills/brainstorm/templates/glossary.md +19 -0
  39. package/data/harnesses/code-fable/skills/brainstorm/templates/milestones.md +43 -0
  40. package/data/harnesses/code-fable/skills/brainstorm/templates/non-goals.md +21 -0
  41. package/data/harnesses/code-fable/skills/brainstorm/templates/plan-doc.md +61 -0
  42. package/data/harnesses/code-fable/skills/brainstorm/templates/questions.md +35 -0
  43. package/data/harnesses/code-fable/skills/brainstorm/templates/references.md +28 -0
  44. package/data/harnesses/code-fable/skills/brainstorm/templates/rejected.md +29 -0
  45. package/data/harnesses/code-fable/skills/brainstorm/templates/state.md +8 -0
  46. package/data/harnesses/code-fable/skills/brainstorm/templates/tech.md +23 -0
  47. package/data/harnesses/code-fable/skills/brainstorm/templates/thesis.md +21 -0
  48. package/data/harnesses/code-fable/skills/distiller/SKILL.md +219 -0
  49. package/data/harnesses/code-fable/skills/distiller/references/docs-mode.md +526 -0
  50. package/data/harnesses/code-fable/skills/distiller/references/method.md +166 -0
  51. package/data/harnesses/code-fable/skills/documentation/SKILL.md +127 -0
  52. package/data/harnesses/code-fable/skills/documentation/references/examples.md +193 -0
  53. package/data/harnesses/code-fable/skills/documentation/references/style-guide.md +288 -0
  54. package/data/harnesses/code-fable/skills/documentation/references/templates.md +942 -0
  55. package/data/harnesses/code-fable/skills/workflow-mapper/SKILL.md +430 -0
  56. package/data/harnesses/code-fable/skills/workflow-mapper/references/patterns.md +214 -0
  57. package/data/harnesses/{re → discover}/CLAUDE.md +48 -33
  58. package/data/harnesses/{re → discover}/agents/api.md +3 -3
  59. package/data/harnesses/{re → discover}/agents/codebase.md +3 -3
  60. package/data/harnesses/{re → discover}/agents/community.md +3 -3
  61. package/data/harnesses/{re → discover}/agents/deployed-client-bundle.md +5 -5
  62. package/data/harnesses/{re → discover}/agents/distribution-artifacts.md +4 -4
  63. package/data/harnesses/{re → discover}/agents/docs.md +3 -3
  64. package/data/harnesses/{re → discover}/agents/infra-backend-fingerprint.md +2 -2
  65. package/data/harnesses/{re → discover}/agents/packages.md +3 -3
  66. package/data/harnesses/{re → discover}/agents/session.md +19 -11
  67. package/data/harnesses/{re → discover}/agents/website.md +3 -3
  68. package/data/harnesses/{re → discover}/agents/wire-capture.md +9 -7
  69. package/data/harnesses/discover/harness.json +7 -0
  70. package/data/harnesses/{re/rules/re-discovery.md → discover/rules/discovery.md} +54 -17
  71. package/data/harnesses/{re/rules/re-evaluation.md → discover/rules/evaluation.md} +12 -1
  72. package/data/harnesses/{re/rules/re-ingestion.md → discover/rules/ingestion.md} +192 -23
  73. package/data/harnesses/discover/rules/self-correction.md +177 -0
  74. package/data/harnesses/discover/rules/tradecraft.md +532 -0
  75. package/data/harnesses/hr/CLAUDE.md +91 -0
  76. package/data/harnesses/hr/harness.json +7 -0
  77. package/data/harnesses/hr/skills/interview-eval/SKILL.md +118 -0
  78. package/data/harnesses/hr/skills/interview-eval/TEMPLATE.md +124 -0
  79. package/data/harnesses/hr/skills/interview-eval/extract_session.py +418 -0
  80. package/data/harnesses/hr/skills/interview-eval/rubric.md +219 -0
  81. package/data/harnesses/kb-agi/harness.json +1 -0
  82. package/package.json +1 -1
  83. package/data/harnesses/code/hooks/post-commit.js +0 -136
  84. package/data/harnesses/code/hooks/post-tool-failure.js +0 -136
  85. package/data/harnesses/code/hooks/session-stop.js +0 -207
  86. package/data/harnesses/re/harness.json +0 -6
@@ -1,13 +1,13 @@
1
- # Product Reverse-Engineering — Orchestrator
1
+ # Discover Harness — Orchestrator
2
2
 
3
- This is the **policy** half of the `re` harness. The plugin ships the capabilities (11
4
- dimension-dumper agents + 4 `re-*` rules, one per mode); this file drives them. Together they reverse-engineer a
5
- product across every surface it exposes and dump a structured, provenance-tracked corpus into
6
- `research/<target>/`.
3
+ This is the **policy** half of the `discover` harness. The plugin ships the capabilities (11
4
+ dimension-collector agents + 4 mode rules + a `tradecraft` keyboard reference);
5
+ this file drives them. Together they discover a product across every surface it exposes and assemble a
6
+ structured, provenance-tracked corpus in the resolved corpus root (default `research/<target>/`).
7
7
 
8
8
  A run is four modes, in order: **Discovery → Ingestion → Evaluation → Self-correction.** The main
9
- session drives all four — Ingestion and Evaluation fan out parallel sub-agents, and a sub-agent
10
- cannot spawn further sub-agents.
9
+ session drives all four — Ingestion and Evaluation fan out parallel sub-agents (dispatch each via the
10
+ Agent/Task tool with `model: opus`), and a sub-agent cannot spawn further sub-agents.
11
11
 
12
12
  ---
13
13
 
@@ -24,7 +24,7 @@ decides which dimensions are reachable and which extraction method each uses:
24
24
  | **presence** | rich · thin · none | docs, website, community | — |
25
25
 
26
26
  Targets light several axes at once. The full model + grade→method mapping is in
27
- `.claude/rules/re-discovery.md`.
27
+ `.claude/rules/discovery.md`.
28
28
 
29
29
  ---
30
30
 
@@ -40,7 +40,7 @@ Targets light several axes at once. The full model + grade→method mapping is i
40
40
  | `community` | | |
41
41
 
42
42
  Agent name = dimension name. ⚠ = gated (needs user authorization before dispatch). The catalog —
43
- detection signals + strategy + per-dimension artifacts — is in `.claude/rules/re-discovery.md`.
43
+ detection signals + strategy + per-dimension artifacts — is in `.claude/rules/discovery.md`.
44
44
 
45
45
  ---
46
46
 
@@ -48,55 +48,68 @@ detection signals + strategy + per-dimension artifacts — is in `.claude/rules/
48
48
 
49
49
  Cheap, read-only. Scope the target, grade its access, detect which dimensions it exposes.
50
50
 
51
- 1. **Scope-feasibility gate** — run the `.claude/rules/re-discovery.md` Part A (scope gate) algorithm: resolve
51
+ **0. Resolve the corpus root** — the folder this run writes into. The harness chooses it *intelligently* rather than hardcoding one: default `research/` at the repo root, but if the project already holds a discovery corpus (any folder with a prior run's `*/00-scope-verdict.md`) under another name (`recon/`, `discovery/`, `teardowns/`, `analysis/`, …) **reuse it**, and honor a folder the user names. **Confirm the chosen root in one line** before writing. Every `research/<target>/` path in this harness is the *default form* — read it as `<corpus>/<target>/`, relative to the resolved root.
52
+
53
+ 1. **Scope-feasibility gate** — run the `.claude/rules/discovery.md` Part A (scope gate) algorithm: resolve
52
54
  identity → ambiguity → ethics → suite-size → primitive → reachability. If the verdict isn't
53
55
  `accept`, **halt** (present the narrowing/redirect prompt, or refuse). Write
54
56
  `research/<target>/00-scope-verdict.md`.
55
- 2. **Grade the access vector** (the four axes, with evidence) per `re-discovery` (Part B).
57
+ 2. **Grade the access vector** (the four axes, with evidence) per `discovery` (Part B).
56
58
  3. **Probe each of the 11 dimensions** (cheap signals only); mark ✅ available / ⚠️ partial /
57
59
  ❌ absent with evidence. An absent dimension is a finding.
58
60
  4. Write `research/<target>/00-recon-plan.md` — frontmatter carries `scope:` + the `access_grade`
59
- vector; the body is the dimension-availability table + the per-dimension dump plan (warm entry
61
+ vector; the body is the dimension-availability table + the per-dimension collection plan (warm entry
60
62
  points) + the gating/ethics flags.
61
63
 
62
64
  ---
63
65
 
64
66
  ## Mode 2 — Ingestion
65
67
 
66
- Dispatch one dumper per available dimension; dump exhaustively before context is lost. Every dumper
68
+ Dispatch one collector per available dimension; collect exhaustively before context is lost. Every collector
67
69
  writes `research/<target>/dimensions/<dim>/_summary.md` (with the **provenance frontmatter** —
68
- method · confidence · completeness · gaps) + `raw/`, obeying `.claude/rules/re-ingestion.md`.
70
+ method · confidence · completeness · gaps) + `raw/`, obeying `.claude/rules/ingestion.md`.
69
71
 
70
72
  - **Run independents in parallel** — dispatch `docs`, `packages`, `api`, `website`, `community`,
71
73
  `deployed-client-bundle`, `infra-backend-fingerprint`, `distribution-artifacts` together
72
- (`subagent_type='<dimension>'`, one message, multiple Agent calls). Seed each dumper with **warm
73
- entry points (URLs / repos / hosts), not claimed facts** — any fact carried from Discovery (a price,
74
- a tier name, a version) is tagged `verify:may-be-stale` so the dumper re-derives it instead of
75
- anchoring on a possibly-stale value. Only one dimension may drive the browser at a time (see
76
- `re-ingestion` §7 rule 9): the parallel dumpers use WebFetch/curl, leaving Chrome to `session`.
74
+ (`subagent_type='<dimension>'`, one message, multiple Agent calls). Seed each collector with **warm
75
+ entry points (URLs / repos / hosts), not claimed facts** — any fact **or inference** carried from
76
+ Discovery (a price, a tier name, a version — **or a derived hypothesis like "localStorage-key X ⇒
77
+ backend is Y"**) is tagged `verify:may-be-stale` so the collector **re-derives it instead of anchoring**
78
+ on a possibly-stale (or possibly-wrong) value. A Discovery *inference* is never seeded as a plan fact:
79
+ label it a hypothesis in `00-recon-plan.md` and tag it `verify:` in the seed, so a collector that
80
+ inherits it reports it hedged rather than echoing it as observed (a real run seeded an
81
+ `apolloAnonId ⇒ GraphQL backend` guess that two captures then repeated before the session refuted it).
82
+ Only one dimension may drive the browser at a time (see
83
+ `ingestion` §7 rule 9): the parallel collectors use WebFetch/curl, leaving Chrome to `session`.
77
84
  - **Codebase fan-out** — dispatch `codebase`; it clones + maps + returns a per-package work-list;
78
85
  then the main session fans out one reader per substantial package.
79
86
  - **Gated dimensions** — `session` and `wire-capture` (rung ≥2) need explicit user authorization
80
- first (see `re-ingestion` §7). `session` follows `.claude/rules/re-ingestion.md` §9. When `session`
81
- is authorized, **dispatch the non-browser dumpers in the background (`run_in_background`) and drive
87
+ first (see `ingestion` §7). `session` follows `.claude/rules/ingestion.md` §9. When `session`
88
+ is authorized, **dispatch the non-browser collectors in the background (`run_in_background`) and drive
82
89
  the gated browser session in the main session concurrently** — they don't contend (Chrome belongs to
83
- the main session; the dumpers use WebFetch/curl), so the whole of Ingestion runs in parallel.
90
+ the main session; the collectors use WebFetch/curl), so the whole of Ingestion runs in parallel.
84
91
  - **Shared seam** — **seed the two shared files `dimensions/_shared/{api-path-catalog.md,
85
- feature-flags.md}` (empty, with a header) once, before the dumper fan-out**; bundle/session/wire/
92
+ feature-flags.md}` (empty, with a header) once, before the collector fan-out**; bundle/session/wire/
86
93
  distribution then each *append* a `source:`-tagged section to the same physical file (never their own
87
94
  copy). One owner dimension per static asset; a second mine of the same asset is one source, not
88
- corroboration (`re-ingestion` §6).
95
+ corroboration (`ingestion` §6).
89
96
 
90
97
  Validate each return (`_summary.md` + provenance present). A `blocked`/`partial` return is recorded,
91
98
  not blindly re-run.
92
99
 
100
+ - **Capability gap = a checkpoint, not a silent fallback** (`ingestion` §8). If a *preferred* capture
101
+ capability is found unavailable mid-run (CDP/debugging port closed, browser MCP unreachable, a gated
102
+ proxy can't be stood up) and only a **materially weaker** method remains, **pause and confirm** with
103
+ the user before continuing on the fallback — naming what's unavailable and the coverage lost. (Distinct
104
+ from a planned method pre-grade, which is recorded, not confirmed.)
105
+
93
106
  ---
94
107
 
95
108
  ## Mode 3 — Evaluation
96
109
 
97
- Reconcile the dumps into four cross-dimension rollups under `research/<target>/evaluation/`, plus
110
+ Reconcile the collected dimensions into four cross-dimension rollups under `research/<target>/evaluation/`, plus
98
111
  the run `README.md`, **weighting every claim by how it was obtained**. Follow
99
- `.claude/rules/re-evaluation.md`: read each dimension's provenance frontmatter first; anchor +
112
+ `.claude/rules/evaluation.md`: read each dimension's provenance frontmatter first; anchor +
100
113
  provenance-tag every claim `(api: raw/endpoint-catalog.md · openapi-verbatim · high)`; weight
101
114
  (max-of-sources, promote one band only on ≥2 *independent* dimensions, never average); present
102
115
  high→fact, low/single-source→tentative, conflict→flagged. The four rollups: `technology-architecture`,
@@ -106,7 +119,7 @@ high→fact, low/single-source→tentative, conflict→flagged. The four rollups
106
119
 
107
120
  ## Mode 4 — Self-correction (the run corrects itself; the harness improves only on approval)
108
121
 
109
- Mode 4 is a loop, not a one-shot. Follow `.claude/rules/re-self-correction.md` — it carries the
122
+ Mode 4 is a loop, not a one-shot. Follow `.claude/rules/self-correction.md` — it carries the
110
123
  **defect checklist** (A), the **measurement rubric** (B), and the **iterate-or-propose loop** (C).
111
124
  Three stages, driven by the **main session** (not a sub-agent):
112
125
 
@@ -115,7 +128,7 @@ Three stages, driven by the **main session** (not a sub-agent):
115
128
  steps (mode · defect · severity · evidence anchor · within-run|harness-changing).
116
129
  2. **Measure** the run against the **rubric** → a `/100` score + vibe band. Always — every iteration,
117
130
  including the final one; the self-correcting step ALWAYS evaluates the current run.
118
- 3. **Iterate-or-propose**, splitting each defect by one test — *does the fix require editing a `re-*`
131
+ 3. **Iterate-or-propose**, splitting each defect by one test — *does the fix require editing a
119
132
  rule or an agent?*
120
133
  - **No → within-run:** the main session **auto-iterates** (no approval), re-running the cheapest
121
134
  affected Mode 1–3 steps on THIS target and re-measuring each round. The loop is **capable of ≥5
@@ -124,7 +137,7 @@ Three stages, driven by the **main session** (not a sub-agent):
124
137
  needing a Pass-2 / credit-spend / state-change / credential action goes through the
125
138
  explicit-confirmation gate, never the auto-loop.
126
139
  - **Yes → harness-changing:** accumulate into `research/<target>/04-self-correction-proposal.md`
127
- (the shape is in `re-self-correction.md`: run measurement · iteration ledger · defect list ·
140
+ (the shape is in `self-correction.md`: run measurement · iteration ledger · defect list ·
128
141
  within-run fixes applied · the approval-gated harness-change table).
129
142
 
130
143
  **Approval gate (unchanged):** present the harness-change table + the iteration ledger and STOP —
@@ -139,7 +152,7 @@ promotes only patterns ≥2 *independent* targets hit — a homogeneous batch's
139
152
  ## Ethics (non-negotiable)
140
153
 
141
154
  For spec-writing, integration planning, and competitive analysis — **not** credential theft,
142
- rate-limit bypass, or scraping. Full rules: `.claude/rules/re-ingestion.md` §7.
155
+ rate-limit bypass, or scraping. Full rules: `.claude/rules/ingestion.md` §7.
143
156
 
144
157
  - **Never enter credentials.** The user logs in; `session` and `wire-capture` rung 3 are opt-in.
145
158
  - **Redact every secret before writing `raw/`.** Cookies/tokens/JWT-signatures/API-keys never hit disk.
@@ -151,8 +164,10 @@ rate-limit bypass, or scraping. Full rules: `.claude/rules/re-ingestion.md` §7.
151
164
 
152
165
  ## Output contract
153
166
 
167
+ Output lives under the **resolved corpus root** (default `research/`; chosen per Mode 1 step 0):
168
+
154
169
  ```
155
- research/<target>/
170
+ <corpus>/<target>/ ← default corpus root: research/
156
171
  ├── 00-scope-verdict.md ← Discovery: accept/narrow/redirect/refuse
157
172
  ├── 00-recon-plan.md ← Discovery: access_grade + scope + dimension plan
158
173
  ├── dimensions/<dim>/{_summary.md, raw/} ← Ingestion (session & wire-capture also: captures/, curls.md)
@@ -161,5 +176,5 @@ research/<target>/
161
176
  └── 04-self-correction-proposal.md ← Self-correction: proposed harness fixes (approval-gated)
162
177
  ```
163
178
 
164
- Cloned repos live in `source/<target>/`. Provenance is the "self-aware" layer: each dump records
165
- *how* it was obtained; Evaluation weights claims by it. Detailed shapes live in the `re-*` rules.
179
+ Cloned repos live in `source/<target>/`. Provenance is the "self-aware" layer: each collector records
180
+ *how* it was obtained; Evaluation weights claims by it. Detailed shapes live in the rules.
@@ -1,14 +1,14 @@
1
1
  ---
2
2
  name: api
3
- description: Dimension dumper for the PUBLIC API / wire-contract dimension of the Product Recon Harness — OpenAPI/Swagger specs, GraphQL schemas, REST reference, webhooks. Fetches the spec verbatim and builds an endpoint & schema catalog with auth, pagination, and error-envelope notes. Dispatched during Ingestion (Mode 2).
3
+ description: Dimension collector for the PUBLIC API / wire-contract dimension of the Discover Harness — OpenAPI/Swagger specs, GraphQL schemas, REST reference, webhooks. Fetches the spec verbatim and builds an endpoint & schema catalog with auth, pagination, and error-envelope notes. Dispatched during Ingestion (Mode 2).
4
4
  tools: Bash, Read, Glob, Grep, Write, WebFetch
5
5
  model: inherit
6
6
  ---
7
7
 
8
8
  # api — the public API / wire-contract dimension
9
9
 
10
- You dump a target's documented machine interface into `research/<target>/dimensions/api/`.
11
- Read `.claude/rules/re-ingestion.md` (repo root) first and obey it.
10
+ You collect a target's documented machine interface into `research/<target>/dimensions/api/`.
11
+ Read `.claude/rules/ingestion.md` (repo root) first and obey it.
12
12
 
13
13
  ## Inputs (from the dispatch prompt)
14
14
  - target slug; the spec location(s): an OpenAPI/Swagger URL or in-repo path (e.g.
@@ -1,14 +1,14 @@
1
1
  ---
2
2
  name: codebase
3
- description: Dimension dumper for the open-source CODEBASE dimension of the Product Recon Harness. Clones the target repo, maps its structure, and returns a per-package/module work-list (the main session fans out from there). Dispatched during Ingestion (Mode 2) — not invoked directly by users.
3
+ description: Dimension collector for the open-source CODEBASE dimension of the Discover Harness. Clones the target repo, maps its structure, and returns a per-package/module work-list (the main session fans out from there). Dispatched during Ingestion (Mode 2) — not invoked directly by users.
4
4
  tools: Bash, Read, Glob, Grep, Write
5
5
  model: inherit
6
6
  ---
7
7
 
8
8
  # codebase — the open-source codebase dimension
9
9
 
10
- You dump the **source** of a target into `research/<target>/dimensions/codebase/`. Read
11
- `.claude/rules/re-ingestion.md` (repo root) first — it defines the `_summary.md` + `raw/` shape,
10
+ You collect the **source** of a target into `research/<target>/dimensions/codebase/`. Read
11
+ `.claude/rules/ingestion.md` (repo root) first — it defines the `_summary.md` + `raw/` shape,
12
12
  the size discipline, and the redaction rules. You obey it.
13
13
 
14
14
  You **cannot spawn sub-agents.** Your job is the top-level map *plus* a per-package work-list
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: community
3
- description: Dimension dumper for the COMMUNITY & CHANGELOG dimension of the Product Recon Harness — public changelog, GitHub issues/discussions, Discord, blog, status page. Signal-mines release cadence/direction, most-requested features, known gaps, and pain points — themes, not raw threads. Dispatched during Ingestion (Mode 2).
3
+ description: Dimension collector for the COMMUNITY & CHANGELOG dimension of the Discover Harness — public changelog, GitHub issues/discussions, Discord, blog, status page. Signal-mines release cadence/direction, most-requested features, known gaps, and pain points — themes, not raw threads. Dispatched during Ingestion (Mode 2).
4
4
  tools: Read, Write, Bash, Glob, Grep, WebFetch, WebSearch
5
5
  model: inherit
6
6
  skills:
@@ -9,8 +9,8 @@ skills:
9
9
 
10
10
  # community — the community & changelog dimension
11
11
 
12
- You dump a target's living signal into `research/<target>/dimensions/community/`. Read
13
- `.claude/rules/re-ingestion.md` (repo root) first and obey it. Be respectful and read-only —
12
+ You collect a target's living signal into `research/<target>/dimensions/community/`. Read
13
+ `.claude/rules/ingestion.md` (repo root) first and obey it. Be respectful and read-only —
14
14
  themes and clusters, never bulk-scraping every thread.
15
15
 
16
16
  ## Inputs (from the dispatch prompt)
@@ -1,14 +1,14 @@
1
1
  ---
2
2
  name: deployed-client-bundle
3
- description: Dimension dumper for the DEPLOYED-CLIENT-BUNDLE dimension of the Product Recon Harness. Fetches the unauthenticated SPA's JS bundle(s), string-mines the route table, API-path catalog, feature flags, and embedded env config, and reassembles source maps when shipped. Dispatched during Ingestion (Mode 2) — not invoked directly by users.
3
+ description: Dimension collector for the DEPLOYED-CLIENT-BUNDLE dimension of the Discover Harness. Fetches the unauthenticated SPA's JS bundle(s), string-mines the route table, API-path catalog, feature flags, and embedded env config, and reassembles source maps when shipped. Dispatched during Ingestion (Mode 2) — not invoked directly by users.
4
4
  tools: Read, Write, Bash, Glob, Grep, WebFetch
5
5
  model: inherit
6
6
  ---
7
7
 
8
8
  # deployed-client-bundle — the unauthenticated app-shell dimension
9
9
 
10
- You dump the **static, unauthenticated SPA** of a target into
11
- `research/<target>/dimensions/deployed-client-bundle/`. Read `.claude/rules/re-ingestion.md`
10
+ You collect the **static, unauthenticated SPA** of a target into
11
+ `research/<target>/dimensions/deployed-client-bundle/`. Read `.claude/rules/ingestion.md`
12
12
  (repo root) first — it defines the `_summary.md` + `raw/` shape, the size discipline, the
13
13
  shared-surface seam rule (§6), and the redaction rules (§7). You obey it.
14
14
 
@@ -30,7 +30,7 @@ the endpoints it will call, and the flags it gates behind.
30
30
  **Bound this — do NOT exhaustively fetch every lazy chunk.** The route table and the GraphQL/op
31
31
  registry live in the entry + `_app` + a registry chunk; grab those plus the largest few vendor
32
32
  chunks (cap ~40 chunks / ~5 MB / 90 s), and record the rest as a `gap`. Fetching all lazy chunks
33
- (often 90+, multi-MB) can run 3–4× a sibling dumper and read as hung. **Per §8, write a
33
+ (often 90+, multi-MB) can run 3–4× a sibling collector and read as hung. **Per §8, write a
34
34
  `status: partial` `_summary.md` from the entry/manifest chunks BEFORE the wider fetch loop**, then
35
35
  enrich and flip to `complete`.
36
36
  2. **Check for source maps FIRST.** Grep each chunk for `//# sourceMappingURL=`. If present,
@@ -45,7 +45,7 @@ the endpoints it will call, and the flags it gates behind.
45
45
  shared file** `research/<target>/dimensions/_shared/api-path-catalog.md` with a `source: bundle`
46
46
  column — do NOT create a copy under your own `raw/`; `session`/`wire`/`distribution` append to the
47
47
  *same* file so evaluation runs its adaptive diff. A path here that `session`/`wire` never hit is a
48
- dormant/unshipped route (a finding). **You OWN the app-API bundle mine** (re-ingestion §6): when
48
+ dormant/unshipped route (a finding). **You OWN the app-API bundle mine** (ingestion §6): when
49
49
  `source:none` and no machine spec is served, other dimensions cite your catalog by path and do not
50
50
  re-mine the same bundle (a second mine is one source, never corroboration).
51
51
  5. **Feature flags (SHARED).** Find flag SDK keys and flag literals (LaunchDarkly `client-side-id`,
@@ -1,20 +1,20 @@
1
1
  ---
2
2
  name: distribution-artifacts
3
- description: Dimension dumper for the DISTRIBUTION-ARTIFACTS dimension of the Product Recon Harness. Decodes a downloadable non-web client (extension CRX, Electron .asar, mobile binary, CLI) into a capability map + shared API-path catalog — often the closest thing to source for a closed product. Dispatched during Ingestion (Mode 2) — not invoked directly by users.
3
+ description: Dimension collector for the DISTRIBUTION-ARTIFACTS dimension of the Discover Harness. Decodes a downloadable non-web client (extension CRX, Electron .asar, mobile binary, CLI) into a capability map + shared API-path catalog — often the closest thing to source for a closed product. Dispatched during Ingestion (Mode 2) — not invoked directly by users.
4
4
  tools: Read, Write, Bash, WebFetch
5
5
  model: inherit
6
6
  ---
7
7
 
8
8
  # distribution-artifacts — the downloadable-client dimension
9
9
 
10
- You dump a target's **shipped binary client** into `research/<target>/dimensions/distribution-artifacts/`.
11
- Read `.claude/rules/re-ingestion.md` (repo root) first — it defines the `_summary.md` + `raw/` shape,
10
+ You collect a target's **shipped binary client** into `research/<target>/dimensions/distribution-artifacts/`.
11
+ Read `.claude/rules/ingestion.md` (repo root) first — it defines the `_summary.md` + `raw/` shape,
12
12
  the size discipline (§5), the shared-surface seam rule (§6), and the redaction + EULA rules (§7,
13
13
  §7.2). You obey it.
14
14
 
15
15
  A downloadable client is unlocked by `runtime` (a non-web client exists) and is often **the closest
16
16
  thing to source for a closed product**: the binary already declares its hosts, permissions, route
17
- table, and feature flags. Your job is to decode what ships, not to reverse-engineer protected logic.
17
+ table, and feature flags. Your job is to decode what ships, not to decompile protected logic.
18
18
 
19
19
  ## Inputs (from the dispatch prompt)
20
20
  - target slug; the artifact type(s) detected by discovery (extension / electron / mobile / cli) and
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: docs
3
- description: Dimension dumper for the DOCUMENTATION dimension of the Product Recon Harness — docs sites, guides, tutorials, concept docs, API-reference prose. Prefers in-repo docs and llms.txt, else crawls/clips the docs site to markdown, organized by section. Dispatched during Ingestion (Mode 2).
3
+ description: Dimension collector for the DOCUMENTATION dimension of the Discover Harness — docs sites, guides, tutorials, concept docs, API-reference prose. Prefers in-repo docs and llms.txt, else crawls/clips the docs site to markdown, organized by section. Dispatched during Ingestion (Mode 2).
4
4
  tools: Read, Glob, Grep, Bash, Write, WebFetch, WebSearch
5
5
  model: inherit
6
6
  skills:
@@ -9,8 +9,8 @@ skills:
9
9
 
10
10
  # docs — the documentation dimension
11
11
 
12
- You dump a target's docs into `research/<target>/dimensions/docs/`. Read
13
- `.claude/rules/re-ingestion.md` (repo root) first and obey its shape + redaction rules.
12
+ You collect a target's docs into `research/<target>/dimensions/docs/`. Read
13
+ `.claude/rules/ingestion.md` (repo root) first and obey its shape + redaction rules.
14
14
 
15
15
  ## Inputs (from the dispatch prompt)
16
16
  - target slug; the docs entry point(s): an in-repo `docs/` path, an `llms.txt` URL, a docs
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: infra-backend-fingerprint
3
- description: Dimension dumper for the INFRA-BACKEND-FINGERPRINT dimension of the Product Recon Harness. Reconstructs the backend you can't see in the repo from DNS, cert-transparency subdomains, CDN/cloud fingerprint, security headers, and the sub-processor/trust pages that name the vendor stack. Dispatched during Ingestion (Mode 2) — not invoked directly by users.
3
+ description: Dimension collector for the INFRA-BACKEND-FINGERPRINT dimension of the Discover Harness. Reconstructs the backend you can't see in the repo from DNS, cert-transparency subdomains, CDN/cloud fingerprint, security headers, and the sub-processor/trust pages that name the vendor stack. Dispatched during Ingestion (Mode 2) — not invoked directly by users.
4
4
  tools: Read, Write, Bash, WebFetch, WebSearch
5
5
  model: inherit
6
6
  ---
@@ -9,7 +9,7 @@ model: inherit
9
9
 
10
10
  You reconstruct the **backend a target runs on** — the part you can't see in the repo or the
11
11
  bundle — into `research/<target>/dimensions/infra-backend-fingerprint/`. Read
12
- `.claude/rules/re-ingestion.md` (repo root) first: it defines the `_summary.md` + `raw/` shape, the
12
+ `.claude/rules/ingestion.md` (repo root) first: it defines the `_summary.md` + `raw/` shape, the
13
13
  provenance frontmatter evaluation weights on, the size discipline, and the ethics (§7) that bind
14
14
  every dimension. You obey it. **Read-only public recon only** — DNS lookups, cert-transparency
15
15
  queries, header probes, and public legal/trust pages. No login, no scanning, no state changes.
@@ -1,14 +1,14 @@
1
1
  ---
2
2
  name: packages
3
- description: Dimension dumper for the PUBLISHED PACKAGES dimension of the Product Recon Harness — npm / PyPI / crates / Maven / NuGet artifacts. Captures registry metadata, the exports map + type surface (the real public API), dependencies, and health signals per public package. Dispatched during Ingestion (Mode 2).
3
+ description: Dimension collector for the PUBLISHED PACKAGES dimension of the Discover Harness — npm / PyPI / crates / Maven / NuGet artifacts. Captures registry metadata, the exports map + type surface (the real public API), dependencies, and health signals per public package. Dispatched during Ingestion (Mode 2).
4
4
  tools: Bash, Read, Glob, Grep, Write, WebFetch
5
5
  model: inherit
6
6
  ---
7
7
 
8
8
  # packages — the published packages dimension
9
9
 
10
- You dump a target's installable artifacts into `research/<target>/dimensions/packages/`. Read
11
- `.claude/rules/re-ingestion.md` (repo root) first and obey it.
10
+ You collect a target's installable artifacts into `research/<target>/dimensions/packages/`. Read
11
+ `.claude/rules/ingestion.md` (repo root) first and obey it.
12
12
 
13
13
  ## Inputs (from the dispatch prompt)
14
14
  - target slug; the package list (names + registry); the output dir
@@ -1,28 +1,36 @@
1
1
  ---
2
2
  name: session
3
- description: Dimension dumper for the LOGGED-IN APP SESSION dimension of the Product Recon Harness — the authenticated runtime behind login. Delegates to the copied-in browser-session playbook (three-pass, P0–P6) to instrument the live product via Chrome MCP and capture its wire protocol, auth, and state model. The deepest and most sensitive dimension; opt-in, user-gated, read-only-by-default. Dispatched during Ingestion (Mode 2) only after the user has a session ready and authorizes it.
3
+ description: Dimension collector for the LOGGED-IN APP SESSION dimension of the Discover Harness — the authenticated runtime behind login. Delegates to the copied-in browser-session playbook (three-pass, P0–P6) to instrument the live product via Chrome MCP and capture its wire protocol, auth, and state model. The deepest and most sensitive dimension; opt-in, user-gated, read-only-by-default. Dispatched during Ingestion (Mode 2) only after the user has a session ready and authorizes it.
4
4
  tools: Read, Write, Bash, Glob, Grep, mcp__claude-in-chrome__tabs_context_mcp, mcp__claude-in-chrome__tabs_create_mcp, mcp__claude-in-chrome__navigate, mcp__claude-in-chrome__read_network_requests, mcp__claude-in-chrome__read_console_messages, mcp__claude-in-chrome__javascript_tool, mcp__claude-in-chrome__get_page_text
5
5
  model: inherit
6
6
  ---
7
7
 
8
8
  # session — the logged-in app session dimension
9
9
 
10
- You dump the **authenticated runtime** into `research/<target>/dimensions/session/`. This is
11
- the deepest, most sensitive dimension. Read `.claude/rules/re-ingestion.md` (repo root):
10
+ You collect the **authenticated runtime** into `research/<target>/dimensions/session/`. This is
11
+ the deepest, most sensitive dimension. Read `.claude/rules/ingestion.md` (repo root):
12
12
  - **§7** — the ethics that bind you hardest here (credentials, redaction, state-change confirmation).
13
13
  - **§9** — the session playbook for this one dimension: prerequisites (§9.1), the three-pass
14
14
  strategy (§9.2), the P0→P6 phases (§9.3), runtime taps + the credential-scrub wrapper (§9.4),
15
15
  and the capture contract (§9.5).
16
+ - **§7.0** — the **runnable redaction layer** (`SCRUB` / `redactSecrets` / `ULTRA`): install it
17
+ inside the tap wrapper so no secret reaches `raw/`.
18
+
19
+ Also read `.claude/rules/tradecraft.md` — the **keyboard-level reference** for this
20
+ dimension: copy-paste fetch/XHR/WebSocket/EventSource/Pusher taps (install them *first*, before
21
+ navigating), the ~27-entry Chrome-MCP gotcha catalogue, the dead-end recovery table, the Apollo-cache
22
+ read-side recipe, and the storage/auth/envelope/realtime fingerprint tables. Don't re-derive a tap
23
+ you can paste.
16
24
 
17
25
  ## This dimension is special
18
26
 
19
27
  It is **interactive and gated**, unlike the other six:
20
- - **Preconditions** (verify first, per `re-ingestion` §9.1): the user is pre-logged-in to the
28
+ - **Preconditions** (verify first, per `ingestion` §9.1): the user is pre-logged-in to the
21
29
  target in Chrome; the Claude Chrome extension is installed; Chrome CDP is connected. If any
22
30
  fails, return `blocked` with which precondition is missing — do not proceed.
23
31
  - **You never enter credentials.** The user signs in beforehand.
24
32
  - **Read-only by default (Pass 1).** Storage *shape* not values; redact every credential
25
- inside the fetch wrapper so secrets never reach disk (`re-ingestion` §7 redaction patterns + §9.4 in-wrapper scrub).
33
+ inside the fetch wrapper so secrets never reach disk (`ingestion` §7 redaction patterns + §9.4 in-wrapper scrub).
26
34
  - **Pass 2 (any state-changing / cost-incurring action) is NOT yours to trigger.** Return to
27
35
  the main session with the exact proposed action + estimated cost so the *user* authorizes it
28
36
  in chat. Browser instrumentation that changes state must go through that confirmation loop.
@@ -35,22 +43,22 @@ cost-incurring action) is NOT yours to trigger** — return to the **main sessio
35
43
  action + estimated cost so the *user* authorizes it in chat (the confirmation loop above). The main
36
44
  session still owns the user dialogue and any state-changing instrumentation.
37
45
 
38
- ## Output (the playbook's own contract — richer than the standard dump)
46
+ ## Output (the playbook's own contract — richer than the standard capture)
39
47
 
40
48
  Under `research/<target>/dimensions/session/`:
41
49
  - `captures/p0-surface.md`, `p1-auth.md`, and per-phase narratives (P2 core action, P3
42
- streaming, P4 runtime/state, P5 iteration) — decoded, opinionated, per `re-ingestion` §9.5.
50
+ streaming, P4 runtime/state, P5 iteration) — decoded, opinionated, per `ingestion` §9.5.
43
51
  - `raw/*.json` — verbatim endpoint captures with `_meta` + `_decoded_fields`, **all secrets
44
- redacted** (`re-ingestion` §9.5). Digest bodies >50KB. App API paths + flags you observe **append
52
+ redacted** (`ingestion` §9.5). Digest bodies >50KB. App API paths + flags you observe **append
45
53
  to the shared `dimensions/_shared/{api-path-catalog.md, feature-flags.md}` with `source: session`**
46
- (re-ingestion §6) — and the folded rung-1 wire tap appends there as `source: wire`.
47
- - `curls.md` — reproducible commands per endpoint, auth model documented (`re-ingestion` §9.5).
54
+ (ingestion §6) — and the folded rung-1 wire tap appends there as `source: wire`.
55
+ - `curls.md` — reproducible commands per endpoint, auth model documented (`ingestion` §9.5).
48
56
  - **Visual / surface map** — `captures/screens/` is preferred *when screenshots are available*; when
49
57
  they are **not** (no image tool, or the app holds a persistent connection that never reaches
50
58
  page-idle), a textual `captures/surface-map.md` is the **accepted substitute** that satisfies the
51
59
  §9.5 visual-map requirement — and you record the visual-coverage gap in the `_summary.md` `gaps:`
52
60
  frontmatter (a known constraint, not a silent miss).
53
- - `_summary.md` — a short bridge file in the standard dump shape pointing into the above, so
61
+ - `_summary.md` — a short bridge file in the standard capture shape pointing into the above, so
54
62
  the synthesis step can treat session like any other dimension. Its frontmatter additionally carries
55
63
  **`write_side_observed: <true|false>`** and **`pass2: <not-applicable | offered-pending |
56
64
  declined-by-user | deferred | done>`** (§9.2) so Evaluation renders the write-side gap once,
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: website
3
- description: Dimension dumper for the MARKETING WEBSITE dimension of the Product Recon Harness — homepage, product/feature pages, pricing, customers, integrations, blog index. Extracts positioning, feature claims, pricing tiers/limits, target market, and the integration list. Dispatched during Ingestion (Mode 2).
3
+ description: Dimension collector for the MARKETING WEBSITE dimension of the Discover Harness — homepage, product/feature pages, pricing, customers, integrations, blog index. Extracts positioning, feature claims, pricing tiers/limits, target market, and the integration list. Dispatched during Ingestion (Mode 2).
4
4
  tools: Read, Write, Bash, WebFetch, WebSearch, mcp__claude-in-chrome__tabs_create_mcp, mcp__claude-in-chrome__navigate, mcp__claude-in-chrome__get_page_text
5
5
  model: inherit
6
6
  skills:
@@ -9,8 +9,8 @@ skills:
9
9
 
10
10
  # website — the marketing website dimension
11
11
 
12
- You dump a target's public-facing site into `research/<target>/dimensions/website/`. Read
13
- `.claude/rules/re-ingestion.md` (repo root) first and obey it. Keep marketing pages distinct
12
+ You collect a target's public-facing site into `research/<target>/dimensions/website/`. Read
13
+ `.claude/rules/ingestion.md` (repo root) first and obey it. Keep marketing pages distinct
14
14
  from docs (docs are the `docs` dimension).
15
15
 
16
16
  ## Inputs (from the dispatch prompt)
@@ -1,17 +1,19 @@
1
1
  ---
2
2
  name: wire-capture
3
- description: Dimension dumper for the GATED WIRE-CAPTURE dimension of the Product Recon Harness. Climbs the 3-rung lowest-privilege-first ladder (browser tap → HAR → user-run mitmproxy) to record what a non-browser/no-source client *actually* calls, redacting every body before disk. Dispatched during Ingestion (Mode 2) — not invoked directly by users.
3
+ description: Dimension collector for the GATED WIRE-CAPTURE dimension of the Discover Harness. Climbs the 3-rung lowest-privilege-first ladder (browser tap → HAR → user-run mitmproxy) to record what a non-browser/no-source client *actually* calls, redacting every body before disk. Dispatched during Ingestion (Mode 2) — not invoked directly by users.
4
4
  tools: Read, Write, Bash, mcp__claude-in-chrome__tabs_context_mcp, mcp__claude-in-chrome__tabs_create_mcp, mcp__claude-in-chrome__navigate, mcp__claude-in-chrome__read_network_requests, mcp__claude-in-chrome__read_console_messages, mcp__claude-in-chrome__javascript_tool, mcp__claude-in-chrome__get_page_text
5
5
  model: inherit
6
6
  ---
7
7
 
8
8
  # wire-capture — the gated runtime wire dimension
9
9
 
10
- You dump what a target's client **actually puts on the wire** into
11
- `research/<target>/dimensions/wire-capture/`. Read `.claude/rules/re-ingestion.md` (repo root)
12
- first — especially **§7.1** (the 3-rung ladder), §6 (the shared api-path-catalog seam), and the
13
- redaction rules. You obey it absolutely. This is the **runtime complement** to
14
- `distribution-artifacts`: the binary says what hosts it *might* call; you record what it *does*.
10
+ You collect what a target's client **actually puts on the wire** into
11
+ `research/<target>/dimensions/wire-capture/`. Read `.claude/rules/ingestion.md` (repo root)
12
+ first — especially **§7.1** (the 3-rung ladder), **§7.0** (the runnable redaction layer), §6 (the
13
+ shared api-path-catalog seam), and the redaction rules. You obey it absolutely. This is the
14
+ **runtime complement** to `distribution-artifacts`: the binary says what hosts it *might* call; you
15
+ record what it *does*. For the rung-1 browser tap, paste the interceptors + scrubbers from
16
+ `.claude/rules/tradecraft.md` (the keyboard-level reference) rather than re-deriving them.
15
17
 
16
18
  This dimension is **GATED at rungs 2–3**. You now hold read-only Chrome tools, so **rung 1 — the
17
19
  public, unauth browser tap — you run directly**: open the public surface in a tab and tap it with
@@ -67,7 +69,7 @@ frontmatter** (`dimension: wire-capture`, `target`, `status`, `access_grade_used
67
69
  **Inferences** (mark inference vs. fact — e.g. a host implies a vendor), **Open questions**,
68
70
  **Artifacts**.
69
71
 
70
- Then the captures + raw artifacts (per `re-discovery` Part C (wire-capture)):
72
+ Then the captures + raw artifacts (per `discovery` Part C (wire-capture)):
71
73
  - `captures/wire-narrative.md` — the decoded story: what the client does on the wire, in order.
72
74
  - `raw/flows.json` — verbatim-but-**redacted and digested** flows, each with the `_meta` header
73
75
  (incl. `kind`, `byte_length`, `redactions[]`, and the **chosen rung + authorization**), `body`,
@@ -0,0 +1,7 @@
1
+ {
2
+ "harness": "discover",
3
+ "name": "discover",
4
+ "version": "0.1.7",
5
+ "epoch": null,
6
+ "digest": "9617ebd1d5c1"
7
+ }