Repository navigation
Controls batch 19b: stored VCA offset and mute automation, composed with each member's own curves - #1719
Merged
Conversation
…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>
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>
…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>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Controls batch 19b: stored VCA automation renders, on a shared merged automation walk. A VCA's own
offset_dbandmuterows (#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
crates/automation/src/compose.rs, 202724b; U1/U2 folds). One composed state per output over all the curves it hears (root ruling R19-2 (b)). Events fall at the union of the curves' discontinuities. Coincident events take the longest jump among them (R19-4). Used by the fader stage (Render stored VCA offset and mute automation #1655) and by the following route op (Render stored send gain, mute and matrix automation #1654 machinery).vca_compose_db(own, S + c_1 + ... + c_m): static terms first, then the reaching automated VCA curves in ascending VCA ID (a class B summation order under the standing ruling). A flat VCA ride renders the bits of the same static VCA offset.offset_dbwrites the entry's offset (live). A hand VCA mute ORs with the curve (live). An edit of a VCA entry, or a change of which member lanes an automated VCA reaches, is a rebuild.gain_dbtakes no hand offset. A session with route-row entries validates, prepares, renders and lists its controls exactly as onmain323433f6a: the entries are inert and there is no new refusal. A new both-host gate holds this (stored_send_row_automation_is_inert_alike_on_both_hosts).CandidateOutcome::TransitionFallback(B19-R7/R8/R9). The text sits beside Carry a following route's column moves exactly into a six-word successor #1713's on all five surfaces:abi.rs, the C header,docs/C_ABI_V1_QUALIFICATION.mdand both d.ts files. With send rows off, the flag only over-reports. The B19-R10 check found that every gate change at a carry is bit-equal to the same gate change on one uninterrupted plan. So no mute-only or VCA-mute carry cuts a live send move, but such a rebuild (even an EQ-only one) is still reported as a fallback. Land a removed send row exactly across a live move #1718 deletes the flag when it lands send rows exactly.compose_toward. On a composed fader lane, a record's or an adoption's ramp target composes each curve toward the ramp's completion, each clipped at its own next discontinuity (K1compose_toward, Compose VCA offsets with stored fader automation #1649 D3). So between the record and another curve's next discontinuity the lane differs from one cell over the summed curve, and that curve's jump makes them equal. A successor plan uses the same rule.main(e0b60a8): batch 19a (Controls batch 19a: a live level move keeps its own length across a Reposition swap #1717) brings Keep a live level move's own length across a Reposition swap #1711 and the Decide how adoption treats a rounding-only table difference #1716 spec. Every conflict took 19b's side, because the 19a commits are patch-equal picks of commits 19b already holds.docs/SESSION_SCHEMA_V1.mddocuments VCA row rendering and the VCAoffset_dboffset, and says again that send rows do not render. Spec records: 1654 (status and decision records), 1655 (decision records; U3 MINOR-1 wording 194fe34), Land a removed send row exactly across a live move #1718 (context and gates, 2a39f5e).Evidence
LIVE_FOLLOW_ROUTE_OWNER_BYTES: 352 onmain, 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.main168,722; +24 B: the control plane'sSessionStatekeeps the send move window,Option<SendMoveWindow>, where 19a deleted the B17-R14 level-move window; it equals the pre-19a value).main4,380,022; +100,783 B, +2.3 %: K1, the VCA fader stage and the route op).audit capipcm_digestbffc21e857b5e134, unchanged (the audit session has no stored automation). 0 render errors, 0 allocations.main168; the new regions are K1 and route-op render code). No file undercrates/engine/src/realtime/was edited.check-capi-abi.shpasses.batch-gates.shall 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.--check-matrix --self-test-mutations) all pass at 2a39f5e.Review
A fresh opus-high adversarial reviewer, then a focused verification of each fold.
compose_towardwording) is fixed in 194fe34.Not in this PR
Placeholders to file
.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
Need help on this PR? Tag
@codesmith-botwith what you need.