Skip to content

Controls batch 14b: first live commit bounded, effect-owner candidate at begin, input-section carry, live window by cells, SDK response codes from the core (#1620, #1621, #1623, #1624, #1630) - #1693

Merged
tamashi095 merged 17 commits into
mainfrom
codex/controls-batch-14b
Oct 15, 2026

Conversation

@tamashi095

@tamashi095 tamashi095 commented Oct 15, 2026 •

Copy link
Copy Markdown
Contributor

Controls batch 14b: the first live edit of a large session costs what a later one costs, the effect control owner keeps its edit candidate only during a transaction, a per-node live effect window is sized by its live cells, a strip's input section carries across a plan swap and then retargets, and the SDK's response preview takes its frame codes from the engine and leaves every refusal to the core.

Closes #1620
Closes #1621
Closes #1623
Closes #1624
Closes #1630

What changed

  • Bound the first live commit of a large session #1620 (root ruling C1) The in-place commit path accepts a SetControl that adds a parameter entry and charges the added entry exactly. session::owners_growth and ResourceEstimate::after_owners_edit run the compile's own cap checks. A list that gets shorter, or an addition that does not fit, takes the full path, which gives the typed refusal before any commit. The committed model and canonical snapshot equal the full path's; a differential gate proves this. Before, the first live edit that wrote a parameter the sparse list did not hold took the full path: 77 KB at 1 track, 198 KB at 64, 663 KB at 256. Now the first call is 757 allocations and a 72,865-byte peak at 1, 64 and 256 tracks alike.
  • Build the effect control owner's candidate at begin #1624 (coordinator ruling B') EffectControlOwner builds its candidate rows and touched mask in begin, with a fallible reservation (EffectControlOwnerError::Allocation, refused before the stamp), and frees them at commit or discard. One owner state holds the candidate, so the phase and the candidate cannot disagree. The retained saving is 780 B per EQ. This is boot and idle retention; a transaction that begins an EQ allocates the same bytes transiently.
  • Size the per-node live effect window by its live cells #1621 A per-node live effect window holds the lane's live parameter cells, not the automation capacity. The estimate charges the same bytes. Departure: the bind check is window <= capacity, the rule banks already use; the lane still refuses a window shorter than its cells, so no live value can drop.
  • Carry, then retarget a strip input section across a plan swap #1630 A surviving strip's input section carries across a plan swap whenever its structure and sample rate match. A live difference retargets through the successor's input cells, on its gate, in the same stamped block as the strip, effect and route retargets. The result is bit-equal to a plan that made the same edit live, at both lane widths. Review fold (root ruling): the input, fader and matrix carry drains count a carried value that the successor's retarget replaces, so D15-2's live_values_superseded is exact on every carry path.
  • Generate the SDK's RESPONSE_GET codes and drop its own checks #1623 A generated SDK module holds the RESPONSE_GET field IDs and codes, taken from protocol::schema and the strict decoders; the SDK's hand copies are deleted. The SDK refuses only a value that has no wire spelling. Review fold (root ruling): the core refuses a non-finite grid endpoint (response.grid) and a non-finite override (new code response.override.value) on both hosts, with a parity row. Before, these came back as a generic protocol.failure. The encoder stays strict, and the wire format is unchanged.

Evidence

  • The full local CI-equivalent set (batch-gates.sh) passes on the integrated tree (head 5f51ba9). The SDK headless suite passes 564 of 564. The run before the last fix caught two stale pins from Carry, then retarget a strip input section across a plan swap #1630's carry marks, the graph fixture and the audit's builtins resource grid; they are regenerated and re-pinned in 538537d.
  • Browser qualification with --check-matrix --self-test-mutations on 10496f1, which has the same browser code as the head: chromium 151.0.7922.34, firefox 153.0 and webkit 26.5 all pass. Render allocations are 0 in every row.
  • audit capi: pcm_digest bf7dcedd1d92621f (unchanged), 0 allocations, locks and syscalls.
  • 0 allocations and frees on Carry, then retarget a strip input section across a plan swap #1630's swap block (bench_support::alloc thread counters).
  • The four-lane (AArch64/NEON) builtin_bank_bytes row runs only in CI. Its ceiling (21,056) was not re-measured here; the +384-byte carry marks are expected to fit under it.

Re-pins (each from a measurement)

Review

One opus-high batch review of c211890...23d7c52: FAIL, with no realtime or acked-batch defect. Folded in 3c49a8b (part B) and 81aa9ef (part A):

Departures recorded in the specs

Issues to file

  • None. Successors are recorded in the specs: the SDK's remaining hand copies in control-frame.ts, live-response.ts and browser/engine.ts.

🤖 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 17 commits October 15, 2026 19:00
…l path, not reusable state (stopped before coding)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… added parameter entries (#1620, ruling C1)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- #1624: begin reserves fallibly (EffectControlOwnerError::Allocation, refused
  before the stamp); one owner state holds the candidate; the candidate test
  commits; heap ceilings re-pinned by a written slack rule.
- #1630: the input, fader and matrix carry drains count a carried value the
  successor's retarget replaces (D15-2, root ruling); a successor input ramp
  test; a debug assert on the join's records.
- #1620: comments say the in-place form adds entries; OwnersGrowth fields are
  private; the left-bytes claim is dropped.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- #1621: the paired-spans test refuses only a window longer than the
  capacity; stale prose.
- #1623: the core refuses a non-finite endpoint (response.grid) and a
  non-finite override (response.override.value) on both hosts, with a parity
  row; the encoder stays strict; the sdk CI job checks the generated
  response-frame and session-key assets; the SDK refuses a non-number and an
  unknown reply section.

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

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…cond carried value; add_carried's doc names both callers (#1630)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…pin the audit's strip preparation bytes (1,136 -> 1,160)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@tamashi095
tamashi095 merged commit c5b5c88 into main Oct 15, 2026
24 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

1 participant