accept_model(): model+harness acceptance gate. A candidate LLM runs
the spec-to-IR regression corpus and is cross-compared against the rules
baseline at full canonical semantics; both thresholds are required
arguments (acceptance criteria must be prespecified), any pipeline error
rejects the candidate, and the decision is logged as a digest-only
model_acceptance audit event.routing_plan(): derives the execution routing directly from spec
lineage — topological waves, per-variable dependencies, and the two
fail-closed lanes (cycle-blocked and human-routed variables stay waveless).
The ordering is computed, not declared, replacing a hand-registered
process DAG.classify_variables_dual(): runs the rules classifier and the LLM
pipeline independently on the same spec, compares the two translations
per variable at full canonical semantics (ir_fingerprint(level = "full")),
adopts the rules IR on agreement, and escalates any divergence
(disagree / rules_abstain / llm_abstain) to needs_human — no
side is ever silently preferred. The decision is recorded as a
digest-only dual_consensus audit event; dual_disagreements()
extracts the human review queue.Initial release.
# CHECK: validation comments and
provenance sidecars (classify_variables(), render_program(),
write_artifact()).backend = "rules") as the default
baseline; optional LLM translation (backend = "llm", via 'ellmer')
emits IR only — the LLM never writes R code and every model response
is validated against the closed vocabulary before use.execute_one(), execute_study() with
derivation ordering, gates, and manifest generation.