Skip to content

feat(playback): deliver automation to hosted plugins#6482

Merged
shipyard-local[bot] merged 1 commit into
mainfrom
feature/timeline-automation-host-delivery-pr4
Jul 23, 2026
Merged

feat(playback): deliver automation to hosted plugins#6482
shipyard-local[bot] merged 1 commit into
mainfrom
feature/timeline-automation-host-delivery-pr4

Conversation

@shipyard-local

@shipyard-local shipyard-local Bot commented Jul 23, 2026

Copy link
Copy Markdown
Contributor

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

  • B1 (Add planning as private submodule, codify planning workflow #11) ramp collapse — delivery now pushes events at the ramp start offset with ramp_duration_sample_frames preserved, instead of collapsing to a zero-duration endpoint step. A hosted adapter that consumes the ramp duration glides instead of stepping.
  • B2 (Add compute pipeline, CI failover, SDK commands #12) passkeys, not raw friendsSnapshotParameterIngressPasskey + ExactParameterNodeClaimPasskey (private ctor, friended to the timeline files, taken by value) replace the two raw friends 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.
  • B3 (Phase 1: Core Foundations — SIMD, platform utils, XML/ZIP, networking #13) configurable limitsTimelineGraphBindingConfig::automation_limits added (defaults to AutomationPlaybackLimits::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-gated inject_exact_parameter_events (exact mailbox, claimed-only) for delivery. #6474's two test_host_signal_graph tests are preserved byte-identical and pass unchanged.

Hardening

  • A one-line invariant comment at the exact-append site documents the sole-writer guarantee.
  • A compile-time 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-identical process() cleanup blocks (preserves "both cleanups always run").
  • reconcile_track_connections() seam extracted from build_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-graph 7501 assertions / 113 cases, pulp-test-timeline-graph-binding 1597 / 39 (incl B1 ramp + param-cursor glide + B3 limit-propagation tests), pulp-test-host 878 / 29. gates.sh + docs_noise_lint clean. Version-at-land (no chore: bump commit).

🤖 Generated with Claude Code

https://claude.ai/code/session_01TVQHcnbg3t6TvXsdv6gXhS


🔎 Provenance

Agent claude
Machine m3
Tab Timeline v3
Directory /private/tmp/claude-501/cte-g5pr4
Session c66f4a64-25ea-42e5-b184-d48611a066a2

Resume

claude --resume c66f4a64-25ea-42e5-b184-d48611a066a2

Jump to this tab

cmux surface focus C0B3DA54-39AF-4DAA-8089-AA08DAB71968

Relaunch (any agent)

cmux surface resume get --surface C0B3DA54-39AF-4DAA-8089-AA08DAB71968

Restore URLhttps://claude.ai/code/session_01TVQHcnbg3t6TvXsdv6gXhS

stamped 2026-07-23 02:28 UTC

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."
@shipyard-local
shipyard-local Bot enabled auto-merge July 23, 2026 02:28
@shipyard-local
shipyard-local Bot added this pull request to the merge queue Jul 23, 2026
Merged via the queue into main with commit 451597b Jul 23, 2026
61 of 88 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant