feat(playback): deliver automation to hosted plugins#6482
Merged
shipyard-local[bot] merged 1 commit intoJul 23, 2026
Conversation
Deliver RT-exact timeline device automation into hosted plugin nodes via an owner-claimed, exact-generation parameter mailbox distinct from the live host/UI mailbox. A claimed node is excluded from anticipation (it must run live to see the real playhead) and rejects live injection while the timeline binding owns it. Ramp events are delivered at their start offset with ramp duration preserved so a hosted adapter glides across the block rather than stepping at the endpoint. Access is gated by tag-type passkeys (SnapshotParameterIngressPasskey, ExactParameterNodeClaimPasskey) instead of blanket friendships, and the ExactParameterIngressOwner identity type is owned by the signal-graph TU. The binding config carries automation_limits; the process() fail-closed cleanup is factored into one helper and track-connection reconciliation into one seam. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01TVQHcnbg3t6TvXsdv6gXhS Skill-Update: skip skill=timeline reason="host automation-delivery change; touched files match the test_timeline_* glob but are host-binding tests. The timeline skill scope boundary explicitly disowns automation delivery; guidance lives in the updated hosting skill."
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.
Delivers RT-exact timeline device automation into hosted plugin nodes (last piece of Gate 5). Stacks on #6474 (rebased onto main after it landed).
What it does
A claimed plugin node receives sample-accurate automation via an owner-claimed, exact-generation parameter mailbox that is distinct from the live host/UI mailbox. The claimed node is excluded from anticipation (must run live to observe the real playhead) and rejects live injection while the timeline binding owns it.
Task fixes
ramp_duration_sample_framespreserved, instead of collapsing to a zero-duration endpoint step. A hosted adapter that consumes the ramp duration glides instead of stepping.SnapshotParameterIngressPasskey+ExactParameterNodeClaimPasskey(private ctor, friended to the timeline files, taken by value) replace the two rawfriends in the generic headers.ExactParameterIngressOwner's definition moved into the signal-graph TU via a factory (header keeps a forward decl). Zero Timeline identity hardcoded into the generic layer.TimelineGraphBindingConfig::automation_limitsadded (defaults toAutomationPlaybackLimits::platform_defaults()), wired to the renderer at build/adopt.Coverage-preserving design
Rather than repurposing #6474's generic public
ExecutionSnapshot::inject_parameter_events(live mailbox), this adds a separate passkey-gatedinject_exact_parameter_events(exact mailbox, claimed-only) for delivery. #6474's twotest_host_signal_graphtests are preserved byte-identical and pass unchanged.Hardening
static_assert(AutomationPlaybackLimits::kMaximumEventsPerDevicePerBlock <= ParameterEventQueue::kCapacity)couples the two constants the no-retry-starvation proof depends on.Should-fixes (in-file, binding not split)
fail_closed()helper extracted from the 5 near-identicalprocess()cleanup blocks (preserves "both cleanups always run").reconcile_track_connections()seam extracted frombuild_candidate().Validation
Full all-targets Release build clean. Reviewed twice (author negative-control proving the anticipation exclusion is load-bearing + independent adversarial pass; both clean, no must-fix). Suites on the rebased tree:
pulp-test-host-signal-graph7501 assertions / 113 cases,pulp-test-timeline-graph-binding1597 / 39 (incl B1 ramp + param-cursor glide + B3 limit-propagation tests),pulp-test-host878 / 29. gates.sh + docs_noise_lint clean. Version-at-land (nochore: bumpcommit).🤖 Generated with Claude Code
https://claude.ai/code/session_01TVQHcnbg3t6TvXsdv6gXhS
🔎 Provenance
claudem3/private/tmp/claude-501/cte-g5pr4c66f4a64-25ea-42e5-b184-d48611a066a2Resume
Jump to this tab
Relaunch (any agent)
Restore URL — https://claude.ai/code/session_01TVQHcnbg3t6TvXsdv6gXhS
stamped 2026-07-23 02:28 UTC