Repository navigation
Conversation
Adds config/scripts/pr16741-track-manifest.mjs, which reads the frozen #16741 head (a68b6f3) against its merge-base 277c289 and assigns every changed file to a track T0-T9 from one first-match glob table (pr16741-track-rules.mjs). It fails when any file matches no rule, splits prod from test lines, marks Bun pieces dropped, T7/T8 deferred, and flags paths where main has since diverged as reconcile. The generated manifest lives at config/scripts/pr16741-track-manifest.json beside its generator, like ci-shard-timings.json; docs/** is gitignored.
…ng-orcad.html §06 shipping-orcad.html was never checked in, yet seven code comments cited it. docs/reference/remote-server-install-model.md records the D10 replacement: one converged server package with client-pushed and user-installed paths, server-<version>/ plus runtimes/node-<sha256>/, a legacy relay-*/orcad-* sweep that deletes only on an exited verdict, a two-release GC hand-over, and one registered execution identity per machine as the permanent rule. The comments now point there; no behaviour changes.
…ts new path
The new path of a rename is absent from main by construction, so every
rename was flagged as reconcile ('main has since removed'). Extract the
check into findMainDivergence and unit-test it.
|
Navigate logical layers of code changes, visualize relationships, and explore their blast radius. No actionable comments were generated in the recent review. 🎉 ℹ️ Recent review info⚙️ Run configurationConfiguration used: Repository UI Review profile: CHILL Plan: Advanced Run ID: 📒 Files selected for processing (14)
Included review availability: This review used your included allowance. Your plan provides up to 10 included reviews per hour; 8 remain after this review. 📝 WalkthroughWalkthroughThe changes add track rules and a script that classifies changed files, calculates per-track counts, checks for divergence from main, and writes a JSON manifest and text summary. New tests cover the script’s parsing, classification, divergence, and output. The changes also add a remote server install model reference, update related source comments, and add an ignore rule for the reference path. Priority: ⬇️ Low Merge Risk: ⚪ Minimal · up to The PR adds manifest tooling and consolidates remote-install documentation without changing installation behavior. No concrete merge-blocking issue remains; it is mergeable subject to normal checks. 🚥 Pre-merge checks | ✅ 3 | ❌ 2❌ Failed checks (2 warnings)
✅ Passed checks (3 passed)
Full details: Description checkExplanation The description covers the main changes, motivation, testing, visual proof, and agent-skill boundary. However, the Linked Issue section does not provide an actual issue link or issue reference, and the Review, Notes, and Checklist sections are omitted. Full details: Docstring CoverageExplanation Docstring coverage is 57.14% which is insufficient. The required threshold is 80.00%. Docstring coverage is scoped to functions touched by this diff. Analyzed 14 functions across 11 files. (2 skipped: 2 unsupported.)
✨ Finishing Touches 💡 1📝 Generate docstrings 💡
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
|
There was a problem hiding this comment.
ℹ️ Minor suggestions only. Two reference details and one checked-in artifact are worth a look before merge.
Reviewed changes
- Track manifest generator —
config/scripts/pr16741-track-manifest.mjsclassifies the 1,985 files of #16741 into D9 tracks (T0–T9), parses--numstat -z, detects structural main divergence, and emits a stable JSON. Verified against the committed data: 1985 files — 84 dropped, 1096 port, 12 reconcile, 793 deferred — all consistent with the rules. - Track rules —
config/scripts/pr16741-track-rules.mjsdefinesTRACKSand the first-match-winsTRACK_RULES, with narrow rules above the directory catch-alls. - Generated manifest —
config/scripts/pr16741-track-manifest.json, regenerated againstorigin/main=db73d28e51;oxfmt --checkclean. - Tests —
config/scripts/pr16741-track-manifest.test.mjs, 42 passing; thefindMainDivergencecase actually pins the rename fix. - Install-model doc —
docs/reference/remote-server-install-model.md, allow-listed in.gitignore, replaces citations to the untrackedshipping-orcad.htmlin sixsrc/main/ssh/*comments and one test comment. Comments only, no runtime change.
Verification: vitest run config/scripts/pr16741-track-manifest.test.mjs → 42 passed; oxlint and oxfmt --check clean on the new files.
ℹ️ Nitpicks
- The PR body says "14 files where main has diverged"; the committed manifest has 12
reconcileentries (d1f7655093regenerated it after the rename fix). Worth refreshing the body so the count matches the artifact. - Nothing ties
pr16741-track-manifest.jsonback topr16741-track-rules.mjs, so a rules edit that forgets to regenerate leaves the committed data stale with no CI signal. A cheap invariant test overclassifyPath(allowingreconcileas an override) would catch it; I confirmed the current file is consistent, so this is only a guard.
| @@ -0,0 +1,317 @@ | |||
| // The D9 track table for #16741 (docs/reference/node-runtime-design.html), read by | |||
There was a problem hiding this comment.
This cites docs/reference/node-runtime-design.html as the authority for the D9 table, but that file is not tracked in the repo — the same dangling-reference problem this PR fixes for shipping-orcad.html. pr16741-track-manifest.mjs:1 cites the same path. If the design doc is intentionally local, say so here; otherwise the citation reintroduces exactly what D10 sets out to remove.
| } | ||
|
|
||
| /** | ||
| * Paths where main diverged from the PR's merge-base. A rename is judged by its source: its new |
There was a problem hiding this comment.
The docstring claims "paths where main diverged from the PR's merge-base", but findMainDivergence only detects structural divergence — a path main added, removed, or renamed. A file both branches independently modified stays port, which is the most common reconcile case, so the wording overstates what callers get. If concurrent modification is deliberately out of scope, naming that limitation here would keep the docstring honest.
| 'src/main/daemon/**', | ||
| 'src/main/orca-profiles/**', | ||
| 'src/main/persistence/**', | ||
| 'src/main/runtime/**', |
There was a problem hiding this comment.
The manifest assigns src/main/runtime/rpc/methods/index.ts to T2, but the #16741 changes to that file import and register methods assigned to deferred T7 and T8. Porting the index changes with T2 would import files that have not been ported, breaking the staged build. Those registrations need to land with their methods.
| for (const entry of entries) { | ||
| const created = addedPaths.has(entry.path) || entry.previousPath !== undefined | ||
| if (created && mainPaths.has(entry.path)) { | ||
| divergence.set(entry.path, 'main has since added its own copy; port the delta only') | ||
| } else if (entry.previousPath !== undefined && !mainPaths.has(entry.previousPath)) { | ||
| divergence.set(entry.path, 'main has since removed or renamed the rename source') | ||
| } else if (!created && !mainPaths.has(entry.path)) { | ||
| divergence.set(entry.path, 'main has since removed or renamed this file') | ||
| } | ||
| } |
There was a problem hiding this comment.
Shared edits miss reconciliation
When main and #16741 both modify an existing file, this check sees that the path still exists and marks it port instead of reconcile. That happened for remote-install-model.ts, remote-install-gc.ts, and orcad-remote-launch.ts between the recorded merge base and main SHA. Track owners get no warning to reconcile those changes and could overwrite main's edits during the port.
There was a problem hiding this comment.
ℹ️ Minor suggestions only. Two reference details and one checked-in artifact are worth a look before merge.
Reviewed changes
- Track manifest generator —
config/scripts/pr16741-track-manifest.mjsclassifies the 1,985 files of #16741 into D9 tracks (T0–T9), parses--numstat -z, detects structural main divergence, and emits a stable JSON. Verified against the committed data: 1985 files — 84 dropped, 1096 port, 12 reconcile, 793 deferred — all consistent with the rules. - Track rules —
config/scripts/pr16741-track-rules.mjsdefinesTRACKSand the first-match-winsTRACK_RULES, with narrow rules above the directory catch-alls. - Generated manifest —
config/scripts/pr16741-track-manifest.json, regenerated againstorigin/main=db73d28e51;oxfmt --checkclean. - Tests —
config/scripts/pr16741-track-manifest.test.mjs, 42 passing; thefindMainDivergencecase actually pins the rename fix. - Install-model doc —
docs/reference/remote-server-install-model.md, allow-listed in.gitignore, replaces citations to the untrackedshipping-orcad.htmlin sixsrc/main/ssh/*comments and one test comment. Comments only, no runtime change.
Verification: vitest run config/scripts/pr16741-track-manifest.test.mjs → 42 passed; oxlint and oxfmt --check clean on the new files.
ℹ️ Nitpicks
- The PR body says "14 files where main has diverged"; the committed manifest has 12
reconcileentries (d1f7655093regenerated it after the rename fix). Worth refreshing the body so the count matches the artifact. - Nothing ties
pr16741-track-manifest.jsonback topr16741-track-rules.mjs, so a rules edit that forgets to regenerate leaves the committed data stale with no CI signal. A cheap invariant test overclassifyPath(allowingreconcileas an override) would catch it; I confirmed the current file is consistent, so this is only a guard.
DeepSeek Flash (free via Pullfrog for OSS) | 𝕏
| @@ -0,0 +1,317 @@ | |||
| // The D9 track table for #16741 (docs/reference/node-runtime-design.html), read by | |||
There was a problem hiding this comment.
This cites docs/reference/node-runtime-design.html as the authority for the D9 table, but that file is not tracked in the repo — the same dangling-reference problem this PR fixes for shipping-orcad.html. pr16741-track-manifest.mjs:1 cites the same path. If the design doc is intentionally local, say so here; otherwise the citation reintroduces exactly what D10 sets out to remove.
| } | ||
|
|
||
| /** | ||
| * Paths where main diverged from the PR's merge-base. A rename is judged by its source: its new |
There was a problem hiding this comment.
The docstring claims "paths where main diverged from the PR's merge-base", but findMainDivergence only detects structural divergence — a path main added, removed, or renamed. A file both branches independently modified stays port, which is the most common reconcile case, so the wording overstates what callers get. If concurrent modification is deliberately out of scope, naming that limitation here would keep the docstring honest.
|
Keeping the #16741 track manifest and the install-model doc local for now; not merging. |
…release gate) Dormant seam for the Phase 3 port of #16741 (design D9.3): the shared contracts later T1/T2 slices build on. No production module imports any of it yet; only tests do. Existing behavior is unchanged: the call-queue hold check is a no-op until something calls holdIdleSelectors. Adds: - RelayWorkAdmission + relay-work-drain-contract: closes relay handler admission and waits for in-flight work, still admitting the cleanup requests/notifications (cancel, acks, unwatch) that let that work finish. - TransportPublicationDrain: counts local write completions against one transport and fails sticky once that transport is replaced. - pty-ownership-transfer-release-gate: exact-match opt-in (ORCA_ENABLE_PTY_OWNERSHIP_TRANSFER_MUTATION=1) that SSH core uses to keep live transfer off (D9.2). - RuntimeRpcCallQueuePool.holdIdleSelectors + RuntimeRpcCallQueueBusyError: atomically fence idle selectors while routing changes. Porting note (source: #16741 head a68b6f3, merge-base 277c289; T1 per the #24137 track manifest): - Taken verbatim: pty-ownership-transfer-release-gate(.test), runtime-rpc-call-queue delta (+ retirement test), relay-work-admission API and behavior, transport-publication-drain API and behavior. - Adapted: relay-work-drain-contract omits relay.reset, relay.recoverPreparedReset (T3) and relay.networkTunnel.close/.frame (T4); those contracts do not exist on this base and join the sets when their tracks land. Promise.withResolvers replaced with plain promises in relay-reachable code, because the legacy relay bundle still targets node18 hosts. RequestContext.transportGeneration is not added here (it belongs with the dispatcher slice), so the admission test drops it. Added transport-publication-drain.test.ts, since #16741 covered it only through relay-producer-publication-drain. - Dropped: the pty-source-credit-contract/-validation/-record/ledger-test deltas. They only carry the ownershipTransfer output envelope, which is live-transfer engine (T7, deferred per D9.2), so the credit contract on this base is already the seam T2 needs. The post-slice assertPtySourceSpan re-validation came with that envelope and is dropped with it. - Not in this slice (next T1 slices, which are also the first consumers): dispatcher wiring (dispatcher-client-state / rpc-routing / producer-transport / notification-publication + RequestContext.transportGeneration) that constructs RelayWorkAdmission; relay-producer-publication-drain on TransportPublicationDrain; fs/git stream shutdown; ws-transport + node-websocket-lifecycle + websocket-transport-limits; renderer flow-controller deltas. Later consumers: T2 ssh-pty-preparation-admission (drain contract), ssh-pty-source-preparation-drain (release gate); T4 tunnels (publication drain); T5 runtime-environment-call-queue (selector hold). No wire change: no new RPC fields, methods, or opcodes.
…acking Dormant foundation for the T2 SSH core port of #16741 (design D9.3). No production module imports it yet; only tests do, so SSH behavior is unchanged. The next T2 slice wires SshConnection.exec/sftp/channel opens and forwarded sockets through it. Adds: - SshConnectionWorkLedger: tracks local operation and channel lifetimes per connection. fenceForReset closes admission (except work nested under an already-admitted operation and one exactly-identified control channel) and drain() waits for the rest, failing sticky on any failure or unverifiable opening observed after the fence. Channel closure is local lifetime evidence only, never proof that a remote process exited. - trackSshConnectionChannelLifetime / openTrackedSshSocket: bind an opened channel or socket to its ledger entry and settle it only on 'close' ('end', 'error' and the destroyed flag are not closure). Porting note (source: #16741 head a68b6f3, merge-base 277c289; T2 per the #24137 track manifest): - Taken verbatim: ssh-connection-work-ledger behavior and tests, ssh-forward-socket-admission.test.ts, openTrackedSshSocket. - Adapted: the ledger no longer calls assertProfileLifetimeAdmission on every admit. That module is an opt-in native-addon profile lock (addon dropped in T0) that overlaps the SQLite authority from #22612; callers inject their own admission check through the existing constructor argument instead (SshConnection will pass its disposed check). The broad `object` resource type became SshConnectionWorkChannel (on/once/ removeListener), and trackSshConnectionChannelLifetime uses a type guard instead of a cast, so a value without removeListener is now reported unverifiable rather than tracked. Added ssh-connection-channel-lifetime tests, since #16741 covered it only through SshConnection. - Dropped: none in these files. - Not in this slice: SshConnection wiring (ssh-connection.ts), forwarded channel lifetime (T4), upload session lifetime (T6), profile lifetime admission/lock/participation (needs a D9.4 decision against #22612). No wire change: nothing is sent to relays or clients.
Dormant foundation for the T2 SSH core port of #16741. No production module imports it yet, so SSH behavior is unchanged; the next T2 slice has SshConnection track every ssh2 client it allocates and gate its transport-closure subscribers on this ledger plus the work ledger. Adds: - SshTransportCloseLedger: remembers every allocated client (including ones whose authentication failed) until it emits 'close'. drain() waits for the snapshot and fails with ssh_client_close_allocations_changed if a client was allocated after the caller should have fenced allocation. Authentication settlement, 'end' and 'error' are not physical closure. - observeSshTransportClose: registers 'close' listeners on a set of transport resources before close is initiated; wait() is cancelable without dropping the evidence, dispose() removes the listeners. Porting note (source: #16741 head a68b6f3, merge-base 277c289; T2 per the #24137 track manifest): - Taken verbatim: both modules and ssh-transport-close-ledger.test.ts. - Adapted: the ledger test no longer casts EventEmitter to ssh2 Client, since track() already accepts an EventEmitter. Added ssh-transport-close-observation tests, since #16741 covered it only through SshConnection.dispose. - Dropped: none. No wire change. Loss of transport is still reported as unverifiable, never as remote process exit.
…release gate) (#24156) Dormant seam for the Phase 3 port of #16741 (design D9.3): the shared contracts later T1/T2 slices build on. No production module imports any of it yet; only tests do. Existing behavior is unchanged: the call-queue hold check is a no-op until something calls holdIdleSelectors. Adds: - RelayWorkAdmission + relay-work-drain-contract: closes relay handler admission and waits for in-flight work, still admitting the cleanup requests/notifications (cancel, acks, unwatch) that let that work finish. - TransportPublicationDrain: counts local write completions against one transport and fails sticky once that transport is replaced. - pty-ownership-transfer-release-gate: exact-match opt-in (ORCA_ENABLE_PTY_OWNERSHIP_TRANSFER_MUTATION=1) that SSH core uses to keep live transfer off (D9.2). - RuntimeRpcCallQueuePool.holdIdleSelectors + RuntimeRpcCallQueueBusyError: atomically fence idle selectors while routing changes. Porting note (source: #16741 head a68b6f3, merge-base 277c289; T1 per the #24137 track manifest): - Taken verbatim: pty-ownership-transfer-release-gate(.test), runtime-rpc-call-queue delta (+ retirement test), relay-work-admission API and behavior, transport-publication-drain API and behavior. - Adapted: relay-work-drain-contract omits relay.reset, relay.recoverPreparedReset (T3) and relay.networkTunnel.close/.frame (T4); those contracts do not exist on this base and join the sets when their tracks land. Promise.withResolvers replaced with plain promises in relay-reachable code, because the legacy relay bundle still targets node18 hosts. RequestContext.transportGeneration is not added here (it belongs with the dispatcher slice), so the admission test drops it. Added transport-publication-drain.test.ts, since #16741 covered it only through relay-producer-publication-drain. - Dropped: the pty-source-credit-contract/-validation/-record/ledger-test deltas. They only carry the ownershipTransfer output envelope, which is live-transfer engine (T7, deferred per D9.2), so the credit contract on this base is already the seam T2 needs. The post-slice assertPtySourceSpan re-validation came with that envelope and is dropped with it. - Not in this slice (next T1 slices, which are also the first consumers): dispatcher wiring (dispatcher-client-state / rpc-routing / producer-transport / notification-publication + RequestContext.transportGeneration) that constructs RelayWorkAdmission; relay-producer-publication-drain on TransportPublicationDrain; fs/git stream shutdown; ws-transport + node-websocket-lifecycle + websocket-transport-limits; renderer flow-controller deltas. Later consumers: T2 ssh-pty-preparation-admission (drain contract), ssh-pty-source-preparation-drain (release gate); T4 tunnels (publication drain); T5 runtime-environment-call-queue (selector hold). No wire change: no new RPC fields, methods, or opcodes. Co-authored-by: m4air <m4air@m4airs-Air.localdomain>
…acking Dormant foundation for the T2 SSH core port of #16741 (design D9.3). No production module imports it yet; only tests do, so SSH behavior is unchanged. The next T2 slice wires SshConnection.exec/sftp/channel opens and forwarded sockets through it. Adds: - SshConnectionWorkLedger: tracks local operation and channel lifetimes per connection. fenceForReset closes admission (except work nested under an already-admitted operation and one exactly-identified control channel) and drain() waits for the rest, failing sticky on any failure or unverifiable opening observed after the fence. Channel closure is local lifetime evidence only, never proof that a remote process exited. - trackSshConnectionChannelLifetime / openTrackedSshSocket: bind an opened channel or socket to its ledger entry and settle it only on 'close' ('end', 'error' and the destroyed flag are not closure). Porting note (source: #16741 head a68b6f3, merge-base 277c289; T2 per the #24137 track manifest): - Taken verbatim: ssh-connection-work-ledger behavior and tests, ssh-forward-socket-admission.test.ts, openTrackedSshSocket. - Adapted: the ledger no longer calls assertProfileLifetimeAdmission on every admit. That module is an opt-in native-addon profile lock (addon dropped in T0) that overlaps the SQLite authority from #22612; callers inject their own admission check through the existing constructor argument instead (SshConnection will pass its disposed check). The broad `object` resource type became SshConnectionWorkChannel (on/once/ removeListener), and trackSshConnectionChannelLifetime uses a type guard instead of a cast, so a value without removeListener is now reported unverifiable rather than tracked. Added ssh-connection-channel-lifetime tests, since #16741 covered it only through SshConnection. - Dropped: none in these files. - Not in this slice: SshConnection wiring (ssh-connection.ts), forwarded channel lifetime (T4), upload session lifetime (T6), profile lifetime admission/lock/participation (needs a D9.4 decision against #22612). No wire change: nothing is sent to relays or clients.
Dormant foundation for the T2 SSH core port of #16741. No production module imports it yet, so SSH behavior is unchanged; the next T2 slice has SshConnection track every ssh2 client it allocates and gate its transport-closure subscribers on this ledger plus the work ledger. Adds: - SshTransportCloseLedger: remembers every allocated client (including ones whose authentication failed) until it emits 'close'. drain() waits for the snapshot and fails with ssh_client_close_allocations_changed if a client was allocated after the caller should have fenced allocation. Authentication settlement, 'end' and 'error' are not physical closure. - observeSshTransportClose: registers 'close' listeners on a set of transport resources before close is initiated; wait() is cancelable without dropping the evidence, dispose() removes the listeners. Porting note (source: #16741 head a68b6f3, merge-base 277c289; T2 per the #24137 track manifest): - Taken verbatim: both modules and ssh-transport-close-ledger.test.ts. - Adapted: the ledger test no longer casts EventEmitter to ssh2 Client, since track() already accepts an EventEmitter. Added ssh-transport-close-observation tests, since #16741 covered it only through SshConnection.dispose. - Dropped: none. No wire change. Loss of transport is still reported as unverifiable, never as remote process exit.
…dger (#16741 T2) (#24210) * feat(ssh): add the SSH connection work ledger and channel lifetime tracking Dormant foundation for the T2 SSH core port of #16741 (design D9.3). No production module imports it yet; only tests do, so SSH behavior is unchanged. The next T2 slice wires SshConnection.exec/sftp/channel opens and forwarded sockets through it. Adds: - SshConnectionWorkLedger: tracks local operation and channel lifetimes per connection. fenceForReset closes admission (except work nested under an already-admitted operation and one exactly-identified control channel) and drain() waits for the rest, failing sticky on any failure or unverifiable opening observed after the fence. Channel closure is local lifetime evidence only, never proof that a remote process exited. - trackSshConnectionChannelLifetime / openTrackedSshSocket: bind an opened channel or socket to its ledger entry and settle it only on 'close' ('end', 'error' and the destroyed flag are not closure). Porting note (source: #16741 head a68b6f3, merge-base 277c289; T2 per the #24137 track manifest): - Taken verbatim: ssh-connection-work-ledger behavior and tests, ssh-forward-socket-admission.test.ts, openTrackedSshSocket. - Adapted: the ledger no longer calls assertProfileLifetimeAdmission on every admit. That module is an opt-in native-addon profile lock (addon dropped in T0) that overlaps the SQLite authority from #22612; callers inject their own admission check through the existing constructor argument instead (SshConnection will pass its disposed check). The broad `object` resource type became SshConnectionWorkChannel (on/once/ removeListener), and trackSshConnectionChannelLifetime uses a type guard instead of a cast, so a value without removeListener is now reported unverifiable rather than tracked. Added ssh-connection-channel-lifetime tests, since #16741 covered it only through SshConnection. - Dropped: none in these files. - Not in this slice: SshConnection wiring (ssh-connection.ts), forwarded channel lifetime (T4), upload session lifetime (T6), profile lifetime admission/lock/participation (needs a D9.4 decision against #22612). No wire change: nothing is sent to relays or clients. * feat(ssh): add SSH transport close ledger and close observation Dormant foundation for the T2 SSH core port of #16741. No production module imports it yet, so SSH behavior is unchanged; the next T2 slice has SshConnection track every ssh2 client it allocates and gate its transport-closure subscribers on this ledger plus the work ledger. Adds: - SshTransportCloseLedger: remembers every allocated client (including ones whose authentication failed) until it emits 'close'. drain() waits for the snapshot and fails with ssh_client_close_allocations_changed if a client was allocated after the caller should have fenced allocation. Authentication settlement, 'end' and 'error' are not physical closure. - observeSshTransportClose: registers 'close' listeners on a set of transport resources before close is initiated; wait() is cancelable without dropping the evidence, dispose() removes the listeners. Porting note (source: #16741 head a68b6f3, merge-base 277c289; T2 per the #24137 track manifest): - Taken verbatim: both modules and ssh-transport-close-ledger.test.ts. - Adapted: the ledger test no longer casts EventEmitter to ssh2 Client, since track() already accepts an EventEmitter. Added ssh-transport-close-observation tests, since #16741 covered it only through SshConnection.dispose. - Dropped: none. No wire change. Loss of transport is still reported as unverifiable, never as remote process exit. --------- Co-authored-by: m4air <m4air@m4airs-Air.localdomain>

ELI5
This prepares the port of #16741 (SSH and remote convergence). It adds a script that sorts every file #16741 changes into the planned stack of smaller PRs, and a tracked document for the remote install model. The document replaces the missing
shipping-orcad.htmlthat code comments cite.What Changed
config/scripts/pr16741-track-manifest.mjs, withpr16741-track-rules.mjsand a generatedpr16741-track-manifest.json.277c289bd4and the frozen heada68b6f3531into tracks T0–T9, with prod and test line counts.port,dropped(T0, the Bun pieces),deferred(T7 and T8, live terminal transfer) orreconcile(14 files where main has diverged).docs/reference/remote-server-install-model.md, allow-listed in.gitignore.server-<version>/plusruntimes/node-<sha>/, a legacy sweep that deletes only onexited, a two-release GC handover, and one registered identity per machine.shipping-orcad.htmlnow points at it. Only comments change.Why
Design D9 says to port #16741 by subsystem, so every file needs an owner track. Design D10: the §06 rule can't be amended in a document nobody has.
Linked Issue
Part of the Node runtime plan (Phase 3 prep).
Visual Proof
N/A. This adds a script, generated data and docs.
Testing
41 classifier tests pass.
Fixed in review: renamed files are now judged by their rename source.
Open for track owners: T1 comes out much smaller than the design estimate (915 prod lines against about 3.8k), because the
src/main/ssh/**catch-all puts transport and work-drain files in T2.I manually tested these changes locally
Automated tests added/updated, or explained why not below
Agent skill upstream boundary
docs/reference/agent-skill-sharing-upstream-boundary.mdand copies or mechanically translates no upstream skill-installer source, tests, fixtures, registry entries, path tables, comments, or documentation.