Skip to content

feat(workshop): port spec→plan→compile pattern (4th instance) (v5.59.0)#24

Merged
edwinhu merged 1 commit into
mainfrom
worktree-workshop-spec-plan-compile
Jun 26, 2026
Merged

feat(workshop): port spec→plan→compile pattern (4th instance) (v5.59.0)#24
edwinhu merged 1 commit into
mainfrom
worktree-workshop-spec-plan-compile

Conversation

@edwinhu

@edwinhu edwinhu commented Jun 26, 2026

Copy link
Copy Markdown
Owner

Summary

Ports the spec → plan → compiled-runner pattern to the workshop workflow — the 4th instance after ds/dev (exit-code) and writing (judgment). Workshop is writing's twin: flat-parallel section fan-out, compile = DATA work-list, no per-project run.js, no DAG. Distinct contribution: a rich-mechanical floor (typst compile + check-all.py real exit codes) + a semantic ceiling — a new gate-type data point for the pass #9 run-core extraction.

What changed

  • ONE shared parser scripts/workshop/workshop_slide_table.py (canonical 7-col TABLE + legacy 4-field PROSE; tolerant-at-parser, canonical-at-emitter) replaces the doubled LLM Discover and emits a DATA work-list.
  • workshop-generate.js: discFromIndex full-replaces the LLM Discover when slideIndex is passed; grep-grounded inventory fidelity; notes-compile gate (notes were previously ungated — could ship malformed).
  • workshop-verify.js: keeps the slides.typ enumeration + an unbiased free-read semantic join (a candidate menu biased it → appendix over-match, caught by n=3 variance); the parser contributes a JS inventory whitelist applied outside the agent; scope:{checked,notChecked} disclosure (D1 / doctrine feat: improve skill scores (+46% avg across 5 skills) #3).
  • Guard reconciled to validate = build_index().violations (S6, −89 lines). Prose now passes → the shipped opv deck is no longer rejected (parity regression fixed by construction); stale-approval = allow+WARN.
  • Skills wired to run the parser + pass args.slideIndex (back-compat fallback). Born-canonical table emitter reconciled; structure-reorder PAUSE fixture.

Parity validation (real ~/projects/opv deck, via the opv-parity partner)

  • Track A — compile-fail short-circuit byte-identical (zero wasted agents).
  • Track B — n=3 clean after fixing an appendix over-match regression: COVERED [21,21,21], over-match [0,0,0].
  • Parser A/B: generate 21/21 exact + verify 21/21 via semantic join; grep-fidelity independently confirmed file-backed; generate end-to-end PASS.
  • 8 real issues surfaced + folded (parity-regression, cardinality, semantic-join, appendix-over-match, paperPath ~, Track-A count nondeterminism, permanently-red floor, notes gate-gap).

Doctrine deepenings (recorded for pass #9)

  • A join turns semantic exactly when the work-list enumerates from >1 source; the parser owns enumeration, never a drifting-identifier join.
  • Don't feed the deterministic artifact into the semantic step — even as a "helpful menu" it biases it; a JS post-filter > a prompt instruction.
  • Single-sample parity is insufficient for judgment seams — n≥3 variance required.
  • Gate only what you compile (notes are a first-class deliverable).

Tests

parser 37/37 · guard 6/6 · engines 23/23.

Out of scope (separate fast-follow — D-w-8)

Pre-existing mechanical-floor bugs deliberately preserved for parity, fixed separately: check-all.py rides cross-domain phantom constraints (→ permanently-red gate on every deck), divider-naive overflow, summary.criticalfindings.length.

DESIGN: docs/DESIGN-workshop-spec-plan-compile.md

🤖 Generated with Claude Code

Workshop is writing's TWIN — flat-parallel section fan-out, compile=DATA
work-list, no per-project run.js, no DAG. Distinct: a rich-mechanical floor
(typst compile + check-all.py REAL exit codes) + a semantic ceiling.

- ONE shared parser scripts/workshop/workshop_slide_table.py (canonical 7-col
  TABLE + legacy 4-field PROSE; tolerant-at-parser, canonical-at-emitter).
  Kills the doubled LLM-Discover drift mask; emits a DATA work-list.
- workshop-generate.js: discFromIndex full-replaces the LLM Discover (no LLM
  Discover when slideIndex present); grep-grounded fidelity; notes-compile gate.
- workshop-verify.js: KEEPS slides.typ enumeration + an UNBIASED free-read
  semantic join (a candidate-menu biased it → appendix over-match, caught by
  n=3 variance); parser contributes a JS inventory whitelist OUTSIDE the agent;
  scope:{checked,notChecked} disclosure (D1).
- guard reconciled to validate = build_index().violations (S6, shrank 89 lines);
  prose now PASSES → the shipped opv deck no longer rejected (parity-regression
  fixed by construction); stale-approval = allow+WARN.
- skills wired to run the parser + pass args.slideIndex (back-compat fallback).
- born-canonical table emitter reconciled; structure-reorder PAUSE fixture.

Parity-validated end-to-end on the real ~/projects/opv deck (opv-parity):
Track A short-circuit byte-identical (zero wasted agents); Track B n=3 clean
(COVERED [21,21,21], appendix over-match [0,0,0]); parser A/B 21/21 generate +
21/21 verify-via-semantic-join; grep-fidelity file-backed; generate end-to-end
PASS. 8 real issues surfaced + folded.

Tests: parser 37/37, guard 6/6, engines 23/23.

D-w-8 (separate fast-follow, NOT in this port): pre-existing permanently-red
check-all.py phantoms + divider-naive overflow + critical/findings count bug.

DESIGN: docs/DESIGN-workshop-spec-plan-compile.md

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LnjkhBxftHMpZeXmuxCjcE
@edwinhu edwinhu merged commit cddc610 into main Jun 26, 2026
@edwinhu edwinhu deleted the worktree-workshop-spec-plan-compile branch June 26, 2026 19:20
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.

1 participant