Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .specify/feature.json
Original file line number Diff line number Diff line change
@@ -1 +1 @@
{"feature_directory":"specs/006-compile"}
{"feature_directory":"specs/009-relaxation"}
2 changes: 1 addition & 1 deletion CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -32,4 +32,4 @@ The oracle cases (vignette §9, `O-1…O-4`) are hand-computed and must never be

## Current phase (update this line when it changes)

Stage 0 complete; PR #8 merged to `main`. Register batch 3 ratified (ASSAY-DEC-22…27, closing concept §6.6–6.11) — walkthrough and findings ledger now canonical, G6 a standing invariant. Stage 1 built (issue #10): research note `01-knowledge.md` (DEC-16 floor); SPEC-05 implemented (`src/{seam,deltas,encoding,lint,knowledge}.ts` + `components/{refusalBanner,s1Table}.ts`); all four Stage-1 exits demonstrated on Meridian. Stage 2 built: research note `docs/research/02-compile.md` (DEC-11 gate — decides the **sparse channel representation** from the Stage-0 dense-world numbers + ATP 2-01.3 MCOO doctrine, retiring dense `Channel.cells`); SPEC-06 specified via spec-kit (`specs/006-compile/`) and **implemented** (`src/compile.ts` + `components/channelTrace.ts`; `fixtures/vignette-config.json`; sparse-channel schema regen; 107 tests, typecheck clean; compile demo moment renders in the gallery). All three Stage-2 exits demonstrated on Meridian (K12 contested ⇒ compile refuses `contested_knowledge`, resolve⇒recompile; byte-identical stamp; every channel traces back to named knowledge via `compiled_into` + `source`). The sparse-channel schema change is recorded as a flagged register candidate (concept §6, item 12), built under seam open item 2's delegated authority pending batch ratification. Stage 3 scorer built: research note `docs/research/03-score-plan.md` (DEC-11 gate — **decides the four-stop verdict mapping as signed margin bands, signs-only**: robust iff m_lo>0, marginal iff m_lo=0, tight iff m_lo<0≤m_hi, violated iff m_hi<0 — the unique O-3-satisfying rule with no interior cut; also settles `(cell,time)` route evaluation over a time-expanded graph, closing note 02 §3's forward flag, and reserves ε-dominance for SPEC-08 plan comparison); SPEC-07 specified via spec-kit (`specs/007-score/`) and **implemented** (`src/{interval,materialise,metrics,score}.ts` + `components/s2Matrix.ts`; `fixtures/plans.json` canned handful; no schema change — verdict/score/plan shapes already exist; 139 tests, typecheck clean; the honest-matrix demo moment renders in the gallery). The correctness leg holds on Meridian: oracle O-1 (`[9,13]`), O-2 (robust, margin `[15,19]`), O-3 (four-stop sweep changes only at band edges 9/13) reproduced exactly, and O-4 propagation-honesty (G6) under property-based testing (`fast-check`). SPEC-07 asserts no new register decision (the mapping is decided in the research note under the latitude vignette §9/O-3 delegated to Stage-3). Stage 3 handful built: SPEC-08 specified via spec-kit (`specs/008-handful/`) and **implemented** (`src/{dominance,generate,handful}.ts` + `components/handfulStrip.ts`; new seam types; no schema change) over the same `03-score-plan.md` note (§5 — the DEC-11 gate, deciding **banded ε-non-domination** and Meridian's **four generation axes**). `/plan/handful` = generate (seeded fan-out over approach × suppression × causeway × extraction) → score (reuses the SPEC-07 scorer) → organise (ε-non-domination on the conservative interval order, ε defaults to 0, diversity cap by axis Hamming — never a scalar, DEC-19). Both Stage-3 handful exits demonstrated on Meridian: `/plan/handful` returns **4 genuinely distinct plans** for the base world (each pair mutually non-dominated; the survivors split cleanly along the two trade axes — approach trades C1↔C2, suppression trades C3↔C4), and **same stamp + seed ⇒ identical handful** (G1); 163 tests, typecheck clean; the honest-matrix demo moment now renders the *generated* handful plus a derived `distinct_because` strip (organised, not authored). SPEC-08 asserts no new register decision (the concept §6.2 handful-axes open question is closed by the research note §5.2 under Stage-3 latitude). **Next: Stage 4 SPEC-09 — relaxation / least-worst (`/relax`, `sacrificed` populated, invariant G4), over research note `04-relaxation.md` (DEC-11 gate — to author); then the Stage 4–6 depth fan-out.**
Stage 0 complete; PR #8 merged to `main`. Register batch 3 ratified (ASSAY-DEC-22…27, closing concept §6.6–6.11) — walkthrough and findings ledger now canonical, G6 a standing invariant. Stage 1 built (issue #10): research note `01-knowledge.md` (DEC-16 floor); SPEC-05 implemented (`src/{seam,deltas,encoding,lint,knowledge}.ts` + `components/{refusalBanner,s1Table}.ts`); all four Stage-1 exits demonstrated on Meridian. Stage 2 built: research note `docs/research/02-compile.md` (DEC-11 gate — decides the **sparse channel representation** from the Stage-0 dense-world numbers + ATP 2-01.3 MCOO doctrine, retiring dense `Channel.cells`); SPEC-06 specified via spec-kit (`specs/006-compile/`) and **implemented** (`src/compile.ts` + `components/channelTrace.ts`; `fixtures/vignette-config.json`; sparse-channel schema regen; 107 tests, typecheck clean; compile demo moment renders in the gallery). All three Stage-2 exits demonstrated on Meridian (K12 contested ⇒ compile refuses `contested_knowledge`, resolve⇒recompile; byte-identical stamp; every channel traces back to named knowledge via `compiled_into` + `source`). The sparse-channel schema change is recorded as a flagged register candidate (concept §6, item 12), built under seam open item 2's delegated authority pending batch ratification. Stage 3 scorer built: research note `docs/research/03-score-plan.md` (DEC-11 gate — **decides the four-stop verdict mapping as signed margin bands, signs-only**: robust iff m_lo>0, marginal iff m_lo=0, tight iff m_lo<0≤m_hi, violated iff m_hi<0 — the unique O-3-satisfying rule with no interior cut; also settles `(cell,time)` route evaluation over a time-expanded graph, closing note 02 §3's forward flag, and reserves ε-dominance for SPEC-08 plan comparison); SPEC-07 specified via spec-kit (`specs/007-score/`) and **implemented** (`src/{interval,materialise,metrics,score}.ts` + `components/s2Matrix.ts`; `fixtures/plans.json` canned handful; no schema change — verdict/score/plan shapes already exist; 139 tests, typecheck clean; the honest-matrix demo moment renders in the gallery). The correctness leg holds on Meridian: oracle O-1 (`[9,13]`), O-2 (robust, margin `[15,19]`), O-3 (four-stop sweep changes only at band edges 9/13) reproduced exactly, and O-4 propagation-honesty (G6) under property-based testing (`fast-check`). SPEC-07 asserts no new register decision (the mapping is decided in the research note under the latitude vignette §9/O-3 delegated to Stage-3). Stage 3 handful built: SPEC-08 specified via spec-kit (`specs/008-handful/`) and **implemented** (`src/{dominance,generate,handful}.ts` + `components/handfulStrip.ts`; new seam types; no schema change) over the same `03-score-plan.md` note (§5 — the DEC-11 gate, deciding **banded ε-non-domination** and Meridian's **four generation axes**). `/plan/handful` = generate (seeded fan-out over approach × suppression × causeway × extraction) → score (reuses the SPEC-07 scorer) → organise (ε-non-domination on the conservative interval order, ε defaults to 0, diversity cap by axis Hamming — never a scalar, DEC-19). Both Stage-3 handful exits demonstrated on Meridian: `/plan/handful` returns **4 genuinely distinct plans** for the base world (each pair mutually non-dominated; the survivors split cleanly along the two trade axes — approach trades C1↔C2, suppression trades C3↔C4), and **same stamp + seed ⇒ identical handful** (G1); 163 tests, typecheck clean; the honest-matrix demo moment now renders the *generated* handful plus a derived `distinct_because` strip (organised, not authored). SPEC-08 asserts no new register decision (the concept §6.2 handful-axes open question is closed by the research note §5.2 under Stage-3 latitude). Stage 4 built (thesis B live): research note `docs/research/04-relaxation.md` (DEC-11 gate — **decides the formalism as preemptive lexicographic priority over the `must/should/prefer` tiers with NO weights**: weighted CSP / MAX-SAT / Archimedean goal programming rejected on honesty grounds by DEC-19, lexicographic goal programming chosen; returns the **inclusion-minimal correction-set frontier** not one optimum, ranked least-worst-first with the must-sacrifice kept-but-last; `sacrificed` = exactly the `violated` commitments; a **content-neutral, stated tie-break** for same-tier sacrifices because encoding a civil-harm-vs-force-protection ranking is the value judgement DEC-19 forbids; command-language narratives per MDMP/JP 5-0; the note also corrects course honestly — the SPEC-08 BASE generator routes clear of the banded regions and cannot enter the mined water, so SPEC-09 authors an R3m-responsive candidate set while the **sacrifices stay computed** by the reused scorer); SPEC-09 specified via spec-kit (`specs/009-relaxation/`) and **implemented** (`src/{tiers,relaxCandidates,relax}.ts` + `components/s3Cards.ts`; new seam types; no schema change — `RelaxationReport`/`RelaxationCandidate`/`Plan` already exist; 187 tests, typecheck clean; the "least-worst, never silence" demo moment renders in the gallery). The Stage-4 exit holds on Meridian: `/relax` over R3m returns **three inclusion-minimal least-worst candidates sacrificing C4, C3, C2** (each `sacrificed` non-empty, computed by the scorer — re-scoring each plan violates exactly its `sacrificed` set; the `{C2,C4}`/`{C3,C4}` supersets are inclusion-dropped), ranked least-worst-first (the C2 `must`-sacrifice last but present), the same-tier C3/C4 tie stated in `tie_break`, every card in command language and traced back via `cited_in`/`sacrificed_in` (G3), never empty and never a silent drop (G4). SPEC-09 asserts no new register decision (the formalism is decided *by* DEC-19; the report shape *by* knowledge model §5/§8 and seam §7/§G; latitude is Stage-4-delegated under vignette §6/§9). **Next: the Stage 4–6 depth fan-out — SPEC-10 (scenario robustness, thesis C), SPEC-11/12/13 (analysis: sensitivity / discrimination / staleness), SPEC-14 (gallery/site), all opening on the landed scorer + relax.**
2 changes: 1 addition & 1 deletion docs/assay-delivery-plan.md
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,7 @@ Stage column maps to `assay-build-plan.md`. Research note is the DEC-11 prerequi
| **SPEC-15** | Spine-complete gate harness — asserts content-addressing, stamp determinism, and invariants G2–G5 end-to-end on Meridian; re-asserts the vignette §9 oracle cases and the O-4 propagation-honesty property (candidate G6) | gate | SPEC-05…13 | — |
| **SPEC-16** | Surfaces S1–S4 as config-declared bundles + five narrative scripts + banded-honesty polish pass | 7 | SPEC-14, SPEC-15, services | `07-narratives.md` |

> **Status (2026-07-13, spine through Stage 3):** SPEC-01…04 (Stage 0) and SPEC-05/06/07/08 (Stages 1–3) built and merged/branch-open. The spine `δ` (SPEC-05 → SPEC-06 → SPEC-07 → SPEC-08) is complete: the scorer stands and the honest generator organises a computed handful over it. SPEC-08's *sacrificial-scope* latitude was spent — the canned fallback (`fixtures/plans.json`) is retained for the SPEC-07 suite; the gallery's honest matrix now runs the generated handful. **Next: the depth fan-out `ε` (SPEC-09…13) opens on the landed scorer.**
> **Status (2026-07-13, spine through Stage 3 + first depth slice):** SPEC-01…04 (Stage 0), SPEC-05/06/07/08 (Stages 1–3), and SPEC-09 (Stage 4) built and merged/branch-open. The spine `δ` (SPEC-05 → SPEC-06 → SPEC-07 → SPEC-08) is complete: the scorer stands and the honest generator organises a computed handful over it. SPEC-08's *sacrificial-scope* latitude was spent — the canned fallback (`fixtures/plans.json`) is retained for the SPEC-07 suite; the gallery's honest matrix now runs the generated handful. The depth fan-out `ε` has opened: **SPEC-09 (relaxation / least-worst, thesis B) is built** over research note `04-relaxation.md` — `/relax` returns the inclusion-minimal least-worst frontier (three candidates sacrificing C4/C3/C2 on R3m), ranked by ordinal tier with a stated tie-break, `sacrificed` computed by the reused scorer, never empty and never a silent drop (G4); the "least-worst, never silence" demo moment renders in the gallery. **Next: the rest of the depth fan-out `ε` (SPEC-10 scenario robustness ∥ SPEC-11/12/13 analysis) opens on the landed scorer + relax.**

## 3. Dependency graph & critical path

Expand Down
51 changes: 50 additions & 1 deletion docs/assets/gallery/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -614,7 +614,56 @@ <h2 style="font-size:16px;margin-top:32px">Score & organise — the honest matri
<span class="assay-verdict-chip" title="margin 10 step" style="display:inline-block;min-width:66px;padding:3px 8px;border-radius:11px;font-family:ui-monospace,monospace;font-size:10.5px;font-weight:700;background:#1E6B3A;color:#FFFFFF">robust</span>
</td></tr></tbody>
</table></div>
<p style="font-size:11.5px;color:#5B6B77;margin-top:28px">Generated from <code>fixtures/</code> by <code>npm run gallery</code> · identifiers frozen per assay-vignette.md §8 · compile per research note <code>docs/research/02-compile.md</code> · score per <code>docs/research/03-score-plan.md</code></p>
<h2 style="font-size:16px;margin-top:32px">Relax — least-worst, never silence (SPEC-09)</h2>
<p style="font-size:12.5px;color:#5B6B77">The Stage-4 demo moment, run end-to-end by the actual machinery. Against the <b>R3m</b> world (both approaches mined, the causeway dropped) no plan satisfies C2, C3 and C4 together — by construction (vignette §6). <code>/relax</code> does not pick one compromise and hide the trade: it returns every <b>inclusion-minimal</b> way forward, each naming what it gives up in <b>command language</b>. The sacrifices are <b>computed</b> — a commitment is sacrificed only when the SPEC-07 scorer returns <code>violated</code> for it — not authored. Ranked <b>least-worst first</b> by the commander's ordinal tiers (<code>must / should / prefer</code>, <b>no numeric weight</b> — DEC-19): the two <code>should</code>-sacrifices lead, the <code>must</code>-sacrifice (C2, "the strait opens two days late") is <b>ranked last but present</b> — never dropped, never silent (G4). Plans that give up <i>more</i> — <code>{C2,C4}</code>, <code>{C3,C4}</code> — are inclusion-dominated and never shown as separate options. <span style="font-family:ui-monospace,monospace;font-size:11px;color:#5B6B77">relax stamp 69fd05662fc5b616… · 3 least-worst candidates over R3m, computed not authored · never empty, never a silent drop (G4) · tie-break stated (DEC-19) · each candidate cited_in the report back to named knowledge (G3)</span></p>
<div style="background:#FCFDFD;border:1px solid #D8DFE4;border-radius:6px;padding:14px;overflow-x:auto"><div class="assay-s3-cards">
<ul style="display:grid;gap:10px;margin:0;padding:0">
<li style="margin:0;padding:12px 14px;border:1px solid #D8DFE4;border-radius:6px;background:#FCFDFD;list-style:none">
<div style="display:flex;gap:8px;align-items:baseline;flex-wrap:wrap;margin-bottom:6px">
<span style="font-family:ui-monospace,monospace;font-size:11px;color:#8A97A0">least-worst #1</span>
<span style="font-family:ui-monospace,monospace;font-size:11.5px;font-weight:700;color:#1B2732">RX-fires</span>
<span style="display:inline-flex;gap:6px;align-items:baseline;border:1px solid #C46A1E;border-radius:4px;padding:2px 8px;background:#FFF">
<span style="font-family:ui-monospace,monospace;font-size:11px;font-weight:700;color:#C46A1E">C3</span>
<span style="font-size:10px;text-transform:uppercase;letter-spacing:.04em;color:#C46A1E">should</span>
</span>
</div>
<div style="font-size:12.5px;color:#33424E;margin-bottom:6px">Fires forward — suppress the FAC berths so the group crosses clean and on time, but the fires fall into the populated harbourfront where the craft berth among the fishing fleet.</div>
<ul style="margin:0;padding-left:18px;font-size:11.5px;color:#5B6B77">
<li style="margin:0">gives up: <b>No fires into the populated port district</b> <span style="color:#8A97A0">(C3)</span></li>
</ul>
</li>
<li style="margin:0;padding:12px 14px;border:1px solid #D8DFE4;border-radius:6px;background:#FCFDFD;list-style:none">
<div style="display:flex;gap:8px;align-items:baseline;flex-wrap:wrap;margin-bottom:6px">
<span style="font-family:ui-monospace,monospace;font-size:11px;color:#8A97A0">least-worst #2</span>
<span style="font-family:ui-monospace,monospace;font-size:11.5px;font-weight:700;color:#1B2732">RX-parallel</span>
<span style="display:inline-flex;gap:6px;align-items:baseline;border:1px solid #C46A1E;border-radius:4px;padding:2px 8px;background:#FFF">
<span style="font-family:ui-monospace,monospace;font-size:11px;font-weight:700;color:#C46A1E">C4</span>
<span style="font-size:10px;text-transform:uppercase;letter-spacing:.04em;color:#C46A1E">should</span>
</span>
</div>
<div style="font-size:12.5px;color:#33424E;margin-bottom:6px">Parallel sweep — both approaches cleared at once, fastest to open the strait, but the amphibious group crosses the mined strait before the battery and FACs are suppressed.</div>
<ul style="margin:0;padding-left:18px;font-size:11.5px;color:#5B6B77">
<li style="margin:0">gives up: <b>Amphibious group not exposed to unsuppressed battery or FAC threat</b> <span style="color:#8A97A0">(C4)</span></li>
</ul>
</li>
<li style="margin:0;padding:12px 14px;border:1px solid #D8DFE4;border-radius:6px;background:#FCFDFD;list-style:none">
<div style="display:flex;gap:8px;align-items:baseline;flex-wrap:wrap;margin-bottom:6px">
<span style="font-family:ui-monospace,monospace;font-size:11px;color:#8A97A0">least-worst #3</span>
<span style="font-family:ui-monospace,monospace;font-size:11.5px;font-weight:700;color:#1B2732">RX-sequential</span>
<span style="display:inline-flex;gap:6px;align-items:baseline;border:1px solid #B23A48;border-radius:4px;padding:2px 8px;background:#FFF">
<span style="font-family:ui-monospace,monospace;font-size:11px;font-weight:700;color:#B23A48">C2</span>
<span style="font-size:10px;text-transform:uppercase;letter-spacing:.04em;color:#B23A48">must</span>
</span>
</div>
<div style="font-size:12.5px;color:#33424E;margin-bottom:6px">Sequential sweep — clear one approach then the other, keeping the group clear and the harbourfront quiet, but the strait opens at D+9, two days late.</div>
<ul style="margin:0;padding-left:18px;font-size:11.5px;color:#5B6B77">
<li style="margin:0">gives up: <b>Halcyon Strait swept and open to deep-draught traffic by D+7</b> <span style="color:#8A97A0">(C2)</span></li>
</ul>
</li>
</ul>
<p style="margin:8px 2px 0;font-size:11px;color:#8A97A0"><b>Tie-break —</b> Same-tier sacrifices were ordered by commitment id (C3 vs C4) — a stated, commander-owned placeholder for within-tier priority, not a claim that one sacrifice outranks the other (ASSAY-DEC-19: no numeric weight; ties stated, never silent).</p>
</div></div>
<p style="font-size:11.5px;color:#5B6B77;margin-top:28px">Generated from <code>fixtures/</code> by <code>npm run gallery</code> · identifiers frozen per assay-vignette.md §8 · compile per research note <code>docs/research/02-compile.md</code> · score per <code>docs/research/03-score-plan.md</code> · relax per <code>docs/research/04-relaxation.md</code></p>
</div>
</body>
</html>
Loading
Loading