@nurix/etna 0.18.0 → 0.18.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (100) hide show
  1. package/README.md +6 -5
  2. package/data/harness-index.json +1 -1
  3. package/data/harnesses/code/CLAUDE.md +7 -18
  4. package/data/harnesses/code/agents/brainstorm.md +3 -3
  5. package/data/harnesses/code/agents/change-review.md +13 -10
  6. package/data/harnesses/code/agents/harness-manager.md +15 -15
  7. package/data/harnesses/code/agents/maintenance.md +10 -3
  8. package/data/harnesses/code/agents/performance-review.md +5 -0
  9. package/data/harnesses/code/harness.json +1 -1
  10. package/data/harnesses/code/rules/general.md +40 -36
  11. package/data/harnesses/code/skills/boundary/SKILL.md +15 -42
  12. package/data/harnesses/code/skills/boundary/references/boundary-taxonomy.md +366 -304
  13. package/data/harnesses/code/skills/brainstorm/README.md +9 -9
  14. package/data/harnesses/code/skills/brainstorm/SKILL.md +15 -15
  15. package/data/harnesses/code/skills/brainstorm/harvest.md +2 -2
  16. package/data/harnesses/code/skills/brainstorm/templates/backlog.md +2 -2
  17. package/data/harnesses/code/skills/brainstorm/templates/build.md +6 -6
  18. package/data/harnesses/code/skills/brainstorm/templates/decisions.md +3 -3
  19. package/data/harnesses/code/skills/brainstorm/templates/doctrine.md +2 -2
  20. package/data/harnesses/code/skills/brainstorm/templates/domain-model.md +2 -2
  21. package/data/harnesses/code/skills/brainstorm/templates/glossary.md +2 -1
  22. package/data/harnesses/code/skills/brainstorm/templates/non-goals.md +3 -7
  23. package/data/harnesses/code/skills/brainstorm/templates/questions.md +6 -5
  24. package/data/harnesses/code/skills/brainstorm/templates/state.md +1 -8
  25. package/data/harnesses/code/skills/brainstorm/templates/tech.md +6 -6
  26. package/data/harnesses/code/skills/brainstorm/templates/thesis.md +2 -2
  27. package/data/harnesses/code/skills/distiller/SKILL.md +48 -177
  28. package/data/harnesses/code/skills/distiller/references/docs-mode.md +116 -343
  29. package/data/harnesses/code/skills/distiller/references/method.md +37 -109
  30. package/data/harnesses/code/skills/documentation/SKILL.md +9 -6
  31. package/data/harnesses/code/skills/documentation/references/examples.md +30 -61
  32. package/data/harnesses/code/skills/documentation/references/style-guide.md +59 -62
  33. package/data/harnesses/code/skills/documentation/references/templates.md +25 -33
  34. package/data/harnesses/code/skills/workflow-mapper/SKILL.md +32 -11
  35. package/data/harnesses/code/skills/workflow-mapper/references/patterns.md +1 -1
  36. package/data/harnesses/code-fable/CLAUDE.md +12 -23
  37. package/data/harnesses/code-fable/agents/brainstorm.md +3 -3
  38. package/data/harnesses/code-fable/agents/change-review.md +13 -10
  39. package/data/harnesses/code-fable/agents/harness-manager.md +15 -15
  40. package/data/harnesses/code-fable/agents/maintenance.md +10 -3
  41. package/data/harnesses/code-fable/agents/performance-review.md +5 -0
  42. package/data/harnesses/code-fable/harness.json +1 -1
  43. package/data/harnesses/code-fable/rules/general.md +40 -36
  44. package/data/harnesses/code-fable/skills/boundary/SKILL.md +15 -42
  45. package/data/harnesses/code-fable/skills/boundary/references/boundary-taxonomy.md +366 -304
  46. package/data/harnesses/code-fable/skills/brainstorm/README.md +9 -9
  47. package/data/harnesses/code-fable/skills/brainstorm/SKILL.md +15 -15
  48. package/data/harnesses/code-fable/skills/brainstorm/harvest.md +2 -2
  49. package/data/harnesses/code-fable/skills/brainstorm/templates/backlog.md +2 -2
  50. package/data/harnesses/code-fable/skills/brainstorm/templates/build.md +6 -6
  51. package/data/harnesses/code-fable/skills/brainstorm/templates/decisions.md +3 -3
  52. package/data/harnesses/code-fable/skills/brainstorm/templates/doctrine.md +2 -2
  53. package/data/harnesses/code-fable/skills/brainstorm/templates/domain-model.md +2 -2
  54. package/data/harnesses/code-fable/skills/brainstorm/templates/glossary.md +2 -1
  55. package/data/harnesses/code-fable/skills/brainstorm/templates/non-goals.md +3 -7
  56. package/data/harnesses/code-fable/skills/brainstorm/templates/questions.md +6 -5
  57. package/data/harnesses/code-fable/skills/brainstorm/templates/state.md +1 -8
  58. package/data/harnesses/code-fable/skills/brainstorm/templates/tech.md +6 -6
  59. package/data/harnesses/code-fable/skills/brainstorm/templates/thesis.md +2 -2
  60. package/data/harnesses/code-fable/skills/distiller/SKILL.md +48 -177
  61. package/data/harnesses/code-fable/skills/distiller/references/docs-mode.md +116 -343
  62. package/data/harnesses/code-fable/skills/distiller/references/method.md +37 -109
  63. package/data/harnesses/code-fable/skills/documentation/SKILL.md +9 -6
  64. package/data/harnesses/code-fable/skills/documentation/references/examples.md +30 -61
  65. package/data/harnesses/code-fable/skills/documentation/references/style-guide.md +59 -62
  66. package/data/harnesses/code-fable/skills/documentation/references/templates.md +25 -33
  67. package/data/harnesses/code-fable/skills/workflow-mapper/SKILL.md +32 -11
  68. package/data/harnesses/code-fable/skills/workflow-mapper/references/patterns.md +1 -1
  69. package/data/harnesses/discover/CLAUDE.md +41 -109
  70. package/data/harnesses/discover/agents/api.md +11 -28
  71. package/data/harnesses/discover/agents/codebase.md +12 -30
  72. package/data/harnesses/discover/agents/community.md +9 -21
  73. package/data/harnesses/discover/agents/deployed-client-bundle.md +16 -67
  74. package/data/harnesses/discover/agents/distribution-artifacts.md +21 -59
  75. package/data/harnesses/discover/agents/docs.md +11 -20
  76. package/data/harnesses/discover/agents/infra-backend-fingerprint.md +28 -68
  77. package/data/harnesses/discover/agents/packages.md +12 -28
  78. package/data/harnesses/discover/agents/session.md +18 -50
  79. package/data/harnesses/discover/agents/website.md +9 -19
  80. package/data/harnesses/discover/agents/wire-capture.md +22 -72
  81. package/data/harnesses/discover/harness.json +1 -1
  82. package/data/harnesses/discover/rules/discovery.md +73 -182
  83. package/data/harnesses/discover/rules/evaluation.md +90 -98
  84. package/data/harnesses/discover/rules/ingestion.md +123 -322
  85. package/data/harnesses/discover/rules/self-correction.md +67 -92
  86. package/data/harnesses/discover/rules/tradecraft.md +201 -172
  87. package/data/harnesses/hr/CLAUDE.md +21 -51
  88. package/data/harnesses/hr/harness.json +1 -1
  89. package/data/harnesses/hr/skills/interview-eval/SKILL.md +23 -11
  90. package/data/harnesses/hr/skills/interview-eval/TEMPLATE.md +49 -29
  91. package/data/harnesses/hr/skills/interview-eval/rubric.md +30 -30
  92. package/data/harnesses/kb-agi/CLAUDE.md +8 -8
  93. package/data/harnesses/kb-agi/agents/kb-agi-init.md +31 -22
  94. package/data/harnesses/kb-agi/agents/kb-catch-stale.md +1 -1
  95. package/data/harnesses/kb-agi/agents/kb-find-gaps.md +1 -1
  96. package/data/harnesses/kb-agi/agents/kb-fix-links.md +1 -1
  97. package/data/harnesses/kb-agi/agents/kb-refresh-summaries.md +2 -2
  98. package/data/harnesses/kb-agi/agents/kb-sync-metadata.md +2 -2
  99. package/data/harnesses/kb-agi/harness.json +1 -1
  100. package/package.json +1 -1
@@ -7,46 +7,29 @@ model: inherit
7
7
 
8
8
  # api — the public API / wire-contract dimension
9
9
 
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.
10
+ You collect a target's documented machine interface into `research/<target>/dimensions/api/`. Read `.claude/rules/ingestion.md` (repo root) first and obey it.
12
11
 
13
12
  ## Inputs (from the dispatch prompt)
14
- - target slug; the spec location(s): an OpenAPI/Swagger URL or in-repo path (e.g.
15
- `source/<target>/docs/references/*.openapi.json`), a GraphQL endpoint, or a REST-reference
16
- docs section; the output dir `research/<target>/dimensions/api/`.
13
+
14
+ - target slug; the spec location(s): an OpenAPI/Swagger URL or in-repo path (e.g. `source/<target>/docs/references/*.openapi.json`), a GraphQL endpoint, or a REST-reference docs section; the output dir `research/<target>/dimensions/api/`.
17
15
 
18
16
  ## Strategy
19
17
 
20
- 1. **OpenAPI / Swagger** — fetch the spec verbatim into `raw/openapi.json` (digest if multi-MB:
21
- keep `info`, `servers`, the full paths list, the component schema *names* + key schemas, drop
22
- redundant examples). Build an **endpoint catalog**: every path × method, summary, auth, the
23
- request/response schema names, pagination style, rate-limit headers.
24
- 2. **GraphQL** — if introspection is on or a schema is published, capture types, queries,
25
- mutations, subscriptions. Note if introspection is disabled (a finding).
18
+ 1. **OpenAPI / Swagger** — fetch the spec verbatim into `raw/openapi.json` (digest if multi-MB: keep `info`, `servers`, the full paths list, the component schema _names_ + key schemas, drop redundant examples). Build an **endpoint catalog**: every path × method, summary, auth, the request/response schema names, pagination style, rate-limit headers.
19
+ 2. **GraphQL** — if introspection is on or a schema is published, capture types, queries, mutations, subscriptions. Note if introspection is disabled (a finding).
26
20
  3. **REST-reference prose** (no machine spec) — reconstruct the catalog from the docs section.
27
- 4. Note the **auth model** (token type + header), the **response envelope** shape, the **error
28
- format**, **versioning**, and **webhooks** (event types + payload shapes) if documented.
29
- 5. **MCP / tool-catalog fold-in** — probe for an MCP server manifest (`/.well-known/mcp`, an MCP
30
- config), a function-calling tool schema, or an LLM "actions"/tools file. An MCP tool list *is*
31
- an API catalog, so it lives here (not as its own dimension) → `raw/tool-catalog.md`. Increasingly
32
- common in 2026; an absent one is fine, a present one is high-signal.
21
+ 4. Note the **auth model** (token type + header), the **response envelope** shape, the **error format**, **versioning**, and **webhooks** (event types + payload shapes) if documented.
22
+ 5. **MCP / tool-catalog fold-in** — probe for an MCP server manifest (`/.well-known/mcp`, an MCP config), a function-calling tool schema, or an LLM "actions"/tools file. An MCP tool list _is_ an API catalog, so it lives here (not as its own dimension) → `raw/tool-catalog.md`. Increasingly common in 2026; an absent one is fine, a present one is high-signal.
33
23
 
34
24
  ## Output
35
25
 
36
- - `research/<target>/dimensions/api/_summary.md` (per contract — incl. the provenance
37
- frontmatter: method/confidence/completeness/gaps): Method, Findings (auth model, envelope,
38
- pagination, the endpoint-family overview as a table, webhook events, any tool-catalog),
39
- Inferences (API generation/style — REST/GraphQL/RPC; maturity; versioning posture), Open
40
- questions, Artifacts.
26
+ - `research/<target>/dimensions/api/_summary.md` (per contract — incl. the provenance frontmatter: method/confidence/completeness/gaps): Method, Findings (auth model, envelope, pagination, the endpoint-family overview as a table, webhook events, any tool-catalog), Inferences (API generation/style — REST/GraphQL/RPC; maturity; versioning posture), Open questions, Artifacts.
41
27
  - `raw/openapi.json` (or `raw/graphql-schema.md`) — the spec, verbatim or digested.
42
28
  - `raw/endpoint-catalog.md` — the full path × method × auth × schema table.
43
29
  - `raw/tool-catalog.md` — the MCP/tool-schema surface, if present.
44
30
 
45
31
  ## Return value
46
- A one-paragraph headline (the API surface in a sentence) + endpoint-family counts + the auth
47
- model. Flag overlap with the packages/docs dimensions (the published SDK often wraps this API)
48
- and especially any drift vs. the session dimension's *observed* wire surface, for synthesis.
49
32
 
50
- **Discipline:** the spec is the load-bearing artifact — capture it accurately, digest if huge.
51
- Redact any embedded keys/example tokens. A disabled-introspection or undocumented API is a
52
- finding, recorded as an Open question, not a guess.
33
+ A one-paragraph headline (the API surface in a sentence) + endpoint-family counts + the auth model. Flag overlap with the packages/docs dimensions (the published SDK often wraps this API) and especially any drift vs. the session dimension's _observed_ wire surface, for synthesis.
34
+
35
+ **Discipline:** the spec is the load-bearing artifact — capture it accurately, digest if huge. Redact any embedded keys/example tokens. A disabled-introspection or undocumented API is a finding, recorded as an Open question, not a guess.
@@ -7,46 +7,31 @@ model: inherit
7
7
 
8
8
  # codebase — the open-source codebase dimension
9
9
 
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
- the size discipline, and the redaction rules. You obey it.
10
+ You collect the **source** of a target into `research/<target>/dimensions/codebase/`. Read `.claude/rules/ingestion.md` (repo root) first — it defines the `_summary.md` + `raw/` shape, the size discipline, and the redaction rules. You obey it.
13
11
 
14
- You **cannot spawn sub-agents.** Your job is the top-level map *plus* a per-package work-list
15
- that the main session uses to fan out deep per-package readers. Don't try to read every line
16
- of every package yourself — map breadth, flag depth.
12
+ You **cannot spawn sub-agents.** Your job is the top-level map _plus_ a per-package work-list that the main session uses to fan out deep per-package readers. Don't try to read every line of every package yourself — map breadth, flag depth.
17
13
 
18
14
  ## Inputs (from the dispatch prompt)
15
+
19
16
  - target slug, the repo clone URL (or a path if already cloned in `source/<target>/`),
20
17
  - the output dir `research/<target>/dimensions/codebase/`.
21
18
 
22
19
  ## Steps
23
20
 
24
- 1. **Clone** (if not already): `git clone --depth 1 <url> source/<target>/`. Capture the
25
- HEAD commit. If huge, still shallow-clone; you'll digest, not read everything.
26
- 2. **Orientation read:** root `README.md`, `AGENTS.md`/`CLAUDE.md`, `CONTRIBUTING`, the root
27
- manifest (`package.json` / `pyproject.toml` / `Cargo.toml` / `go.mod`), and the workspace
28
- manifest (`pnpm-workspace.yaml` / `turbo.json` / `lerna.json` / Cargo workspace).
29
- 3. **Structural map:** top-level layout; every package/app/module with a one-line purpose
30
- (from its own README / manifest `description`); the **internal dependency hierarchy**
31
- (which package depends on which); the build system, language(s), test setup; license posture
32
- (look for a `licenses/` dir or per-package `license` fields).
33
- 4. **Identify the substantial units** — the packages/modules worth a deep read (public SDKs,
34
- the core engine, anything large or load-bearing). These become the work-list.
21
+ 1. **Clone** (if not already): `git clone --depth 1 <url> source/<target>/`. Capture the HEAD commit. If huge, still shallow-clone; you'll digest, not read everything.
22
+ 2. **Orientation read:** root `README.md`, `AGENTS.md`/`CLAUDE.md`, `CONTRIBUTING`, the root manifest (`package.json` / `pyproject.toml` / `Cargo.toml` / `go.mod`), and the workspace manifest (`pnpm-workspace.yaml` / `turbo.json` / `lerna.json` / Cargo workspace).
23
+ 3. **Structural map:** top-level layout; every package/app/module with a one-line purpose (from its own README / manifest `description`); the **internal dependency hierarchy** (which package depends on which); the build system, language(s), test setup; license posture (look for a `licenses/` dir or per-package `license` fields).
24
+ 4. **Identify the substantial units** — the packages/modules worth a deep read (public SDKs, the core engine, anything large or load-bearing). These become the work-list.
35
25
 
36
26
  ## Output
37
27
 
38
- Write `research/<target>/dimensions/codebase/_summary.md` (per the contract): Method,
39
- Findings (the structural map + dep hierarchy + build system, as tables), Inferences
40
- (architecture, public vs private packages, runtime model), Open questions, Artifacts.
28
+ Write `research/<target>/dimensions/codebase/_summary.md` (per the contract): Method, Findings (the structural map + dep hierarchy + build system, as tables), Inferences (architecture, public vs private packages, runtime model), Open questions, Artifacts.
41
29
 
42
- Write `research/<target>/dimensions/codebase/raw/structure-map.md` — the full layout + a
43
- table of every package: name · path · purpose · public/private · key deps. And
44
- `raw/dependency-graph.md` — the internal dependency hierarchy.
30
+ Write `research/<target>/dimensions/codebase/raw/structure-map.md` — the full layout + a table of every package: name · path · purpose · public/private · key deps. And `raw/dependency-graph.md` — the internal dependency hierarchy.
45
31
 
46
32
  ## Return value (critical — this drives the fan-out)
47
33
 
48
- Return a **per-unit work-list** as a compact table so the main session can dispatch one reader
49
- per unit:
34
+ Return a **per-unit work-list** as a compact table so the main session can dispatch one reader per unit:
50
35
 
51
36
  ```
52
37
  | unit | path | why it matters | suggested output file |
@@ -55,9 +40,6 @@ per unit:
55
40
  | ... | ... | ... | ... |
56
41
  ```
57
42
 
58
- Plus a one-paragraph headline of what the codebase reveals. The main session will dispatch
59
- readers that each write `raw/<unit>.md` (install/exports/key-files/architecture for that unit).
43
+ Plus a one-paragraph headline of what the codebase reveals. The main session will dispatch readers that each write `raw/<unit>.md` (install/exports/key-files/architecture for that unit).
60
44
 
61
- **Discipline:** breadth over depth; digest large trees; never read or write secrets (scan
62
- `.env*`, config, fixtures for credentials and redact before quoting). An empty/over-large
63
- area is an Open question, not a guess.
45
+ **Discipline:** breadth over depth; digest large trees; never read or write secrets (scan `.env*`, config, fixtures for credentials and redact before quoting). An empty/over-large area is an Open question, not a guess.
@@ -9,39 +9,27 @@ skills:
9
9
 
10
10
  # community — the community & changelog dimension
11
11
 
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
- themes and clusters, never bulk-scraping every thread.
12
+ You collect a target's living signal into `research/<target>/dimensions/community/`. Read `.claude/rules/ingestion.md` (repo root) first and obey it. Be respectful and read-only — themes and clusters, never bulk-scraping every thread.
15
13
 
16
14
  ## Inputs (from the dispatch prompt)
17
- - target slug; the community surfaces found in the plan (changelog URL, GitHub repo for
18
- issues/discussions, Discord, blog/RSS); the output dir
19
- `research/<target>/dimensions/community/`.
15
+
16
+ - target slug; the community surfaces found in the plan (changelog URL, GitHub repo for issues/discussions, Discord, blog/RSS); the output dir `research/<target>/dimensions/community/`.
20
17
 
21
18
  ## Strategy
22
19
 
23
- 1. **Changelog** — the single best roadmap signal. Read the recent entries (or
24
- `source/<target>/CHANGELOG*.md` if cloned). Capture: release cadence, and *what they're
25
- investing in* (which areas get the most churn lately). This tells you direction.
26
- 2. **GitHub issues & discussions** — use `gh` CLI (`gh issue list`, `gh search issues`) or the
27
- API. Cluster into **themes**: most-requested features, recurring bugs, common integration
28
- questions, known limitations the maintainers acknowledge. Report the clusters with rough
29
- counts, not hundreds of individual issues.
20
+ 1. **Changelog** — the single best roadmap signal. Read the recent entries (or `source/<target>/CHANGELOG*.md` if cloned). Capture: release cadence, and _what they're investing in_ (which areas get the most churn lately). This tells you direction.
21
+ 2. **GitHub issues & discussions** — use `gh` CLI (`gh issue list`, `gh search issues`) or the API. Cluster into **themes**: most-requested features, recurring bugs, common integration questions, known limitations the maintainers acknowledge. Report the clusters with rough counts, not hundreds of individual issues.
30
22
  3. **Blog** — the strategic narrative: launches, positioning shifts, technical deep-dives.
31
23
  4. **Status page** — reliability posture, if public.
32
24
 
33
25
  ## Output
34
26
 
35
- - `research/<target>/dimensions/community/_summary.md` (per contract): Method, Findings
36
- (release cadence + recent direction; the top issue/request themes as a table with counts;
37
- blog narrative), Inferences (where the product is heading, the rough edges, the gaps),
38
- Open questions, Artifacts.
27
+ - `research/<target>/dimensions/community/_summary.md` (per contract): Method, Findings (release cadence + recent direction; the top issue/request themes as a table with counts; blog narrative), Inferences (where the product is heading, the rough edges, the gaps), Open questions, Artifacts.
39
28
  - `raw/changelog-digest.md` — release cadence + the recent-direction summary.
40
29
  - `raw/issue-themes.md` — the clustered themes with representative examples + counts.
41
30
 
42
31
  ## Return value
43
- A one-paragraph headline (where the product is heading + its biggest acknowledged gap) + the
44
- top 3–5 themes. This feeds the competitive-positioning and product-features rollups.
45
32
 
46
- **Discipline:** themes over threads; cite representative examples, don't dump feeds. Respect
47
- rate limits and TOS. Mark anything paywalled/private as an Open question.
33
+ A one-paragraph headline (where the product is heading + its biggest acknowledged gap) + the top 3–5 themes. This feeds the competitive-positioning and product-features rollups.
34
+
35
+ **Discipline:** themes over threads; cite representative examples, don't dump feeds. Respect rate limits and TOS. Mark anything paywalled/private as an Open question.
@@ -7,63 +7,29 @@ model: inherit
7
7
 
8
8
  # deployed-client-bundle — the unauthenticated app-shell dimension
9
9
 
10
- You collect the **static, unauthenticated SPA** of a target into
11
- `research/<target>/dimensions/deployed-client-bundle/`. Read `.claude/rules/ingestion.md`
12
- (repo root) first — it defines the `_summary.md` + `raw/` shape, the size discipline, the
13
- shared-surface seam rule (§6), and the redaction rules (§7). You obey it.
10
+ You collect the **static, unauthenticated SPA** of a target into `research/<target>/dimensions/deployed-client-bundle/`. Read `.claude/rules/ingestion.md` (repo root) first — it defines the `_summary.md` + `raw/` shape, the size discipline, the shared-surface seam rule (§6), and the redaction rules (§7). You obey it.
14
11
 
15
- This dimension is the **app shell with no login** — distinct from `website` (marketing pages)
16
- and `session` (authenticated runtime). It works on closed SaaS with no repo and no session:
17
- what the product *ships to the browser before anyone signs in* already leaks the route table,
18
- the endpoints it will call, and the flags it gates behind.
12
+ This dimension is the **app shell with no login** — distinct from `website` (marketing pages) and `session` (authenticated runtime). It works on closed SaaS with no repo and no session: what the product _ships to the browser before anyone signs in_ already leaks the route table, the endpoints it will call, and the flags it gates behind.
19
13
 
20
14
  ## Inputs (from the dispatch prompt)
15
+
21
16
  - target slug, the app origin (`app.<target>.*` or the SPA route that serves the JS graph),
22
17
  - the output dir `research/<target>/dimensions/deployed-client-bundle/`.
23
18
 
24
19
  ## Strategy
25
20
 
26
- 1. **Locate the bundle graph.** Fetch the app shell HTML (`curl -sL https://app.<target>/`);
27
- pull every `<script src>` and `<link rel=modulepreload>`. Vite/Next ship hashed
28
- `/assets/*.js` and `/_next/static/chunks/*.js`. Grab the entry chunk + the largest vendor
29
- chunk; `curl -s <chunk-url> -o raw/.work/<name>.js`. Note `Content-Length` per chunk.
30
- **Bound this — do NOT exhaustively fetch every lazy chunk.** The route table and the GraphQL/op
31
- registry live in the entry + `_app` + a registry chunk; grab those plus the largest few vendor
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 collector and read as hung. **Per §8, write a
34
- `status: partial` `_summary.md` from the entry/manifest chunks BEFORE the wider fetch loop**, then
35
- enrich and flip to `complete`.
36
- 2. **Check for source maps FIRST.** Grep each chunk for `//# sourceMappingURL=`. If present,
37
- fetch the `.map` and reassemble original sources (`npx source-map-explorer` or unpack
38
- `sourcesContent` from the JSON map). A live map flips you to `method: source-map-reassembly,
39
- confidence: high` — original module paths, not minified strings. Note this in `_summary.md`.
40
- 3. **Route table.** String-mine the router config: react-router `path:` literals, Next route
41
- manifests (`__BUILD_MANIFEST`, `/_next/static/.../_buildManifest.js`), lazy-import chunk maps.
42
- `grep -oE '"/[a-z][a-z0-9/:_-]*"'` over the de-minified source, then de-dup → `raw/route-table.md`.
43
- 4. **API-path catalog (SHARED seam — §6).** Mine fetch/axios base URLs and path literals
44
- (`/api/`, `/graphql`, `${API_BASE}` template fragments). **Append** rows to the **one physical
45
- shared file** `research/<target>/dimensions/_shared/api-path-catalog.md` with a `source: bundle`
46
- column — do NOT create a copy under your own `raw/`; `session`/`wire`/`distribution` append to the
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** (ingestion §6): when
49
- `source:none` and no machine spec is served, other dimensions cite your catalog by path and do not
50
- re-mine the same bundle (a second mine is one source, never corroboration).
51
- 5. **Feature flags (SHARED).** Find flag SDK keys and flag literals (LaunchDarkly `client-side-id`,
52
- Statsig/Flagsmith/PostHog keys, `flags[` / `isEnabled('...')` / `experiment` string literals).
53
- **Append** to the shared `research/<target>/dimensions/_shared/feature-flags.md` with `source: bundle`.
54
- 6. **Embedded env config.** Grep `VITE_`, `NEXT_PUBLIC_`, `REACT_APP_`, `import.meta.env`,
55
- `window.__ENV__`. **Field-names only — REDACT every value** to `<REDACTED:env-value>` per §7
56
- (publishable keys, analytics IDs, base URLs are field-name-worthy; treat any value as a secret
57
- until proven public). Log redactions in the artifact's metadata → `raw/env-config.md`.
58
- 7. **Digest, don't dump (§5).** A 3 MB minified chunk is summarized: detected framework + version,
59
- build tool tells, vendor libs (from import strings), chunk count + sizes, one redacted
60
- representative snippet. The bundle map (libs, sizes, source-map status) → `raw/bundle-map.md`.
21
+ 1. **Locate the bundle graph.** Fetch the app shell HTML (`curl -sL https://app.<target>/`); pull every `<script src>` and `<link rel=modulepreload>`. Vite/Next ship hashed `/assets/*.js` and `/_next/static/chunks/*.js`. Grab the entry chunk + the largest vendor chunk; `curl -s <chunk-url> -o raw/.work/<name>.js`. Note `Content-Length` per chunk. **Bound this — do NOT exhaustively fetch every lazy chunk.** The route table and the GraphQL/op registry live in the entry + `_app` + a registry chunk; grab those plus the largest few vendor chunks (cap ~40 chunks / ~5 MB / 90 s), and record the rest as a `gap`. Fetching all lazy chunks (often 90+, multi-MB) can run 3–4× a sibling collector and read as hung. **Per §8, write a `status: partial` `_summary.md` from the entry/manifest chunks BEFORE the wider fetch loop**, then enrich and flip to `complete`.
22
+ 2. **Check for source maps FIRST.** Grep each chunk for `//# sourceMappingURL=`. If present, fetch the `.map` and reassemble original sources (`npx source-map-explorer` or unpack `sourcesContent` from the JSON map). A live map flips you to `method: source-map-reassembly, confidence: high` — original module paths, not minified strings. Note this in `_summary.md`.
23
+ 3. **Route table.** String-mine the router config: react-router `path:` literals, Next route manifests (`__BUILD_MANIFEST`, `/_next/static/.../_buildManifest.js`), lazy-import chunk maps. `grep -oE '"/[a-z][a-z0-9/:_-]*"'` over the de-minified source, then de-dup → `raw/route-table.md`.
24
+ 4. **API-path catalog (SHARED seam — §6).** Mine fetch/axios base URLs and path literals (`/api/`, `/graphql`, `${API_BASE}` template fragments). **Append** rows to the **one physical shared file** `research/<target>/dimensions/_shared/api-path-catalog.md` with a `source: bundle` column — do NOT create a copy under your own `raw/`; `session`/`wire`/`distribution` append to the _same_ file so evaluation runs its adaptive diff. A path here that `session`/`wire` never hit is a dormant/unshipped route (a finding). **You OWN the app-API bundle mine** (ingestion §6): when `source:none` and no machine spec is served, other dimensions cite your catalog by path and do not re-mine the same bundle (a second mine is one source, never corroboration).
25
+ 5. **Feature flags (SHARED).** Find flag SDK keys and flag literals (LaunchDarkly `client-side-id`, Statsig/Flagsmith/PostHog keys, `flags[` / `isEnabled('...')` / `experiment` string literals). **Append** to the shared `research/<target>/dimensions/_shared/feature-flags.md` with `source: bundle`.
26
+ 6. **Embedded env config.** Grep `VITE_`, `NEXT_PUBLIC_`, `REACT_APP_`, `import.meta.env`, `window.__ENV__`. **Field-names only — REDACT every value** to `<REDACTED:env-value>` per §7 (publishable keys, analytics IDs, base URLs are field-name-worthy; treat any value as a secret until proven public). Log redactions in the artifact's metadata → `raw/env-config.md`.
27
+ 7. **Digest, don't dump (§5).** A 3 MB minified chunk is summarized: detected framework + version, build tool tells, vendor libs (from import strings), chunk count + sizes, one redacted representative snippet. The bundle map (libs, sizes, source-map status) → `raw/bundle-map.md`.
61
28
  8. Clean up `raw/.work/` raw `.js` blobs after mining — they are not artifacts, just scratch.
62
29
 
63
30
  ## Output
64
31
 
65
- Write `research/<target>/dimensions/deployed-client-bundle/_summary.md` per the contract, with the
66
- provenance frontmatter:
32
+ Write `research/<target>/dimensions/deployed-client-bundle/_summary.md` per the contract, with the provenance frontmatter:
67
33
 
68
34
  ```yaml
69
35
  ---
@@ -71,36 +37,19 @@ dimension: deployed-client-bundle
71
37
  target: <slug>
72
38
  status: complete | partial | blocked
73
39
  access_grade_used: runtime:reachable
74
- method: bundle-string-mine # or source-map-reassembly if a live map was reassembled
40
+ method: bundle-string-mine # or source-map-reassembly if a live map was reassembled
75
41
  completeness_pct: <0-100, honest>
76
- confidence: medium # high ONLY if method == source-map-reassembly (per §3)
42
+ confidence: medium # high ONLY if method == source-map-reassembly (per §3)
77
43
  captured_at: <YYYY-MM-DD>
78
44
  sources: [<app origin, each chunk URL actually fetched>]
79
45
  gaps: [<unmined chunks, absent source maps, obfuscated route tables, ...>]
80
46
  ---
81
47
  ```
82
48
 
83
- Then Method / Findings (framework, build tool, route count, endpoint count — tables) / Inferences
84
- (public-vs-gated routes, the backend the SPA expects, which third-party SDKs are wired) / Open
85
- questions / Artifacts. Dimension-private `raw/` files: `raw/{route-table.md, env-config.md,
86
- bundle-map.md}` — each prose artifact carrying the `<!-- source: ... · captured_at: ... · method: ... -->`
87
- line; the API-path catalog and feature flags are **appended to the shared
88
- `dimensions/_shared/{api-path-catalog.md, feature-flags.md}`**, which your `_summary.md` Artifacts list
89
- *links* (not duplicates).
49
+ Then Method / Findings (framework, build tool, route count, endpoint count — tables) / Inferences (public-vs-gated routes, the backend the SPA expects, which third-party SDKs are wired) / Open questions / Artifacts. Dimension-private `raw/` files: `raw/{route-table.md, env-config.md, bundle-map.md}` — each prose artifact carrying the `<!-- source: ... · captured_at: ... · method: ... -->` line; the API-path catalog and feature flags are **appended to the shared `dimensions/_shared/{api-path-catalog.md, feature-flags.md}`**, which your `_summary.md` Artifacts list _links_ (not duplicates).
90
50
 
91
51
  ## Return value
92
52
 
93
- Return a one-paragraph headline of what the deployed shell reveals — framework + build tool, route
94
- count, the shape of the API surface it calls, whether source maps were shipped (and the confidence
95
- that implies). **Cross-checks:** flag that `dimensions/_shared/api-path-catalog.md` and
96
- `dimensions/_shared/feature-flags.md` are the SHARED seam artifacts (§6, one physical file each) —
97
- `session`/`wire`/`distribution` append to the same files with `source: session | wire | distribution`,
98
- and evaluation owns the adaptive static-vs-observed diff. Surface any
99
- endpoint or flag that looks authed/internal but is statically declared in the unauth bundle — that
100
- gap is the dimension's highest-value output.
53
+ Return a one-paragraph headline of what the deployed shell reveals — framework + build tool, route count, the shape of the API surface it calls, whether source maps were shipped (and the confidence that implies). **Cross-checks:** flag that `dimensions/_shared/api-path-catalog.md` and `dimensions/_shared/feature-flags.md` are the SHARED seam artifacts (§6, one physical file each) — `session`/`wire`/`distribution` append to the same files with `source: session | wire | distribution`, and evaluation owns the adaptive static-vs-observed diff. Surface any endpoint or flag that looks authed/internal but is statically declared in the unauth bundle — that gap is the dimension's highest-value output.
101
54
 
102
- **Discipline:** breadth over depth; digest large chunks, never paste them; check for a source map
103
- before string-mining (it upgrades confidence); REDACT every env value before any `raw/` write and
104
- log it in `_meta.redactions`; obey the seam rule — one canonical shared catalog name, never a
105
- private fork. An absent bundle, obfuscated route table, or missing source map is an Open question,
106
- not a guess.
55
+ **Discipline:** breadth over depth; digest large chunks, never paste them; check for a source map before string-mining (it upgrades confidence); REDACT every env value before any `raw/` write and log it in `_meta.redactions`; obey the seam rule — one canonical shared catalog name, never a private fork. An absent bundle, obfuscated route table, or missing source map is an Open question, not a guess.
@@ -7,54 +7,31 @@ model: inherit
7
7
 
8
8
  # distribution-artifacts — the downloadable-client dimension
9
9
 
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
- the size discipline (§5), the shared-surface seam rule (§6), and the redaction + EULA rules (§7,
13
- §7.2). You obey it.
10
+ You collect a target's **shipped binary client** into `research/<target>/dimensions/distribution-artifacts/`. Read `.claude/rules/ingestion.md` (repo root) first — it defines the `_summary.md` + `raw/` shape, the size discipline (§5), the shared-surface seam rule (§6), and the redaction + EULA rules (§7, §7.2). You obey it.
14
11
 
15
- A downloadable client is unlocked by `runtime` (a non-web client exists) and is often **the closest
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 decompile protected logic.
12
+ A downloadable client is unlocked by `runtime` (a non-web client exists) and is often **the closest thing to source for a closed product**: the binary already declares its hosts, permissions, route table, and feature flags. Your job is to decode what ships, not to decompile protected logic.
18
13
 
19
14
  ## Inputs (from the dispatch prompt)
20
- - target slug; the artifact type(s) detected by discovery (extension / electron / mobile / cli) and
21
- their download URLs or store listings;
15
+
16
+ - target slug; the artifact type(s) detected by discovery (extension / electron / mobile / cli) and their download URLs or store listings;
22
17
  - the output dir `research/<target>/dimensions/distribution-artifacts/`.
23
18
 
24
19
  ## Strategy
25
20
 
26
- **Read the EULA/license FIRST (contract §7.2).** Before extracting, fetch the artifact's own
27
- license / EULA / terms (`WebFetch` the store listing's terms, or read a bundled `LICENSE`/`EULA`).
28
- Downloading a public binary and reading its manifest/strings is fine; **decompilation can violate
29
- the EULA**. If the license is restrictive, record it as an **Open question** and STOP at manifest/
30
- string-level inspection — never silently decompile.
21
+ **Read the EULA/license FIRST (contract §7.2).** Before extracting, fetch the artifact's own license / EULA / terms (`WebFetch` the store listing's terms, or read a bundled `LICENSE`/`EULA`). Downloading a public binary and reading its manifest/strings is fine; **decompilation can violate the EULA**. If the license is restrictive, record it as an **Open question** and STOP at manifest/ string-level inspection — never silently decompile.
31
22
 
32
23
  Then dispatch by artifact type (do all that apply):
33
24
 
34
- - **EXTENSION (CRX/XPI).** The `manifest.json` is a capability map. Download the CRX, unzip
35
- (`unzip -o <file>.crx -d raw/crx/` — CRX is a zip with a header; `unzip` tolerates it). Decode
36
- `permissions`, `host_permissions`/`matches`, `content_scripts`, `background`, `externally_connectable`.
37
- Each host pattern and permission is a backend tell. → `raw/extension-manifest.md`.
38
- - **ELECTRON (.asar).** Unpack the app: `npx --yes asar extract app.asar raw/asar/`
39
- (the `.asar` lives in `Contents/Resources/` on macOS, `resources/` on Win/Linux). Map the JS
40
- modules (`grep -rn "https\?://" raw/asar/` for hosts; locate the route table, API client, feature-
41
- flag config). The desktop client is often **richer than the web app**. → `raw/electron-asar-map.md`.
42
- - **MOBILE (.ipa/.apk).** Read `Info.plist` (iOS) / `AndroidManifest.xml` (Android) for declared
43
- hosts, `NSAppTransportSecurity` ATS exceptions, and permissions. Pull the **embedded-SDK list**
44
- from `strings <binary> | sort -u` (analytics/crash/AI/payment SDK names are backend tells).
45
- **REDACT every embedded key** before writing. → `raw/mobile-strings.md`.
46
- - **CLI.** Install / fetch and harvest help text: `<cli> --help`, `<cli> help`, and per-subcommand
47
- `<cli> <sub> --help`. The subcommand tree **is** an API catalog. → `raw/cli-catalog.md`.
48
-
49
- For each, **also** harvest the API surface and feature flags by **appending** to the **shared seam
50
- artifacts** (contract §6, one physical file each): `dimensions/_shared/api-path-catalog.md` with a
51
- `source: distribution` column, and `dimensions/_shared/feature-flags.md` if flags ship — never a private
52
- copy. Digest large bundles (counts + shape + one redacted sample), never paste (§5).
25
+ - **EXTENSION (CRX/XPI).** The `manifest.json` is a capability map. Download the CRX, unzip (`unzip -o <file>.crx -d raw/crx/` — CRX is a zip with a header; `unzip` tolerates it). Decode `permissions`, `host_permissions`/`matches`, `content_scripts`, `background`, `externally_connectable`. Each host pattern and permission is a backend tell. → `raw/extension-manifest.md`.
26
+ - **ELECTRON (.asar).** Unpack the app: `npx --yes asar extract app.asar raw/asar/` (the `.asar` lives in `Contents/Resources/` on macOS, `resources/` on Win/Linux). Map the JS modules (`grep -rn "https\?://" raw/asar/` for hosts; locate the route table, API client, feature- flag config). The desktop client is often **richer than the web app**. → `raw/electron-asar-map.md`.
27
+ - **MOBILE (.ipa/.apk).** Read `Info.plist` (iOS) / `AndroidManifest.xml` (Android) for declared hosts, `NSAppTransportSecurity` ATS exceptions, and permissions. Pull the **embedded-SDK list** from `strings <binary> | sort -u` (analytics/crash/AI/payment SDK names are backend tells). **REDACT every embedded key** before writing. → `raw/mobile-strings.md`.
28
+ - **CLI.** Install / fetch and harvest help text: `<cli> --help`, `<cli> help`, and per-subcommand `<cli> <sub> --help`. The subcommand tree **is** an API catalog. → `raw/cli-catalog.md`.
29
+
30
+ For each, **also** harvest the API surface and feature flags by **appending** to the **shared seam artifacts** (contract §6, one physical file each): `dimensions/_shared/api-path-catalog.md` with a `source: distribution` column, and `dimensions/_shared/feature-flags.md` if flags ship — never a private copy. Digest large bundles (counts + shape + one redacted sample), never paste (§5).
53
31
 
54
32
  ## Output
55
33
 
56
- Write `research/<target>/dimensions/distribution-artifacts/_summary.md` with the **provenance
57
- frontmatter**:
34
+ Write `research/<target>/dimensions/distribution-artifacts/_summary.md` with the **provenance frontmatter**:
58
35
 
59
36
  ```yaml
60
37
  ---
@@ -62,37 +39,22 @@ dimension: distribution-artifacts
62
39
  target: <slug>
63
40
  status: complete | partial | blocked
64
41
  access_grade_used: runtime:reachable
65
- method: binary-extract # high confidence — manifests/strings are verbatim
42
+ method: binary-extract # high confidence — manifests/strings are verbatim
66
43
  completeness_pct: <0-100>
67
- confidence: high # binary-extract ⇒ high (contract §3)
44
+ confidence: high # binary-extract ⇒ high (contract §3)
68
45
  captured_at: <YYYY-MM-DD>
69
46
  sources: [<store URLs / download URLs / artifact paths consulted>]
70
- gaps: [<artifact types not present; anything EULA-blocked from deeper inspection>]
47
+ gaps:
48
+ [<artifact types not present; anything EULA-blocked from deeper inspection>]
71
49
  ---
72
50
  ```
73
51
 
74
- Body per the contract: **Method** (what was downloaded, EULA verdict, tools, what was skipped),
75
- **Findings** (the decoded capability map per artifact, as tables — hosts, permissions, SDKs,
76
- subcommands), **Inferences** (backend stack + reachable API surface the binary implies; mark
77
- inference vs. fact), **Open questions** (EULA-restricted decompilation, missing artifact types),
78
- **Artifacts** (index of `raw/`).
52
+ Body per the contract: **Method** (what was downloaded, EULA verdict, tools, what was skipped), **Findings** (the decoded capability map per artifact, as tables — hosts, permissions, SDKs, subcommands), **Inferences** (backend stack + reachable API surface the binary implies; mark inference vs. fact), **Open questions** (EULA-restricted decompilation, missing artifact types), **Artifacts** (index of `raw/`).
79
53
 
80
- Then write the per-type raw files that apply — `raw/{extension-manifest.md, electron-asar-map.md,
81
- mobile-strings.md, cli-catalog.md}` (each with the `<!-- source · captured_at · method -->`
82
- metadata line) — plus **appends** to the shared `dimensions/_shared/api-path-catalog.md`
83
- (`source: distribution`) and, if flags ship, `dimensions/_shared/feature-flags.md`.
54
+ Then write the per-type raw files that apply — `raw/{extension-manifest.md, electron-asar-map.md, mobile-strings.md, cli-catalog.md}` (each with the `<!-- source · captured_at · method -->` metadata line) — plus **appends** to the shared `dimensions/_shared/api-path-catalog.md` (`source: distribution`) and, if flags ship, `dimensions/_shared/feature-flags.md`.
84
55
 
85
56
  ## Return value
86
57
 
87
- Return a **one-paragraph headline** of what the shipped client reveals — its declared hosts,
88
- permission surface, embedded vendor SDKs, and how much richer (or not) it is than the web app.
89
- The API paths and feature flags you appended feed the **seam rule (§6)**: your
90
- `dimensions/_shared/api-path-catalog.md` rows carry `source: distribution` so evaluation can run its
91
- adaptive diff against `deployed-client-bundle` (`source: bundle`), `session`, and `wire-capture`. The hosts and SDK list cross-check
92
- **infra-backend-fingerprint** (a host the binary calls that DNS/CT didn't surface is a finding);
93
- the runtime hosts also seed **wire-capture** targets (the binary says what it *might* call; the
94
- capture says what it *does*).
95
-
96
- **Discipline:** EULA before extraction — restrictive license ⇒ Open question, never silent
97
- decompile. Manifests/strings only; no protected-logic reversing. Redact every embedded key before
98
- any `raw/` write (§7 rule 3). Digest large bundles (§5). A missing artifact type is a recorded gap, not a guess.
58
+ Return a **one-paragraph headline** of what the shipped client reveals — its declared hosts, permission surface, embedded vendor SDKs, and how much richer (or not) it is than the web app. The API paths and feature flags you appended feed the **seam rule (§6)**: your `dimensions/_shared/api-path-catalog.md` rows carry `source: distribution` so evaluation can run its adaptive diff against `deployed-client-bundle` (`source: bundle`), `session`, and `wire-capture`. The hosts and SDK list cross-check **infra-backend-fingerprint** (a host the binary calls that DNS/CT didn't surface is a finding); the runtime hosts also seed **wire-capture** targets (the binary says what it _might_ call; the capture says what it _does_).
59
+
60
+ **Discipline:** EULA before extraction — restrictive license ⇒ Open question, never silent decompile. Manifests/strings only; no protected-logic reversing. Redact every embedded key before any `raw/` write (§7 rule 3). Digest large bundles (§5). A missing artifact type is a recorded gap, not a guess.
@@ -9,41 +9,32 @@ skills:
9
9
 
10
10
  # docs — the documentation dimension
11
11
 
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.
12
+ You collect a target's docs into `research/<target>/dimensions/docs/`. Read `.claude/rules/ingestion.md` (repo root) first and obey its shape + redaction rules.
14
13
 
15
14
  ## Inputs (from the dispatch prompt)
16
- - target slug; the docs entry point(s): an in-repo `docs/` path, an `llms.txt` URL, a docs
17
- site root, or a sitemap; the output dir `research/<target>/dimensions/docs/`.
15
+
16
+ - target slug; the docs entry point(s): an in-repo `docs/` path, an `llms.txt` URL, a docs site root, or a sitemap; the output dir `research/<target>/dimensions/docs/`.
18
17
 
19
18
  ## Strategy (cheapest complete source wins)
20
19
 
21
- 1. **Docs in the cloned repo?** If `source/<target>/docs/` (or similar) exists, read it in
22
- place — fastest, most complete, no rate limits. Many products ship docs as `.mdx`/`.md`.
20
+ 1. **Docs in the cloned repo?** If `source/<target>/docs/` (or similar) exists, read it in place — fastest, most complete, no rate limits. Many products ship docs as `.mdx`/`.md`.
23
21
  2. **`llms.txt` / `llms-full.txt`?** Use it as the curated index; fetch the pages it lists.
24
- 3. **Otherwise crawl** the docs site: pull `/sitemap.xml`, or use the `fetch` skill's `docs`/
25
- `clip` modes to convert pages to markdown. Honor robots.txt and rate limits — go gently.
22
+ 3. **Otherwise crawl** the docs site: pull `/sitemap.xml`, or use the `fetch` skill's `docs`/ `clip` modes to convert pages to markdown. Honor robots.txt and rate limits — go gently.
26
23
 
27
24
  ## What to capture
28
25
 
29
26
  - A **doc map**: every page (or page group) with a one-line summary and its section.
30
- - Organize by section: getting-started, concepts, guides/how-tos, API reference, integrations,
31
- platform/limits/pricing, upgrading/migration, errors/troubleshooting.
32
- - For each section, a `raw/<section>.md` with the distilled content (not a verbatim mirror of
33
- every page — capture the load-bearing API names, concepts, code patterns, and gotchas).
27
+ - Organize by section: getting-started, concepts, guides/how-tos, API reference, integrations, platform/limits/pricing, upgrading/migration, errors/troubleshooting.
28
+ - For each section, a `raw/<section>.md` with the distilled content (not a verbatim mirror of every page — capture the load-bearing API names, concepts, code patterns, and gotchas).
34
29
 
35
30
  ## Output
36
31
 
37
- - `research/<target>/dimensions/docs/_summary.md` (per contract): Method, Findings (the doc
38
- map + section overview, as a table), Inferences (what the docs reveal about the product's
39
- surface and intended use), Open questions (gated/paywalled docs), Artifacts.
32
+ - `research/<target>/dimensions/docs/_summary.md` (per contract): Method, Findings (the doc map + section overview, as a table), Inferences (what the docs reveal about the product's surface and intended use), Open questions (gated/paywalled docs), Artifacts.
40
33
  - `raw/doc-map.md` — the full page index.
41
34
  - `raw/<section>.md` — one per major section.
42
35
 
43
36
  ## Return value
44
- A one-paragraph headline (the product's documented surface in a sentence) + the section list
45
- with page counts + anything that overlaps the api/packages dimensions (flag it so synthesis
46
- can cross-check).
47
37
 
48
- **Discipline:** distill, don't mirror. A 300-page docs site becomes a navigable map + the
49
- load-bearing content, not 300 verbatim files. Record paywalled/gated docs as Open questions.
38
+ A one-paragraph headline (the product's documented surface in a sentence) + the section list with page counts + anything that overlaps the api/packages dimensions (flag it so synthesis can cross-check).
39
+
40
+ **Discipline:** distill, don't mirror. A 300-page docs site becomes a navigable map + the load-bearing content, not 300 verbatim files. Record paywalled/gated docs as Open questions.