Repository navigation
Controls batch 12a: subscriptions survive restarted and removed owners; spectrum carries; meter frames follow the strip count (#1584 D6a, #1395, #1618, #1290 d1, #1106) - #1675
Merged
Conversation
…nd the stale ones, and the C ABI pairing placeholder (TBD24) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…TION_ENDED; #1290 (d1) frame with the PlanShape; 12a/12b order) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…p-count swap (#1290 d1) The meter frame, its header and a carried-from table travel with the PlanShape; the worklet cuts each set's views in the message handler that commits and switches to the pending set by reference when the active header reads retired, so process() never cuts a view or allocates. A strip-count change publishes the successor's correctly shaped frame from the first window after adoption; windows of carried strips whose handles shift are published, not dropped. WebMeterHeader grows 72 -> 80 bytes (retired, frame and successor pointers); the ABI mirrors follow. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…VATION_ENDED when their target goes (#1584 D6a) ObservationBindings (controls) is owned by SessionState beside the monitor overlay and travels to every successor in SuccessorBase; each successor arms its taps from it at preparation with a prepared arm whose window starts at the first accumulated block, so a restarted owner keeps an acknowledged subscribe (applied or still pending). A binding whose target is gone ends with a reliable OBSERVATION_ENDED event (0x8011, revision and stable key), room-checked with SESSION_COMMITTED before the commit; no room is BACKPRESSURE and nothing changes. Same on both hosts; COMPLETE_SCHEMA_HASH and two C ABI vectors re-pinned; no rendered bit moved. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
#1106) The hop probe waits for two windows one hop apart on a 10 s performance.now() deadline, yielding 5 ms between pumps, with a permanent planted 750 ms slow start; a failure names what it saw. A new qualification row and four self-test mutations hold the wait to its deadline and refuse a spin. The old 512-poll loop fails the planted start in chromium and webkit. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…on (#1395a) A spectrum capture whose target, channels, rate and quantum are unchanged carries its observer through the swap (one-shot state included); the control side pairs the readers at promotion from a list built at preparation (SpectrumService::adopt_successor), never in the swap block, and returns the displaced captures to drop off the audio thread. Allocation-free in the swap block and at promotion. Collections are #1395b. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…key (root ruling A) OBSERVATION_ENDED (0x8011) is now the sequence and one repeated key message per tap the commit ended, strictly ascending, at least one. attach_observation_ended reserves a single reliable slot beside SESSION_COMMITTED whatever the number of keys and returns the event frame length, so BACKPRESSURE means only a lane holding unread events; an event over one control frame is a resource refusal. The commit moves the prepared event and allocates nothing. capi_resources charges the event heap per observation slot and, as D6a missed, the observation slot tables (40 bytes the capi retained-bytes tests found). COMPLETE_SCHEMA_HASH re-pinned to 0xcc9a_7bcc_502c_4936 (#1584 D6a fold: one OBSERVATION_ENDED per commit); the corpus row carries two keys. No rendered bit moved (pcm_digest bf7dcedd1d92621f). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A collection's entries that keep their key, kind, rate and quantum carry by key in any order (the selection follows its entry and keeps its epoch); entries that do not carry start fresh; SpectrumService::adopt_successor pairs the collection at promotion. Allocation-free in the swap block and at promotion. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
At promotion, a one-shot on a capture that does not carry (no successor at its key, or a refused hand-over) starts the successor's capture Invalid with the predecessor's generation, so one read reports CaptureInvalid and a new arm completes on the successor; a stream on it ends (cadence, smoothing and analysis cleared); a lost collection selection releases its arm. Carried captures are untouched. 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 12a: no acknowledged subscription is lost at a swap any more, spectrum captures carry, and the browser keeps meter frames running across a strip-count change. An acknowledged subscribe survives its effect owner's restart, and a removed owner's subscription ends with one
OBSERVATION_ENDEDevent per commit (both hosts). Spectrum captures and collections carry by key and pair at promotion on the control side; a capture that does not carry settles honestly. The browser publishes the successor's correctly shaped meter frame from the first block after a strip-count swap, and the spectrum hop probe that failed CI on four PRs waits on its deadline.Closes #1395
Closes #1618
Closes #1106
#1584 stays open: this batch is its D6a (core); D6b (browser) is in batch 12b, and the C ABI
Observeedit (D1-D5, D7, D8) follows. #1290 stays open: (d1) is here; (d2) is in batch 12b.What changed
ObservationBindings(controls) is owned bySessionStatebeside the monitor overlay and travels to every successor inSuccessorBase(root ruling). Each successor arms its taps at preparation with a prepared arm onObservationLanewhose window starts at its first accumulated block, so a restarted owner keeps an acknowledged subscribe, applied or still pending; a carried tap's own state wins. A binding whose target is gone ends with one reliableOBSERVATION_ENDED(0x8011) per commit carrying every ended key (root ruling A), its room reserved besideSESSION_COMMITTEDand its size checked at preparation; a lane full of unread events isBACKPRESSUREwith nothing changed; an event that cannot fit one control frame refuses the commit as a resource limit. Same on both hosts, with a parity row. The browser admits an Observe insideprocess(), sopush_effect_observerecords per-slot state in preallocated storage and the nextservice()folds it (command()services first).SpectrumService::adopt_successor), never in the swap block.Invalidwith its generation (oneCaptureInvalidread, then a new arm completes), a stream ends, a lost collection selection releases its arm.PlanShape; the worklet cuts each set's views in the message handler that commits and switches by reference when the active header readsretired, soprocess()never cuts a view or allocates (root ruling).WebMeterHeadergrows 72 -> 80 bytes (retired, frame and successor pointers); the ABI mirrors follow.Evidence
batch-gates.sh: fmt, workspace clippy, workspace tests, the doc job, bench and realtime policies, the host-core feature matrix and loom step, fixtures, ABI, protocol parity and allocation audit, cross-targets, the AudioWorklet build/check with the boot budget, SDK headless, expected resources, fuzz) plustrace-graph-audit.sh; browser qualification (--check-matrix --self-test-mutations) in chromium, firefox and webkit: all green on the final head5f378f426(SDK headless 528 pass, 0 fail;trace-graph-audit1,000,000 blocks); each browser prints "all qualification gates passed".audit capipcm_digestbf7dcedd1d92621f(unchanged), 0 allocations.COMPLETE_SCHEMA_HASH(D6a adds event 0x8011, then the fold makes it one event per commit with repeated keys); two C ABI capabilities vectors;WebMeterHeaderABI mirrors;capi_retained_bytesceiling 181,696 -> 205,312 (the review fold charges a frame-boundedOBSERVATION_ENDEDreserve per cell and the bindings table; measured 186,614 plus 10 %, rounded to 64).Review
One opus-high review of the batch diff: PASS with findings, no blocker. Root's question answered: the in-
process()Observe path allocates nothing (lookups and one enum write into preallocated storage; the allocating fold runs only from the service step andcommand()). Folded: the meter-header successor-pointer checks were always true on 64-bit native hosts and now compare full-width addresses (red on a missing pointer); theOBSERVATION_ENDEDcells are charged by a frame-bounded ceiling, and the bindings table and itsafter()copy are charged; the observation slots are built with fallible allocation before the commit; a control-plane test shows an over-frame end event refuses as a resource limit with nothing changed; two dead public methods deleted; doc and error-name fixes.Issues to file
pair-carried-meter-and-observation-readers-on-the-c-abi(placeholder in this branch).🤖 Generated with Claude Code
Need help on this PR? Tag
@codesmith-botwith what you need.