@nurix/etna 0.18.1 → 0.18.3
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/data/harness-index.json +2 -6
- package/data/harnesses/code/CLAUDE.md +1 -1
- package/data/harnesses/code/harness.json +3 -3
- package/data/harnesses/code/rules/nomenclature.md +11 -0
- package/data/harnesses/code/skills/brainstorm/harvest.md +1 -1
- package/data/harnesses/code/skills/documentation/SKILL.md +2 -0
- package/data/harnesses/code/skills/documentation/references/style-guide.md +23 -0
- package/data/harnesses/code/skills/documentation/references/templates.md +1 -1
- package/data/harnesses/discover/CLAUDE.md +25 -10
- package/data/harnesses/discover/harness.json +2 -2
- package/data/harnesses/discover/rules/cartography-coverage.md +94 -0
- package/data/harnesses/discover/rules/cartography-flows.md +99 -0
- package/data/harnesses/discover/rules/cartography-ia.md +88 -0
- package/data/harnesses/discover/rules/cartography.md +109 -0
- package/data/harnesses/discover/rules/evaluation.md +3 -1
- package/data/harnesses/discover/rules/ingestion.md +1 -1
- package/data/harnesses/discover/rules/self-correction.md +35 -23
- package/data/harnesses/hr/harness.json +1 -1
- package/data/harnesses/kb-agi/harness.json +1 -1
- package/package.json +1 -1
- package/data/harnesses/code-fable/.prettierignore +0 -12
- package/data/harnesses/code-fable/.prettierrc.json +0 -3
- package/data/harnesses/code-fable/.vscode/settings.json +0 -10
- package/data/harnesses/code-fable/CLAUDE.md +0 -124
- package/data/harnesses/code-fable/agents/brainstorm.md +0 -35
- package/data/harnesses/code-fable/agents/change-review.md +0 -251
- package/data/harnesses/code-fable/agents/harness-manager.md +0 -181
- package/data/harnesses/code-fable/agents/maintenance.md +0 -122
- package/data/harnesses/code-fable/agents/performance-review.md +0 -223
- package/data/harnesses/code-fable/agents/spec-mode.md +0 -56
- package/data/harnesses/code-fable/harness.json +0 -12
- package/data/harnesses/code-fable/hooks/hooks.json +0 -27
- package/data/harnesses/code-fable/hooks/lib/redact.mjs +0 -35
- package/data/harnesses/code-fable/hooks/prompt-recall.mjs +0 -155
- package/data/harnesses/code-fable/hooks/session-reflect.mjs +0 -285
- package/data/harnesses/code-fable/rules/general.md +0 -83
- package/data/harnesses/code-fable/rules/nomenclature.md +0 -30
- package/data/harnesses/code-fable/rules/typescript.md +0 -19
- package/data/harnesses/code-fable/skills/boundary/SKILL.md +0 -49
- package/data/harnesses/code-fable/skills/boundary/references/boundary-taxonomy.md +0 -796
- package/data/harnesses/code-fable/skills/brainstorm/README.md +0 -136
- package/data/harnesses/code-fable/skills/brainstorm/SKILL.md +0 -135
- package/data/harnesses/code-fable/skills/brainstorm/harvest.md +0 -26
- package/data/harnesses/code-fable/skills/brainstorm/templates/backlog.md +0 -39
- package/data/harnesses/code-fable/skills/brainstorm/templates/build.md +0 -37
- package/data/harnesses/code-fable/skills/brainstorm/templates/decisions.md +0 -29
- package/data/harnesses/code-fable/skills/brainstorm/templates/doctrine.md +0 -31
- package/data/harnesses/code-fable/skills/brainstorm/templates/domain-model.md +0 -25
- package/data/harnesses/code-fable/skills/brainstorm/templates/glossary.md +0 -20
- package/data/harnesses/code-fable/skills/brainstorm/templates/milestones.md +0 -43
- package/data/harnesses/code-fable/skills/brainstorm/templates/non-goals.md +0 -17
- package/data/harnesses/code-fable/skills/brainstorm/templates/plan-doc.md +0 -61
- package/data/harnesses/code-fable/skills/brainstorm/templates/questions.md +0 -36
- package/data/harnesses/code-fable/skills/brainstorm/templates/references.md +0 -28
- package/data/harnesses/code-fable/skills/brainstorm/templates/rejected.md +0 -29
- package/data/harnesses/code-fable/skills/brainstorm/templates/state.md +0 -1
- package/data/harnesses/code-fable/skills/brainstorm/templates/tech.md +0 -23
- package/data/harnesses/code-fable/skills/brainstorm/templates/thesis.md +0 -21
- package/data/harnesses/code-fable/skills/distiller/SKILL.md +0 -90
- package/data/harnesses/code-fable/skills/distiller/references/docs-mode.md +0 -299
- package/data/harnesses/code-fable/skills/distiller/references/method.md +0 -94
- package/data/harnesses/code-fable/skills/documentation/SKILL.md +0 -128
- package/data/harnesses/code-fable/skills/documentation/references/examples.md +0 -162
- package/data/harnesses/code-fable/skills/documentation/references/style-guide.md +0 -285
- package/data/harnesses/code-fable/skills/documentation/references/templates.md +0 -857
- package/data/harnesses/code-fable/skills/workflow-mapper/SKILL.md +0 -451
- package/data/harnesses/code-fable/skills/workflow-mapper/references/patterns.md +0 -214
package/data/harness-index.json
CHANGED
|
@@ -1,12 +1,8 @@
|
|
|
1
1
|
{
|
|
2
|
-
"fingerprint": "
|
|
2
|
+
"fingerprint": "4bbc31742cc4",
|
|
3
3
|
"harnesses": {
|
|
4
4
|
"code": {
|
|
5
|
-
"plugin": "code
|
|
6
|
-
"description": "Nurix code-project harness"
|
|
7
|
-
},
|
|
8
|
-
"code-fable": {
|
|
9
|
-
"plugin": "code-fable",
|
|
5
|
+
"plugin": "code",
|
|
10
6
|
"description": "Nurix code-project harness"
|
|
11
7
|
},
|
|
12
8
|
"discover": {
|
|
@@ -36,7 +36,7 @@ Three peer modes plus a Completion step — enter wherever the user's thinking a
|
|
|
36
36
|
| **Spec** | new feature work | `spec-mode` agent + `documentation` skill | Plan |
|
|
37
37
|
| **Plan** | a spec is approved | `documentation` skill → `docs/history/plans/YYYY-MM-DD-{slug}.md` | Completion |
|
|
38
38
|
|
|
39
|
-
On **Completion**: freeze the plan (`Status: Complete`) and flip the feature spec to `Status: Active`, extending it with how-it-works sections; then distil the plan's trail — if the memory inbox (`docs/memory/inbox/`) holds entries, run `distiller facts` (inbox→fact-cards), then `distiller docs` for the just-completed feature's doc drafts any pending deltas for approval (presented, never auto-written). The `boundary` skill gates every approved plan before coding — it reads the source the plan touches and reports what would break (see **Boundaries** below); on brainstorm close, harvest by scope — module pillars → `docs/modules/{m}/pillars/`, cross-module doctrine + contract changes → `docs/architecture/` /
|
|
39
|
+
On **Completion**: freeze the plan (`Status: Complete`) and flip the feature spec to `Status: Active`, extending it with how-it-works sections; then distil the plan's trail — if the memory inbox (`docs/memory/inbox/`) holds entries, run `distiller facts` (inbox→fact-cards), then `distiller docs` for the just-completed feature's doc drafts any pending deltas for approval (presented, never auto-written). The `boundary` skill gates every approved plan before coding — it reads the source the plan touches and reports what would break (see **Boundaries** below); on brainstorm close, harvest by scope — module pillars → `docs/modules/{m}/pillars/`, cross-module doctrine + contract changes (the deployed-design SOT) → `docs/architecture/` with its decision record → `docs/history/adr/`, backlog → `docs/history/`. Open questions block close.
|
|
40
40
|
|
|
41
41
|
---
|
|
42
42
|
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"harness": "code",
|
|
3
|
-
"name": "code
|
|
4
|
-
"version": "0.17.
|
|
3
|
+
"name": "code",
|
|
4
|
+
"version": "0.17.3",
|
|
5
5
|
"epoch": 14,
|
|
6
6
|
"files": [
|
|
7
7
|
".prettierrc.json",
|
|
8
8
|
".prettierignore",
|
|
9
9
|
".vscode/settings.json"
|
|
10
10
|
],
|
|
11
|
-
"digest": "
|
|
11
|
+
"digest": "0c459bd1301c"
|
|
12
12
|
}
|
|
@@ -28,3 +28,14 @@
|
|
|
28
28
|
- snake_case : Used in File names, folder names. Examples: `user_service`, `api_utils`, `auth_middleware`, `data_models`
|
|
29
29
|
- UPPER_SNAKE_CASE : Used in Constants, environment variables. Examples: `MAX_RETRY_COUNT`, `API_KEY`, `DEFAULT_TIMEOUT`, `COLOR_PRIMARY`
|
|
30
30
|
- kebab-case : Used in URLs, CSS class names, HTML IDs. Examples: `nav-container`, `user-profile`, `button-primary`, `form-wrapper`
|
|
31
|
+
|
|
32
|
+
## Database
|
|
33
|
+
|
|
34
|
+
Naming for D1 tables, columns, indexes, and their Drizzle mirrors. (For column **types** — PK shape, timestamp columns — see the Cloudflare D1 Schema rule, not here; this section governs names only.)
|
|
35
|
+
|
|
36
|
+
- **Tables** : snake_case. Entity / hub tables use the plural noun for the thing they hold. Examples: `users`, `apps`, `devices`, `services`.
|
|
37
|
+
- **Junction (M:N) tables** : name a many-to-many join `<entityA>_<entityB>_map` — **always**, even when the join carries its own columns (a `role`, a secret, a status). The `_map` suffix is the signal that a row is a relationship, not an entity; extra attributes on the join do **not** earn it a standalone noun. Use the **singular** stem of each side, owning/anchor entity first (mirror the existing tables — `app_*`). Examples: `app_user_map` (apps ⨯ users), `app_device_map` (apps ⨯ devices), `app_service_map` (apps ⨯ services).
|
|
38
|
+
- ❌ Don't invent a "nice" noun for a junction — no `members`, `installs`, `memberships`, `enrolments`. A reviewer should read the table name and know both sides and that it's a join.
|
|
39
|
+
- **Columns** : snake_case. Foreign keys are `<entity>_id` (`user_id`, `app_id`, `device_id`, `service_id`). Booleans follow the boolean rule (`is_*`/`has_*`); timestamps are `created_at` / `updated_at`.
|
|
40
|
+
- **Indexes** : `<table>_<col(s)>_idx`; unique indexes `<table>_<col(s)>_unique`. The composite unique on a junction reads `<table>_<colA>_<colB>_unique` — e.g. `app_user_map_app_user_unique`, `app_device_map_device_app_unique`.
|
|
41
|
+
- **Drizzle mirror** : the exported table object is the camelCase of the snake_case table name (`app_user_map` → `appUserMap`); column TS properties are the camelCase of the column (`created_at` → `createdAt`, `service_key` → `serviceKey`). The snake_case string passed to `sqliteTable("…")` and every index name must match `seed/init.sql` exactly (the G1 schema-parity boundary).
|
|
@@ -10,7 +10,7 @@ The harvest is a structured diff between the session pillars and the live docs,
|
|
|
10
10
|
| --- | --- |
|
|
11
11
|
| `thesis.md` narrative | `docs/history/plans/YYYY-MM-DD-{slug}.md` (Status: Draft, `documentation` skill §8 Plan template) |
|
|
12
12
|
| `domain-model.md` | `docs/architecture/domain-model.md`; if it changes the IA or a cross-cutting contract, note the contract change there — the `boundary` skill will pick it up from source at the next plan check |
|
|
13
|
-
| Decisions spanning 2+ modules | one ADR per cohesive theme → `docs/
|
|
13
|
+
| Decisions spanning 2+ modules | one ADR per cohesive theme → `docs/history/adr/ADR-NNN-{slug}.md` (a historical decision record, not the deployed-design SOT in `docs/architecture/`), authored to the **`documentation` skill §10 ADR template** (frontmatter `status:` is the lifecycle source of truth — no body Status line; required sections Decision/Context/Consequences); rejected alternatives → the ADR's **Options Considered** table |
|
|
14
14
|
| Module-local decisions / doctrine / glossary / rejected | `docs/modules/{m}/pillars/{decisions,doctrine,glossary,rejected}.md` |
|
|
15
15
|
| Cross-module doctrine / glossary | `docs/architecture/domain-model.md` / `docs/architecture/glossary.md` |
|
|
16
16
|
| `tech.md` deviations | `docs/architecture/references.md` or the relevant ADR |
|
|
@@ -11,6 +11,8 @@ Document contracts and architecture, not implementation details. Show function s
|
|
|
11
11
|
|
|
12
12
|
**No redirect docs.** When moving a doc to a new location, delete the old file entirely. Update all references (routing, memory files, frontmatter `depends_on`, cross-doc links) to point to the new path. Never leave a stub file that says "Moved to X" — redirect docs rot, clutter the repo, and create false search hits.
|
|
13
13
|
|
|
14
|
+
**Present tense, current state only.** Active docs (everything outside `docs/history/`) describe the system _as it is now_ — what exists and how it works today. They never narrate how it got there: no migration/fold history, no dated "shipped/verified/built on YYYY-MM-DD" markers, no "ex-`@nurix/X`, folded 2026-06-12" provenance, no "was X → now Y" change journeys, no "removed/deleted in the <date> fold". The historical record — when and how things changed — lives **only** in `docs/history/` (changelog, plans, ADRs); `docs/memory/` is the agent's dated log and is likewise exempt. A doc may cite an ADR for the _why_ (the decision rationale), but must not narrate the _when/how it changed_. Routing/index docs point only to current authority docs — never to a historical plan or changelog as the "read first" source. When you find historical narration in an active doc, rewrite it to the present-tense fact and let `docs/history/` carry the story.
|
|
15
|
+
|
|
14
16
|
---
|
|
15
17
|
|
|
16
18
|
## Decision Tree
|
|
@@ -220,6 +220,29 @@ Use for structured info:
|
|
|
220
220
|
|
|
221
221
|
---
|
|
222
222
|
|
|
223
|
+
## Tense & History
|
|
224
|
+
|
|
225
|
+
**Active docs describe the present, not the past.** Everything outside `docs/history/` states what the system _is_ and how it works _today_. It must not narrate how it got there. The historical record — the journey, the dates, the migrations — lives **only** in `docs/history/` (changelog, plans, ADRs). (`docs/memory/` is the agent's own dated log and is likewise exempt from this rule.)
|
|
226
|
+
|
|
227
|
+
Strip this language from active docs:
|
|
228
|
+
|
|
229
|
+
| ❌ Historical narration (belongs in `docs/history/`) | ✅ Present-tense fact (belongs in the active doc) |
|
|
230
|
+
| --- | --- |
|
|
231
|
+
| "Folded in from the `NuStack-X` repo (2026-06-12)." | "Vendor-connector catalogue; one subpath per vendor." |
|
|
232
|
+
| "Built 2026-06-14; shipped + verified 2026-06-13." | "`agentSessionWorkflow` runs an outer turn loop over `runAgentLoop`." |
|
|
233
|
+
| "The legacy worker was deleted in the 2026-06-14 fold." | "One worker interprets `WorkflowDefinition`." |
|
|
234
|
+
| "ex-`@nurix/mcp-runtime`, M9 Phase C; was X, now Y." | "MCP client runtime, wired into `agentTriggerWorkflow`." |
|
|
235
|
+
| "Read first: `docs/history/plans/2026-…-fold.md`" (routing) | "Read first: `docs/architecture/<current-SOT>.md`" |
|
|
236
|
+
|
|
237
|
+
Rules:
|
|
238
|
+
|
|
239
|
+
- **No dates in active docs** for when something shipped, was verified, folded, or was removed. A bare status marker (`✅ shipped`, `⏳ pending`) is fine; the _date_ it shipped is not.
|
|
240
|
+
- **Cite the ADR for the _why_, never the _when_.** `Provenance: ADR-002` is good (it points to the decision rationale). "Decided in ADR-002 and shipped 2026-06-13" is not.
|
|
241
|
+
- **Routing/index docs point only to current authority docs.** A row whose only "read first" target is a historical plan or changelog is a redirect-for-history — repoint it to the current SOT doc, or drop the row.
|
|
242
|
+
- **When a doc changes because the system changed, the change-story goes in `docs/history/` (a changelog entry), and the active doc simply becomes correct in present tense.** Never leave the diff narrated in place.
|
|
243
|
+
|
|
244
|
+
---
|
|
245
|
+
|
|
223
246
|
## Structure
|
|
224
247
|
|
|
225
248
|
### Headers
|
|
@@ -600,7 +600,7 @@ path/to/another/file.js
|
|
|
600
600
|
|
|
601
601
|
## 9. Architecture Decision Record (ADR)
|
|
602
602
|
|
|
603
|
-
Use for: capturing a single, point-in-time architectural decision with its context, alternatives considered, and consequences. Lives in `docs/architecture/
|
|
603
|
+
Use for: capturing a single, point-in-time architectural decision with its context, alternatives considered, and consequences. Lives in `docs/history/adr/` — an ADR is a **historical decision record**, not the deployed-design source of truth (which lives in `docs/architecture/`). When the design later changes, update `docs/architecture/` and write a new superseding ADR; never rewrite a shipped ADR.
|
|
604
604
|
|
|
605
605
|
### When to write an ADR
|
|
606
606
|
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
# Discover Harness — Orchestrator
|
|
2
2
|
|
|
3
|
-
This is the **policy** half of the `discover` harness. The plugin ships the capabilities (11 dimension-collector agents +
|
|
3
|
+
This is the **policy** half of the `discover` harness. The plugin ships the capabilities (11 dimension-collector agents + 5 mode rules + a `tradecraft` keyboard reference); this file drives them. Together they discover a product across every surface it exposes and assemble a structured, provenance-tracked corpus in the resolved corpus root (default `research/<target>/`).
|
|
4
4
|
|
|
5
|
-
A run is
|
|
5
|
+
A run is five modes, in order: **Discovery → Ingestion → Evaluation → Cartography → Self-correction.** The main session drives all five — Ingestion and Evaluation fan out parallel sub-agents (dispatch each via the Agent/Task tool with `model: opus`); Cartography re-enters the live product (the browser singleton) to walk + screenshot it and may fan out doc-drafting sub-agents; a sub-agent cannot spawn further sub-agents.
|
|
6
6
|
|
|
7
7
|
---
|
|
8
8
|
|
|
@@ -70,15 +70,28 @@ Reconcile the collected dimensions into four cross-dimension rollups under `rese
|
|
|
70
70
|
|
|
71
71
|
---
|
|
72
72
|
|
|
73
|
-
## Mode 4 —
|
|
73
|
+
## Mode 4 — Product Cartography & Coverage
|
|
74
74
|
|
|
75
|
-
|
|
75
|
+
Make the product **legible as a product**. After Evaluation reconciles the dimensions, Cartography **re-enters the live product** (read-only nav, the browser singleton) and compiles the navigable **information architecture**, the primary **UX flows**, a **screenshot surface map**, and a **feature-coverage gate** — reconciling every _marketed / documented_ feature against **where it actually lives in the product** and **whether the run walked it**. This catches the blind spot the dimension collectors structurally miss: a feature **hyped on the website but buried three levels deep** — or marketed but **absent from this edition**. Follow `.claude/rules/cartography.md` (the spine: inputs · scorecard · orchestration · ethics), which routes to three artifact references — `cartography-ia.md` · `cartography-flows.md` · `cartography-coverage.md`. Four artifacts:
|
|
76
76
|
|
|
77
|
-
1.
|
|
78
|
-
2.
|
|
77
|
+
1. `evaluation/information-architecture.md` — nav tree + per-surface cards, each tagged with **depth** (D0 top-level … D3+ sub-panel) and **promoted | buried**.
|
|
78
|
+
2. `evaluation/ux-flows.md` — the primary journeys as mermaid sequence diagrams, traced from the **observed `session` wire** (not source). A write/generate flow on a `write_side_observed: false` run is diagrammed **as inferred**, never observed.
|
|
79
|
+
3. `evaluation/feature-coverage.md` — the **claimed-vs-located-vs-walked** matrix + the machine-readable **coverage scorecard** (`feature_location_rate`, `flow_coverage`, `screenshot_coverage`, `ia_nav_complete`) that Mode 5 scores against. A `claimed-but-not-located` feature is **never dropped** — it is dispositioned (deeper-than-looked → re-walk queue · edition/roadmap-gated → recorded gap · over-claim → an evaluation flag).
|
|
80
|
+
4. `dimensions/session/captures/screens/` — one **redacted** screenshot per primary surface (+ `_index.md`); the textual surface-map is the fallback only when the runtime can't screenshot.
|
|
81
|
+
|
|
82
|
+
Main-session-driven (it owns the browser); it **may** dispatch sub-agents (`model: opus`) to draft the three docs from captured material, but the **live walk + screenshots are main-session**. **Read-only / no-cost only** — locating a feature never triggers it; any write/generate stays behind the Pass-2 gate.
|
|
83
|
+
|
|
84
|
+
---
|
|
85
|
+
|
|
86
|
+
## Mode 5 — Self-correction (the run corrects itself; the harness improves only on approval)
|
|
87
|
+
|
|
88
|
+
Mode 5 is a loop, not a one-shot. Follow `.claude/rules/self-correction.md` — it carries the **defect checklist** (A), the **measurement rubric** (B), and the **iterate-or-propose loop** (C). Three stages, driven by the **main session** (not a sub-agent):
|
|
89
|
+
|
|
90
|
+
1. **Inspect** the finished run (scope verdict, plan, every dimension `_summary.md`, the rollups, **the Cartography IA / UX-flows / feature-coverage docs**) against the **built-in defect checklist** → a concrete list of _behavioral defects_ in the prior steps (mode · defect · severity · evidence anchor · within-run|harness-changing).
|
|
91
|
+
2. **Measure** the run against the **rubric** → a `/100` score + vibe band — including the heavily-weighted **experiential / IA coverage** axis fed by the Cartography scorecard. Always — every iteration, including the final one; the self-correcting step ALWAYS evaluates the current run.
|
|
79
92
|
3. **Iterate-or-propose**, splitting each defect by one test — _does the fix require editing a rule or an agent?_
|
|
80
|
-
- **No → within-run:** the main session **auto-iterates** (no approval), re-running the cheapest affected Mode 1–
|
|
81
|
-
- **Yes → harness-changing:** accumulate into `research/<target>/
|
|
93
|
+
- **No → within-run:** the main session **auto-iterates** (no approval), re-running the cheapest affected Mode 1–4 steps on THIS target and re-measuring each round — including **re-entering the live product (read-only nav) to walk the `located-but-not-walked` queue** and capture missed screenshots. The loop is **capable of ≥5 iterations** and **stops on regression** (a clear score drop → revert to the best prior run), **convergence** (no within-run defects left), or the cap. **Read-only / no-cost only** — any fix needing a Pass-2 / credit-spend / state-change / credential action goes through the explicit-confirmation gate, never the auto-loop.
|
|
94
|
+
- **Yes → harness-changing:** accumulate into `research/<target>/05-self-correction-proposal.md` (the shape is in `self-correction.md`: run measurement · iteration ledger · defect list · within-run fixes applied · the approval-gated harness-change table).
|
|
82
95
|
|
|
83
96
|
**Approval gate (unchanged):** present the harness-change table + the iteration ledger and STOP — nothing in the harness is applied. The user accepts / rejects / defers per item. Then the **main session** (not a sub-agent) applies accepted items, flips each row to APPLIED, and logs the change. Promote only what the _next, different_ target would also hit; prefer additive edits; structural edits are flagged, never auto-applied. (For a batch, additionally roll up into a cross-target synthesis that promotes only patterns ≥2 _independent_ targets hit — a homogeneous batch's 6/6 is one vote, not six.)
|
|
84
97
|
|
|
@@ -104,9 +117,11 @@ Output lives under the **resolved corpus root** (default `research/`; chosen per
|
|
|
104
117
|
├── 00-scope-verdict.md ← Discovery: accept/narrow/redirect/refuse
|
|
105
118
|
├── 00-recon-plan.md ← Discovery: access_grade + scope + dimension plan
|
|
106
119
|
├── dimensions/<dim>/{_summary.md, raw/} ← Ingestion (session & wire-capture also: captures/, curls.md)
|
|
107
|
-
├──
|
|
120
|
+
├── dimensions/session/captures/screens/ ← Cartography: redacted per-surface screenshots (+ _index.md)
|
|
121
|
+
├── evaluation/{technology-architecture, product-features, data-model-api-surface, competitive-positioning}.md ← Evaluation
|
|
122
|
+
├── evaluation/{information-architecture, ux-flows, feature-coverage}.md ← Cartography (Mode 4)
|
|
108
123
|
├── README.md ← Evaluation: run story + headline findings
|
|
109
|
-
└──
|
|
124
|
+
└── 05-self-correction-proposal.md ← Self-correction (Mode 5): proposed harness fixes (approval-gated)
|
|
110
125
|
```
|
|
111
126
|
|
|
112
127
|
Cloned repos live in `source/<target>/`. Provenance is the "self-aware" layer: each collector records _how_ it was obtained; Evaluation weights claims by it. Detailed shapes live in the rules.
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"harness": "discover",
|
|
3
3
|
"name": "discover",
|
|
4
|
-
"version": "0.1.
|
|
4
|
+
"version": "0.1.8",
|
|
5
5
|
"epoch": null,
|
|
6
6
|
"files": [
|
|
7
7
|
".prettierrc.json",
|
|
8
8
|
".prettierignore",
|
|
9
9
|
".vscode/settings.json"
|
|
10
10
|
],
|
|
11
|
-
"digest": "
|
|
11
|
+
"digest": "0f1520e846ae"
|
|
12
12
|
}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
# Cartography — Feature Coverage + Screenshots reference (Mode 4, artifact 3 of 3)
|
|
2
|
+
|
|
3
|
+
The method + template for `evaluation/feature-coverage.md` (the **coverage gate**) and the screenshot
|
|
4
|
+
contract for `dimensions/session/captures/screens/`. Spine in [`cartography.md`](cartography.md);
|
|
5
|
+
siblings [`cartography-ia.md`](cartography-ia.md), [`cartography-flows.md`](cartography-flows.md).
|
|
6
|
+
|
|
7
|
+
This is the reconciliation the dimension collectors don't do: take **every** feature the product
|
|
8
|
+
_claims_ (website + docs + community/changelog), locate it in the actual product by **route + depth**
|
|
9
|
+
(from `information-architecture.md`), and record whether the run **walked** it. It turns "we clipped the
|
|
10
|
+
feature page" into "we know which features are real, where they live, and which we never actually saw."
|
|
11
|
+
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
## Assembling the claimed-feature catalog
|
|
15
|
+
|
|
16
|
+
The rows of the matrix are the **union** of every feature claim across:
|
|
17
|
+
|
|
18
|
+
- `dimensions/website/raw/features.md` (+ `editions-pricing.md` for edition-gated features),
|
|
19
|
+
- `dimensions/docs/raw/*` (a documented capability is a claim),
|
|
20
|
+
- `dimensions/community/raw/changelog-digest.md` (a shipped-changelog feature is a claim).
|
|
21
|
+
|
|
22
|
+
De-duplicate to one row per distinct capability. Each row is then **located** (against the IA surface
|
|
23
|
+
cards) and **walked** (did this run actually navigate/observe it).
|
|
24
|
+
|
|
25
|
+
## The disposition taxonomy (a `claimed-but-not-located` row is NEVER blank)
|
|
26
|
+
|
|
27
|
+
Every feature that is claimed but not located **must** be dispositioned into exactly one — each routes
|
|
28
|
+
differently:
|
|
29
|
+
|
|
30
|
+
| Disposition | Meaning | Routes to |
|
|
31
|
+
| --- | --- | --- |
|
|
32
|
+
| **deeper-than-looked** | it exists in this product; we just didn't navigate deep enough | the **re-walk queue** (Mode 5 walks it read-only) |
|
|
33
|
+
| **edition/plan-gated** | not in this tenant's edition/plan (e.g. a trial) | a recorded gap — **not** re-walked (re-walking can't find what isn't shipped here) |
|
|
34
|
+
| **roadmap-not-shipped** | marketed but not yet a shipped capability | a recorded gap |
|
|
35
|
+
| **marketing over-claim** | the claim overstates what the product does | an `evaluation/product-features.md` **over-claim flag** |
|
|
36
|
+
|
|
37
|
+
---
|
|
38
|
+
|
|
39
|
+
## The output template — `evaluation/feature-coverage.md`
|
|
40
|
+
|
|
41
|
+
```markdown
|
|
42
|
+
# <Target> — Feature Coverage
|
|
43
|
+
---
|
|
44
|
+
coverage_scorecard:
|
|
45
|
+
features_claimed: <N> # union of website + docs + changelog feature claims
|
|
46
|
+
features_located: <N> # found in the live product (route known)
|
|
47
|
+
features_walked: <N> # actually navigated / observed this run
|
|
48
|
+
feature_location_rate: <0-100> # located ÷ claimed
|
|
49
|
+
flow_coverage: <0-100> # primary journeys diagrammed ÷ journeys identified
|
|
50
|
+
ia_surfaces_mapped: <N> # surface cards written in information-architecture.md
|
|
51
|
+
ia_nav_complete: <true|false> # every top-level nav destination has a surface card
|
|
52
|
+
screenshot_coverage: <0-100> # primary surfaces with a screenshot ÷ all primary surfaces
|
|
53
|
+
---
|
|
54
|
+
## Coverage matrix
|
|
55
|
+
| Feature (claimed) | Source | Located? | Route · depth | Walked? | Edition-gated? | Confidence | Note |
|
|
56
|
+
|---|---|---|---|---|---|---|---|
|
|
57
|
+
| <feature> | website,docs | ✅ | #/…/x · D2 | ❌ not-walked | — | high | promoted on site, 2 levels deep, not exercised this run |
|
|
58
|
+
| <feature> | website(AI) | ⚠ edition? | — | ❌ | maybe-not-in-trial | low | marketed flagship, not located in this tenant |
|
|
59
|
+
## Located-but-not-walked (the within-run re-walk queue — Mode 5 walks these read-only, no cost)
|
|
60
|
+
## Claimed-but-not-located (each row dispositioned per the taxonomy above — NEVER left blank)
|
|
61
|
+
## Buried flagships (marketing-promoted features sitting ≥D3 — the positioning-vs-product gap,
|
|
62
|
+
drawn from information-architecture.md's promoted-vs-buried headline)
|
|
63
|
+
## Unmarketed depth (powerful surfaces the marketing never mentions — the inverse finding)
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
## How the scorecard is scored (the Mode-5 handoff)
|
|
67
|
+
|
|
68
|
+
`cartography.md` describes _why_ the scorecard exists; here is _how each field is computed_, so Mode 5's
|
|
69
|
+
experiential / IA coverage axis (`self-correction.md` rubric, axis 2, max 20) is reproducible:
|
|
70
|
+
|
|
71
|
+
- `feature_location_rate` = `100 × features_located ÷ features_claimed`.
|
|
72
|
+
- `flow_coverage` = `100 × (primary journeys diagrammed in ux-flows.md ÷ journeys identified)`.
|
|
73
|
+
- `screenshot_coverage` = `100 × (primary surfaces with a screenshot ÷ all primary surfaces)`.
|
|
74
|
+
- `ia_nav_complete` = every D0 nav destination has a surface card.
|
|
75
|
+
|
|
76
|
+
Mode 5 axis 2 = `8 × location_rate/100 + 6 × flow_coverage/100 + 4 × screenshot_coverage/100 + 2 ×
|
|
77
|
+
(ia_nav_complete ? 1 : cards÷destinations)`, **−2** per `claimed-but-not-located` row left
|
|
78
|
+
un-dispositioned. The `located-but-not-walked` list is the re-walk queue Mode 5 iterates.
|
|
79
|
+
|
|
80
|
+
---
|
|
81
|
+
|
|
82
|
+
## Screenshots — `dimensions/session/captures/screens/`
|
|
83
|
+
|
|
84
|
+
One annotated screenshot per **primary** surface (each D0 nav destination + each materially distinct
|
|
85
|
+
detail / editor surface). **Redact visible PII before saving** (user names, emails, customer data,
|
|
86
|
+
partner identifiers). Name `<nn>-<surface>.png`; write a one-line `screens/_index.md` mapping each file
|
|
87
|
+
→ surface → route → depth.
|
|
88
|
+
|
|
89
|
+
**Screenshots are the Mode-4 deliverable that the session playbook's textual surface-map only
|
|
90
|
+
_substitutes_ for** (ingestion §9.5) — capture them live here; fall back to the textual map (and record
|
|
91
|
+
the `screenshot_coverage` gap) only when the runtime genuinely cannot screenshot (no image tool, or the
|
|
92
|
+
app never reaches page-idle because of a persistent connection). The screenshots live under the
|
|
93
|
+
`session` dimension (it owns the browser captures); `information-architecture.md`'s surface cards
|
|
94
|
+
reference them by path.
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
# Cartography — UX Flows reference (Mode 4, artifact 2 of 3)
|
|
2
|
+
|
|
3
|
+
The method + template for `evaluation/ux-flows.md`. Spine in [`cartography.md`](cartography.md); siblings
|
|
4
|
+
[`cartography-ia.md`](cartography-ia.md), [`cartography-coverage.md`](cartography-coverage.md).
|
|
5
|
+
|
|
6
|
+
The UX-flows doc captures the primary end-to-end journeys, each as a **mermaid sequence diagram**. This
|
|
7
|
+
is the **black-box adaptation of a code-level workflow trace**: where a source tracer follows call
|
|
8
|
+
chains, Cartography follows the **observed wire** — trigger (user action) → surface → the actual API
|
|
9
|
+
calls captured in the `session` dimension → state transitions → terminal effect. **Diagram only what was
|
|
10
|
+
observed**; mark any inferred hop explicitly.
|
|
11
|
+
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
## Participants (the black-box vocabulary)
|
|
15
|
+
|
|
16
|
+
Map every actor in a captured flow to one of these participants (keep names identical across all
|
|
17
|
+
diagrams — the same backend is the same participant everywhere):
|
|
18
|
+
|
|
19
|
+
| Participant | What it is |
|
|
20
|
+
| --- | --- |
|
|
21
|
+
| `User` | the operator taking the action |
|
|
22
|
+
| `SPA` | the client app (browser) |
|
|
23
|
+
| `InternalAPI` | the app-own cookie/token API (the real transport — `/rest`, `/enrich`, `/graphql`, …) |
|
|
24
|
+
| `PublicAPI` | the published developer/partner API — **only if the flow actually used it** |
|
|
25
|
+
| `JobQueue` | an async batch / worker / job system (the work happens off-request) |
|
|
26
|
+
| `Realtime` | a WS / SSE / long-poll channel |
|
|
27
|
+
| `3rdParty` | a named external vendor (AI mesh, payments, CDP, email, telephony) |
|
|
28
|
+
| `Store` | browser storage / client cache (Apollo, Redux-persist, IndexedDB) |
|
|
29
|
+
|
|
30
|
+
---
|
|
31
|
+
|
|
32
|
+
## Identifying the flows (from captured wire, not source)
|
|
33
|
+
|
|
34
|
+
The entry points are the **captured journeys** in the `session` dimension — you already have the wire;
|
|
35
|
+
this turns it into a journey. Per category, look for:
|
|
36
|
+
|
|
37
|
+
- **Core action** — the primary write: the create / save / submit body + its server resolution
|
|
38
|
+
(`raw/write-flow.md`).
|
|
39
|
+
- **Auth & session** — login → token/cookie → the authed read; the refresh path (`raw/auth-*.md`).
|
|
40
|
+
- **Realtime** — the WS/SSE/long-poll lifecycle + the event catalog (or the **negative**: "dashboard is
|
|
41
|
+
REST-only" is a real flow finding, not a miss).
|
|
42
|
+
- **Data pipeline** — import/export, ingest, sync, bulk/mass-action (often an async `JobQueue` flow).
|
|
43
|
+
- **Configuration** — a model/setting change that ripples (e.g. add an attribute → completeness recompute).
|
|
44
|
+
- **AI** — a generate/translate/agent call (`raw/*-wire.md`); note brokered-server-side vs client-direct.
|
|
45
|
+
|
|
46
|
+
Trace each: trigger → which surface → the observed request(s) → branches (conflict/permission/feature
|
|
47
|
+
flag → `alt`/`opt`) → loops (polling/retry/batch → `loop`) → the terminal effect (a persisted entity, a
|
|
48
|
+
job id, a streamed result). Stop at the terminal write or external response.
|
|
49
|
+
|
|
50
|
+
## Complexity (sets diagram detail)
|
|
51
|
+
|
|
52
|
+
- **Steps** (distinct operations): 1–2 simple · 3–5 moderate · 6+ complex.
|
|
53
|
+
- **Participants**: 2 simple · 3–4 moderate · 5+ complex.
|
|
54
|
+
- **Branching** (`alt`/`opt`): 0 linear · 1–2 moderate · 3+ complex.
|
|
55
|
+
- Async (polling / job / child workflow): +1 level.
|
|
56
|
+
|
|
57
|
+
---
|
|
58
|
+
|
|
59
|
+
## The output template — `evaluation/ux-flows.md`
|
|
60
|
+
|
|
61
|
+
````markdown
|
|
62
|
+
# <Target> — UX Flows
|
|
63
|
+
## TL;DR (how the product gets work done: sync-REST vs async-job, where realtime lives,
|
|
64
|
+
the approval/gate pattern, what's brokered server-side)
|
|
65
|
+
## Flow index (table: flow · category · trigger · participants · complexity)
|
|
66
|
+
## <Category> flows (Core action / Auth & session / Realtime / Data pipeline / Configuration / AI —
|
|
67
|
+
skip empty categories)
|
|
68
|
+
### <Flow name>
|
|
69
|
+
**Trigger · Surface · Observed?** (observed-wire | partially-inferred)
|
|
70
|
+
```mermaid
|
|
71
|
+
sequenceDiagram
|
|
72
|
+
participant User
|
|
73
|
+
participant SPA
|
|
74
|
+
participant InternalAPI
|
|
75
|
+
User->>SPA: <action>
|
|
76
|
+
SPA->>InternalAPI: <METHOD> <path>
|
|
77
|
+
InternalAPI-->>SPA: <status + shape>
|
|
78
|
+
SPA-->>User: <UI effect>
|
|
79
|
+
```
|
|
80
|
+
**Notes:** (server-side resolution · the gate · the async hop · what was inferred vs observed)
|
|
81
|
+
## Cross-dimension reconciliation (the flow as the app runs it vs as the public API/docs describe it —
|
|
82
|
+
drift is a finding; published = fact, observed-drift = tentative)
|
|
83
|
+
## Open questions
|
|
84
|
+
````
|
|
85
|
+
|
|
86
|
+
## Diagram rules (from the workflow-mapper discipline)
|
|
87
|
+
|
|
88
|
+
1. **Arrows:** solid `->>` = request/call · dashed `-->>` = return/response. No dangling calls (every
|
|
89
|
+
request has a response or a noted fire-and-forget).
|
|
90
|
+
2. **≤7 participants, ≤15 steps** per diagram. Past that, group with `rect` blocks / `Note over`, or
|
|
91
|
+
split into linked sub-diagrams.
|
|
92
|
+
3. **`alt`** = a real workflow branch (conflict vs success), **`loop`** = poll / retry / batch (label
|
|
93
|
+
the condition), **`opt`** = a gated step (permission, feature flag) — not generic error handling.
|
|
94
|
+
4. **Labels ≤8 words** — the action, not the implementation detail.
|
|
95
|
+
5. **Consistent participant names** across every diagram.
|
|
96
|
+
6. **The write-side rule (hard):** a flow that touches a **write / generate / launch** path on a
|
|
97
|
+
`write_side_observed: false` run is diagrammed **as inferred** (dashed arrows, an explicit
|
|
98
|
+
`Note over … : inferred (Pass-1 only)`), **never as observed** — this mirrors the evaluation
|
|
99
|
+
write-side cap, and drawing it solid is a Mode-5 Cartography defect.
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
# Cartography — Information Architecture reference (Mode 4, artifact 1 of 3)
|
|
2
|
+
|
|
3
|
+
The method + template for `evaluation/information-architecture.md`. Spine + inputs + orchestration are
|
|
4
|
+
in [`cartography.md`](cartography.md); the other two artifacts in [`cartography-flows.md`](cartography-flows.md)
|
|
5
|
+
and [`cartography-coverage.md`](cartography-coverage.md).
|
|
6
|
+
|
|
7
|
+
The IA doc is the map of **how the product is organized for the operator**. Walk the live app
|
|
8
|
+
(read-only, in-app nav — never a full reload mid-walk, ingestion §9.4); for every reachable surface
|
|
9
|
+
record its **depth**, whether it is **promoted** or **buried**, its **operator capability**, its
|
|
10
|
+
**route**, the **wire endpoints** it fires, and the **entities** it touches.
|
|
11
|
+
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
## The depth taxonomy (the load-bearing measure)
|
|
15
|
+
|
|
16
|
+
A capability's _depth_ is the product's implicit priority signal — record it **numerically**:
|
|
17
|
+
|
|
18
|
+
| Depth | Meaning | Example |
|
|
19
|
+
| --- | --- | --- |
|
|
20
|
+
| **D0** | a top-level nav destination (sidebar / top-bar item) | `Products`, `Settings` |
|
|
21
|
+
| **D1** | a list / index under a D0 destination | the product grid; the attributes list |
|
|
22
|
+
| **D2** | a detail / editor surface, or a tab within it | a product edit form; an attribute's config |
|
|
23
|
+
| **D3+** | a sub-panel, modal, drawer, or nested tab | "Ask AI" panel; a variant-axis editor; a workflow-config sub-tab |
|
|
24
|
+
|
|
25
|
+
**Promoted** = the capability is a D0/D1 first-class destination. **Buried** = it is only reachable at
|
|
26
|
+
≥D2 (often D3+), behind a detail surface or a menu. Depth is what makes the two reconciliations below
|
|
27
|
+
computable.
|
|
28
|
+
|
|
29
|
+
---
|
|
30
|
+
|
|
31
|
+
## The two reconciliations that matter
|
|
32
|
+
|
|
33
|
+
1. **Positioning-vs-product (the buried flagship).** A feature the **marketing** promotes — a verb on
|
|
34
|
+
the homepage, a named hero capability — that lives at **≥D3** in the product is a real finding. Name
|
|
35
|
+
it; it feeds `feature-coverage.md`'s _buried flagships_ section. (A "Workflow engine" splashed on the
|
|
36
|
+
site but reached only via a product → menu → sub-tab is the canonical case.)
|
|
37
|
+
2. **Unmarketed depth (the inverse).** A deep, powerful surface the marketing **never mentions** (a rich
|
|
38
|
+
admin/config/automation surface, a governance log, a bulk-action engine) is equally a finding — it
|
|
39
|
+
feeds `feature-coverage.md`'s _unmarketed depth_ section.
|
|
40
|
+
|
|
41
|
+
Both are computed by comparing the **walked nav depth** (this doc) against the **claimed feature
|
|
42
|
+
catalog** (`cartography-coverage.md`).
|
|
43
|
+
|
|
44
|
+
---
|
|
45
|
+
|
|
46
|
+
## Surface cards (the screen layer that realizes the entity spine)
|
|
47
|
+
|
|
48
|
+
One card per **primary** surface (each D0 destination + each materially distinct D1 list and D2 detail
|
|
49
|
+
surface). The card is the join between the IA and the data model:
|
|
50
|
+
|
|
51
|
+
```markdown
|
|
52
|
+
### <Surface name> [route · depth Dn · promoted | buried]
|
|
53
|
+
- **Capability:** what the operator can do here (read / create / edit / configure / run)
|
|
54
|
+
- **Entities:** the domain entities it surfaces (link → data-model-api-surface.md)
|
|
55
|
+
- **Endpoints:** the app-own wire calls it fires (link → _shared/api-path-catalog.md)
|
|
56
|
+
- **Screenshot:** captures/screens/<nn>-<surface>.png (or: gap — reason)
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
> **Cross-dimension reconciliation (a route that's in the bundle but not in the nav).** Diff the walked
|
|
60
|
+
> nav against `deployed-client-bundle`'s `route-table.md`: a route present in the bundle but **never
|
|
61
|
+
> reachable in the live nav** is a **dormant / unshipped surface** — a finding, not noise. (On a
|
|
62
|
+
> server-rendered / RSC app, a bundle route count can overstate the client surface — fold that into the
|
|
63
|
+
> note rather than reporting a phantom "unused routes" gap; ingestion §9.4 RSC check.)
|
|
64
|
+
|
|
65
|
+
---
|
|
66
|
+
|
|
67
|
+
## The output template — `evaluation/information-architecture.md`
|
|
68
|
+
|
|
69
|
+
```markdown
|
|
70
|
+
# <Target> — Information Architecture
|
|
71
|
+
## TL;DR (org-shape in 3–5 sentences: how many top-level destinations, what's promoted vs
|
|
72
|
+
folded, the deepest important surface, the biggest positioning-vs-product gap)
|
|
73
|
+
## Nav tree (the full hierarchy as an indented tree or table: top-level → section → list →
|
|
74
|
+
detail → sub-tab; tag each node with depth D0/D1/D2/… and [promoted]/[buried])
|
|
75
|
+
## Surface cards (one per primary surface — the card shape above)
|
|
76
|
+
## Promoted vs buried (the headline reconciliation: first-class destinations vs surfaces hidden N
|
|
77
|
+
levels deep — name the surprises in BOTH directions: buried flagships AND
|
|
78
|
+
unmarketed depth)
|
|
79
|
+
## Admin / settings depth (the configuration surfaces + how deep they sit)
|
|
80
|
+
## Global affordances (command palette, global search, create-anywhere, keyboard shortcuts — if present)
|
|
81
|
+
## Cross-dimension reconciliation (nav-as-walked vs the bundle route-table / docs IA — dormant/unshipped
|
|
82
|
+
routes are findings)
|
|
83
|
+
## Open questions
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
> The IA doc **feeds** `feature-coverage.md`: every surface card's route + depth is what the coverage
|
|
87
|
+
> matrix's `Located? · Route · depth` columns cite, and the promoted-vs-buried headline is what its
|
|
88
|
+
> _buried flagships_ / _unmarketed depth_ sections draw from. Build the IA doc first, then coverage.
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
# Cartography Reference — Mode 4 spine (Information Architecture · UX Flows · Feature Coverage)
|
|
2
|
+
|
|
3
|
+
The reference root for **Cartography** (`discover` harness, **Mode 4**). After Evaluation (Mode 3)
|
|
4
|
+
reconciles the dimensions into the four rollups, Cartography makes the product **legible as a product**:
|
|
5
|
+
it **re-enters the live product** (read-only nav) and compiles three experiential artifacts the
|
|
6
|
+
dimension collectors structurally miss, then runs a **coverage gate** that reconciles every
|
|
7
|
+
_marketed / documented_ feature against **where it actually lives in the product** and **whether the run
|
|
8
|
+
walked it**.
|
|
9
|
+
|
|
10
|
+
The blind spot it closes: a feature **hyped on the website but buried three levels deep** in the product
|
|
11
|
+
— or marketed but **absent from this edition entirely**. Ingestion captures the _raw_ feature lists
|
|
12
|
+
(`website`, `docs`, `community`) and the _entity spine + wire_ (`session`); none of those locate a
|
|
13
|
+
feature in the nav, measure its depth, draw its journey, or save a screenshot.
|
|
14
|
+
|
|
15
|
+
> **Why a distinct mode, not a phase of Evaluation.** Evaluation is **desk reconciliation** of
|
|
16
|
+
> already-captured material. Cartography **re-enters the live product** to walk surfaces, measure nav
|
|
17
|
+
> depth, and capture screenshots — work that needs the **browser singleton** (ingestion §7 rule 9) and
|
|
18
|
+
> a marketed-feature checklist to drive it. It runs **after** Evaluation (so the entity spine +
|
|
19
|
+
> claimed-feature catalog exist) and **before** Self-correction (Mode 5), so the **coverage scorecard**
|
|
20
|
+
> it emits feeds the score and the within-run re-walk.
|
|
21
|
+
|
|
22
|
+
---
|
|
23
|
+
|
|
24
|
+
## The Cartography family (this spine + three artifact references)
|
|
25
|
+
|
|
26
|
+
This file is the **spine** — the inputs, the orchestration, the scorecard handoff, the ethics, the
|
|
27
|
+
degraded modes. Each of the three artifacts has its own focused reference; **read the matching one when
|
|
28
|
+
building that artifact**:
|
|
29
|
+
|
|
30
|
+
| Artifact (output) | Governing reference | One-line |
|
|
31
|
+
| --- | --- | --- |
|
|
32
|
+
| `evaluation/information-architecture.md` | [`cartography-ia.md`](cartography-ia.md) | nav tree + per-surface cards, tagged with **depth** + **promoted\|buried** |
|
|
33
|
+
| `evaluation/ux-flows.md` | [`cartography-flows.md`](cartography-flows.md) | primary journeys as mermaid sequence diagrams, traced from the **observed wire** |
|
|
34
|
+
| `evaluation/feature-coverage.md` + `dimensions/session/captures/screens/` | [`cartography-coverage.md`](cartography-coverage.md) | the **claimed-vs-located-vs-walked** matrix + the **coverage scorecard** + the screenshots |
|
|
35
|
+
|
|
36
|
+
> **Degraded modes are recorded, never faked.** When `auth` is `none` / there is **no authenticated app
|
|
37
|
+
> surface**, Cartography maps only the **public** surfaces (marketing IA + docs IA + the unauth app
|
|
38
|
+
> shell from `deployed-client-bundle`) and records the authed-surface gap in the scorecard. When the
|
|
39
|
+
> live runtime can't be screenshotted (no image tool, or the app never reaches page-idle because of a
|
|
40
|
+
> persistent connection — ingestion §9.5), the **textual surface-map is the accepted fallback** and the
|
|
41
|
+
> `screenshot_coverage` gap is recorded. Cartography never fabricates an IA it could not navigate.
|
|
42
|
+
|
|
43
|
+
---
|
|
44
|
+
|
|
45
|
+
## Inputs (read these first)
|
|
46
|
+
|
|
47
|
+
- `evaluation/product-features.md` + `dimensions/website/raw/features.md` + `dimensions/docs/raw/*` —
|
|
48
|
+
the **claimed feature catalog**: the checklist Cartography must locate. (Community/changelog feature
|
|
49
|
+
claims fold in too.) → drives `cartography-coverage.md`.
|
|
50
|
+
- `evaluation/data-model-api-surface.md` + `dimensions/session/raw/*` — the **entity spine** + the
|
|
51
|
+
observed endpoints, so each surface card names the entities + wire calls it touches → drives
|
|
52
|
+
`cartography-ia.md`; the captured wires (`raw/write-flow.md`, `raw/*-wire.md`, the auth fingerprint)
|
|
53
|
+
are the source for `cartography-flows.md`.
|
|
54
|
+
- `dimensions/session/captures/surface-map.md` + `dimensions/deployed-client-bundle/raw/route-table.md` —
|
|
55
|
+
the **route / nav inventory** to walk (the coverage checklist of surfaces, ingestion §9.4).
|
|
56
|
+
- `dimensions/session/_summary.md` `write_side_observed` / `pass2` flags — gate whether a write/generate
|
|
57
|
+
flow can be diagrammed from **observation** or must be marked **inferred** (ingestion §9.2;
|
|
58
|
+
`cartography-flows.md`).
|
|
59
|
+
|
|
60
|
+
---
|
|
61
|
+
|
|
62
|
+
## The coverage scorecard (the machine-readable handoff to Mode 5)
|
|
63
|
+
|
|
64
|
+
The single load-bearing output of Cartography for the self-correcting loop. It is produced as the
|
|
65
|
+
frontmatter of `feature-coverage.md` (schema + scoring in `cartography-coverage.md`) and read by
|
|
66
|
+
**Self-correction (Mode 5)** two ways:
|
|
67
|
+
|
|
68
|
+
1. **Scores the experiential / IA coverage axis** (the heavily-weighted rubric axis) from
|
|
69
|
+
`feature_location_rate`, `flow_coverage`, `screenshot_coverage`, `ia_nav_complete`.
|
|
70
|
+
2. **Drives the within-run re-walk** from the `located-but-not-walked` queue: Mode 5 re-enters the live
|
|
71
|
+
product (read-only nav), walks the not-yet-walked surfaces, captures the missed screenshots, and
|
|
72
|
+
locates any _deeper-than-looked_ marketed feature — then re-runs Mode 4 and re-scores.
|
|
73
|
+
|
|
74
|
+
A `claimed-but-not-located` feature is **never silently dropped** — it is always dispositioned
|
|
75
|
+
(_deeper-than-looked_ → the re-walk queue · _edition/plan-gated_ and _roadmap-not-shipped_ → a recorded
|
|
76
|
+
gap, not re-walked · _marketing over-claim_ → an `evaluation/product-features.md` over-claim flag).
|
|
77
|
+
|
|
78
|
+
---
|
|
79
|
+
|
|
80
|
+
## How Mode 4 is driven
|
|
81
|
+
|
|
82
|
+
By the **main session** — it owns the browser singleton (ingestion §7 rule 9), and Cartography
|
|
83
|
+
re-enters the live product. Steps:
|
|
84
|
+
|
|
85
|
+
1. Read the inputs (the claimed-feature catalog, the entity spine, the route/nav inventory).
|
|
86
|
+
2. **Walk the live product read-only**, section by section, via in-app nav (never a full reload
|
|
87
|
+
mid-walk, ingestion §9.4). Per surface: record depth + capability + route + the endpoints it fires +
|
|
88
|
+
capture a screenshot. _(method per `cartography-ia.md`)_
|
|
89
|
+
3. Compile `information-architecture.md` (`cartography-ia.md`).
|
|
90
|
+
4. Turn the captured `session` wires into the `ux-flows.md` sequence diagrams (`cartography-flows.md`).
|
|
91
|
+
5. Build the `feature-coverage.md` matrix + emit the **coverage scorecard** (`cartography-coverage.md`).
|
|
92
|
+
|
|
93
|
+
The main session **MAY dispatch sub-agents** (`model: opus`) to _draft_ the three docs from
|
|
94
|
+
already-captured material (overlapping reads, independent writes) — but the **live walk + screenshots
|
|
95
|
+
are main-session only** (browser singleton). **Read-only / no-cost only:** locating a feature never
|
|
96
|
+
requires triggering it — any write/generate/launch trigger stays behind the Pass-2 confirmation gate
|
|
97
|
+
(ingestion §7 rule 4, §9.2), never fired to "see" a feature. **Absences are findings, never silent
|
|
98
|
+
drops** — a claimed-but-not-located feature, an unmapped nav destination, and an undiagrammed primary
|
|
99
|
+
flow are each recorded, and the scorecard makes the gaps machine-readable for Mode 5.
|
|
100
|
+
|
|
101
|
+
---
|
|
102
|
+
|
|
103
|
+
## How the modes use this family
|
|
104
|
+
|
|
105
|
+
Mode 4 reads this spine for the inputs + orchestration + scorecard contract, then the three artifact
|
|
106
|
+
references for each deliverable's method + template. Mode 5 reads the **scorecard** (here) + the
|
|
107
|
+
**Cartography defect category** (`self-correction.md` stage A) to score the experiential axis and drive
|
|
108
|
+
the within-run re-walk. Evaluation's rollups are Cartography's inputs (`evaluation.md`); Cartography's
|
|
109
|
+
screenshots complete the session playbook's surface-map (ingestion §9.5).
|
|
@@ -2,6 +2,8 @@
|
|
|
2
2
|
|
|
3
3
|
`evaluation` reads every `dimensions/<dim>/_summary.md` (its **provenance frontmatter** + Findings) and reconciles them into **cross-dimension** documents under `research/<target>/evaluation/`. The value is the reconciliation — cross-checking views into one coherent picture, **weighted by how each claim was obtained**, with disagreements flagged.
|
|
4
4
|
|
|
5
|
+
> This file governs the **four reconciliation rollups** (technology-architecture, product-features, data-model-api-surface, competitive-positioning) + the README. The three **experiential** docs that also live under `evaluation/` — `information-architecture.md`, `ux-flows.md`, `feature-coverage.md` — are produced by **Mode 4 (Cartography)** and governed by `cartography.md`; Evaluation's rollups are their inputs (the entity spine → IA surface cards; the feature map → the coverage matrix), and Cartography's coverage scorecard feeds Mode 5's experiential-coverage axis.
|
|
6
|
+
|
|
5
7
|
**Three rules for every evaluation doc:**
|
|
6
8
|
|
|
7
9
|
1. **Anchor + tag every claim** with its dimension _and provenance_: `(api: raw/endpoint-catalog.md · openapi-verbatim · high)`. The method + confidence come verbatim from the source dimension's `_summary.md` frontmatter.
|
|
@@ -127,7 +129,7 @@
|
|
|
127
129
|
|
|
128
130
|
## Headline findings (5–10, each anchored+tagged)
|
|
129
131
|
|
|
130
|
-
## How to navigate (00-scope-verdict.md, 00-recon-plan.md, dimensions/, evaluation
|
|
132
|
+
## How to navigate (00-scope-verdict.md, 00-recon-plan.md, dimensions/, evaluation/ [4 reconciliation rollups + Cartography's information-architecture / ux-flows / feature-coverage], 05-self-correction-proposal.md)
|
|
131
133
|
|
|
132
134
|
## Lessons (candidate methodology learnings → feed self-correction)
|
|
133
135
|
|