Skip to content

Fork integration: porting MultiSeat-Extended as a four-PR sequence #29

Description

@vibesoftwarecoder

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 structProcessId, StartedAt,
    Matches(pid, startTime). Small enough to lift on its own.
  • 18a733ca, d0446ae and 526202f are not on master. 79dfced effectively ismaster
    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 ApolloProcessIdStreamingProcessId
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.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions