Tracking issue for porting @Dani6ca-T's work from
Dani6ca-T/MultiSeat-Extended into this repo as a
sequence of small, reviewable PRs.
This exists because the design discussion was happening on #26, which is now closed. It belongs
somewhere that outlives any single PR.
The sequence
| PR |
contents |
status |
| A |
the four clean fixes — atomic config writes, corrupt-preset quarantine, config-range validation, duplicate-provisioning guard |
open as #27, CHANGES_REQUESTED |
| B |
a minimal process-identity primitive only: ProcessIdentity = PID + process start time, GetProcessStartTime(pid), identity-aware liveness and termination |
not opened |
| C |
teardown / session-replacement guards, built on the SeatLifecycleGate already in this repo |
not opened |
| D |
API contract changes (18a733ca, d0446ae) |
not opened |
Each PR rebased on current master rather than on the fork's history.
Why B comes before C
@Dani6ca-T's dependency audit, refined in
#26 (comment):
- The teardown guards do not require the process-tracking subsystem. Their semantic prerequisite
is SeatLifecycleGate, which is already here.
- The PID-reuse safety fixes do have a real process-identity dependency — but that dependency is
the primitive, not the architecture around it.
We verified this independently before agreeing:
- No guard commit's production code touches
ProcessTracking. The IProcessTracker references in
those commits are all Mock.Of<IProcessTracker>() in test files satisfying ApolloManager's
constructor.
SeatLifecycleGate.cs is present on master.
ProcessIdentity in the fork is a 43-line readonly record struct — ProcessId, StartedAt,
Matches(pid, startTime). Small enough to lift on its own.
18a733ca, d0446ae and 526202f are not on master. 79dfced effectively is — master
carries SeatStatus.Connecting in the transition table and the dashboard already renders
Connecting: "Reconnecting..." — so PR D does not need it.
PID alone is ambiguous across process reuse. PID plus start time is the right primitive, and it is
what the PID-reuse fixes actually depend on.
Known cost, so it is not a surprise mid-PR
The SeatManager constructors have diverged beyond the ApolloProcessId → StreamingProcessId
rename and the transition-table enforcement:
| fork |
here |
IAccountManager, ISessionLauncher, IVirtualDisplayManager |
concrete AccountManager, SessionLauncher, VirtualDisplayManager |
IStreamingProvider + IStreamingConfigurator |
ApolloManager + ApolloConfigBuilder |
| — |
Monitoring.ApolloServerQuery |
Production hunks translate cleanly. The cost is in the tests, which construct SeatManager
directly and run 321–391 lines each. Worth budgeting for in PR C.
⚠️ Two changes should travel with the PR they belong to rather than riding along in a guard commit:
dbb93c7 adds LaunchedProcessId to MultiSeat.Shared/Models/SeatInfo.cs (a contract change —
PR D), and a461885 de-seals ProcessInjector and virtualises two methods for mocking (its own
decision).
⚠️ Diff each PR against master, not against #26. Some of that work already exists here under
different names — #26's four fixes were already implemented in 201d683 before it was opened, which
is why the hand-port collided.
Two carry-overs from the #27 review
Credit
@Dani6ca-T is credited in the release notes of whatever version carries 201d683 and 287a9c7,
independently of how any of these PRs land. Recorded in #25 and unchanged by this plan.
Tracking issue for porting @Dani6ca-T's work from
Dani6ca-T/MultiSeat-Extendedinto this repo as asequence of small, reviewable PRs.
This exists because the design discussion was happening on #26, which is now closed. It belongs
somewhere that outlives any single PR.
The sequence
CHANGES_REQUESTEDProcessIdentity = PID + process start time,GetProcessStartTime(pid), identity-aware liveness and terminationSeatLifecycleGatealready in this repo18a733ca,d0446ae)Each PR rebased on current
masterrather than on the fork's history.Why B comes before C
@Dani6ca-T's dependency audit, refined in
#26 (comment):
is
SeatLifecycleGate, which is already here.the primitive, not the architecture around it.
We verified this independently before agreeing:
ProcessTracking. TheIProcessTrackerreferences inthose commits are all
Mock.Of<IProcessTracker>()in test files satisfyingApolloManager'sconstructor.
SeatLifecycleGate.csis present onmaster.ProcessIdentityin the fork is a 43-linereadonly record struct—ProcessId,StartedAt,Matches(pid, startTime). Small enough to lift on its own.18a733ca,d0446aeand526202fare not onmaster.79dfcedeffectively is —mastercarries
SeatStatus.Connectingin the transition table and the dashboard already rendersConnecting: "Reconnecting..."— so PR D does not need it.PID alone is ambiguous across process reuse. PID plus start time is the right primitive, and it is
what the PID-reuse fixes actually depend on.
Known cost, so it is not a surprise mid-PR
The
SeatManagerconstructors have diverged beyond theApolloProcessId→StreamingProcessIdrename and the transition-table enforcement:
IAccountManager,ISessionLauncher,IVirtualDisplayManagerAccountManager,SessionLauncher,VirtualDisplayManagerIStreamingProvider+IStreamingConfiguratorApolloManager+ApolloConfigBuilderMonitoring.ApolloServerQueryProduction hunks translate cleanly. The cost is in the tests, which construct
SeatManagerdirectly and run 321–391 lines each. Worth budgeting for in PR C.
dbb93c7addsLaunchedProcessIdtoMultiSeat.Shared/Models/SeatInfo.cs(a contract change —PR D), and
a461885de-sealsProcessInjectorand virtualises two methods for mocking (its owndecision).
master, not against #26. Some of that work already exists here underdifferent names — #26's four fixes were already implemented in
201d683before it was opened, whichis why the hand-port collided.
Two carry-overs from the #27 review
up from one that failed after, and it is easy to drop in a translation pass.
open issue on Pr1 four clean #27, and A seat's config directory is writable by every local user, including other seats #28 is the same class of problem from the other direction.
Credit
@Dani6ca-T is credited in the release notes of whatever version carries
201d683and287a9c7,independently of how any of these PRs land. Recorded in #25 and unchanged by this plan.