feat(workshop): port spec→plan→compile pattern (4th instance) (v5.59.0) - #24
Merged
Merged
Conversation
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
added a commit
that referenced
this pull request
Jul 27, 2026
…l to mirror (#97) Mirror PR #24. ior was 0.0 wherever the CRSP denominator is unknown, making 'institutions hold none' and 'no denominator' the same value on 42.85% of leg 2. Now null for unknown, 0.0 only for a measured zero. NOTE FOR THE GRID SIDE: merge_panel.sas needs the matching change. In mirror the coupled fix was to merge_panel.py's 'ior_crsp <= 1.2' filter, which drops nulls in polars and would have silently deleted that 42.85% at the merge. SAS WHERE clauses treat missing the same way — 'where ior_crsp <= 1.2' excludes missing values — so if the SAS merge carries that filter it needs 'or ior_crsp is missing' before this reaches a grid run. Kept byte-identical to mirror so leg 2 stays one implementation. Claude-Session: https://claude.ai/code/session_0193ue9M5okF31PoPetXXBmL Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Ports the
spec → plan → compiled-runnerpattern 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-projectrun.js, no DAG. Distinct contribution: a rich-mechanical floor (typst compile+check-all.pyreal exit codes) + a semantic ceiling — a new gate-type data point for the pass #9 run-core extraction.What changed
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:discFromIndexfull-replaces the LLM Discover whenslideIndexis passed; grep-grounded inventory fidelity; notes-compile gate (notes were previously ungated — could ship malformed).workshop-verify.js: keeps theslides.typenumeration + 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).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.args.slideIndex(back-compat fallback). Born-canonical table emitter reconciled; structure-reorder PAUSE fixture.Parity validation (real
~/projects/opvdeck, via theopv-paritypartner)[21,21,21], over-match[0,0,0].~, Track-A count nondeterminism, permanently-red floor, notes gate-gap).Doctrine deepenings (recorded for pass #9)
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.pyrides cross-domain phantom constraints (→ permanently-red gate on every deck), divider-naive overflow,summary.critical≠findings.length.DESIGN:
docs/DESIGN-workshop-spec-plan-compile.md🤖 Generated with Claude Code