Fix connection lifetime, pin the build, gate on real OBS - #39
Merged
Merged
Conversation
Agash
force-pushed
the
fix/audit-remediation
branch
from
September 17, 2026 07:03
0ace2a3 to
df331d9
Compare
Agash
force-pushed
the
fix/audit-remediation
branch
from
September 22, 2026 07:49
df331d9 to
66399d5
Compare
This was referenced Sep 22, 2026
Agash
force-pushed
the
fix/audit-remediation
branch
3 times, most recently
from
September 22, 2026 08:43
e4b3131 to
5784d45
Compare
Agash
force-pushed
the
fix/audit-remediation
branch
from
September 22, 2026 09:10
5784d45 to
36576e6
Compare
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.
Connection lifetime
The socket, serializer, receive cancellation, receive task and handshake state were separate fields
that could disagree. They are now one
ObsConnectionContext, built per attempt from an immutablesettings snapshot and replaced whole. The serializer is selected from that snapshot, so changing
Formatat runtime switches the wire format instead of reconnecting on the old one, and namedclients read the options monitor rather than a snapshot taken at registration.
ReidentifyAsyncis single flight;Identifiedcarries no request id, so concurrent operationscannot be matched to their replies.
MaxIncomingMessageBytes(64 MiB) is checked before each fragment is appended.transition in
StopAsync.ConnectAsyncno longer writes back onto shared monitored options.ObsWebSocketMetrics.obsws.events.dropped,obsws.messages.dropped.Breaking:
ObsWebSocketClienttakes anObsSerializerFactoryinstead of a serializer. Pass_ => serializerto fix one. Keeping both constructors madeAddSingleton<ObsWebSocketClient>()ambiguous.
Build
protocol.jsonwas gitignored and fetched from upstreammasterwhen absent, so a clean checkoutgenerated the public API from whatever upstream said that day. It is checked in, pinned by commit
and SHA-256 in
protocol.lock.json, and verified on every build; onlyRefreshObsProtocolreachesthe network. The vendored file is byte-identical to the revision already in use, so no generated
source changed.
Toolchain moves to .NET 11 RC1 and C# 15, off
LangVersion=latestand off preview roll-forward.Verification
run-transport-testsrendered failures into a table and exited zero, so it could not gate anything.It now reports a verdict and exits non-zero, and resolves input and filter kinds from the connected
OBS rather than assuming Windows-only ones. A new workflow installs OBS, runs it under Xvfb and
validates both transports.
The suite ships its fixtures rather than depending on the machine: a scene collection with a group
and a configurable transition for the CI runner, and a 17 KB clip so the media cursor requests have
something to seek. Outputs are enumerated once per cycle, since asking again after a state change
reads a freed encoder and takes OBS down (#25). Profiles are created, switched away from, then
removed, waiting for OBS to apply each step (#42).
The AOT gate dropped
WarningsNotAsErrors=IL2104;IL3053, which excused exactly the aggregates thathide trimming problems. It now itemises warnings, covers
win-x64as well aslinux-x64, and failson any warning raised outside MessagePack. All 10 actions across 5 workflows are pinned to SHAs.
Testing
180 tests per TFM, green on net10 and net11, zero warnings. The regression tests for
re-identification and the size limit were each confirmed to fail with their fix reverted, and the
protocol hash gate to fail the build on a one-byte edit. Validated live against OBS on Windows over
both transports.