Skip to content

Implement SPEC-08: handful generator + banded non-domination (Stage 3)#20

Open
IanMayo wants to merge 1 commit into
mainfrom
claude/next-spec-tkiz9e
Open

Implement SPEC-08: handful generator + banded non-domination (Stage 3)#20
IanMayo wants to merge 1 commit into
mainfrom
claude/next-spec-tkiz9e

Conversation

@IanMayo

@IanMayo IanMayo commented Jul 13, 2026

Copy link
Copy Markdown
Contributor

What

/plan/handful — the last unit of the spine (delivery plan §δ): generate → score → organise. A seeded, strategy-biased fan-out over Meridian's four axes produces candidate plans; the SPEC-07 scorer (reused, not re-implemented) turns each into a C1–C6 margin vector; a banded ε-non-domination organiser keeps the plans no other conservatively beats on every commitment, capped by axis diversity — never by a scalar (DEC-19).

This closes both Stage-3 handful exits and completes the spine SPEC-05 → SPEC-06 → SPEC-07 → SPEC-08.

Why it's honest (the point of the slice)

The handful is where a demonstrator could most easily cheat — pick a flattering three and call them "the options". SPEC-08 refuses that by construction:

  • The organiser never invents precision. Distinctness is ε-non-domination on the conservative interval order (A ⪯ B iff A.hi ≤ B.lo). Overlapping bands are honestly incomparable and both survive; a plan is dropped only when another is conservatively at-or-above it on every commitment and strictly separated-above on at least one. No scalar total, weighted sum, or midpoint decides membership (DEC-15, DEC-19).
  • The generator is honest fan-out, not cherry-picking. Candidates come from the domain's own four axes; the handful is what the organiser leaves standing.
  • distinct_because is derived, not captioned — each reason names the commitments a plan leads on and its axis signature.

Decision provenance

Decided in research note 03-score-plan.md §5 (the DEC-11 gate, reserved for SPEC-08 when it gated SPEC-07): banded ε-non-domination and Meridian's four generation axes (closing the concept §6.2 open question under Stage-3 latitude). No new register decision; no schema change (npm run gen not run).

Changes

File Role
src/dominance.ts banded ε-non-domination — noWorse / strictlyBetter / dominates / nonDominated; irreflexive, asymmetric, monotone in ε; violated = conservatively worst
src/generate.ts seeded fan-out over approach × suppression × causeway × extraction → 16 valid Plans (documented axis→route mapping; clean reaches, C4 exercises the banded threat channel)
src/handful.ts HandfulService.handful — clamp count to [3,5], generate/store/score, organise, diversity cap (axis Hamming, FNV-1a seed tie-break), derive distinct_because, deterministic stamp
src/components/handfulStrip.ts + gallery the honest-matrix demo moment now renders the generated handful (organised, not authored)
src/seam.ts HandfulRequest / HandfulSuccess / HandfulResult movement types
specs/008-handful/ spec / plan / tasks / data-model / research / quickstart / contract / checklist
CLAUDE.md · delivery plan · gallery batch propagation

Result on Meridian

/plan/handful over the base world returns 4 genuinely distinct plans — each pair mutually non-dominated, the survivors splitting cleanly along the two trade axes (approach trades C1↔C2, suppression trades C3↔C4) — and same stamp + seed ⇒ identical handful (G1). Every verdict opens a complete trace chain to named knowledge (G3).

Verification

  • npm run typecheck clean
  • npm test163 passed (SPEC-07 baseline + dominance / generate / handful suites)
  • npm run gallery renders the generated handful + distinct_because strip

🤖 Generated with Claude Code

https://claude.ai/code/session_018yWb83axhXcr22oHDWNCoL


Generated by Claude Code

/plan/handful — the last unit of the spine (delivery plan §δ): generate →
score → organise. A seeded, strategy-biased fan-out over Meridian's four
axes (approach × suppression × causeway × extraction) produces 16 candidate
plans; the SPEC-07 scorer (reused, not re-implemented) turns each into a
C1–C6 margin vector; a banded ε-non-domination organiser keeps the plans no
other conservatively beats on every commitment, capped by axis diversity —
never by a scalar (DEC-19).

Decided in research note 03-score-plan.md §5 (DEC-11 gate): distinctness is
ε-non-domination on the conservative interval order (ε defaults to 0,
scale-free); the four generation axes are Meridian's own (closes concept
§6.2). No schema change.

- src/dominance.ts — noWorse / strictlyBetter / dominates / nonDominated;
  irreflexive, asymmetric, monotone in ε; violated = conservatively worst.
- src/generate.ts — documented axis→route mapping; 16 valid Plans, clean
  reaches, C4 exercises the banded threat channel; deterministic in (config, seed).
- src/handful.ts — HandfulService: clamp count to [3,5], generate/store/score,
  organise, diversity cap (axis Hamming, FNV-1a seed tie-break), derive
  distinct_because, stamp over (world.stamp, seed, count, engine).
- src/components/handfulStrip.ts + gallery — the honest matrix now renders the
  generated handful (organised, not authored) with derived reasons.

Both Stage-3 handful exits hold on Meridian: 4 genuinely distinct plans (each
pair mutually non-dominated; survivors split along the two trade axes — approach
C1↔C2, suppression C3↔C4), and same stamp + seed ⇒ identical handful (G1).
Every verdict opens a complete trace chain (G3). specs/008-handful/ via
spec-kit. 163 tests, typecheck clean.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_018yWb83axhXcr22oHDWNCoL
@github-actions

Copy link
Copy Markdown
PR Preview Action v1.8.1

QR code for preview link

🚀 View preview at
https://DeepBlueCLtd.github.io/assay/pr-preview/pr-20/

Built to branch gh-pages at 2026-07-13 07:13 UTC.
Preview will be ready when the GitHub Pages deployment is complete.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants