Skip to content

Controls batch 19b: stored VCA offset and mute automation, composed with each member's own curves - #1719

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

tamashi095 merged 49 commits into
mainfrom
codex/controls-batch-19v

Conversation

@tamashi095

@tamashi095 tamashi095 commented Oct 17, 2026 •

Copy link
Copy Markdown
Contributor

Controls batch 19b: stored VCA automation renders, on a shared merged automation walk. A VCA's own offset_db and mute rows (#1655) now play on the C ABI and in the browser alike through the VCA's members, in each member's own fader node time. The merged walk K1 composes every curve a lane hears into one state. #1654's route-op machinery ships for its production callers. Send-row automation stays off.

Closes #1655

What changed

Evidence

  • LIVE_FOLLOW_ROUTE_OWNER_BYTES: 352 on main, 824 here (x86-64). Reason: a following route now keeps the merged-walk state of both columns inline (FollowCursors: the K1 cursors of the source-mute and VCA-mute curves it hears, the jump rule, the carry flags) and the block's node spans and jump lengths (FollowBlock). The cost applies to each following route only. It is charged under the existing caps.
  • capi_retained 168,746 of 175,296 (19a main 168,722; +24 B: the control plane's SessionState keeps the send move window, Option<SendMoveWindow>, where 19a deleted the B17-R14 level-move window; it equals the pre-19a value).
  • Boot growth 19,857,408 bytes, unchanged (pin 20,971,520). simd128 artifact 4,480,805 B (main 4,380,022; +100,783 B, +2.3 %: K1, the VCA fader stage and the route op).
  • audit capi pcm_digest bffc21e857b5e134, unchanged (the audit session has no stored automation). 0 render errors, 0 allocations.
  • Realtime policy: 171 marked regions in 34 files (main 168; the new regions are K1 and route-op render code). No file under crates/engine/src/realtime/ was edited.
  • C header: doc-comment-only change (one sentence beside Carry a following route's column moves exactly into a six-word successor #1713's). No symbol, constant or layout changed. check-capi-abi.sh passes.
  • Gates: batch-gates.sh all green on codex/controls-batch-19v at 2a39f5e: 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 2a39f5e.

Review

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

  • U2 (K1 + Render stored send gain, mute and matrix automation #1654): FAIL (four route-column re-time defects) -> fold 1 -> verification FAIL -> fold 2 -> verification FAIL (the owed landing: a further rebuild dropped it; a seek left a stale value). Root ruling B19-R7: split (remove the owed landing, land at once, flag conservatively). Its check FAILed, and so did the B19-R8 check (a broadened flag) and the B19-R9 check (the whole flag term: a move committed while a rebuild is pending, and the landing tail). Root ruling B19-R10: send rows off, machinery kept. B19-R10 check: PASS, no MAJOR. MINOR-1 (the flag only over-reports) is stated above and in Land a removed send row exactly across a live move #1718. MINOR-2 (three stale "cuts a move" comments) is reworded in 2a39f5e. NIT-1 (under the pending-rebuild shape, a removed muting curve opens over the live move's own ramp, as a live record does on one plan) is recorded in Land a removed send row exactly across a live move #1718.
  • U3 (Render stored VCA offset and mute automation #1655): FAIL (MAJOR-1: a composed fader lane's hold outlived another curve's step) -> fold 1 -> verification PASS. Its MINOR-1 (the compose_toward wording) is fixed in 194fe34.
  • Root rulings R19-1 to R19-6, B19-R7 to B19-R10.

Not in this PR

Placeholders to file

  • Land a removed send row exactly across a live move #1718 "Land a removed send row exactly across a live move" (.github/ISSUE_SPECS/1718-land-a-removed-send-row-exactly-across-a-live-move.md; phase 2). It lands a removed send row (or source-mute curve) exactly across a live send move, and keeps a live send move on any rebuild that carries an automated following send. It deletes the conservative flag. It is amended with the last check's two MAJORs: W1, a live send move committed while a rebuild is pending is cut at adoption and the pending candidate is never marked; W2, the window closes at the record ramp's end while the column's R19-3 landing tail still runs. Render stored send gain, mute and matrix automation #1654 builds on it.

🤖 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 30 commits October 17, 2026 12:31
…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>
…an offset (#1654 T1)

Route rows 1-6 of a route into a submix join automation_row_renders; route
gain_db takes the hand offset (one shared value; differing left/right bits
are refused control.automation.offset); the in-place owner rule covers
route row 1; the listing reports the offset and automated = true. The
host-core lowering and render come in later tranches.

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>
The seven-word route flags word gains plan-fixed bits 6-11 (automated
gain, own mute, matrix ll/lr/rl/rr); a follow-route source accepts a route
with only route-row cells; per-row jump lengths (source mute, SendGain,
SendMatrix) replace the mute-only jump rule; graph_compiler::route_gain_law
is the one dB law (route_transform calls it with offset -0.0, bit for bit).
Types only: no render behaviour change. Realtime policy 168 -> 170.

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>
… offset (#1655 V0)

VCA rows offset_db and mute join automation_row_renders; offset_db takes a
per-lane hand offset (fader domain); the in-place owner rule covers it and
the listing reports the offset with automated = true. New event-lane
predicates and the reach rule (a reach change of an automated VCA is a
rebuild). S sums own hand offset, static offsets of non-automated VCAs, then
hand offsets of automated VCAs (root's class B order); with no VCA offset
automation every bit is unchanged.

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>
# Conflicts:
#	crates/controls/src/automation.rs
crates/automation/src/compose.rs walks K curve cursors into one composed
output per caller (a route column now, a VCA member channel in #1655). It
reuses CellState's decisions, now pub(crate) in events.rs and used by
CellEvents itself (no behaviour change): grid events are held while a jump
or a deferral runs; at the column ramp's end each moved value lands over
its own J; coincident events take the longest jump (R19-4). K = 1 gives
CellEvents' event stream exactly (differential over the corpus and a
seeded generator); the walk is allocation-free. Realtime policy 171.

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>
# Conflicts:
#	.github/ISSUE_SPECS/1711-keep-a-live-level-moves-own-length-across-a-reposition-swap.md
Route cells join the one program after the mute cells (route rows 1-6,
host.automation.route on refusal); a route with any automated row binds
the seven-word lane with flags bits 6-11 and its hand gain offset in word
0. A send automation edit is a carried rebuild; a hand move on an
automated send gain writes the offset (live, SendGain); an automated matrix
row commits model_only; other rows of such a route write the seven-word
cell. The commit's pre-write check compares the whole automated set. Render
reads these in T3.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…lk (#1654 T3)

The following route op is rewritten on K1: each source column walks its
curves (source mutes, the route's own mute, gain, its matrix entry) and
composes one target (gain law, matrix, gate) on the per-column ramps. A
column jump holds its value events and lands them over their own length at
the jump's end (R19-3); a held value follows the column's current free time
when a later jump replaces the ramp; coincident events take the longest
jump (R19-4); a continued row carries its cursor verbatim; a hand move in
flight at a Reposition keeps its length (R19-5). Cursor tables are charged
by size_of. Realtime policy 171.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
# Conflicts:
#	.github/ISSUE_SPECS/1654-render-stored-send-gain-mute-and-matrix-automation.md
#	crates/graph/src/lib.rs
…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>
# Conflicts:
#	crates/controls/src/automation.rs
One continued-rows path (the source's, which render reads); the route op
seeds an automated gain from the hand offset; a route row the predecessor
did not automate composes the join record with its curve at the first
carried block and keeps the record's column hold. Gates 1-8 and R19-5 on
the C ABI, both hosts and host-core at Simd8, Simd4 and the scalar oracle;
the schema doc says send rows render and the send gain takes the offset.

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>
 V2)

VCA cells join the one program after the route cells. A member lane an
automated VCA reaches composes one state over its own cell and the VCA
cells (offsets summed in f64 with S first; mute ORed with terms) on the
shared walk with a held grid (opt-in, so a step keeps its J while another
curve rides); lanes no VCA curve reaches keep the CellEvents path and bits.
The offsets cell gains own_db; carry requires the reaching VCA tables to be
unchanged; pair state is charged as bank payload. Realtime policy 172.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
# Conflicts:
#	crates/automation/src/compose/tests.rs
Fader event lanes take no FaderDb: a hand move on a member only a VCA ride
reaches writes own_db through the offsets cell; a hand move on an automated
VCA offset rewrites S of every reached lane over the edit's ramp; a hand
VCA mute is the terms write; a reach change of an automated VCA rebuilds.
The join releases lanes that stop being event lanes; following routes use
the mute event lanes and the prep exports the VCA mute cells for V4.
Interim (until V4): a send following a lane only a VCA mute reaches is
refused at attach (host.route_control.attach).

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

Held value events are heard, so a gate event inside a hold composes the
grid's current values; a live move in flight at an equal-table swap keeps
its length; removing a route row's or the source mute's automation lands
the column on its static value over the removed row's length (after a move
in flight, at its free sample); a value step keeps its jump length under
another curve's ride (with_held_grid, ported from #1655 V2, on for every
route column). Cursor tables are allocated at attach with a typed refusal.
Gates for each, red before.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The owed landing after a removed row moves from a cursor to the column
(FollowCursors::owed): the walks are cut at its offset, the column retargets
to its heard composition over the owed length, and its grid holds; a column
that loses its last curve with a move in flight owes the landing at the
ramp's free sample instead of retargeting at once. The owed length no
longer leaks to later jumps. Gates on the graph, host-core (Simd8, Simd4,
scalar) and the C ABI, red before.

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

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
tamashi095 and others added 19 commits October 17, 2026 15:49
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…le difference (phase 2)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…move (phase 2, B19-R7)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A following send of a lane an automated VCA mute reaches walks the VCA
mute curves as gate cursors in the same column table, in the tap's node
time, over the VcaMute length; a lane only a VCA mute reaches now prepares.
VCA mute cursors carry verbatim when the lane continues and a(tap) holds,
else they are placed fresh; a moved gate retargets over its own row's
length. Graph gates for tap time, the OR, R19-3 holds and the carry.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…root ruling B19-R7)

The owed landing is removed: a carried seven-word following route that
loses a route row or its source-mute curve lands the column at once over
the removed row's own length, so no landing state survives a carry, a
seek or a further rebuild. Such a rebuild can cut a live send move in
flight, so the control plane marks it TransitionFallback while a live send
move may still ramp (send-only, conservative; TBD54 removes it). The doc
text sits beside #1713's on all five surfaces. Gates on the graph,
host-core (Simd8, Simd4, scalar), the C ABI and both hosts.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Gates 1-8, R19-4 and the R19-6 reach-pair cap: flat VCA rides equal the
static bits; members hear the ride in their own node time; a VCA mute
closes a following send at its latent tap; hand edits follow D5 and the
in-place path equals the full path; render is allocation-free; a VCA table
edit keeps a level move's length (EXACT); one pair over the cap is refused
host.resource.vca_reach_pairs on both hosts. pcm_digest unchanged. The
schema doc names the VCA rows, D2's order and the VCA offset.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
# Conflicts:
#	crates/graph/src/runtime.rs
#	hosts/host-web/tests/control_parity.rs
…ve send move (#1654, root ruling B19-R8)

Control plane only. The send-only conservative term now marks a
transaction rebuild TransitionFallback when it carries a following route
into a following route while a live send move may still ramp, and it
counts the transaction's own ramped send records before the decision.
Render can cut such a move at the carry (TBD54 removes the cut and the
flag). Doc text on all five surfaces; gates for an unrelated rebuild and a
same-transaction move on the C ABI and both hosts.

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

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

On a composed fader lane, a hold or deferral that a lane-level ramp put on
every cursor outlived another curve's step, so the lane froze for the rest
of that ramp. A new opt-in Composed::with_jump_release shortens each
restartable cursor's hold to the emitted jump's completion and clears its
deferral, as a single cell's jump does; only fader composed lanes use it,
so route columns keep their T3 rule. Gates in K1, host-core (Simd8,
Simd4, scalar; live and rebuild) and both hosts, red before.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ot ruling B19-R9)

The B17-R15 one-line fold: a flagged transaction rebuild also folds its
revision and its landing ramp into the window, so a second rebuild inside
its at-once landing is flagged too. Gates on the C ABI and both hosts (R1
and R2 flagged, R3 after the landing EXACT), red with the fold reverted.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…root ruling B19-R10)

Route rows 1-6 no longer render or take an offset, as on main 323433f:
route-row entries are inert and no new refusal exists. Route cells, flag
bits 6-11, the gain law and the value-cursor paths had no production
caller left and are deleted. The route op on K1 stays for source-mute and
VCA-mute following routes, with the B19-R7/R8/R9 conservative flag. The
send-row gates are deleted; the machinery gates are adapted to mute
curves; a new both-host gate shows route-row entries are inert.

LIVE_FOLLOW_ROUTE_OWNER_BYTES 952 -> 824.

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

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
19a's commits are cherry-picks of commits 19b already holds; every
conflict takes 19b's side. From 19a: the events.rs unit test and the 1711
spec note (8c2107b), and the TBD53 spec renamed to #1716 (255b9e1).

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

The B19-R10 check found every gate change at a carry bit-equal to the
same change on one uninterrupted plan. Three graph comments that said the
at-once landing cuts a move now say it is the uninterrupted gate change;
TBD54 records that production routes reach the flag only as an
over-report. Comments and spec only.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@tamashi095
tamashi095 merged commit e7722bd 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.

Render stored VCA offset and mute automation

1 participant