- split_prereq_op_dataset.py: extract accepted/rejected/schema-drift rows per gate - gen_prereq_op_rsa_data.py: convert accepted rows to Fabricate TSV format - 1000-run extracted dataset: 1297 accepted prereq_op rows, 24 schema-drift - Key finding: needs_validate_intake always True; effective gate is binary (needs_resolve_dependencies 77%, needs_architect_review 20%) - Key finding: run corpus text is template-driven (17 unique inputs) — not suitable for text-based training; RSA exists before ideal input is available - ROADMAP: gate lifecycle framing — goal is choice of backend, not forced determinism; RSA operates on imperfect/mixed/incomplete input by design - training_data_strategy.md: taskitem-as-self-contained-work-unit constraint - SPRINT-003: updated with 1000-run results, text audit findings, design constraints - SPRINT-004: pipeline decision audit — manual walkthrough of every decision from project description to generated artifact; execute next session Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
17 KiB
Sprint 003: WhetstoneDSL Gate Semantic Bootstrap
Status
Active — pending intake contract design (see Architectural Constraint below)
Intent
Turn the current RSA architecture and gate inventory into an executable semantic
bootstrap focused on the first concrete whetstone_DSL case-study gates.
This sprint exists to close the gap between:
- generic RSA architecture
- generic semantic bootstrap language
- actual
whetstone_DSLdecision surfaces
The output of this sprint should be concrete enough that later work can proceed without re-deriving what the first real gates are or how they map into semantic entities.
Architectural Constraint — Intake Contract
Discovered this session. This constraint changes how RSA training data is sourced.
The current whetstone_DSL run corpus predates a planned intake contract. The intended design is that external tools (HiveMind, gleaner, constcad, etc.) submit project descriptions in a structured contract format that explicitly carries the fields needed to make RSA gate decisions bounded and classifiable.
Without the contract, the intake produces ~18 unique template outputs regardless of project. With the contract, every project submission becomes a varied, labeled training example with known decision-relevant fields.
Correct pipeline (with contract):
External tool
↓ submits structured project description (contract fields)
Intake contract schema ← explicit per-field semantics
↓
architect_intake reads contract, produces normalized form
↓
RSA gates fire on contract fields ← bounded, varied, discriminative
↓
generate_taskitems ← deterministic given gate outputs
Implications for RSA design:
- Gate input features are contract fields, not free-form text
- Training data comes from contract submissions, not ad hoc specs
- The current corpus is valid for label schema validation only
- Sprint plan step descriptions remain a valid interim text source for baseline training
- The contract schema must be defined before RSA training data can be collected at scale
Next design milestone (not this sprint):
Define the intake contract schema: what fields must an external tool provide, and which
fields are the discriminative inputs for each immediate RSA gate (verification_type,
worker_type, prereq_op_selector, cpp_raising_profile).
Why This Sprint Exists
SPRINT-002-rsa-semantic-bootstrap.md established the architectural direction,
but it is still too abstract to drive direct implementation.
We now have a concrete inventory in:
docs/case_studies/whetstone_dsl_gate_inventory.md
The next step is to operationalize that inventory into:
- first concrete case-study gate records
- explicit semantic mapping rules
- clear enum-vs-structured-output boundaries
- acceptance criteria for what counts as a completed bootstrap
Scope
This sprint is still semantic-first.
Primary outputs:
- a detailed sprint plan for the first case-study gate set
- semantic records for the first concrete
whetstone_DSLgates - mapping notes from
whetstone_DSLdecision surfaces into RSA entities - explicit skeleton targets for later structured-output gates
This sprint does not require:
- model training
- wiring RSA runtime into
whetstone_DSL - replacing current
whetstone_DSLheuristics - projecting full Whetstone-authored AST entities yet
Primary Gate Set
These are the first concrete RSA case-study gates for bootstrap:
Immediate RSA gates
verification_typeworker_typeprereq_op_selectorcpp_raising_profile
Skeleton-first semantic decisions
execution_contract_shapeworkstream_groupingtarget_file_selection
Gate Definitions To Lock Down
1. verification_type
Source surface:
RegisterArchitectIntakeTools.h
Decision form:
- bounded enum
Expected outputs:
unitschemadocssmoke
Contract interpretation:
- unstructured textual input
- bounded discrete output
- stable policy
- deterministic downstream verification behavior
2. worker_type
Source surface:
TaskitemGeneratorV2.h
Decision form:
- bounded enum
Expected outputs:
implementerreviewerarchitectqa
Contract interpretation:
- unstructured or hybrid textual input
- bounded discrete output
- mixed context sensitivity
- deterministic downstream routing behavior
3. prereq_op_selector
Source surface:
TaskitemGeneratorV2.h
Decision form:
- bounded structured output
- factorized / multi-label candidate
Expected atomic outputs:
validate-intakearchitect-reviewresolve-dependencies
Contract interpretation:
- hybrid semantic gate
- not a good flat multiclass default
- primary probe target for factorization analysis
4. cpp_raising_profile
Source surface:
RegisterCppRaisingTools.h
Decision form:
- bounded enum
Expected outputs:
safe-firstperf-firstinterop-first
Contract interpretation:
- structured symbolic input
- bounded discrete output
- deterministic downstream execution and artifact generation
Skeleton Decisions To Represent But Not Train Yet
execution_contract_shape
Why skeleton first:
- output is structured
- current semantics are implicit across many heuristics
- not yet stable enough as a direct training target
Required semantic fields:
- target files
- required tools
- acceptance commands
- step sequence
- cross-project targets
- resource locks
workstream_grouping
Why skeleton first:
- current logic mixes lexical grouping with semantic bundling
- good future structured-output gate
- not yet clean enough for direct benchmark comparisons
target_file_selection
Why skeleton first:
- current logic is bounded but still heavily heuristic
- needs clearer contract and evaluation rules before training
Deliverables
Deliverable A: Case-study gate records
Update the semantic bootstrap so it explicitly records:
- gate identity
- ontology fields
- output labels or slot schema
- candidate gate shape
- deterministic baseline availability
- downstream executor kind
for the four immediate gates.
Status:
- complete in
semantic/rsa_semantic_bootstrap_v0.json
Deliverable B: Mapping rules
Write down the mapping from current whetstone_DSL code surfaces into RSA
semantic entities:
TaskitemGeneratorV2TaskitemConfidenceAmbiguityRegisterArchitectIntakeToolsRegisterCppRaisingToolsRoutingEngine
Status:
- complete in
docs/case_studies/whetstone_dsl_semantic_mapping.md
Deliverable C: Structured-output bootstrap boundary
Define how prereq_op_selector and execution_contract_shape are represented
without collapsing them into flat labels.
Status:
- partially complete
execution_contract_shapeskeleton captured indocs/case_studies/whetstone_dsl_execution_contract_shape_skeleton.md- extraction rules for
prereq_op_selectorand execution-contract child decisions captured indocs/case_studies/whetstone_dsl_gate_extraction_specs_v0.md - machine-readable extraction contracts captured in
semantic/rsa_gate_extraction_contracts_v0.json
Deliverable D: Artifact-grounded extraction path
Define which surviving whetstone_DSL corpora can support RSA-aligned
extraction, and which should remain context or evaluation corpora.
Status:
- partially complete
- audit captured in
docs/case_studies/whetstone_dsl_run_artifact_audit.md - first extraction rules captured in
docs/case_studies/whetstone_dsl_gate_extraction_specs_v0.md - parser-facing extraction contracts captured in
semantic/rsa_gate_extraction_contracts_v0.json
Active Next Task
Use semantic/rsa_gate_extraction_contracts_v0.json to draft the first
artifact parser for:
prereq_op_selectortarget_file_selectionacceptance_command_selectionrequired_tool_selection
Status:
- complete
- parser implemented in
tools/extract_gate_rows.py - sample output generated in
semantic/extracted_gate_rows_sample.ndjson
Next Active Task
Run the parser over a broader taskitem-run slice and review extraction yield by:
- gate id
- provenance class
- rejection-flag frequency
Status:
- complete for first 50-run slice
- output captured in
semantic/extracted_gate_rows_slice.ndjson - yield review captured in
docs/case_studies/whetstone_dsl_extraction_yield_snapshot.md
Updated Working Conclusion
The first extraction-ready dataset candidate is:
prereq_op_selector
The following remain explicit but review-gated due to strong sibling-uniform template behavior in the current slice:
target_file_selectionacceptance_command_selectionrequired_tool_selection
Next Active Task
Turn prereq_op_selector into the first accepted dataset slice, with:
- accepted rows
- rejected rows
- explicit schema-drift examples
Status:
- complete for the 50-run slice
- split produced by
tools/split_prereq_op_dataset.py - outputs at
semantic/prereq_op_dataset/accepted.ndjson— 94 rowsrejected.ndjson— 12 rows (all schema-drift)schema_drift.ndjson— 12 rows (same set; all rejections are schema-drift)
Key Findings From Split
Label distribution (accepted rows):
| Combo | Count |
|---|---|
| validate_intake only | 13 |
| validate_intake + resolve_dependencies | 47 |
| validate_intake + architect_review | 34 |
needs_validate_intake is always True across all 94 accepted rows.
This means:
validate_intakeis not a decision surface — it is a constant output in this corpus.- The effective gate is a 3-way classification:
validate_only(13 rows, 13.8%)validate+resolve(47 rows, 50%)validate+architect(34 rows, 36.2%)
- Or equivalently, two independent binary decisions:
needs_resolve_dependencies(47/94 = 50%)needs_architect_review(34/94 = 36%)
Schema-drift rows carry valid label signal. The 12 rejected rows have correct
needs_* booleans. The only issue is source_values contains tool IDs mixed
with valid op names. Salvage path: re-extract only the valid op names and strip
the tool IDs, then accept the row.
Decision Required Before Broadening
Before running over more runs, decide:
-
Hard-filter or salvage schema-drift rows?
- Hard-filter: discard 12 rows, keep extraction simple.
- Salvage: strip invalid values from
source_values, promote to accepted. - Recommendation: hard-filter for the first training run. Salvage later if the accepted corpus stays small after broadening.
-
Flat 3-way vs factorized binary formulation?
- Flat 3-way: treat as single multiclass with 3 outputs (ignoring validate_intake).
- Factorized binary: two independent classifiers for
architect_reviewandresolve_dependencies.validate_intakeis dropped as a constant. - Recommendation: factorized binary. The two decisions appear semantically orthogonal in the data.
1000-Run Extraction Results
Output at semantic/prereq_op_dataset_1000/ (1000 runs, 1321 tasks):
- accepted: 1297 rows
- rejected: 24 rows (all schema-drift)
- schema drift variants:
- tool-ID drift (
whetstone_generate_taskitems, etc.): 12 rows manual-approvaldrift: 12 rows (undocumented op name inprerequisiteOps)
- tool-ID drift (
Label distribution (1000-run accepted):
| Combo | Count | Pct |
|---|---|---|
| validate_intake + resolve_dependencies | 996 | 76.8% |
| validate_intake + architect_review | 256 | 19.7% |
| validate_intake only | 44 | 3.4% |
| all three | 1 | 0.1% |
needs_validate_intake remains always True at 1000-run scale.
Effective gate at 1000 runs:
needs_resolve_dependencies: 997/1297 = 76.9% positiveneeds_architect_review: 257/1297 = 19.8% positive
Class imbalance for needs_architect_review (~80/20) is manageable for training.
The validate_intake constant can be dropped from the label space.
Both schema-drift variants are salvageable: valid bits (needs_*) are correct;
only source_values contains noise. Recommendation: hard-filter for first training
run, evaluate whether 24 extra rows are worth a salvage pass after.
Text Feature Audit — Critical Finding
Attempted text composition from extracted row context fields: title, reasons,
normalized_requirements. Result:
- unique texts across 1297 rows: 17 (title+reasons), 18 (acceptance criteria)
- top text appears 697 times ("Execution Readiness Primary | high_confidence_clear_path")
- structured features (confidence, dependency count) are also nearly constant
Root cause: The whetstone_DSL corpus uses a small set of canonical intake specs (~18 unique templates) run many times. All tasks generated from the same intake share the same context text. The step description text — the actual discriminative feature — is not stored in run artifacts.
Conclusion:
The run corpus captures labels correctly but not the text features needed to train a text-based prereq_op specialist.
The correct training data source for text input remains sprint plan step descriptions
(as used by gen_prereq_op_data.py in the specialist fleet). The run corpus contributes:
- validated label schema
- label frequency distribution (validate-intake constant, resolve 77%, architect 20%)
- schema-drift pattern documentation
- corpus for future label-correction of heuristic sprint-plan data
Data strategy going forward:
| Source | Role |
|---|---|
| Sprint plan step descriptions | Primary text input for training |
Run corpus (accepted.ndjson) |
Label validation and frequency baseline |
| Run corpus schema-drift rows | Schema-drift taxonomy for robustness testing |
The sprint plan approach is already implemented in:
CLionProjects/whetstone_DSL/specialists/scripts/gen_prereq_op_data.py
That script uses keyword heuristics to assign labels. The RSA extraction work validates that the heuristic label schema is correct; improving label accuracy requires linking sprint plan steps back to run artifacts (not yet feasible).
Next Active Task
Proceed to training using existing sprint plan data with the factorized binary formulation:
- Run
gen_prereq_op_data.pyto regenerate sprint plan TSVs. - Split into two binary TSVs (resolve / architect) using
prereq_op_binary_split.py. - Train both specialists with
train_specialist_pt.py. - Evaluate combined accuracy against the 4-way eval set.
The RSA-extracted accepted.ndjson dataset remains available as a label-validation
reference and can be used for post-training audit (do sprint-plan-trained specialists
generalize to real run labels?).
execution_contract_shapeskeleton is now defined indocs/case_studies/whetstone_dsl_execution_contract_shape_skeleton.mdtarget_file_selectionandworkstream_groupingstill need explicit skeleton field sets
Deliverable D: Probe-readiness notes
Record which probes should apply first to each gate:
confidence_threshold_probefactorization_probeschema_stability_probedeterministic_rule_probecontext_width_probe
Status:
- partially complete
- immediate-gate probe candidates are recorded in the gate inventory and bootstrap notes
- still needs a single consolidated probe-readiness artifact
Recommended Execution Order
- Extend the semantic bootstrap artifact with the first four case-study gates.
- Record mapping notes from each current
whetstone_DSLimplementation surface. - Represent
prereq_op_selectoras structured/factorized rather than flat. - Represent skeleton-only decisions for execution-contract shaping and grouping.
- Record which current gates should remain deterministic.
- Leave runtime wiring and training for later sprints.
Current progress:
- steps 1, 2, and 3 are complete
execution_contract_shapeis complete enough for first-pass skeleton treatmenttarget_file_selectionis now the active task
Acceptance Criteria
- the sprint names a fixed first gate set rather than speaking about gates in the abstract
- the semantic bootstrap artifact contains explicit records for:
verification_typeworker_typeprereq_op_selectorcpp_raising_profile
- each gate is classified as enum, structured, or factorized
- at least three skeleton-first decision entities are identified and justified
- deterministic-baseline gates are explicitly separated from RSA gates
- the sprint is actionable without reopening architecture debate
Not In Scope
- training a new specialist
- modifying
whetstone_DSLruntime code - adding new RSA C++ runtime classes unless needed for semantic alignment
- making Whetstone AST the full live authoring source this sprint
Exit Condition
This sprint is complete when a later session can answer all of the following without ambiguity:
- what are the first real
whetstone_DSLgates in RSA terms - which are enum versus structured-output
- which should remain deterministic
- which structured decisions need skeleton treatment before training
- what the first semantic bootstrap records look like
Immediate First Task
Extend semantic/rsa_semantic_bootstrap_v0.json with a case-study gate section
covering:
verification_typeworker_typeprereq_op_selectorcpp_raising_profile