@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.
- package/README.md +6 -5
- package/data/harness-index.json +1 -1
- package/data/harnesses/code/CLAUDE.md +7 -18
- package/data/harnesses/code/agents/brainstorm.md +3 -3
- package/data/harnesses/code/agents/change-review.md +13 -10
- package/data/harnesses/code/agents/harness-manager.md +15 -15
- package/data/harnesses/code/agents/maintenance.md +10 -3
- package/data/harnesses/code/agents/performance-review.md +5 -0
- package/data/harnesses/code/harness.json +1 -1
- package/data/harnesses/code/rules/general.md +40 -36
- package/data/harnesses/code/skills/boundary/SKILL.md +15 -42
- package/data/harnesses/code/skills/boundary/references/boundary-taxonomy.md +366 -304
- package/data/harnesses/code/skills/brainstorm/README.md +9 -9
- package/data/harnesses/code/skills/brainstorm/SKILL.md +15 -15
- package/data/harnesses/code/skills/brainstorm/harvest.md +2 -2
- package/data/harnesses/code/skills/brainstorm/templates/backlog.md +2 -2
- package/data/harnesses/code/skills/brainstorm/templates/build.md +6 -6
- package/data/harnesses/code/skills/brainstorm/templates/decisions.md +3 -3
- package/data/harnesses/code/skills/brainstorm/templates/doctrine.md +2 -2
- package/data/harnesses/code/skills/brainstorm/templates/domain-model.md +2 -2
- package/data/harnesses/code/skills/brainstorm/templates/glossary.md +2 -1
- package/data/harnesses/code/skills/brainstorm/templates/non-goals.md +3 -7
- package/data/harnesses/code/skills/brainstorm/templates/questions.md +6 -5
- package/data/harnesses/code/skills/brainstorm/templates/state.md +1 -8
- package/data/harnesses/code/skills/brainstorm/templates/tech.md +6 -6
- package/data/harnesses/code/skills/brainstorm/templates/thesis.md +2 -2
- package/data/harnesses/code/skills/distiller/SKILL.md +48 -177
- package/data/harnesses/code/skills/distiller/references/docs-mode.md +116 -343
- package/data/harnesses/code/skills/distiller/references/method.md +37 -109
- package/data/harnesses/code/skills/documentation/SKILL.md +9 -6
- package/data/harnesses/code/skills/documentation/references/examples.md +30 -61
- package/data/harnesses/code/skills/documentation/references/style-guide.md +59 -62
- package/data/harnesses/code/skills/documentation/references/templates.md +25 -33
- package/data/harnesses/code/skills/workflow-mapper/SKILL.md +32 -11
- package/data/harnesses/code/skills/workflow-mapper/references/patterns.md +1 -1
- package/data/harnesses/code-fable/CLAUDE.md +12 -23
- package/data/harnesses/code-fable/agents/brainstorm.md +3 -3
- package/data/harnesses/code-fable/agents/change-review.md +13 -10
- package/data/harnesses/code-fable/agents/harness-manager.md +15 -15
- package/data/harnesses/code-fable/agents/maintenance.md +10 -3
- package/data/harnesses/code-fable/agents/performance-review.md +5 -0
- package/data/harnesses/code-fable/harness.json +1 -1
- package/data/harnesses/code-fable/rules/general.md +40 -36
- package/data/harnesses/code-fable/skills/boundary/SKILL.md +15 -42
- package/data/harnesses/code-fable/skills/boundary/references/boundary-taxonomy.md +366 -304
- package/data/harnesses/code-fable/skills/brainstorm/README.md +9 -9
- package/data/harnesses/code-fable/skills/brainstorm/SKILL.md +15 -15
- package/data/harnesses/code-fable/skills/brainstorm/harvest.md +2 -2
- package/data/harnesses/code-fable/skills/brainstorm/templates/backlog.md +2 -2
- package/data/harnesses/code-fable/skills/brainstorm/templates/build.md +6 -6
- package/data/harnesses/code-fable/skills/brainstorm/templates/decisions.md +3 -3
- package/data/harnesses/code-fable/skills/brainstorm/templates/doctrine.md +2 -2
- package/data/harnesses/code-fable/skills/brainstorm/templates/domain-model.md +2 -2
- package/data/harnesses/code-fable/skills/brainstorm/templates/glossary.md +2 -1
- package/data/harnesses/code-fable/skills/brainstorm/templates/non-goals.md +3 -7
- package/data/harnesses/code-fable/skills/brainstorm/templates/questions.md +6 -5
- package/data/harnesses/code-fable/skills/brainstorm/templates/state.md +1 -8
- package/data/harnesses/code-fable/skills/brainstorm/templates/tech.md +6 -6
- package/data/harnesses/code-fable/skills/brainstorm/templates/thesis.md +2 -2
- package/data/harnesses/code-fable/skills/distiller/SKILL.md +48 -177
- package/data/harnesses/code-fable/skills/distiller/references/docs-mode.md +116 -343
- package/data/harnesses/code-fable/skills/distiller/references/method.md +37 -109
- package/data/harnesses/code-fable/skills/documentation/SKILL.md +9 -6
- package/data/harnesses/code-fable/skills/documentation/references/examples.md +30 -61
- package/data/harnesses/code-fable/skills/documentation/references/style-guide.md +59 -62
- package/data/harnesses/code-fable/skills/documentation/references/templates.md +25 -33
- package/data/harnesses/code-fable/skills/workflow-mapper/SKILL.md +32 -11
- package/data/harnesses/code-fable/skills/workflow-mapper/references/patterns.md +1 -1
- package/data/harnesses/discover/CLAUDE.md +41 -109
- package/data/harnesses/discover/agents/api.md +11 -28
- package/data/harnesses/discover/agents/codebase.md +12 -30
- package/data/harnesses/discover/agents/community.md +9 -21
- package/data/harnesses/discover/agents/deployed-client-bundle.md +16 -67
- package/data/harnesses/discover/agents/distribution-artifacts.md +21 -59
- package/data/harnesses/discover/agents/docs.md +11 -20
- package/data/harnesses/discover/agents/infra-backend-fingerprint.md +28 -68
- package/data/harnesses/discover/agents/packages.md +12 -28
- package/data/harnesses/discover/agents/session.md +18 -50
- package/data/harnesses/discover/agents/website.md +9 -19
- package/data/harnesses/discover/agents/wire-capture.md +22 -72
- package/data/harnesses/discover/harness.json +1 -1
- package/data/harnesses/discover/rules/discovery.md +73 -182
- package/data/harnesses/discover/rules/evaluation.md +90 -98
- package/data/harnesses/discover/rules/ingestion.md +123 -322
- package/data/harnesses/discover/rules/self-correction.md +67 -92
- package/data/harnesses/discover/rules/tradecraft.md +201 -172
- package/data/harnesses/hr/CLAUDE.md +21 -51
- package/data/harnesses/hr/harness.json +1 -1
- package/data/harnesses/hr/skills/interview-eval/SKILL.md +23 -11
- package/data/harnesses/hr/skills/interview-eval/TEMPLATE.md +49 -29
- package/data/harnesses/hr/skills/interview-eval/rubric.md +30 -30
- package/data/harnesses/kb-agi/CLAUDE.md +8 -8
- package/data/harnesses/kb-agi/agents/kb-agi-init.md +31 -22
- package/data/harnesses/kb-agi/agents/kb-catch-stale.md +1 -1
- package/data/harnesses/kb-agi/agents/kb-find-gaps.md +1 -1
- package/data/harnesses/kb-agi/agents/kb-fix-links.md +1 -1
- package/data/harnesses/kb-agi/agents/kb-refresh-summaries.md +2 -2
- package/data/harnesses/kb-agi/agents/kb-sync-metadata.md +2 -2
- package/data/harnesses/kb-agi/harness.json +1 -1
- package/package.json +1 -1
|
@@ -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
|
-
|
|
15
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
51
|
-
|
|
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
|
|
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
|
-
|
|
26
|
-
|
|
27
|
-
|
|
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
|
-
|
|
18
|
-
|
|
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
|
-
|
|
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
|
-
|
|
47
|
-
|
|
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
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
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
|
|
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
|
|
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
|
-
|
|
21
|
-
|
|
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
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
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
|
|
42
|
+
method: binary-extract # high confidence — manifests/strings are verbatim
|
|
66
43
|
completeness_pct: <0-100>
|
|
67
|
-
confidence: high
|
|
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:
|
|
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
|
-
|
|
89
|
-
|
|
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
|
-
|
|
17
|
-
|
|
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
|
-
|
|
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
|
-
|
|
49
|
-
|
|
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.
|