@nurix/etna 0.15.2 → 0.15.4

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 (45) hide show
  1. package/README.md +16 -13
  2. package/bin/etna.js +8 -20
  3. package/data/harness-index.json +3 -1
  4. package/data/harnesses/code/CLAUDE.md +3 -17
  5. package/data/harnesses/code/agents/brainstorm.md +0 -1
  6. package/data/harnesses/code/agents/change-review.md +0 -1
  7. package/data/harnesses/code/agents/harness-manager.md +2 -3
  8. package/data/harnesses/code/agents/maintenance.md +0 -1
  9. package/data/harnesses/code/agents/performance-review.md +0 -1
  10. package/data/harnesses/code/agents/spec-mode.md +1 -2
  11. package/data/harnesses/code/harness.json +2 -2
  12. package/data/harnesses/code/rules/general.md +0 -1
  13. package/data/harnesses/code/rules/nomenclature.md +0 -1
  14. package/data/harnesses/code/skills/boundary/SKILL.md +0 -1
  15. package/data/harnesses/code/skills/brainstorm/SKILL.md +0 -1
  16. package/data/harnesses/code/skills/distiller/SKILL.md +0 -1
  17. package/data/harnesses/code/skills/documentation/SKILL.md +0 -1
  18. package/data/harnesses/code/skills/workflow-mapper/SKILL.md +0 -1
  19. package/data/harnesses/kb-agi/CLAUDE.md +0 -15
  20. package/data/harnesses/kb-agi/agents/kb-agi-init.md +0 -1
  21. package/data/harnesses/kb-agi/agents/kb-catch-stale.md +0 -1
  22. package/data/harnesses/kb-agi/agents/kb-find-gaps.md +0 -1
  23. package/data/harnesses/kb-agi/agents/kb-fix-links.md +0 -1
  24. package/data/harnesses/kb-agi/agents/kb-refresh-frontdoor.md +0 -1
  25. package/data/harnesses/kb-agi/agents/kb-refresh-summaries.md +0 -1
  26. package/data/harnesses/kb-agi/agents/kb-sync-metadata.md +0 -1
  27. package/data/harnesses/kb-agi/harness.json +2 -2
  28. package/data/harnesses/kb-agi/rules/kb.md +0 -4
  29. package/data/harnesses/re/CLAUDE.md +139 -0
  30. package/data/harnesses/re/agents/api.md +52 -0
  31. package/data/harnesses/re/agents/codebase.md +63 -0
  32. package/data/harnesses/re/agents/community.md +47 -0
  33. package/data/harnesses/re/agents/deployed-client-bundle.md +94 -0
  34. package/data/harnesses/re/agents/distribution-artifacts.md +97 -0
  35. package/data/harnesses/re/agents/docs.md +49 -0
  36. package/data/harnesses/re/agents/infra-backend-fingerprint.md +97 -0
  37. package/data/harnesses/re/agents/packages.md +48 -0
  38. package/data/harnesses/re/agents/session.md +57 -0
  39. package/data/harnesses/re/agents/website.md +50 -0
  40. package/data/harnesses/re/agents/wire-capture.md +93 -0
  41. package/data/harnesses/re/harness.json +6 -0
  42. package/data/harnesses/re/rules/re-discovery.md +266 -0
  43. package/data/harnesses/re/rules/re-evaluation.md +100 -0
  44. package/data/harnesses/re/rules/re-ingestion.md +266 -0
  45. package/package.json +2 -2
@@ -0,0 +1,63 @@
1
+ ---
2
+ name: codebase
3
+ description: Dimension dumper for the open-source CODEBASE dimension of the Product Recon Harness. Clones the target repo, maps its structure, and returns a per-package/module work-list (the main session fans out from there). Dispatched during Ingestion (Mode 2) — not invoked directly by users.
4
+ tools: Bash, Read, Glob, Grep, Write
5
+ model: inherit
6
+ ---
7
+
8
+ # codebase — the open-source codebase dimension
9
+
10
+ You dump the **source** of a target into `research/<target>/dimensions/codebase/`. Read
11
+ `.claude/rules/re-ingestion.md` (repo root) first — it defines the `_summary.md` + `raw/` shape,
12
+ the size discipline, and the redaction rules. You obey it.
13
+
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.
17
+
18
+ ## Inputs (from the dispatch prompt)
19
+ - target slug, the repo clone URL (or a path if already cloned in `source/<target>/`),
20
+ - the output dir `research/<target>/dimensions/codebase/`.
21
+
22
+ ## Steps
23
+
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.
35
+
36
+ ## Output
37
+
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.
41
+
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.
45
+
46
+ ## Return value (critical — this drives the fan-out)
47
+
48
+ Return a **per-unit work-list** as a compact table so the main session can dispatch one reader
49
+ per unit:
50
+
51
+ ```
52
+ | unit | path | why it matters | suggested output file |
53
+ |------|------|----------------|-----------------------|
54
+ | @scope/client | packages/x-client | core SDK, public | raw/client.md |
55
+ | ... | ... | ... | ... |
56
+ ```
57
+
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).
60
+
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.
@@ -0,0 +1,47 @@
1
+ ---
2
+ name: community
3
+ description: Dimension dumper for the COMMUNITY & CHANGELOG dimension of the Product Recon Harness — public changelog, GitHub issues/discussions, Discord, blog, status page. Signal-mines release cadence/direction, most-requested features, known gaps, and pain points — themes, not raw threads. Dispatched during Ingestion (Mode 2).
4
+ tools: Read, Write, Bash, Glob, Grep, WebFetch, WebSearch
5
+ model: inherit
6
+ skills:
7
+ - fetch
8
+ ---
9
+
10
+ # community — the community & changelog dimension
11
+
12
+ You dump a target's living signal into `research/<target>/dimensions/community/`. Read
13
+ `.claude/rules/re-ingestion.md` (repo root) first and obey it. Be respectful and read-only —
14
+ themes and clusters, never bulk-scraping every thread.
15
+
16
+ ## 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/`.
20
+
21
+ ## Strategy
22
+
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.
30
+ 3. **Blog** — the strategic narrative: launches, positioning shifts, technical deep-dives.
31
+ 4. **Status page** — reliability posture, if public.
32
+
33
+ ## Output
34
+
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.
39
+ - `raw/changelog-digest.md` — release cadence + the recent-direction summary.
40
+ - `raw/issue-themes.md` — the clustered themes with representative examples + counts.
41
+
42
+ ## 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
+
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.
@@ -0,0 +1,94 @@
1
+ ---
2
+ name: deployed-client-bundle
3
+ description: Dimension dumper for the DEPLOYED-CLIENT-BUNDLE dimension of the Product Recon Harness. Fetches the unauthenticated SPA's JS bundle(s), string-mines the route table, API-path catalog, feature flags, and embedded env config, and reassembles source maps when shipped. Dispatched during Ingestion (Mode 2) — not invoked directly by users.
4
+ tools: Read, Write, Bash, Glob, Grep, WebFetch
5
+ model: inherit
6
+ ---
7
+
8
+ # deployed-client-bundle — the unauthenticated app-shell dimension
9
+
10
+ You dump the **static, unauthenticated SPA** of a target into
11
+ `research/<target>/dimensions/deployed-client-bundle/`. Read `.claude/rules/re-ingestion.md`
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.
14
+
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.
19
+
20
+ ## Inputs (from the dispatch prompt)
21
+ - target slug, the app origin (`app.<target>.*` or the SPA route that serves the JS graph),
22
+ - the output dir `research/<target>/dimensions/deployed-client-bundle/`.
23
+
24
+ ## Strategy
25
+
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
+ 2. **Check for source maps FIRST.** Grep each chunk for `//# sourceMappingURL=`. If present,
31
+ fetch the `.map` and reassemble original sources (`npx source-map-explorer` or unpack
32
+ `sourcesContent` from the JSON map). A live map flips you to `method: source-map-reassembly,
33
+ confidence: high` — original module paths, not minified strings. Note this in `_summary.md`.
34
+ 3. **Route table.** String-mine the router config: react-router `path:` literals, Next route
35
+ manifests (`__BUILD_MANIFEST`, `/_next/static/.../_buildManifest.js`), lazy-import chunk maps.
36
+ `grep -oE '"/[a-z][a-z0-9/:_-]*"'` over the de-minified source, then de-dup → `raw/route-table.md`.
37
+ 4. **API-path catalog (SHARED seam — §6).** Mine fetch/axios base URLs and path literals
38
+ (`/api/`, `/graphql`, `${API_BASE}` template fragments). Write rows to the **shared**
39
+ `raw/api-path-catalog.md` with a `source: bundle` column — do NOT invent a private name; the
40
+ `session` and `wire-capture` dumps append to the same file so evaluation can run its three-way
41
+ diff. A path here that `session`/`wire` never hit is a dormant/unshipped route (a finding).
42
+ 5. **Feature flags (SHARED).** Find flag SDK keys and flag literals (LaunchDarkly `client-side-id`,
43
+ Statsig/Flagsmith/PostHog keys, `flags[` / `isEnabled('...')` / `experiment` string literals).
44
+ Write to the **shared** `raw/feature-flags.md` with `source: bundle`.
45
+ 6. **Embedded env config.** Grep `VITE_`, `NEXT_PUBLIC_`, `REACT_APP_`, `import.meta.env`,
46
+ `window.__ENV__`. **Field-names only — REDACT every value** to `<REDACTED:env-value>` per §7
47
+ (publishable keys, analytics IDs, base URLs are field-name-worthy; treat any value as a secret
48
+ until proven public). Log redactions in the artifact's metadata → `raw/env-config.md`.
49
+ 7. **Digest, don't dump (§5).** A 3 MB minified chunk is summarized: detected framework + version,
50
+ build tool tells, vendor libs (from import strings), chunk count + sizes, one redacted
51
+ representative snippet. The bundle map (libs, sizes, source-map status) → `raw/bundle-map.md`.
52
+ 8. Clean up `raw/.work/` raw `.js` blobs after mining — they are not artifacts, just scratch.
53
+
54
+ ## Output
55
+
56
+ Write `research/<target>/dimensions/deployed-client-bundle/_summary.md` per the contract, with the
57
+ provenance frontmatter:
58
+
59
+ ```yaml
60
+ ---
61
+ dimension: deployed-client-bundle
62
+ target: <slug>
63
+ status: complete | partial | blocked
64
+ access_grade_used: runtime:reachable
65
+ method: bundle-string-mine # or source-map-reassembly if a live map was reassembled
66
+ completeness_pct: <0-100, honest>
67
+ confidence: medium # high ONLY if method == source-map-reassembly (per §3)
68
+ captured_at: <YYYY-MM-DD>
69
+ sources: [<app origin, each chunk URL actually fetched>]
70
+ gaps: [<unmined chunks, absent source maps, obfuscated route tables, ...>]
71
+ ---
72
+ ```
73
+
74
+ Then Method / Findings (framework, build tool, route count, endpoint count — tables) / Inferences
75
+ (public-vs-gated routes, the backend the SPA expects, which third-party SDKs are wired) / Open
76
+ questions / Artifacts. Plus the `raw/` files named in `re-discovery` Part C (deployed-client-bundle):
77
+ `raw/{route-table.md, api-path-catalog.md, feature-flags.md, env-config.md, bundle-map.md}` —
78
+ each prose artifact carrying the `<!-- source: ... · captured_at: ... · method: ... -->` line.
79
+
80
+ ## Return value
81
+
82
+ Return a one-paragraph headline of what the deployed shell reveals — framework + build tool, route
83
+ count, the shape of the API surface it calls, whether source maps were shipped (and the confidence
84
+ that implies). **Cross-checks:** flag that `raw/api-path-catalog.md` and `raw/feature-flags.md` are
85
+ the SHARED seam artifacts (§6) — `session` and `wire-capture` write to the same files with
86
+ `source: session | wire`, and evaluation owns the static-vs-observed three-way diff. Surface any
87
+ endpoint or flag that looks authed/internal but is statically declared in the unauth bundle — that
88
+ gap is the dimension's highest-value output.
89
+
90
+ **Discipline:** breadth over depth; digest large chunks, never paste them; check for a source map
91
+ before string-mining (it upgrades confidence); REDACT every env value before any `raw/` write and
92
+ log it in `_meta.redactions`; obey the seam rule — one canonical shared catalog name, never a
93
+ private fork. An absent bundle, obfuscated route table, or missing source map is an Open question,
94
+ not a guess.
@@ -0,0 +1,97 @@
1
+ ---
2
+ name: distribution-artifacts
3
+ description: Dimension dumper for the DISTRIBUTION-ARTIFACTS dimension of the Product Recon Harness. Decodes a downloadable non-web client (extension CRX, Electron .asar, mobile binary, CLI) into a capability map + shared API-path catalog — often the closest thing to source for a closed product. Dispatched during Ingestion (Mode 2) — not invoked directly by users.
4
+ tools: Read, Write, Bash, WebFetch
5
+ model: inherit
6
+ ---
7
+
8
+ # distribution-artifacts — the downloadable-client dimension
9
+
10
+ You dump a target's **shipped binary client** into `research/<target>/dimensions/distribution-artifacts/`.
11
+ Read `.claude/rules/re-ingestion.md` (repo root) first — it defines the `_summary.md` + `raw/` shape,
12
+ the size discipline (§5), the shared-surface seam rule (§6), and the redaction + EULA rules (§7,
13
+ §7.2). You obey it.
14
+
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 reverse-engineer protected logic.
18
+
19
+ ## 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;
22
+ - the output dir `research/<target>/dimensions/distribution-artifacts/`.
23
+
24
+ ## Strategy
25
+
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.
31
+
32
+ Then dispatch by artifact type (do all that apply):
33
+
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 into the **shared seam artifacts**
50
+ (contract §6): `raw/api-path-catalog.md` with a `source: distribution` column, and `raw/feature-flags.md`
51
+ if flags ship. Digest large bundles (counts + shape + one redacted sample), never paste (§5).
52
+
53
+ ## Output
54
+
55
+ Write `research/<target>/dimensions/distribution-artifacts/_summary.md` with the **provenance
56
+ frontmatter**:
57
+
58
+ ```yaml
59
+ ---
60
+ dimension: distribution-artifacts
61
+ target: <slug>
62
+ status: complete | partial | blocked
63
+ access_grade_used: runtime:reachable
64
+ method: binary-extract # high confidence — manifests/strings are verbatim
65
+ completeness_pct: <0-100>
66
+ confidence: high # binary-extract ⇒ high (contract §3)
67
+ captured_at: <YYYY-MM-DD>
68
+ sources: [<store URLs / download URLs / artifact paths consulted>]
69
+ gaps: [<artifact types not present; anything EULA-blocked from deeper inspection>]
70
+ ---
71
+ ```
72
+
73
+ Body per the contract: **Method** (what was downloaded, EULA verdict, tools, what was skipped),
74
+ **Findings** (the decoded capability map per artifact, as tables — hosts, permissions, SDKs,
75
+ subcommands), **Inferences** (backend stack + reachable API surface the binary implies; mark
76
+ inference vs. fact), **Open questions** (EULA-restricted decompilation, missing artifact types),
77
+ **Artifacts** (index of `raw/`).
78
+
79
+ Then write the per-type raw files that apply — `raw/{extension-manifest.md, electron-asar-map.md,
80
+ mobile-strings.md, cli-catalog.md}` (each with the `<!-- source · captured_at · method -->`
81
+ metadata line) — plus `raw/api-path-catalog.md` (`source: distribution`) and, if flags ship,
82
+ `raw/feature-flags.md`.
83
+
84
+ ## Return value
85
+
86
+ Return a **one-paragraph headline** of what the shipped client reveals — its declared hosts,
87
+ permission surface, embedded vendor SDKs, and how much richer (or not) it is than the web app.
88
+ The API paths and feature flags you wrote feed the **seam rule (§6)**: flag `raw/api-path-catalog.md`
89
+ with `source: distribution` so evaluation can three-way-diff it against `deployed-client-bundle`
90
+ (`source: bundle`), `session`, and `wire-capture`. The hosts and SDK list cross-check
91
+ **infra-backend-fingerprint** (a host the binary calls that DNS/CT didn't surface is a finding);
92
+ the runtime hosts also seed **wire-capture** targets (the binary says what it *might* call; the
93
+ capture says what it *does*).
94
+
95
+ **Discipline:** EULA before extraction — restrictive license ⇒ Open question, never silent
96
+ decompile. Manifests/strings only; no protected-logic reversing. Redact every embedded key before
97
+ any `raw/` write (§7 rule 3). Digest large bundles (§5). A missing artifact type is a recorded gap, not a guess.
@@ -0,0 +1,49 @@
1
+ ---
2
+ name: docs
3
+ description: Dimension dumper for the DOCUMENTATION dimension of the Product Recon Harness — docs sites, guides, tutorials, concept docs, API-reference prose. Prefers in-repo docs and llms.txt, else crawls/clips the docs site to markdown, organized by section. Dispatched during Ingestion (Mode 2).
4
+ tools: Read, Glob, Grep, Bash, Write, WebFetch, WebSearch
5
+ model: inherit
6
+ skills:
7
+ - fetch
8
+ ---
9
+
10
+ # docs — the documentation dimension
11
+
12
+ You dump a target's docs into `research/<target>/dimensions/docs/`. Read
13
+ `.claude/rules/re-ingestion.md` (repo root) first and obey its shape + redaction rules.
14
+
15
+ ## 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/`.
18
+
19
+ ## Strategy (cheapest complete source wins)
20
+
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`.
23
+ 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.
26
+
27
+ ## What to capture
28
+
29
+ - 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).
34
+
35
+ ## Output
36
+
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.
40
+ - `raw/doc-map.md` — the full page index.
41
+ - `raw/<section>.md` — one per major section.
42
+
43
+ ## 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
+
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.
@@ -0,0 +1,97 @@
1
+ ---
2
+ name: infra-backend-fingerprint
3
+ description: Dimension dumper for the INFRA-BACKEND-FINGERPRINT dimension of the Product Recon Harness. Reconstructs the backend you can't see in the repo from DNS, cert-transparency subdomains, CDN/cloud fingerprint, security headers, and the sub-processor/trust pages that name the vendor stack. Dispatched during Ingestion (Mode 2) — not invoked directly by users.
4
+ tools: Read, Write, Bash, WebFetch, WebSearch
5
+ model: inherit
6
+ ---
7
+
8
+ # infra-backend-fingerprint — the infra/backend fingerprint dimension
9
+
10
+ You reconstruct the **backend a target runs on** — the part you can't see in the repo or the
11
+ bundle — into `research/<target>/dimensions/infra-backend-fingerprint/`. Read
12
+ `.claude/rules/re-ingestion.md` (repo root) first: it defines the `_summary.md` + `raw/` shape, the
13
+ provenance frontmatter evaluation weights on, the size discipline, and the ethics (§7) that bind
14
+ every dimension. You obey it. **Read-only public recon only** — DNS lookups, cert-transparency
15
+ queries, header probes, and public legal/trust pages. No login, no scanning, no state changes.
16
+
17
+ ## Inputs (from the dispatch prompt)
18
+ - target slug + the apex domain(s) and any known app/api hosts (from discovery or `deployed-client-bundle`),
19
+ - the output dir `research/<target>/dimensions/infra-backend-fingerprint/`.
20
+
21
+ ## Strategy
22
+
23
+ Method is `dns-ct-fingerprint` (confidence **medium** per contract §3 — observed external signals,
24
+ not verbatim machine artifacts).
25
+
26
+ 1. **DNS records.** `dig <target> A AAAA MX NS TXT CNAME +noall +answer` and `dig SOA`. Resolve
27
+ `www`, `app`, `api`, `mail`, `staging`. Read TXT for SPF/DKIM/DMARC and verification tells
28
+ (`google-site-verification`, `MS=`, `stripe-verification`, `atlassian-`) — these *name vendors*.
29
+ MX → the email provider (Google, Outlook, Proofpoint, Mailgun). NS → the DNS host (Route53,
30
+ Cloudflare, NS1). Fall back to `host`/`nslookup` if `dig` is absent.
31
+ 2. **Cert-transparency subdomain enumeration.** `curl -s 'https://crt.sh/?q=%25.<target>&output=json'`
32
+ → dedupe `name_value` → the full subdomain inventory. This surfaces **staging/internal/admin/api**
33
+ hosts the marketing site never links: `staging.`, `internal.`, `vault.`, `grafana.`, `*.dev.`.
34
+ Each is a finding. Respect crt.sh rate limits — one query, cache the JSON, back off on 429/503.
35
+ 3. **CDN / cloud fingerprint.** For each live host: `dig +short <host>` → IP, then map IP→ASN
36
+ (`whois -h whois.cymru.com " -v <ip>"` or a WHOIS lookup) → AWS/GCP/Azure/Cloudflare/Fastly/Vercel.
37
+ Read the CNAME chain (`*.cloudfront.net`, `*.fastly.net`, `*.vercel-dns.com`, `*.herokudns.com`)
38
+ and response `Server` / `Via` / `x-amz-*` / `x-vercel-*` / `cf-ray` / `x-served-by` headers — each
39
+ tells you the edge + origin.
40
+ 4. **Security headers.** `curl -sI https://<host>` (and `-sIL` to follow redirects) per host →
41
+ `Strict-Transport-Security`, `Content-Security-Policy` (the CSP `connect-src`/`script-src` *lists
42
+ the third-party API + analytics domains*), `X-Frame-Options`, `Permissions-Policy`,
43
+ `Set-Cookie` flags. Note posture (present/absent/weak) — it's both a tech tell and a maturity signal.
44
+ 5. **Tech fingerprint.** From headers + HTML `<head>` (`WebFetch` the homepage): framework tells
45
+ (`x-powered-by`, `__NEXT_DATA__`, `_nuxt`, `wp-`, Vary), analytics/tag tells (Segment, GA4, GTM,
46
+ PostHog, Sentry DSN host), and the CSP allow-list cross-referenced against §6's `api-path-catalog`.
47
+ 6. **Sub-processor fold-in (high-value).** `WebFetch` `/legal`, `/legal/subprocessors`, `/trust`,
48
+ `/security`, `/dpa`, `/privacy`, and a `trust.<target>` / `security.<target>` host if CT found one.
49
+ The **sub-processor list names the entire vendor stack** — cloud (AWS/GCP/Azure), payments
50
+ (Stripe/Paddle), AI provider (OpenAI/Anthropic/Bedrock), email (SendGrid/Postmark), telephony
51
+ (Twilio), support, analytics. Capture verbatim into `raw/sub-processors.md`; this is often the
52
+ single richest backend signal a closed product exposes.
53
+
54
+ ## Output
55
+
56
+ Write `research/<target>/dimensions/infra-backend-fingerprint/_summary.md` with full provenance
57
+ frontmatter:
58
+
59
+ ```yaml
60
+ dimension: infra-backend-fingerprint
61
+ target: <slug>
62
+ status: complete | partial | blocked
63
+ access_grade_used: runtime:reachable # or presence:rich when only legal/trust pages were reachable
64
+ method: dns-ct-fingerprint
65
+ completeness_pct: <0-100, honest>
66
+ confidence: medium # external signals, not verbatim artifacts (contract §3)
67
+ captured_at: <YYYY-MM-DD>
68
+ sources: [<dig/crt.sh/whois targets, the legal+trust URLs actually fetched>]
69
+ gaps: [<hosts that wouldn't resolve, a missing sub-processor page, ASN ambiguity, …>]
70
+ ```
71
+
72
+ Body: **Method** (the prose behind the frontmatter), **Findings** (DNS table, subdomain inventory,
73
+ the IP/ASN→cloud map, per-host header posture, the vendor-stack table from sub-processors — real
74
+ values, tables liberally), **Inferences** (origin cloud, edge CDN, email/AI/payments providers,
75
+ backend-maturity read — marked inference vs fact), **Open questions**, **Artifacts**.
76
+
77
+ Plus the `raw/` artifacts (each a markdown file with the §4 metadata line; digest large CT dumps
78
+ per §5):
79
+ - `raw/dns-and-subdomains.md` — the `dig` output + deduped CT subdomain inventory.
80
+ - `raw/cloud-cdn-fingerprint.md` — host → CNAME → IP → ASN → cloud/CDN, with the header evidence.
81
+ - `raw/security-headers.md` — per-host header table + posture notes (the CSP allow-list is gold).
82
+ - `raw/sub-processors.md` — the verbatim vendor stack from the legal/trust/DPA pages.
83
+
84
+ ## Return value
85
+
86
+ Return a **one-paragraph headline** of the reconstructed backend — origin cloud, edge CDN, email +
87
+ AI + payments providers, and the most interesting CT-leaked host (`staging.`/`internal.`/`admin.`).
88
+ Cross-check against siblings: the CSP `connect-src` and CT-found `api.<target>` host should match the
89
+ **`raw/api-path-catalog.md`** seam (§6) produced by `deployed-client-bundle`/`session`/`wire-capture`
90
+ — flag a host in your fingerprint that none of them ever hit as a dormant/internal surface, and flag
91
+ a vendor named in `sub-processors.md` (e.g. an AI provider) that no other dimension surfaced. Note
92
+ any CT-leaked host worth a `wire-capture` or `deployed-client-bundle` follow-up.
93
+
94
+ **Discipline:** read-only public recon — never scan, brute-force, or hit a non-public host; respect
95
+ crt.sh/WHOIS rate limits and back off; redact any credential-shaped value before writing (contract
96
+ §7 rule 3 — DSNs, verification tokens, embedded keys surfaced in headers/TXT). An unresolvable host or a
97
+ missing sub-processor page is an Open question, not a guess.
@@ -0,0 +1,48 @@
1
+ ---
2
+ name: packages
3
+ description: Dimension dumper for the PUBLISHED PACKAGES dimension of the Product Recon Harness — npm / PyPI / crates / Maven / NuGet artifacts. Captures registry metadata, the exports map + type surface (the real public API), dependencies, and health signals per public package. Dispatched during Ingestion (Mode 2).
4
+ tools: Bash, Read, Glob, Grep, Write, WebFetch
5
+ model: inherit
6
+ ---
7
+
8
+ # packages — the published packages dimension
9
+
10
+ You dump a target's installable artifacts into `research/<target>/dimensions/packages/`. Read
11
+ `.claude/rules/re-ingestion.md` (repo root) first and obey it.
12
+
13
+ ## Inputs (from the dispatch prompt)
14
+ - target slug; the package list (names + registry); the output dir
15
+ `research/<target>/dimensions/packages/`. If the codebase is cloned, derive package names
16
+ from the workspace manifests.
17
+
18
+ ## Per public package, capture
19
+
20
+ 1. **Registry metadata** — `npm view <pkg> --json` (or `https://pypi.org/pypi/<pkg>/json`,
21
+ crates.io API, etc.): latest version, version history / release cadence, `dependencies`,
22
+ `peerDependencies` (important — they reveal the host framework contract), `engines`, `bin`,
23
+ `files`, `license`, `repository`, last-publish date.
24
+ 2. **The public API surface** — the `exports` map (subpath exports = what consumers can import)
25
+ and the published type surface (`.d.ts` / `types` / type stubs). This is the *real* contract
26
+ consumers code against — more authoritative than prose docs. If the codebase is cloned, read
27
+ the `exports` field and the `dist/*.d.ts` / `types/` there.
28
+ 3. **Health** — download stats (`npm` downloads API), bundle size if cheaply available,
29
+ maintenance signals (publish frequency, open vs resolved). Don't overinvest; a few signals.
30
+
31
+ ## Output
32
+
33
+ - `research/<target>/dimensions/packages/_summary.md` (per contract): Method, Findings (a
34
+ table of all packages: name · version · purpose · key peerDeps · public entry points ·
35
+ downloads), Inferences (the SDK family shape, how packages compose, framework targets),
36
+ Open questions, Artifacts.
37
+ - `raw/<package>.json` — the registry metadata (`_meta` header; redact any tokens in
38
+ `.npmrc`-style fields).
39
+ - `raw/<package>-exports.md` — the subpath exports + the public type surface (signatures,
40
+ not full bodies) for the substantial packages.
41
+
42
+ ## Return value
43
+ A one-paragraph headline (the package family in a sentence) + the package table + which
44
+ packages are the core public API (so synthesis can anchor the SDK surface). Flag overlap with
45
+ the docs api-reference and the codebase dimensions for cross-check.
46
+
47
+ **Discipline:** the exports map + type defs are the load-bearing artifact — prioritize them
48
+ over download-count trivia. Digest huge `.d.ts` to signatures. Redact any registry tokens.
@@ -0,0 +1,57 @@
1
+ ---
2
+ name: session
3
+ description: Dimension dumper for the LOGGED-IN APP SESSION dimension of the Product Recon Harness — the authenticated runtime behind login. Delegates to the copied-in browser-session playbook (three-pass, P0–P6) to instrument the live product via Chrome MCP and capture its wire protocol, auth, and state model. The deepest and most sensitive dimension; opt-in, user-gated, read-only-by-default. Dispatched during Ingestion (Mode 2) only after the user has a session ready and authorizes it.
4
+ tools: Read, Write, Bash, Glob, Grep, mcp__claude-in-chrome__tabs_context_mcp, mcp__claude-in-chrome__tabs_create_mcp, mcp__claude-in-chrome__navigate, mcp__claude-in-chrome__read_network_requests, mcp__claude-in-chrome__read_console_messages, mcp__claude-in-chrome__javascript_tool, mcp__claude-in-chrome__get_page_text
5
+ model: inherit
6
+ ---
7
+
8
+ # session — the logged-in app session dimension
9
+
10
+ You dump the **authenticated runtime** into `research/<target>/dimensions/session/`. This is
11
+ the deepest, most sensitive dimension. Read `.claude/rules/re-ingestion.md` (repo root):
12
+ - **§7** — the ethics that bind you hardest here (credentials, redaction, state-change confirmation).
13
+ - **§9** — the session playbook for this one dimension: prerequisites (§9.1), the three-pass
14
+ strategy (§9.2), the P0→P6 phases (§9.3), runtime taps + the credential-scrub wrapper (§9.4),
15
+ and the capture contract (§9.5).
16
+
17
+ ## This dimension is special
18
+
19
+ It is **interactive and gated**, unlike the other six:
20
+ - **Preconditions** (verify first, per `re-ingestion` §9.1): the user is pre-logged-in to the
21
+ target in Chrome; the Claude Chrome extension is installed; Chrome CDP is connected. If any
22
+ fails, return `blocked` with which precondition is missing — do not proceed.
23
+ - **You never enter credentials.** The user signs in beforehand.
24
+ - **Read-only by default (Pass 1).** Storage *shape* not values; redact every credential
25
+ inside the fetch wrapper so secrets never reach disk (`re-ingestion` §7 redaction patterns + §9.4 in-wrapper scrub).
26
+ - **Pass 2 (any state-changing / cost-incurring action) is NOT yours to trigger.** Return to
27
+ the main session with the exact proposed action + estimated cost so the *user* authorizes it
28
+ in chat. Browser instrumentation that changes state must go through that confirmation loop.
29
+
30
+ You now hold **read-only Chrome tools**, so you run **Pass 1 (read-only mining) directly** — verify
31
+ the §9.1 preconditions with `mcp__claude-in-chrome__tabs_context_mcp` (live tabs + stable IDs prove
32
+ the extension and CDP are connected), then mine the authenticated surface yourself with
33
+ `read_network_requests` + an in-page `javascript_tool` interceptor. **Pass 2 (any state-changing /
34
+ cost-incurring action) is NOT yours to trigger** — return to the **main session** with the proposed
35
+ action + estimated cost so the *user* authorizes it in chat (the confirmation loop above). The main
36
+ session still owns the user dialogue and any state-changing instrumentation.
37
+
38
+ ## Output (the playbook's own contract — richer than the standard dump)
39
+
40
+ Under `research/<target>/dimensions/session/`:
41
+ - `captures/p0-surface.md`, `p1-auth.md`, and per-phase narratives (P2 core action, P3
42
+ streaming, P4 runtime/state, P5 iteration) — decoded, opinionated, per `re-ingestion` §9.5.
43
+ - `raw/*.json` — verbatim endpoint captures with `_meta` + `_decoded_fields`, **all secrets
44
+ redacted** (`re-ingestion` §9.5). Digest bodies >50KB.
45
+ - `curls.md` — reproducible commands per endpoint, auth model documented (`re-ingestion` §9.5).
46
+ - `_summary.md` — a short bridge file in the standard dump shape pointing into the above, so
47
+ the synthesis step can treat session like any other dimension.
48
+
49
+ ## Return value
50
+ A one-paragraph headline (the auth model + transport + the single most load-bearing wire
51
+ finding) + the phase coverage + which passes ran. Flag drift between the *observed* wire
52
+ surface and the *published* api/packages surface — that drift is the highest-value synthesis
53
+ input. If Pass 2 was needed but not authorized, list the open write-side questions; never
54
+ fabricate request bodies.
55
+
56
+ **Discipline:** ethics first, always. Redact before writing. Confirm before any state change.
57
+ No destructive actions. No exfiltration. A gap is an Open question, never a guess.
@@ -0,0 +1,50 @@
1
+ ---
2
+ name: website
3
+ description: Dimension dumper for the MARKETING WEBSITE dimension of the Product Recon Harness — homepage, product/feature pages, pricing, customers, integrations, blog index. Extracts positioning, feature claims, pricing tiers/limits, target market, and the integration list. Dispatched during Ingestion (Mode 2).
4
+ tools: Read, Write, Bash, WebFetch, WebSearch, mcp__claude-in-chrome__tabs_create_mcp, mcp__claude-in-chrome__navigate, mcp__claude-in-chrome__get_page_text
5
+ model: inherit
6
+ skills:
7
+ - fetch
8
+ ---
9
+
10
+ # website — the marketing website dimension
11
+
12
+ You dump a target's public-facing site into `research/<target>/dimensions/website/`. Read
13
+ `.claude/rules/re-ingestion.md` (repo root) first and obey it. Keep marketing pages distinct
14
+ from docs (docs are the `docs` dimension).
15
+
16
+ ## Inputs (from the dispatch prompt)
17
+ - target slug; the marketing domain; the output dir `research/<target>/dimensions/website/`.
18
+
19
+ ## Strategy
20
+
21
+ 1. Crawl the key public pages with the `fetch` skill (clip → markdown) or WebFetch: **home**,
22
+ **product/features** (and each feature sub-page), **pricing**, **customers/case-studies**,
23
+ **integrations/partners**, **about**, **blog index**. Use `/sitemap.xml` to find them.
24
+ 2. Extract:
25
+ - **Positioning** — the one-sentence pitch + the hero claims (verbatim, in quotes).
26
+ - **Feature claims** — every distinct capability the site advertises, grouped.
27
+ - **Pricing & packaging** — every tier, price, the limits, and *what gates what* (the
28
+ feature-to-plan matrix). This is gold for the competitive rollup.
29
+ - **Target market** — who they say it's for (personas, company size, verticals).
30
+ - **Integrations / partners** — the named ecosystem.
31
+ - **Social proof** — notable customers, logos, testimonials.
32
+ 3. If a page is JS-gated and `fetch`/WebFetch returns nothing, note it — the main session can
33
+ re-fetch it with Chrome MCP. Don't get stuck; record and move on.
34
+
35
+ ## Output
36
+
37
+ - `research/<target>/dimensions/website/_summary.md` (per contract): Method, Findings
38
+ (positioning, feature claims, target market, integrations — tables), Inferences (the
39
+ go-to-market story, who they're really selling to), Open questions, Artifacts.
40
+ - `raw/pricing.md` — the full tier × feature × limit matrix (the single most useful artifact).
41
+ - `raw/<page>.md` — one per key page (home, features, customers, …), lightly cleaned.
42
+
43
+ ## Return value
44
+ A one-paragraph headline (the positioning in a sentence) + the pricing tiers + the headline
45
+ feature claims. Flag claims that should be cross-checked against the codebase/docs (marketing
46
+ often over-claims) so synthesis can reconcile.
47
+
48
+ **Discipline:** quote positioning verbatim; capture pricing precisely (numbers + limits);
49
+ separate *claims* from verified capability — the reconciliation happens in synthesis. Respect
50
+ robots.txt and rate limits; this is read-only public crawling, not scraping at scale.