Skip to content

Pulsar 3.0.0

Choose a tag to compare

@ClodoCapeo ClodoCapeo released this 08 Sep 06:04
· 10 commits to main since this release
v3.0.0
9bb72e9

[3.0.0] - 2026-09-07

Pulsar 3.0.0 delivers the dual-lane Preview/Program production core, isolated concurrent runtimes, correlated production telemetry, and measured Windows readback improvements. The release includes the TypeScript client and both Windows x64 bundles.

Scope and comparison baseline

  • Previous release: v2.0.0b, commit 514f504db0521035973f576d3ab03788b1b3bf52.
  • Product source reviewed through 3ba9ab8d21eed9f29009fcb6b7b9674643402236 (PR #288); 70 reachable commits since that baseline, including merged branch history.
  • Source diff before this release's version/changelog metadata: 268 files changed, 68,231 insertions and 1,115 deletions. These totals include tests, documentation and evidence; they are not a measure of product-code growth.
  • Full release comparison.
  • The dual-lane ADR and approved Amendment 1 are closed through #255. Optional extensions retain their documented limitations.

Added

  • Hot A/B production lanes: independent physical lanes remain alive while their On-Air and Preview roles alternate. Stable Program and Preview views keep downstream outputs attached throughout a Cut.
  • Frame-boundary atomic Cut: preparation, admission, commit and abort behavior is exposed through pulsar.scene-switch.v1, with command/intent identities, revisions, ordering, stale rejection and idempotent retries.
  • Dual-lane scene-switch runtime: Preview changes are isolated from Program; preparation freezes the admitted state, and the old On-Air lane becomes editable only after the committed exchange.
  • Fade and Stinger transitions: dual-lane transition execution and corresponding validation are included. Enable PULSAR_DUAL_LANE_TRANSITIONS=1 to opt in; the default remains Cut.
  • Runtime isolation: every Node-spawned process receives a validated runtimeInstanceId, private runtimeDir, instance lock and dedicated configuration/log/recording namespace. Automatic free-port selection avoids inheriting one shared WebSocket port.
  • Namespaced DirectShow returns: per-instance queue identities and explicit legacy-alias lease behavior support concurrent runtimes. Legacy aliases remain single-owner resources.
  • Correlated latency instrumentation: raw Program, DirectShow return, encode requests/completion, output enqueue/interleaver/callback, RTMP receipt and decoded-frame observations have separate boundaries and identities.
  • Configurable telemetry signals: bounded encoder-stage observations and selector-controlled callbacks allow observation cost to be controlled separately from production optimizations.
  • D3D11 return transport: an explicitly selected transport, capability reporting, shared-texture path, consumer liveness and CPU fallback diagnostics. Its presence is not a universal performance guarantee.
  • Structured TypeScript diagnostics: typed transport/runtime errors, canonical action outcomes and optional onPrismLog events cover client operations and spawned-runtime lifecycle failures while retaining legacy response fields.
  • Native validation tools: GPU pending-packet scheduling/failure probes, return-queue concurrency checks, content-timestamp tests and a native RTMP decoder provide reproducible evidence at actual packet/frame boundaries.
  • Operator UX specification and harness: Preview/On-Air and T-bar interaction, keyboard and accessibility scenarios are documented and exercised in a mock/headless consumer harness. This does not ship a production T-bar UI.

Changed

  • Preserve stable active video_t bindings and hot producer activation across lane exchanges, including equal-view swaps.
  • Keep Program audio on a common stable route across Cuts. Preview mutation does not switch Program audio implicitly.
  • Move DirectShow consumer-lease polling off the per-frame publication path.
  • Elide unnecessary Preview/Program return copies when no consumer is active; use bulk copies for tightly packed NV12 planes.
  • Pipeline Preview and Program return publication and expose the associated stage costs.
  • Reduce selected GPU encoder startup/output waiting and safely lower the existing NVENC ultra-low-latency output delay without reducing codec quality settings.
  • Promote current-frame CPU readback on qualified hardware: automatic activation is limited to Windows, NV12, 1920x1080, 60/1 fps, CPU encoding and a physical graphics adapter. Other configurations retain the historical path.
  • Align current-frame readback presentation timestamps with the audio timeline, keeping content time distinct from encoded/media time.
  • Add a guarded Windows incremental-build path covering the frontend API, D3D11 and required native components; allow an explicit upstream build directory and preserve full-build CEF capability.
  • Publish @clodocapeo/pulsar-client, @clodocapeo/pulsar-bundle and @clodocapeo/pulsar-bundle-full at 3.0.0, with matching bundle/client dependencies. Internal validation workspaces resolve the same client/runtime generation.

Fixed

  • Reject ambiguous DirectShow queue namespaces instead of attaching to an unintended runtime.
  • Resolve libobs data/plugins from the executable location when a process runs from its private working directory.
  • Harden shared return queues: validate mappings before atomic reads, retain read-only consumer access, accept committed mapped views and keep NV12 setup/bootstrap live.
  • Address CPU mapping and consumer-lease collisions, D3D11 producer/consumer liveness, stale registrations and session cleanup.
  • Move consumer registration to producer-owned communication and use a producer-authoritative read-only ABI with authenticated private-helper returns.
  • Make pipeline telemetry counters atomic and ensure selectors actually control callback registration.
  • Retain valid equal-clock DirectShow stage observations rather than treating finite-resolution zero durations as absent data.
  • Preserve Take/frame identities through content-floor validation and renderer catch-up; repeated pictures no longer rely on invalid linear clock-to-media extrapolation.
  • Keep decoded marker observations reliable and distinguish packet decode order from presentation order.
  • Defer fatal GPU encoder shutdown away from the encoding thread, avoiding a self-wait; verify clean failure followed by restart of the same encoder/output.
  • Stop the replay buffer correctly when no timestamp has yet been produced.
  • Select process-loopback audio by executable identity.
  • Redact the WebSocket password in application-visible startup log callbacks; validate runtime identifiers and clean up owned runtime directories after failed startup.
  • Fix Windows fast-build configuration for pristine builds, missing host-processor values, Qt host-tool argument parsing, required headers and patch ordering.

Tests, build and documentation

  • Add and expand contract, lifecycle, ordering, idempotence, concurrency, audio, lease, namespace, transition, shutdown, rollback and runtime-isolation tests.
  • Exercise exact dual-codec canary and load/soak/recovery campaigns; preserve measured resource and latency overruns rather than relabeling them as passing capacity.
  • Keep native assertions active in RelWithDebInfo builds. Transfer required libobs effect data with native test artifacts.
  • Explicitly skip physical-GPU scheduler checks on a runner declared to have no physical GPU; retain execution on hardware hosts and the recorded local hardware evidence.
  • Document DirectShow transport/lease operation, latency collection, canary operation, embedding, scene-switch protocol, accessibility and qualified optimization scope.
  • Persist the approved AC-12/I14 amendment separating same-packet RTMP transport latency (AC-12a) from total command-to-egress latency (AC-12b).
  • Preserve rejected optimization experiments and their measurements. Native asynchronous NVENC completion remains disabled by default after a worse measured p95; lower-B-frame alternatives were not promoted after quality regressions.
  • Rewrite the complete product README, architecture, development and embedding guides; audit every component/package README and secondary runbook against the current code. Add a documentation index and a complete 52-patch libobs/fork inventory; retain approved ADRs and historical measurement values with clear status boundaries.
  • Remove obsolete agent artifacts while retaining canonical proof archives.
  • Complete independent ADR closure covering I1-I14 and applicable AC-01 through AC-14, with the effective amendment and extension disposition recorded.

Measured results and release limits

  • Same-observer x264 trials on the qualified Windows 1080p60 workload measured first changed decoded-image p95 at 45.897–45.947 ms before and 33.045–37.982 ms after, about 8–13 ms / 17–28% lower, over 500 measured Cuts plus 500 warm-ups. This is measured decoder output, not physical-display latency.
  • Audio validation retained monotonic AAC 48 kHz timestamps over 100 Cuts per codec. All 876 frames in the native/reference decoder comparison matched visible-plane hashes and PTS.
  • Three local Twitch broadcasts totaling 245 seconds validated CEF composition, H.264 1080p60, non-silent AAC, public HLS audio/video decode and clean shutdown before release preparation.
  • The integrated product revision passed pipeline 34161470883 and compliance 34161471011. Its CTest result was 20 passed, 2 physical-GPU skips and 0 failures. Release-tag validation is recorded separately by the release workflow.
  • Preview audio and audio-follow-video are not supported by this release's dual-lane contract; the common Program audio route is the supported behavior.
  • No universal NVENC decoded-latency gain, 4K qualification, physical-display bound, multi-camera capacity or seamless worker-handoff guarantee is introduced. WGC/CEF/NVENC resource costs remain workload-dependent.
  • AC-12a retains the correlated same-packet transport gate. AC-12b is mandatory disclosed command-to-egress timing with no r2 threshold; the two must not be substituted for one another.
  • Roll back the qualified CPU staging optimization with PULSAR_RAW_CURRENT_READBACK=0. Diagnostic/experimental switches do not imply production qualification.

Upgrade notes

  • Upgrade the client and chosen bundle together to 3.0.0. Use the full bundle for browser/CEF sources; the light bundle retains its documented reduced module set.
  • Code that assumed configuration, recordings or WebSocket state lived beside the executable must use the returned runtimeDir or an explicit PULSAR_RUNTIME_DIR. Automatically owned runtime directories are temporary and cleaned up at shutdown; use an explicit directory for durable application-owned files.
  • Concurrent instances must use their runtime identity and dedicated return names; a legacy DirectShow alias cannot be owned by multiple instances.
  • Consumers of scene switching must honor admission/commit events, revisions and idempotency rather than treating request submission as proof of an On-Air change.
  • Handle structured error/outcome fields and optionally subscribe to onPrismLog; retained legacy fields support existing diagnostic consumers.

Complete commit inventory since v2.0.0b

The following 70 entries enumerate every reachable commit in v2.0.0b..3ba9ab8, oldest first. A squash commit can contain several changes; the thematic sections above summarize their delivered behavior. The 3.0.0 release commits add version metadata and the comprehensive README/secondary-documentation refresh described above; the inventory boundary remains the integrated product commit.

  • 1bd92e1 2026-08-25 — docs: align Pulsar README with runtime
  • ffdc7fe 2026-08-25 — docs: keep Pulsar README product-neutral
  • 76a9ee7 2026-08-25 — chore: remove agent artifacts from Pulsar
  • d46a4ac 2026-08-26 — feat(observability): instrument client and runtime failures
  • 1252c6e 2026-08-28 — docs(adr): record Pulsar dual-lane capability decision
  • b1c0b7c 2026-08-29 — feat(contract): add pulsar.scene-switch.v1 (#256)
  • f408740 2026-08-29 — fix(runtime): isolate concurrent Pulsar instances (#257)
  • 8a26b8a 2026-08-29 — feat: add hot A/B frame-boundary scene lanes (#258)
  • 65c5d63 2026-08-29 — fix(directshow): fail closed on ambiguous queue namespaces (#264)
  • b92620c 2026-08-29 — feat(telemetry): instrument dual-lane latency and SLOs (#246)
  • a9642c3 2026-08-29 — feat(audio): stabilize common Program route for dual-lane Cuts (#261)
  • 9b809d1 2026-08-29 — feat: add dual-lane scene switch runtime (#247)
  • cd1ab25 2026-08-30 — test: persist exact scene switch lifecycle evidence (#247)
  • df18628 2026-08-31 — docs(adr): persist dual-lane AC-12 amendment (#269)
  • a4f8fd3 2026-08-31 — feat: integrate dual-lane core canary (#268)
  • e0c3de5 2026-09-01 — feat(pulsar): complete dual-lane canary and local build fastpath (#270)
  • 9fa54db 2026-09-01 — feat(frontend): add dual-lane fade and stinger transitions (#250)
  • 1a6de30 2026-09-01 — perf(pulsar): tighten dual-lane timing and telemetry (#272)
  • ecf927b 2026-09-01 — perf(pulsar): pipeline Program and Preview return telemetry (#273)
  • b88f52d 2026-09-01 — perf(pulsar): elide idle PreviewReturn copies (#274)
  • 3d93eb6 2026-09-01 — perf(pulsar): elide idle ProgramReturn copies
  • 86343a2 2026-09-01 — fix(build): support pristine fastpath configuration
  • aa8515e 2026-09-01 — fix(build): resolve empty CMake host processor
  • 6d71783 2026-09-01 — fix(pulsar): harden atomic return queue
  • 62885f8 2026-09-01 — fix(pulsar): correct return queue ABI proof
  • 039e330 2026-09-01 — perf(build): add guarded local runtime fastpath
  • eeae3fe 2026-09-01 — test(build): guard local runtime fastpath
  • e986a61 2026-09-01 — docs(build): establish guarded fastpath workflow
  • 6717d6c 2026-09-01 — feat(pulsar): add D3D11 return transport capability skeleton
  • 9415ecc 2026-09-01 — feat(pulsar): implement opt-in D3D11 return transport
  • d7b1e36 2026-09-01 — fix(pulsar): regenerate D3D11 patch after return queue
  • 9ee5147 2026-09-01 — fix(pulsar): make D3D11 return patch compile
  • 9637d0d 2026-09-01 — fix(pulsar): preserve CPU DirectShow observation path
  • e252e1c 2026-09-01 — fix(pulsar): gate D3D11 consumer on explicit transport
  • 9939957 2026-09-01 — fix(pulsar): include D3D11 device interfaces
  • af56612 2026-09-01 — fix(pulsar): enforce D3D11 opt-in inside ABI helpers
  • e32ea00 2026-09-01 — fix(pulsar): validate queue mapping before atomic reads
  • da4222e 2026-09-01 — fix(win-dshow): use read-only atomic queue loads
  • e803a8e 2026-09-01 — fix(win-dshow): accept committed shared queue views
  • a858003 2026-09-01 — fix(win-dshow): keep NV12 return queue live during setup
  • 416c171 2026-09-02 — perf(libobs): remove initial GPU encode frame delay
  • 4f87d5b 2026-09-02 — test(win-dshow): align read-only queue safety contract
  • 264bcd8 2026-09-02 — merge: integrate ProgramReturn D3D11 transport
  • bf22c56 2026-09-02 — fix: persist DirectShow telemetry and bootstrap patch (#275)
  • e35c400 2026-09-02 — fix(audio): target process loopback by executable
  • 33934ed 2026-09-02 — fix(libobs): make pipeline telemetry counters atomic
  • 5309f46 2026-09-02 — test(pulsar): reject unproven telemetry tuning candidate
  • 69d51f2 2026-09-02 — fix(win-dshow): move return lease polling off frame path
  • c9cdfa9 2026-09-02 — perf(win-dshow): bulk-copy tight NV12 return planes
  • 99907bc 2026-09-02 — fix(win-dshow): make lease patch stack-safe
  • 662006e 2026-09-02 — build(windows): allow external upstream build directory
  • d5b0b3d 2026-09-02 — feat(telemetry): add bounded encoder stage signals
  • 8203dc2 2026-09-02 — fix(telemetry): gate callback registration by selector
  • 2a746be 2026-09-02 — test(telemetry): cover selector callback cases
  • 2b0ad28 2026-09-02 — fix(telemetry): declare selector state for MSVC
  • 737c392 2026-09-03 — fix(probe): propagate d3d11 return transport opt-in
  • aab3c56 2026-09-03 — fix(win-dshow): report d3d11 fallback state on empty reads
  • 8ad1bd3 2026-09-03 — perf(win-dshow): move lease polling off frame path
  • 87f9e4c 2026-09-03 — chore(win-dshow): order lease watcher patch after telemetry
  • 1e7cfb8 2026-09-03 — test(win-dshow): follow lease watcher patch ordering
  • 995607f 2026-09-03 — build(windows): include frontend API in fastpath
  • d81192d 2026-09-03 — build(windows): include D3D11 in fastpath
  • 4da491c 2026-09-03 — perf(libobs): expose interleaver contention telemetry
  • 8930b2a 2026-09-03 — perf(nvenc): lower ULL output delay safely
  • a95aaf5 2026-09-04 — perf(pulsar): finalize dual-lane soak and recovery
  • 1b34af4 2026-09-04 — perf(pulsar): preserve hot lane activation on cuts
  • 5f72a56 2026-09-05 — docs(ux): specify T-bar Preview/On-Air accessibility (#251) (#285)
  • 68e1e8d 2026-09-05 — test(ux-251): add accessible dual-lane consumer harness (#286)
  • ad2c290 2026-09-05 — docs(contract): descope preview audio AFV for r2 (#287)
  • 3ba9ab8 2026-09-07 — perf: reduce decoded-frame latency on qualified Windows readback (#288)

Release validation provenance (2026-09-08)

  • The signed v3.0.0 tag and its original packaged assets are unchanged. Post-tag CI repairs are tracked separately from the released product source.
  • The exact released Windows runtime completed a separate 600-second local GPU/Twitch proof: 120 observations at 60 FPS, 6000 kbps and zero output-skipped frames. Its video and diagnostic are attached.
  • An additional local x264 test confirmed 1920×1080 at 60 FPS and 6000 kbps across 40 observations through 200 seconds. The owner accepted this observation and requested a graceful stop; its finalized recording lasts 202.048 seconds. This was not a completed 10-minute x264 qualification.
  • The hosted runner's 1080p60 test failed its actual-cadence gate at 11.7 FPS without a physical GPU. The owner explicitly accepted the local evidence and disabled automated Twitch broadcast and GitHub Pages proof publication. Skipped/cancelled hosted checks are not presented as successful live validation.
  • Owner decision, metrics and publication safeguards.