Skip to content

Controls batch 19a: a live level move keeps its own length across a Reposition swap - #1717

Merged
tamashi095 merged 13 commits into
mainfrom
codex/controls-batch-19a
Oct 17, 2026
Merged

tamashi095 merged 13 commits into
mainfrom
codex/controls-batch-19a

Conversation

@tamashi095

@tamashi095 tamashi095 commented Oct 17, 2026 •

Copy link
Copy Markdown
Contributor

Controls batch 19a: a live level move keeps its own length across a Reposition swap. When a rebuild changes only an automated fader ride's table while a VCA move or a hand move on that fader is still ramping, the move now runs to its end as the uninterrupted engine runs it, and the revision's watermark reports OUTCOME_EXACT. The conservative fallback flag of batch 17 (B17-R14/R15) is deleted.

Closes #1711

What changed

  • The stage target did not move; the comparison did (Keep a live level move's own length across a Reposition swap #1711 first item, F1 a3ab8b5). The adoption rule compared the curve with fader_gain, which RememberGain moves while grid events are held. So every heard move landed at the swap. A free stage now compares with the kernel's ramp target (BuiltinFaderBank::ramp_target); a held stage keeps fader_gain.
  • The deferred jump (D1, F2 aad5939). At a Reposition adoption a free stage's live ramp is not retargeted. If the target moved, the cell's J jump waits for the move's first free sample (CellState::defer_jump), and a restartable cell holds its grid events until it fires. A free live write and the hold releases clear the deferral. The stretched landing (long_landing, max(J, remaining)) is deleted. Root ruling R19-1: for a moved target with remaining >= J, the old ramp finishes, then the J jump.
  • The owed discharge is kept and gated (G4, F3 83113e5, both-host leg 028db34). The self.owed = false line on a free fader write is observable; a gate is red without it.
  • The conservative flag is deleted (D2, F4 83113e5). LevelMoveWindow and its TransitionFallback term are gone from crates/control-plane/src/control.rs, with their text in abi.rs, the C header, docs/C_ABI_V1_QUALIFICATION.md and both d.ts files. The Carry a following route's column moves exactly into a six-word successor #1713 route flag and its text stay. Every G1, G2 and R19-1 case asserts OUTCOME_EXACT with no fallback on both hosts.
  • Review folds (U1 fold 1 65912a2, 9c164c8; fold 2 6d0a587; unit test 8c2107b). A step of the new table inside a live move's remaining ramp clears the pending deferral, but only when its jump is emitted (otherwise the lane froze until the move's end, or a deferral still owed was dropped). The G2 parity test is a real bit claim against a fresh plan at the fader's node time (the post-insert soft-clip slot has 31 samples of latency).
  • Docs: the batch 19 spec check (d86368c; the closed batch 18 specs Render stored mute automation on the strip #1651-Write a following send's route cell from the shared commit #1653 are removed), root's rulings in the specs (e22541d), two decision-record corrections (0bcac82) and the Decide how adoption treats a rounding-only table difference #1716 placeholder (4889236).

Evidence

  • audit capi pcm_digest bffc21e857b5e134, unchanged (the audit session has no stored automation). 0 violations, 0 allocations.
  • Realtime policy: 168 marked regions (unchanged). No file under crates/engine/src/realtime/ was edited.
  • Sizes: no new render state (CellState.deferred already existed). capi_retained 168,722 of 175,296 (main 168,746; -24 B: the B17-R14 Option<LevelMoveWindow> in the control plane's SessionState is gone). Boot growth 19,857,408 bytes, unchanged (pin 20,971,520). simd128 artifact 4,380,022 B (main 4,384,816; -4,794 B, the deleted landing code).
  • C header: doc-comment-only change (the B17-R14 sentence removed); no symbol, constant or layout changed; check-capi-abi.sh passes.
  • Gates: batch-gates.sh all green on codex/controls-batch-19a at 8c2107b: fmt; bench and realtime policy; host-core clippy default / no-default / all features and the loom spectrum handoff; workspace clippy -D warnings; no-feature release and debug checks; workspace tests (all features); the whole documentation job; builtins, console and effect-runtime fixtures; graph determinism; effect contract; host-core policy; protocol wasm parity; SDK generated and types; C ABI; protocol allocation audit; builtins and builtins-graph trace audits; test-web-audioworklet; check-cross-targets; web build, check-web-audioworklet, SDK headless; CI path routing, test-support CI, browser expected resources, SDK deletions, command reason and kind vocabularies, script reachability; fuzz check.
  • Browsers: chromium, firefox and webkit qualification (--check-matrix --self-test-mutations) all pass at 8c2107b.

Review

A fresh opus-high adversarial reviewer, then a focused verification of each fold (each fold touched render).

Not in this PR

Placeholders to file

  • Decide how adoption treats a rounding-only table difference #1716 "Decide how adoption treats a rounding-only table difference" (.github/ISSUE_SPECS/1716-decide-how-adoption-treats-a-rounding-only-table-difference.md; phase 2). A split table can differ from the old one only in f32 rounding; the cell then jumps over J where a fresh plan never jumps (about 1.7e-4). That is specified D2 behaviour, so EXACT is honest; no gate claims bits for the two-rebuild case.

🤖 Generated with Claude Code


View with [code]smith Autofix with [code]smith
Need help on this PR? Tag @codesmith-bot with what you need.

tamashi095 and others added 13 commits October 17, 2026 17:14
…specs

Amend #1654, #1655 and #1711 against 323433f: fresh anchors, the mapping
onto the batch 17-18 code, the rulings each needs, gates at Simd8 and Simd4
on both hosts, and the authorized paths. #1711 records the diagnosis of the
moving stage target (the adoption rule compares the curve with fader_gain,
not the ramp target) and the owed-discharge gate. Remove the closed specs
#1651-#1653; git history keeps them.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… the #1713 note)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
 F1)

settle_adoption compared the curve with fader_gain, which RememberGain moves
while grid events are held, so every heard level move landed at the swap.
A free stage now compares with the kernel's ramp target
(BuiltinFaderBank::ramp_target); a held stage keeps fader_gain. G1 is now
bit-equal for VCA and hand moves heard 1, 12, 24, 26 and 30 blocks, on the
C ABI and in host-core at Simd8 and Simd4 (red without the fix).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… F2)

At a Reposition adoption, a free stage's live ramp now runs to its end as
the uninterrupted engine runs it; a moved target defers the cell's J jump
to the first free sample after the ramp (CellState::defer_jump), and a
restartable cell holds its grid events until the deferral fires. A free
live write and the hold releases clear the deferral. The stretched landing
(long_landing, max(J, remaining)) is deleted. Gates G2 and R19-1 on the C
ABI, in host-core at Simd8 and Simd4, and as a both-host parity case.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…1711 F3, F4)

G4: an exact unmute that frees a held lane discharges the owed move (C ABI
and every host-core form; red with the line deleted). D2: LevelMoveWindow
and the B17-R14/R15 TransitionFallback term are deleted, with their doc
text in abi.rs, the C header, C_ABI_V1_QUALIFICATION.md and both d.ts files
(the #1713 text stays). Every G1, G2 and R19-1 case now asserts
OUTCOME_EXACT with no fallback on both hosts.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…t 1)

A step of the new table inside a live move's remaining ramp fired its own J
jump but left the deferral pending, so the grid stayed held and the lane
froze until the move's end while the watermark said EXACT. A discontinuity
jump on a restartable cell now clears the deferral. Host-core gates at
Simd8 and Simd4 (red before: sample 2,944, 2.9e-2) and a gate for a hand
mute inside a pending deferral.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…d 1, part 2)

C ABI and both-host gates for a table step inside a deferred move's ramp
(red with the fix reverted); the outcome-only two-rebuild test is deleted
(its no-move EXACT check moves into G1); the deleted mute-curve parity
case's bit check is restored; the G2 parity test now carries the committed
hand offset so the deferral is exercised on both hosts.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The fold-1 clear ran before jump_event, so an unchanged value at a
discontinuity dropped a deferral that was still owed (in the shared walk a
value grid then cut a gate jump). The clear now runs only when the jump is
emitted. K1 gate an_unchanged_value_jump_keeps_the_gate_deferral (red
before). The G2 parity test compares every block with a fresh pair whose
step sits at the fader's node time (the soft-clip slot's 31 samples).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…le difference (phase 2)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Batch 19a ships #1711 alone (option C). The fold-2 rule's K1 gate ships
with K1 in 19b, so a small events.rs unit test now holds the rule: a
discontinuity whose jump emits nothing keeps a pending deferral (red
with the fold-1 rule). The 1711 spec records the note.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@tamashi095
tamashi095 merged commit a3a963f into main Oct 17, 2026
22 checks passed
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.

Keep a live level move's own length across a Reposition swap

1 participant