Pulsar 3.0.0
[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=1to opt in; the default remains Cut. - Runtime isolation: every Node-spawned process receives a validated
runtimeInstanceId, privateruntimeDir, 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
onPrismLogevents 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_tbindings 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-bundleand@clodocapeo/pulsar-bundle-fullat 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
runtimeDiror an explicitPULSAR_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.
1bd92e12026-08-25 — docs: align Pulsar README with runtimeffdc7fe2026-08-25 — docs: keep Pulsar README product-neutral76a9ee72026-08-25 — chore: remove agent artifacts from Pulsard46a4ac2026-08-26 — feat(observability): instrument client and runtime failures1252c6e2026-08-28 — docs(adr): record Pulsar dual-lane capability decisionb1c0b7c2026-08-29 — feat(contract): add pulsar.scene-switch.v1 (#256)f4087402026-08-29 — fix(runtime): isolate concurrent Pulsar instances (#257)8a26b8a2026-08-29 — feat: add hot A/B frame-boundary scene lanes (#258)65c5d632026-08-29 — fix(directshow): fail closed on ambiguous queue namespaces (#264)b92620c2026-08-29 — feat(telemetry): instrument dual-lane latency and SLOs (#246)a9642c32026-08-29 — feat(audio): stabilize common Program route for dual-lane Cuts (#261)9b809d12026-08-29 — feat: add dual-lane scene switch runtime (#247)cd1ab252026-08-30 — test: persist exact scene switch lifecycle evidence (#247)df186282026-08-31 — docs(adr): persist dual-lane AC-12 amendment (#269)a4f8fd32026-08-31 — feat: integrate dual-lane core canary (#268)e0c3de52026-09-01 — feat(pulsar): complete dual-lane canary and local build fastpath (#270)9fa54db2026-09-01 — feat(frontend): add dual-lane fade and stinger transitions (#250)1a6de302026-09-01 — perf(pulsar): tighten dual-lane timing and telemetry (#272)ecf927b2026-09-01 — perf(pulsar): pipeline Program and Preview return telemetry (#273)b88f52d2026-09-01 — perf(pulsar): elide idle PreviewReturn copies (#274)3d93eb62026-09-01 — perf(pulsar): elide idle ProgramReturn copies86343a22026-09-01 — fix(build): support pristine fastpath configurationaa8515e2026-09-01 — fix(build): resolve empty CMake host processor6d717832026-09-01 — fix(pulsar): harden atomic return queue62885f82026-09-01 — fix(pulsar): correct return queue ABI proof039e3302026-09-01 — perf(build): add guarded local runtime fastpatheeae3fe2026-09-01 — test(build): guard local runtime fastpathe986a612026-09-01 — docs(build): establish guarded fastpath workflow6717d6c2026-09-01 — feat(pulsar): add D3D11 return transport capability skeleton9415ecc2026-09-01 — feat(pulsar): implement opt-in D3D11 return transportd7b1e362026-09-01 — fix(pulsar): regenerate D3D11 patch after return queue9ee51472026-09-01 — fix(pulsar): make D3D11 return patch compile9637d0d2026-09-01 — fix(pulsar): preserve CPU DirectShow observation pathe252e1c2026-09-01 — fix(pulsar): gate D3D11 consumer on explicit transport99399572026-09-01 — fix(pulsar): include D3D11 device interfacesaf566122026-09-01 — fix(pulsar): enforce D3D11 opt-in inside ABI helperse32ea002026-09-01 — fix(pulsar): validate queue mapping before atomic readsda4222e2026-09-01 — fix(win-dshow): use read-only atomic queue loadse803a8e2026-09-01 — fix(win-dshow): accept committed shared queue viewsa8580032026-09-01 — fix(win-dshow): keep NV12 return queue live during setup416c1712026-09-02 — perf(libobs): remove initial GPU encode frame delay4f87d5b2026-09-02 — test(win-dshow): align read-only queue safety contract264bcd82026-09-02 — merge: integrate ProgramReturn D3D11 transportbf22c562026-09-02 — fix: persist DirectShow telemetry and bootstrap patch (#275)e35c4002026-09-02 — fix(audio): target process loopback by executable33934ed2026-09-02 — fix(libobs): make pipeline telemetry counters atomic5309f462026-09-02 — test(pulsar): reject unproven telemetry tuning candidate69d51f22026-09-02 — fix(win-dshow): move return lease polling off frame pathc9cdfa92026-09-02 — perf(win-dshow): bulk-copy tight NV12 return planes99907bc2026-09-02 — fix(win-dshow): make lease patch stack-safe662006e2026-09-02 — build(windows): allow external upstream build directoryd5b0b3d2026-09-02 — feat(telemetry): add bounded encoder stage signals8203dc22026-09-02 — fix(telemetry): gate callback registration by selector2a746be2026-09-02 — test(telemetry): cover selector callback cases2b0ad282026-09-02 — fix(telemetry): declare selector state for MSVC737c3922026-09-03 — fix(probe): propagate d3d11 return transport opt-inaab3c562026-09-03 — fix(win-dshow): report d3d11 fallback state on empty reads8ad1bd32026-09-03 — perf(win-dshow): move lease polling off frame path87f9e4c2026-09-03 — chore(win-dshow): order lease watcher patch after telemetry1e7cfb82026-09-03 — test(win-dshow): follow lease watcher patch ordering995607f2026-09-03 — build(windows): include frontend API in fastpathd81192d2026-09-03 — build(windows): include D3D11 in fastpath4da491c2026-09-03 — perf(libobs): expose interleaver contention telemetry8930b2a2026-09-03 — perf(nvenc): lower ULL output delay safelya95aaf52026-09-04 — perf(pulsar): finalize dual-lane soak and recovery1b34af42026-09-04 — perf(pulsar): preserve hot lane activation on cuts5f72a562026-09-05 — docs(ux): specify T-bar Preview/On-Air accessibility (#251) (#285)68e1e8d2026-09-05 — test(ux-251): add accessible dual-lane consumer harness (#286)ad2c2902026-09-05 — docs(contract): descope preview audio AFV for r2 (#287)3ba9ab82026-09-07 — perf: reduce decoded-frame latency on qualified Windows readback (#288)
Release validation provenance (2026-09-08)
- The signed
v3.0.0tag 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.