core/generate/derivation
Shay 9dcb00248c feat(derivation): route accumulation through ADR-0184 S2 semantic ledger
ADR-0184 S1 (state/bind.py, state/change.py) landed the reusable referent and
change-cue helpers. S2 adds the first explicit state-transition substrate and
routes both accumulation readings through it:

- state/model.py   frozen SET/GAIN/LOSS transition model over one entity/unit
                   StateKey, with structural validation (closed op set; unit is a
                   str with "" = unitless, mirroring the extractor's Quantity.unit
                   contract; entity optional, mirroring leading_subject_token).
- state/ledger.py  build_accumulation_ledger() — the proven single-referent
                   gain/loss reading, expressed as a SemanticLedger.
- state/replay.py  replay_accumulation_ledger() — the only bridge to
                   GroundedDerivation; refuses any non-accumulation ledger shape
                   (non-SET start, cross-key mutation).

accumulate.py's _build_accumulation / _build_accumulation_anchor_skip now build a
ledger and replay it instead of constructing the arithmetic chain inline; the
public compose_accumulation()/accumulation_candidates() surfaces are unchanged.

Behavior-equivalent: a byte-for-byte differential over 937 real GSM8K problems
(accumulation_candidates, compose_accumulation, pooled_candidates, resolve_pooled)
shows 0 differences vs main. Semantic worlds never commit directly — replay emits
GroundedDerivation and verify.py / pool.py remain the sole authority. Sealed: no
serving/runtime/chat import; no CLAIMS or eval-lane-SHA movement.

Refs ADR-0184 section 7 (S2).
2026-06-10 12:00:23 -07:00
..
state feat(derivation): route accumulation through ADR-0184 S2 semantic ledger 2026-06-10 12:00:23 -07:00
__init__.py feat: add gsm8k r1 reconstruction 2026-06-04 13:25:11 -07:00
accumulate.py feat(derivation): route accumulation through ADR-0184 S2 semantic ledger 2026-06-10 12:00:23 -07:00
clauses.py
comparatives.py
compose.py
extract.py feat(adr-0163-f2): EX-6 hyphen-bonded unit extraction — pseudo-accumulation confusers refuse (wrong 7->5) (#473) 2026-05-29 12:23:26 -07:00
goal_residual.py feat(r4): flip cv-0005 to serving — train_sample 6/44/0 -> 7/43/0 (ADR-0207 §5 step 2) 2026-06-03 22:20:12 -07:00
model.py
multistep.py feat(adr-0177-cp2a): cue-precision ledger training + measurement (+ unit hygiene) (#461) 2026-05-29 10:21:58 -07:00
pool.py feat(r4): goal-residual production — ADR-0207 §5 step 2 (sealed lane) 2026-06-03 21:50:59 -07:00
product_bridge.py feat(adr-0195): GSM8K product promotion bridge — serving 4/46/0 → 6/44/0, wrong=0 (#500) 2026-05-30 17:33:56 -07:00
r1_reconstruction.py feat: add gsm8k r1 reconstruction 2026-06-04 13:25:11 -07:00
search.py feat(adr-0182): cross-composer disagreement pooling — distractor 0014 + disguised-polarity refuse (confuser wrong 5->2) (#476) 2026-05-29 13:22:19 -07:00
target.py feat(adr-0182): prior-state question guard — temporal-scope confuser refuses (confuser wrong 2->1, pair-tells ->0) (#480) 2026-05-29 14:22:28 -07:00
verify.py feat(derivation): math-serving reach seam — select_self_verified is policy-aware (ADR-0206 §5) 2026-06-06 15:46:14 -07:00