Repository navigation
docs(specs): add spec 85 for truthful health and hold-then-swap cuts - #416
Draft
hyperb1iss wants to merge 6 commits into
Draft
hyperb1iss wants to merge 6 commits into
hyperb1iss wants to merge 6 commits into
Conversation
The demo-film rehearsal showed that no effect change can land on a beat: HTML effects warm up in public behind a placeholder, layers report Active before a real pixel exists, a failed page load stays Active forever, and the producer only starts loading when the cut is requested. The draft makes every stack replacement hold the outgoing stack live until the incoming one has real frames, makes LayerHealth truthful (Active on the swap frame, Failed and Stalled emitted), and adds runtime-only zone cues that prepare an effect early and go live on a frame boundary. Apply becomes an implicit cue plus go, so there is one staging path, and playlists prepare their next item through it. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
The first review found the mechanics underspecified: retaining slots cannot hold a live graph when layers are shared between stacks, default readiness lied for asynchronous sources, Active could not prove a cut reached the LEDs, cue consumption raced deletes and revision checks, and the capacity budget cited an interface the daemon does not have. Rev 2 introduces producer incarnations and three graphs per zone, makes readiness a required per-source contract, defines an activation origin with page suspension, adds presentation receipts carrying a cut generation to the device hand-off, makes go one transaction with replay before If-Match, gives cues their complete canonical source, scopes the effect-error fallback, adds a runtime health snapshot, and replaces the threshold budget with a measured admission ledger that never refuses a live user action. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
The second review closed nine of the first round's findings and raised more, most of them about cues and their capacity admission: memory that cannot be attributed per session, release that outlives destroy acknowledgement, and worker bursts that steady-state occupancy hides. Those cannot be designed honestly before hold-then-swap exists to measure, so rev 3 narrows the spec to what can be: incarnations and per-source readiness, truthful health with readiness exposed beside it, hold-then-swap with geometry holding the last frame and the outgoing graph living through scene transitions, an SDK preparation handshake with honest behavior for pages without it, and cut receipts that report per-target delivery outcomes with monotonic latency. The cue requirements both reviews surfaced are recorded for the follow-up spec. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Round three accepted narrowing spec 85 and found two blockers: an interrupted scene transition kept every contributing graph alive, so repeated interruptions grew without bound, and a cut overtaken in a slow target's queue never completed its receipt. Rev 4 releases both graphs behind an immutable hold still when a transition is interrupted, so a zone never holds more than one still and one incoming graph, and gives every target routed at the swap a terminal outcome, adding Superseded for host-side replacement and Unverified for backends whose acknowledgements are untrue. It also specifies immutable per-zone hold stills, per-target activation blending, readiness tied to a preparation revision, deadline suspension for every owner, source classes, timing asserted at each boundary, the minimal handshake in phase one, and the complete cue requirements. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Round four closed the unbounded interruption chain and found receipts could still strand: host-side dedupe and zero-brightness skips never reach a backend, and a generation could be marked superseded while one of its frames was still in flight. Rev 5 adds operation ids minted at ingress and the swap frame number so requests join to receipts, tracks each generation per target across pending and in-flight attempts with a stated precedence, makes host suppression a terminal outcome with its stage, carries contribution metadata through physical aggregation, and has activation cuts own the union of outgoing and incoming targets. It also fences re-preparation with its own deadline, starts finite media at logical playback zero, takes interruption stills before output policy, and splits dispatch from transport completion in acceptance. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Round five found phase one fully specified and five phase two contracts still open: operation completion for changes that create no cut, blending complete display contributions, holds that survive geometry changes on LEDs, preparation budgets per source class, and dispatch eligibility when sampling defers or transport is busy. Those are better decided with phase one built and measured, so the spec now records them with the review's implementation notes instead of another prose round. It also names a pre-existing conflict with the spec's doctrine: live media admission caps video counts and downshifts the render tier from estimated cost. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
|
Important Draft PR not reviewedDraft PRs are not automatically reviewed by default.
To automatically review draft PRs, update your CodeRabbit configuration: reviews:
auto_review:
drafts: true
Comment |
This branch has not been deployed
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.
Every effect change today replaces a zone's layer stack and lets the new producer warm up in public. HTML effects flash a placeholder frame, the layer reports Active before it shows a real pixel, a page that fails to load stays Active forever with the placeholder on the LEDs, and nothing reports when a cut actually reached the devices. A scripted rehearsal of the demo film against the owner's rig measured each of these, and they make a beat-synced cut impossible. Spec 85 defines how the engine fixes them without lowering any performance baseline.
What this changes
The spec adds
docs/specs/85-show-grade-cuts.md:Failedexactly once,DegradedandStalledare emitted honestly, deadlines survive session sleep, andGET /scene/runtimelets a reconnecting client recover the current truth. SDK pages get a minimal init and origin-frame handshake so readiness means real pixels.Why
The film's cuts have to land on the music on real hardware, and the rehearsal showed the engine cannot do that or even report honestly whether it did. The evidence (raw runner reports and the daemon's audit log for the rehearsal windows) is committed on
nova/demo-videounderdemo/evidence/.Verification
just verifypasses locally (Rust fmt + lint + test)just denypasses (required for dependency or license changes)just ui-testandjust ui-buildpass (required forcrates/hypercolor-ui/)just sdk-lint,just sdk-check, andjust sdk-buildpass (required forsdk/)just python-verifypasses (required forpython/)just compat-checkpasses (required fordata/drivers/vendors/*.toml)just docs-buildpasses (required for docs or README changes)cd docs && zola checkpasses (required for docs link/content changes)scripts/orpackaging/)just e2e-buildpasses with the normal Servo stack (required for daemon/UI/effect integration changes)just e2e-build-cpupasses when validating the CPU smoke fallbackjust e2epasses against the Servo stack (required for end-to-end behavior changes; starts daemon/browser)The spec went through five rounds of independent review against the code, each citing file and line receipts. Findings fell from 20 (5 blocking) to 18, 14, 8, and finally 5 open Phase 2 decisions with no blocker; §12 records each round's dispositions. The last round judged Phase 1 fully specified. The spec lives under
docs/specs/, outside the Zola site, so the docs gates do not apply.Notes for reviewers
🤖 Generated with Claude Code