instar 1.3.507 → 1.3.509

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (99) hide show
  1. package/dist/commands/server.d.ts.map +1 -1
  2. package/dist/commands/server.js +154 -13
  3. package/dist/commands/server.js.map +1 -1
  4. package/dist/config/ConfigDefaults.d.ts.map +1 -1
  5. package/dist/config/ConfigDefaults.js +16 -0
  6. package/dist/config/ConfigDefaults.js.map +1 -1
  7. package/dist/coordination/AnchoredAuthorization.d.ts +66 -0
  8. package/dist/coordination/AnchoredAuthorization.d.ts.map +1 -0
  9. package/dist/coordination/AnchoredAuthorization.js +71 -0
  10. package/dist/coordination/AnchoredAuthorization.js.map +1 -0
  11. package/dist/core/AutonomousSessions.d.ts +8 -0
  12. package/dist/core/AutonomousSessions.d.ts.map +1 -1
  13. package/dist/core/AutonomousSessions.js +34 -0
  14. package/dist/core/AutonomousSessions.js.map +1 -1
  15. package/dist/core/ExternalOperationGate.d.ts +12 -0
  16. package/dist/core/ExternalOperationGate.d.ts.map +1 -1
  17. package/dist/core/ExternalOperationGate.js +6 -0
  18. package/dist/core/ExternalOperationGate.js.map +1 -1
  19. package/dist/core/MeshRpc.d.ts +6 -1
  20. package/dist/core/MeshRpc.d.ts.map +1 -1
  21. package/dist/core/MeshRpc.js +7 -0
  22. package/dist/core/MeshRpc.js.map +1 -1
  23. package/dist/core/OwnershipReconciler.d.ts.map +1 -1
  24. package/dist/core/OwnershipReconciler.js +17 -0
  25. package/dist/core/OwnershipReconciler.js.map +1 -1
  26. package/dist/core/PostUpdateMigrator.d.ts.map +1 -1
  27. package/dist/core/PostUpdateMigrator.js +9 -0
  28. package/dist/core/PostUpdateMigrator.js.map +1 -1
  29. package/dist/core/SessionDrainRunner.d.ts +116 -0
  30. package/dist/core/SessionDrainRunner.d.ts.map +1 -0
  31. package/dist/core/SessionDrainRunner.js +162 -0
  32. package/dist/core/SessionDrainRunner.js.map +1 -0
  33. package/dist/core/SessionOwnership.d.ts +22 -1
  34. package/dist/core/SessionOwnership.d.ts.map +1 -1
  35. package/dist/core/SessionOwnership.js +17 -1
  36. package/dist/core/SessionOwnership.js.map +1 -1
  37. package/dist/core/devGatedFeatures.d.ts.map +1 -1
  38. package/dist/core/devGatedFeatures.js +5 -0
  39. package/dist/core/devGatedFeatures.js.map +1 -1
  40. package/dist/core/seamlessnessConfig.d.ts +8 -1
  41. package/dist/core/seamlessnessConfig.d.ts.map +1 -1
  42. package/dist/core/seamlessnessConfig.js +8 -1
  43. package/dist/core/seamlessnessConfig.js.map +1 -1
  44. package/dist/core/types.d.ts +5 -0
  45. package/dist/core/types.d.ts.map +1 -1
  46. package/dist/core/types.js.map +1 -1
  47. package/dist/scaffold/templates.d.ts.map +1 -1
  48. package/dist/scaffold/templates.js +8 -0
  49. package/dist/scaffold/templates.js.map +1 -1
  50. package/dist/server/AgentServer.d.ts +8 -0
  51. package/dist/server/AgentServer.d.ts.map +1 -1
  52. package/dist/server/AgentServer.js +1 -0
  53. package/dist/server/AgentServer.js.map +1 -1
  54. package/dist/server/middleware.d.ts +14 -0
  55. package/dist/server/middleware.d.ts.map +1 -1
  56. package/dist/server/middleware.js +17 -0
  57. package/dist/server/middleware.js.map +1 -1
  58. package/dist/server/routes.d.ts +11 -0
  59. package/dist/server/routes.d.ts.map +1 -1
  60. package/dist/server/routes.js +206 -17
  61. package/dist/server/routes.js.map +1 -1
  62. package/dist/threadline/ContentClassifier.d.ts +15 -0
  63. package/dist/threadline/ContentClassifier.d.ts.map +1 -1
  64. package/dist/threadline/ContentClassifier.js +39 -0
  65. package/dist/threadline/ContentClassifier.js.map +1 -1
  66. package/dist/threadline/ConversationStore.d.ts +32 -0
  67. package/dist/threadline/ConversationStore.d.ts.map +1 -1
  68. package/dist/threadline/ConversationStore.js +74 -0
  69. package/dist/threadline/ConversationStore.js.map +1 -1
  70. package/dist/threadline/NegotiatorGate.d.ts +88 -0
  71. package/dist/threadline/NegotiatorGate.d.ts.map +1 -0
  72. package/dist/threadline/NegotiatorGate.js +148 -0
  73. package/dist/threadline/NegotiatorGate.js.map +1 -0
  74. package/dist/threadline/NegotiatorLease.d.ts +156 -0
  75. package/dist/threadline/NegotiatorLease.d.ts.map +1 -0
  76. package/dist/threadline/NegotiatorLease.js +202 -0
  77. package/dist/threadline/NegotiatorLease.js.map +1 -0
  78. package/dist/threadline/ThreadlineEndpoints.d.ts +2 -1
  79. package/dist/threadline/ThreadlineEndpoints.d.ts.map +1 -1
  80. package/dist/threadline/ThreadlineEndpoints.js +21 -1
  81. package/dist/threadline/ThreadlineEndpoints.js.map +1 -1
  82. package/dist/threadline/ThreadlineMCPServer.d.ts +8 -0
  83. package/dist/threadline/ThreadlineMCPServer.d.ts.map +1 -1
  84. package/dist/threadline/ThreadlineMCPServer.js +14 -1
  85. package/dist/threadline/ThreadlineMCPServer.js.map +1 -1
  86. package/dist/threadline/mcp-http-client.d.ts.map +1 -1
  87. package/dist/threadline/mcp-http-client.js +6 -0
  88. package/dist/threadline/mcp-http-client.js.map +1 -1
  89. package/dist/threadline/recordInboundAck.d.ts +48 -0
  90. package/dist/threadline/recordInboundAck.d.ts.map +1 -0
  91. package/dist/threadline/recordInboundAck.js +46 -0
  92. package/dist/threadline/recordInboundAck.js.map +1 -0
  93. package/package.json +1 -1
  94. package/src/data/builtin-manifest.json +64 -64
  95. package/src/scaffold/templates.ts +8 -0
  96. package/upgrades/1.3.508.md +83 -0
  97. package/upgrades/1.3.509.md +74 -0
  98. package/upgrades/side-effects/multi-machine-seamlessness-ws12b-drain.md +205 -0
  99. package/upgrades/side-effects/threadline-single-negotiator.md +106 -0
@@ -0,0 +1,116 @@
1
+ /**
2
+ * SessionDrainRunner — the OWNER-side bounded drain for an active-topic
3
+ * transfer (WS1.2, MULTI-MACHINE-SEAMLESSNESS-SPEC).
4
+ *
5
+ * Executes the receiver half of the `drain` mesh verb: the router (transfer
6
+ * planner) has ordered this machine — the topic's CURRENT owner — to hand the
7
+ * topic to `target`. The runner:
8
+ *
9
+ * 1. Re-validates ownership + the sender's observed epoch, then CASes
10
+ * active → transferring(target). A stale/replayed drain dies HERE at the
11
+ * fence (reach ≠ authority — RBAC proved the sender may ask; the CAS
12
+ * proves the ask still matches reality).
13
+ * 2. Suspends the topic's autonomous run for the move (the REMOTE arm of
14
+ * WS1.4 — the state file survives, rides the working-set carrier).
15
+ * 3. Waits for the session's turn boundary, bounded by `drainBoundMs`,
16
+ * checking the emergency stop EVERY poll.
17
+ * 4. On the boundary (or the bound): closes the local session — forced at
18
+ * the bound, marked `interrupted-mid-task` with ONE honest notice — and
19
+ * COMPLETES the transfer by landing the target's claim CAS (the FSM
20
+ * permits a non-target sender to land a claim NAMING the target — the
21
+ * established router-confirmClaim precedent), so the durable queue's
22
+ * barrier releases to the new owner exactly at drain completion.
23
+ * 5. On emergency stop: CAS abort-transfer — the topic STAYS HERE, the
24
+ * sender marks the transfer failed-needs-retry, nothing is left split.
25
+ *
26
+ * The drain BARRIER needs no new machinery: while the record is
27
+ * `transferring`, route() queues inbound (ownership-contention); the claim in
28
+ * step 4 is the release point. The WS1.3 reconciler's transferring-to-me claim
29
+ * is held back by `drainClaimGraceMs` so it backstops a dead-mid-drain owner
30
+ * WITHOUT front-running a live one.
31
+ *
32
+ * Honest bound (named in the side-effects artifact): the spec's full "final
33
+ * context flush durably replicated" release gate is the Track H ledger
34
+ * machinery; today's release point is drain completion, with the target's
35
+ * spawn-time history + working-set fetch carrying the context.
36
+ *
37
+ * All I/O is injected — the sequence is deterministic and unit-testable.
38
+ * P19: one bounded poll loop (drainBoundMs / pollMs), no retries, no timers
39
+ * that outlive run().
40
+ */
41
+ import type { OwnershipAction, SessionOwnershipRecord } from './SessionOwnership.js';
42
+ export interface DrainRequest {
43
+ /** The topic key being transferred. */
44
+ sessionKey: string;
45
+ /** The machine the topic is moving to. */
46
+ target: string;
47
+ /** The ownership epoch the SENDER observed when planning the transfer. */
48
+ senderObservedEpoch: number;
49
+ }
50
+ export type DrainStatus = 'drained' | 'drained-interrupted' | 'aborted-emergency-stop' | 'refused-not-owner' | 'refused-stale-epoch' | 'refused-cas-lost';
51
+ export interface DrainOutcome {
52
+ status: DrainStatus;
53
+ /** True when the topic's autonomous run was suspended for the move. */
54
+ autonomousRunSuspended: boolean;
55
+ /** Milliseconds spent waiting for the turn boundary. */
56
+ drainedInMs?: number;
57
+ detail?: string;
58
+ }
59
+ export interface SessionDrainRunnerDeps {
60
+ selfMachineId: string;
61
+ readOwnership: (sessionKey: string) => SessionOwnershipRecord | null;
62
+ /** The registry CAS (epoch-fenced; legality enforced by the FSM). */
63
+ cas: (action: OwnershipAction, ctx: {
64
+ sessionKey: string;
65
+ sender: string;
66
+ nonce: string;
67
+ }) => {
68
+ ok: boolean;
69
+ reason?: string;
70
+ };
71
+ /** WS1.4 remote arm: suspend the topic's autonomous run, file survives. */
72
+ suspendAutonomousRun: (topic: string, target: string) => {
73
+ suspended: boolean;
74
+ };
75
+ /** Turn-boundary signal: is the topic's local session quiet (no turn in flight)?
76
+ * `true` when there is no local session at all — nothing to drain. */
77
+ sessionQuiet: (sessionKey: string) => boolean;
78
+ /** The emergency-stop flag (checked EVERY poll — user safety preempts the move). */
79
+ emergencyStopActive: () => boolean;
80
+ /** Close the topic's local session. `force` at the bound (the session did not
81
+ * reach a boundary in time); implementations escalate to hard-kill if wedged. */
82
+ terminateSession: (sessionKey: string, reason: string, opts: {
83
+ force: boolean;
84
+ }) => Promise<{
85
+ terminated: boolean;
86
+ skipped?: string;
87
+ }>;
88
+ /** Stamp the topic's suspended run file `interrupted_mid_task: true` (no-op without a run). */
89
+ markInterrupted: (topic: string) => void;
90
+ /** ONE honest notice for a forced close ("moved to X mid-task — final turn may be partial"). */
91
+ notifyInterrupted: (topic: string, target: string, detail: string) => void;
92
+ audit?: (event: Record<string, unknown>) => void;
93
+ now: () => number;
94
+ sleep: (ms: number) => Promise<void>;
95
+ nonce: () => string;
96
+ }
97
+ export interface SessionDrainRunnerConfig {
98
+ /** Hard bound on the turn-boundary wait (spec: a long reply must not block a transfer). */
99
+ drainBoundMs: number;
100
+ /** Poll cadence inside the bound. */
101
+ pollMs: number;
102
+ }
103
+ export declare const DEFAULT_DRAIN_RUNNER_CONFIG: SessionDrainRunnerConfig;
104
+ /**
105
+ * How long the WS1.3 reconciler must hold back its transferring-to-me claim so
106
+ * it backstops a dead-mid-drain owner without front-running a live drain:
107
+ * the drain bound plus slack for the close + claim CAS to land.
108
+ */
109
+ export declare const DEFAULT_DRAIN_CLAIM_GRACE_MS: number;
110
+ export declare class SessionDrainRunner {
111
+ private readonly deps;
112
+ private readonly cfg;
113
+ constructor(deps: SessionDrainRunnerDeps, cfg?: Partial<SessionDrainRunnerConfig>);
114
+ run(req: DrainRequest): Promise<DrainOutcome>;
115
+ }
116
+ //# sourceMappingURL=SessionDrainRunner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SessionDrainRunner.d.ts","sourceRoot":"","sources":["../../src/core/SessionDrainRunner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,162 @@
1
+ /**
2
+ * SessionDrainRunner — the OWNER-side bounded drain for an active-topic
3
+ * transfer (WS1.2, MULTI-MACHINE-SEAMLESSNESS-SPEC).
4
+ *
5
+ * Executes the receiver half of the `drain` mesh verb: the router (transfer
6
+ * planner) has ordered this machine — the topic's CURRENT owner — to hand the
7
+ * topic to `target`. The runner:
8
+ *
9
+ * 1. Re-validates ownership + the sender's observed epoch, then CASes
10
+ * active → transferring(target). A stale/replayed drain dies HERE at the
11
+ * fence (reach ≠ authority — RBAC proved the sender may ask; the CAS
12
+ * proves the ask still matches reality).
13
+ * 2. Suspends the topic's autonomous run for the move (the REMOTE arm of
14
+ * WS1.4 — the state file survives, rides the working-set carrier).
15
+ * 3. Waits for the session's turn boundary, bounded by `drainBoundMs`,
16
+ * checking the emergency stop EVERY poll.
17
+ * 4. On the boundary (or the bound): closes the local session — forced at
18
+ * the bound, marked `interrupted-mid-task` with ONE honest notice — and
19
+ * COMPLETES the transfer by landing the target's claim CAS (the FSM
20
+ * permits a non-target sender to land a claim NAMING the target — the
21
+ * established router-confirmClaim precedent), so the durable queue's
22
+ * barrier releases to the new owner exactly at drain completion.
23
+ * 5. On emergency stop: CAS abort-transfer — the topic STAYS HERE, the
24
+ * sender marks the transfer failed-needs-retry, nothing is left split.
25
+ *
26
+ * The drain BARRIER needs no new machinery: while the record is
27
+ * `transferring`, route() queues inbound (ownership-contention); the claim in
28
+ * step 4 is the release point. The WS1.3 reconciler's transferring-to-me claim
29
+ * is held back by `drainClaimGraceMs` so it backstops a dead-mid-drain owner
30
+ * WITHOUT front-running a live one.
31
+ *
32
+ * Honest bound (named in the side-effects artifact): the spec's full "final
33
+ * context flush durably replicated" release gate is the Track H ledger
34
+ * machinery; today's release point is drain completion, with the target's
35
+ * spawn-time history + working-set fetch carrying the context.
36
+ *
37
+ * All I/O is injected — the sequence is deterministic and unit-testable.
38
+ * P19: one bounded poll loop (drainBoundMs / pollMs), no retries, no timers
39
+ * that outlive run().
40
+ */
41
+ export const DEFAULT_DRAIN_RUNNER_CONFIG = {
42
+ drainBoundMs: 30_000,
43
+ pollMs: 1_000,
44
+ };
45
+ /**
46
+ * How long the WS1.3 reconciler must hold back its transferring-to-me claim so
47
+ * it backstops a dead-mid-drain owner without front-running a live drain:
48
+ * the drain bound plus slack for the close + claim CAS to land.
49
+ */
50
+ export const DEFAULT_DRAIN_CLAIM_GRACE_MS = DEFAULT_DRAIN_RUNNER_CONFIG.drainBoundMs + 15_000;
51
+ export class SessionDrainRunner {
52
+ deps;
53
+ cfg;
54
+ constructor(deps, cfg = {}) {
55
+ this.deps = deps;
56
+ this.cfg = { ...DEFAULT_DRAIN_RUNNER_CONFIG, ...cfg };
57
+ }
58
+ async run(req) {
59
+ const d = this.deps;
60
+ const audit = (event, detail = {}) => d.audit?.({ event, sessionKey: req.sessionKey, target: req.target, ...detail });
61
+ // ── 1. Re-validate + fence ────────────────────────────────────────────
62
+ const rec = d.readOwnership(req.sessionKey);
63
+ const resumingOwnDrain = rec?.status === 'transferring' && rec.ownerMachineId === d.selfMachineId && rec.transferTo === req.target;
64
+ if (!resumingOwnDrain) {
65
+ if (!rec || rec.status !== 'active' || rec.ownerMachineId !== d.selfMachineId) {
66
+ audit('drain-refused', { reason: 'not-owner', observedStatus: rec?.status ?? 'none' });
67
+ return { status: 'refused-not-owner', autonomousRunSuspended: false };
68
+ }
69
+ if (rec.ownershipEpoch !== req.senderObservedEpoch) {
70
+ // The transfer this drain belongs to no longer matches reality
71
+ // (replayed drain, or ownership moved since the plan) — refuse.
72
+ audit('drain-refused', { reason: 'stale-epoch', observed: rec.ownershipEpoch, sent: req.senderObservedEpoch });
73
+ return { status: 'refused-stale-epoch', autonomousRunSuspended: false };
74
+ }
75
+ const t = d.cas({ type: 'transfer', to: req.target, drain: true }, { sessionKey: req.sessionKey, sender: d.selfMachineId, nonce: d.nonce() });
76
+ if (!t.ok) {
77
+ audit('drain-refused', { reason: 'cas-lost', casReason: t.reason });
78
+ return { status: 'refused-cas-lost', autonomousRunSuspended: false, detail: t.reason };
79
+ }
80
+ audit('drain-started', { epoch: req.senderObservedEpoch });
81
+ }
82
+ else {
83
+ // A re-delivered drain for the transfer we are ALREADY draining —
84
+ // idempotent resume of the wait loop, no second CAS.
85
+ audit('drain-resumed');
86
+ }
87
+ // ── 2. WS1.4 remote arm: suspend the run for the move ────────────────
88
+ let autonomousRunSuspended = false;
89
+ try {
90
+ autonomousRunSuspended = d.suspendAutonomousRun(req.sessionKey, req.target).suspended;
91
+ }
92
+ catch {
93
+ // @silent-fallback-ok — reported via the outcome field (false); the run's
94
+ // own stop hook keeps it honest on this machine either way.
95
+ }
96
+ // ── 3. Bounded wait for the turn boundary, emergency stop every poll ─
97
+ const startedAt = d.now();
98
+ let interrupted = false;
99
+ for (;;) {
100
+ if (d.emergencyStopActive()) {
101
+ const ab = d.cas({ type: 'abort-transfer', machineId: d.selfMachineId }, { sessionKey: req.sessionKey, sender: d.selfMachineId, nonce: d.nonce() });
102
+ audit('drain-aborted-emergency-stop', { abortLanded: ab.ok, casReason: ab.reason });
103
+ // If the abort CAS lost (e.g. the grace expired and the target already
104
+ // claimed), the transfer has completed under us — report honestly; the
105
+ // emergency stop still stops local work via its own machinery.
106
+ return {
107
+ status: 'aborted-emergency-stop',
108
+ autonomousRunSuspended,
109
+ detail: ab.ok ? 'transfer-aborted-topic-stays' : `abort-cas-${ab.reason ?? 'lost'}`,
110
+ };
111
+ }
112
+ if (d.sessionQuiet(req.sessionKey))
113
+ break;
114
+ if (d.now() - startedAt >= this.cfg.drainBoundMs) {
115
+ interrupted = true;
116
+ break;
117
+ }
118
+ await d.sleep(this.cfg.pollMs);
119
+ }
120
+ const drainedInMs = d.now() - startedAt;
121
+ // ── 4. Close the local session, complete the transfer ────────────────
122
+ const reason = interrupted
123
+ ? `topic ${req.sessionKey} transferring to ${req.target} — drain bound reached, closing mid-task`
124
+ : `topic ${req.sessionKey} transferring to ${req.target} — turn boundary reached, clean close`;
125
+ let closeSkipped;
126
+ try {
127
+ const res = await d.terminateSession(req.sessionKey, reason, { force: interrupted });
128
+ if (!res.terminated)
129
+ closeSkipped = res.skipped ?? 'unknown';
130
+ }
131
+ catch (err) {
132
+ closeSkipped = err instanceof Error ? err.message : String(err);
133
+ }
134
+ if (interrupted) {
135
+ try {
136
+ d.markInterrupted(req.sessionKey);
137
+ }
138
+ catch { /* @silent-fallback-ok — marker is best-effort; the notice below is the user-facing record */ }
139
+ try {
140
+ d.notifyInterrupted(req.sessionKey, req.target, `drain bound (${this.cfg.drainBoundMs}ms) reached — final turn may be partial`);
141
+ }
142
+ catch { /* @silent-fallback-ok — notice failure must not strand the transfer; the audit row below is the durable record */ }
143
+ }
144
+ // Land the target's claim — the owner completing the handoff it was
145
+ // ordered to perform (router-confirmClaim precedent: the FSM checks the
146
+ // claim NAMES the transfer target, not who sent the CAS). This is the
147
+ // barrier release point: the queue stops holding and forwards to the
148
+ // new owner. If the CAS lost, the reconciler's post-grace claim is the
149
+ // backstop — the transfer still completes, just later.
150
+ const claim = d.cas({ type: 'claim', machineId: req.target }, { sessionKey: req.sessionKey, sender: d.selfMachineId, nonce: d.nonce() });
151
+ audit(interrupted ? 'drain-completed-interrupted' : 'drain-completed', {
152
+ drainedInMs, claimLanded: claim.ok, ...(closeSkipped ? { closeSkipped } : {}),
153
+ });
154
+ return {
155
+ status: interrupted ? 'drained-interrupted' : 'drained',
156
+ autonomousRunSuspended,
157
+ drainedInMs,
158
+ ...(closeSkipped ? { detail: `close-skipped:${closeSkipped}` } : {}),
159
+ };
160
+ }
161
+ }
162
+ //# sourceMappingURL=SessionDrainRunner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SessionDrainRunner.js","sourceRoot":"","sources":["../../src/core/SessionDrainRunner.ts"],"names":[],"mappings":"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"}
@@ -26,6 +26,13 @@ export interface SessionOwnershipRecord {
26
26
  status: SessionOwnershipStatus;
27
27
  /** During `transferring`: the target machine the session is moving to. */
28
28
  transferTo?: string;
29
+ /** WS1.2: this transferring record was set by the DRAIN flow — the owner's
30
+ * SessionDrainRunner will land the target's claim itself at drain
31
+ * completion. Consumers (the WS1.3 reconciler) hold their backstop claim
32
+ * for the drain grace instead of front-running the live drain. Absent on
33
+ * reconciler-cooperative transfers (claim promptly) and on records from
34
+ * pre-WS1.2 peers. */
35
+ drainInFlight?: boolean;
29
36
  nonce: string;
30
37
  timestamp: number;
31
38
  updatedAt: string;
@@ -40,6 +47,7 @@ export type OwnershipAction = {
40
47
  } | {
41
48
  type: 'transfer';
42
49
  to: string;
50
+ drain?: boolean;
43
51
  } | {
44
52
  type: 'release';
45
53
  machineId: string;
@@ -58,8 +66,21 @@ export type OwnershipAction = {
58
66
  | {
59
67
  type: 'force-claim';
60
68
  machineId: string;
69
+ }
70
+ /**
71
+ * WS1.2 (MULTI-MACHINE-SEAMLESSNESS-SPEC): the emergency-stop-during-drain
72
+ * path — the CURRENT owner aborts its own in-flight transfer and returns to
73
+ * `active` at epoch+1, so the topic STAYS on the old machine and nothing is
74
+ * left split. The fenced epoch increment makes the stale target's later
75
+ * claim fail (claim-out-of-sequence on an active record at a newer epoch).
76
+ * Owner-only by construction: only the machine the transferring record
77
+ * names may abort.
78
+ */
79
+ | {
80
+ type: 'abort-transfer';
81
+ machineId: string;
61
82
  };
62
- export type OwnershipReason = 'ok' | 'already-placed' | 'claim-out-of-sequence' | 'claim-wrong-machine' | 'transfer-not-active' | 'release-not-owner' | 'release-requires-active' | 'force-claim-self' | 'no-record';
83
+ export type OwnershipReason = 'ok' | 'already-placed' | 'claim-out-of-sequence' | 'claim-wrong-machine' | 'transfer-not-active' | 'release-not-owner' | 'release-requires-active' | 'force-claim-self' | 'abort-not-transferring' | 'abort-not-owner' | 'no-record';
63
84
  /**
64
85
  * Pure transition. Given the CURRENT record (or null for a never-seen session)
65
86
  * and an action, returns the next record (the CAS candidate, at epoch+1) or a
@@ -1 +1 @@
1
- {"version":3,"file":"SessionOwnership.d.ts","sourceRoot":"","sources":["../../src/core/SessionOwnership.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,MAAM,MAAM,sBAAsB,GAAG,SAAS,GAAG,QAAQ,GAAG,cAAc,GAAG,UAAU,CAAC;AAExF,MAAM,WAAW,sBAAsB;IACrC,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,MAAM,CAAC;IACvB,cAAc,EAAE,MAAM,CAAC;IACvB,MAAM,EAAE,sBAAsB,CAAC;IAC/B,0EAA0E;IAC1E,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,MAAM,eAAe,GACvB;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,GACpC;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,GACpC;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,GAChC;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE;AACxC;;;;;;;;;;GAUG;GACD;IAAE,IAAI,EAAE,aAAa,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAAC;AAE/C,MAAM,MAAM,eAAe,GACvB,IAAI,GACJ,gBAAgB,GAChB,uBAAuB,GACvB,qBAAqB,GACrB,qBAAqB,GACrB,mBAAmB,GACnB,yBAAyB,GACzB,kBAAkB,GAClB,WAAW,CAAC;AAEhB;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,sBAAsB,GAAG,IAAI,EACtC,MAAM,EAAE,eAAe,EACvB,GAAG,EAAE;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAA;CAAE,GAC3E;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,IAAI,EAAE,sBAAsB,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,eAAe,CAAA;CAAE,CAwErF;AAED;;;;;GAKG;AACH,wBAAgB,MAAM,CAAC,MAAM,EAAE,sBAAsB,GAAG,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,GAAG,OAAO,CAGhH;AAED,MAAM,WAAW,YAAY;IAC3B,mEAAmE;IACnE,OAAO,EAAE,OAAO,CAAC;IACjB,6EAA6E;IAC7E,gBAAgB,EAAE,OAAO,CAAC;CAC3B;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,OAAO,CACrB,MAAM,EAAE,sBAAsB,GAAG,IAAI,EACrC,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE,GACvE,YAAY,CAkBd;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAEnH"}
1
+ {"version":3,"file":"SessionOwnership.d.ts","sourceRoot":"","sources":["../../src/core/SessionOwnership.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,MAAM,MAAM,sBAAsB,GAAG,SAAS,GAAG,QAAQ,GAAG,cAAc,GAAG,UAAU,CAAC;AAExF,MAAM,WAAW,sBAAsB;IACrC,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,MAAM,CAAC;IACvB,cAAc,EAAE,MAAM,CAAC;IACvB,MAAM,EAAE,sBAAsB,CAAC;IAC/B,0EAA0E;IAC1E,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB;;;;;2BAKuB;IACvB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,MAAM,eAAe,GACvB;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,GACpC;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,GACpC;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,OAAO,CAAA;CAAE,GACjD;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE;AACxC;;;;;;;;;;GAUG;GACD;IAAE,IAAI,EAAE,aAAa,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE;AAC5C;;;;;;;;GAQG;GACD;IAAE,IAAI,EAAE,gBAAgB,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAAC;AAElD,MAAM,MAAM,eAAe,GACvB,IAAI,GACJ,gBAAgB,GAChB,uBAAuB,GACvB,qBAAqB,GACrB,qBAAqB,GACrB,mBAAmB,GACnB,yBAAyB,GACzB,kBAAkB,GAClB,wBAAwB,GACxB,iBAAiB,GACjB,WAAW,CAAC;AAEhB;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,sBAAsB,GAAG,IAAI,EACtC,MAAM,EAAE,eAAe,EACvB,GAAG,EAAE;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAA;CAAE,GAC3E;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,IAAI,EAAE,sBAAsB,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,eAAe,CAAA;CAAE,CAsFrF;AAED;;;;;GAKG;AACH,wBAAgB,MAAM,CAAC,MAAM,EAAE,sBAAsB,GAAG,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,GAAG,OAAO,CAGhH;AAED,MAAM,WAAW,YAAY;IAC3B,mEAAmE;IACnE,OAAO,EAAE,OAAO,CAAC;IACjB,6EAA6E;IAC7E,gBAAgB,EAAE,OAAO,CAAC;CAC3B;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,OAAO,CACrB,MAAM,EAAE,sBAAsB,GAAG,IAAI,EACrC,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE,GACvE,YAAY,CAkBd;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAEnH"}
@@ -68,7 +68,10 @@ export function applyOwnershipAction(current, action, ctx) {
68
68
  return { ok: false, reason: 'transfer-not-active' };
69
69
  return {
70
70
  ok: true,
71
- next: { ...base, ownerMachineId: current.ownerMachineId, ownershipEpoch: epoch + 1, status: 'transferring', transferTo: action.to },
71
+ next: {
72
+ ...base, ownerMachineId: current.ownerMachineId, ownershipEpoch: epoch + 1, status: 'transferring', transferTo: action.to,
73
+ ...(action.drain ? { drainInFlight: true } : {}),
74
+ },
72
75
  };
73
76
  }
74
77
  case 'force-claim': {
@@ -85,6 +88,19 @@ export function applyOwnershipAction(current, action, ctx) {
85
88
  }
86
89
  return { ok: true, next: { ...base, ownerMachineId: action.machineId, ownershipEpoch: epoch + 1, status: 'active' } };
87
90
  }
91
+ case 'abort-transfer': {
92
+ // WS1.2 emergency-stop-during-drain: only the DRAINING OWNER of a
93
+ // `transferring` record may abort, returning itself to `active` at
94
+ // epoch+1 (the fence that invalidates the stale target's claim).
95
+ if (!current || current.status !== 'transferring')
96
+ return { ok: false, reason: 'abort-not-transferring' };
97
+ if (current.ownerMachineId !== action.machineId)
98
+ return { ok: false, reason: 'abort-not-owner' };
99
+ return {
100
+ ok: true,
101
+ next: { ...base, ownerMachineId: action.machineId, ownershipEpoch: epoch + 1, status: 'active' },
102
+ };
103
+ }
88
104
  case 'release': {
89
105
  if (!current)
90
106
  return { ok: false, reason: 'no-record' };
@@ -1 +1 @@
1
- {"version":3,"file":"SessionOwnership.js","sourceRoot":"","sources":["../../src/core/SessionOwnership.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"SessionOwnership.js","sourceRoot":"","sources":["../../src/core/SessionOwnership.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"devGatedFeatures.d.ts","sourceRoot":"","sources":["../../src/core/devGatedFeatures.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAEH,oEAAoE;AACpE,MAAM,WAAW,eAAe;IAC9B,mEAAmE;IACnE,IAAI,EAAE,MAAM,CAAC;IACb,uEAAuE;IACvE,UAAU,EAAE,MAAM,CAAC;IACnB,6DAA6D;IAC7D,WAAW,EAAE,MAAM,CAAC;IACpB;;;;;;OAMG;IACH,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,eAAO,MAAM,kBAAkB,EAAE,eAAe,EA2E/C,CAAC;AAEF;;;;;;;;;;;;GAYG;AACH,MAAM,MAAM,gBAAgB,GACxB,aAAa,GACb,sBAAsB,GACtB,cAAc,GACd,iBAAiB,GACjB,0BAA0B,CAAC;AAE/B,MAAM,WAAW,iBAAiB;IAChC,uEAAuE;IACvE,UAAU,EAAE,MAAM,CAAC;IACnB,6CAA6C;IAC7C,QAAQ,EAAE,gBAAgB,CAAC;IAC3B,mFAAmF;IACnF,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,eAAO,MAAM,oBAAoB,EAAE,iBAAiB,EAoHnD,CAAC;AAEF;;;GAGG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAO5E"}
1
+ {"version":3,"file":"devGatedFeatures.d.ts","sourceRoot":"","sources":["../../src/core/devGatedFeatures.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAEH,oEAAoE;AACpE,MAAM,WAAW,eAAe;IAC9B,mEAAmE;IACnE,IAAI,EAAE,MAAM,CAAC;IACb,uEAAuE;IACvE,UAAU,EAAE,MAAM,CAAC;IACnB,6DAA6D;IAC7D,WAAW,EAAE,MAAM,CAAC;IACpB;;;;;;OAMG;IACH,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,eAAO,MAAM,kBAAkB,EAAE,eAAe,EA2E/C,CAAC;AAEF;;;;;;;;;;;;GAYG;AACH,MAAM,MAAM,gBAAgB,GACxB,aAAa,GACb,sBAAsB,GACtB,cAAc,GACd,iBAAiB,GACjB,0BAA0B,CAAC;AAE/B,MAAM,WAAW,iBAAiB;IAChC,uEAAuE;IACvE,UAAU,EAAE,MAAM,CAAC;IACnB,6CAA6C;IAC7C,QAAQ,EAAE,gBAAgB,CAAC;IAC3B,mFAAmF;IACnF,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,eAAO,MAAM,oBAAoB,EAAE,iBAAiB,EAyHnD,CAAC;AAEF;;;GAGG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAO5E"}
@@ -163,6 +163,11 @@ export const DARK_GATE_EXCLUSIONS = [
163
163
  reason: 'hold-for-stability policy; trails inboundQueue one rollout stage behind (operator discipline)',
164
164
  },
165
165
  // ── deliberate-fleet-default — off for everyone by design (incl. dev) ──
166
+ {
167
+ configPath: 'threadline.singleNegotiator.enabled',
168
+ category: 'deliberate-fleet-default',
169
+ reason: 'lease send-gate withholds a non-owner content send; off+dry-run-first for everyone until dry-run telemetry shows an acceptable false-positive rate (THREADLINE-SINGLE-NEGOTIATOR-SPEC FD-7)',
170
+ },
166
171
  {
167
172
  configPath: 'monitoring.bootHealthBeacon.enabled',
168
173
  category: 'deliberate-fleet-default',
@@ -1 +1 @@
1
- {"version":3,"file":"devGatedFeatures.js","sourceRoot":"","sources":["../../src/core/devGatedFeatures.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"devGatedFeatures.js","sourceRoot":"","sources":["../../src/core/devGatedFeatures.ts"],"names":[],"mappings":"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"}
@@ -15,8 +15,15 @@ import type { MultiMachineConfig } from './types.js';
15
15
  * The mesh protocol version this build speaks. A machine below this version
16
16
  * is ineligible for the awake lease during a seamless handoff (spec §11
17
17
  * partial-migration safety). Bump only on a breaking coordination change.
18
+ *
19
+ * v2 (WS1.2, MULTI-MACHINE-SEAMLESSNESS-SPEC): the `drain` mesh verb — an
20
+ * active-topic transfer now drains the owner's live session through an
21
+ * authorized, epoch-bound signal. Verb-level skew is additionally handled by
22
+ * the 501/no-handler degrade (an old owner falls back to today's
23
+ * idle-closeout-only transfer), so mixed pools keep working; the version
24
+ * gates only lease eligibility during a handoff window.
18
25
  */
19
- export declare const SEAMLESSNESS_PROTOCOL_VERSION = 1;
26
+ export declare const SEAMLESSNESS_PROTOCOL_VERSION = 2;
20
27
  /** Fully-resolved seamlessness knobs (every field concrete). */
21
28
  export interface ResolvedSeamlessnessConfig {
22
29
  ingressHeartbeatMs: number;
@@ -1 +1 @@
1
- {"version":3,"file":"seamlessnessConfig.d.ts","sourceRoot":"","sources":["../../src/core/seamlessnessConfig.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAErD;;;;GAIG;AACH,eAAO,MAAM,6BAA6B,IAAI,CAAC;AAE/C,gEAAgE;AAChE,MAAM,WAAW,0BAA0B;IACzC,kBAAkB,EAAE,MAAM,CAAC;IAC3B,sBAAsB,EAAE,MAAM,CAAC;IAC/B,qBAAqB,EAAE,MAAM,CAAC;IAC9B,2EAA2E;IAC3E,mBAAmB,EAAE,MAAM,CAAC;IAC5B,mBAAmB,EAAE,MAAM,CAAC;IAC5B,UAAU,EAAE,MAAM,CAAC;IACnB,iBAAiB,EAAE,QAAQ,GAAG,KAAK,CAAC;IACpC,sBAAsB,EAAE,MAAM,CAAC;IAC/B,kBAAkB,EAAE,MAAM,CAAC;IAC3B,2BAA2B,EAAE,MAAM,CAAC;IACpC,wBAAwB,EAAE,MAAM,CAAC;IACjC,mBAAmB,EAAE,MAAM,CAAC;IAC5B,oBAAoB,EAAE,MAAM,CAAC;IAC7B,8BAA8B,EAAE,MAAM,CAAC;IACvC,UAAU,EAAE,cAAc,GAAG,SAAS,CAAC;IACvC,eAAe,EAAE,MAAM,CAAC;IACxB;;;;;;OAMG;IACH,kBAAkB,EAAE,OAAO,CAAC;IAC5B,eAAe,EAAE,MAAM,CAAC;CACzB;AAED,qBAAa,uBAAwB,SAAQ,KAAK;gBACpC,OAAO,EAAE,MAAM;CAI5B;AAED;;;;;GAKG;AACH,wBAAgB,0BAA0B,CAAC,EAAE,CAAC,EAAE,kBAAkB,GAAG,MAAM,CAG1E;AAED;;;;GAIG;AACH,wBAAgB,yBAAyB,CAAC,EAAE,CAAC,EAAE,kBAAkB,GAAG,0BAA0B,CAgD7F;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,8BAA8B,CAAC,CAAC,EAAE,0BAA0B,GAAG,MAAM,EAAE,CAgDtF;AAED;;;;GAIG;AACH,wBAAgB,4BAA4B,CAAC,EAAE,CAAC,EAAE,kBAAkB,GAAG,0BAA0B,CAUhG"}
1
+ {"version":3,"file":"seamlessnessConfig.d.ts","sourceRoot":"","sources":["../../src/core/seamlessnessConfig.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAErD;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,6BAA6B,IAAI,CAAC;AAE/C,gEAAgE;AAChE,MAAM,WAAW,0BAA0B;IACzC,kBAAkB,EAAE,MAAM,CAAC;IAC3B,sBAAsB,EAAE,MAAM,CAAC;IAC/B,qBAAqB,EAAE,MAAM,CAAC;IAC9B,2EAA2E;IAC3E,mBAAmB,EAAE,MAAM,CAAC;IAC5B,mBAAmB,EAAE,MAAM,CAAC;IAC5B,UAAU,EAAE,MAAM,CAAC;IACnB,iBAAiB,EAAE,QAAQ,GAAG,KAAK,CAAC;IACpC,sBAAsB,EAAE,MAAM,CAAC;IAC/B,kBAAkB,EAAE,MAAM,CAAC;IAC3B,2BAA2B,EAAE,MAAM,CAAC;IACpC,wBAAwB,EAAE,MAAM,CAAC;IACjC,mBAAmB,EAAE,MAAM,CAAC;IAC5B,oBAAoB,EAAE,MAAM,CAAC;IAC7B,8BAA8B,EAAE,MAAM,CAAC;IACvC,UAAU,EAAE,cAAc,GAAG,SAAS,CAAC;IACvC,eAAe,EAAE,MAAM,CAAC;IACxB;;;;;;OAMG;IACH,kBAAkB,EAAE,OAAO,CAAC;IAC5B,eAAe,EAAE,MAAM,CAAC;CACzB;AAED,qBAAa,uBAAwB,SAAQ,KAAK;gBACpC,OAAO,EAAE,MAAM;CAI5B;AAED;;;;;GAKG;AACH,wBAAgB,0BAA0B,CAAC,EAAE,CAAC,EAAE,kBAAkB,GAAG,MAAM,CAG1E;AAED;;;;GAIG;AACH,wBAAgB,yBAAyB,CAAC,EAAE,CAAC,EAAE,kBAAkB,GAAG,0BAA0B,CAgD7F;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,8BAA8B,CAAC,CAAC,EAAE,0BAA0B,GAAG,MAAM,EAAE,CAgDtF;AAED;;;;GAIG;AACH,wBAAgB,4BAA4B,CAAC,EAAE,CAAC,EAAE,kBAAkB,GAAG,0BAA0B,CAUhG"}
@@ -14,8 +14,15 @@
14
14
  * The mesh protocol version this build speaks. A machine below this version
15
15
  * is ineligible for the awake lease during a seamless handoff (spec §11
16
16
  * partial-migration safety). Bump only on a breaking coordination change.
17
+ *
18
+ * v2 (WS1.2, MULTI-MACHINE-SEAMLESSNESS-SPEC): the `drain` mesh verb — an
19
+ * active-topic transfer now drains the owner's live session through an
20
+ * authorized, epoch-bound signal. Verb-level skew is additionally handled by
21
+ * the 501/no-handler degrade (an old owner falls back to today's
22
+ * idle-closeout-only transfer), so mixed pools keep working; the version
23
+ * gates only lease eligibility during a handoff window.
17
24
  */
18
- export const SEAMLESSNESS_PROTOCOL_VERSION = 1;
25
+ export const SEAMLESSNESS_PROTOCOL_VERSION = 2;
19
26
  export class SeamlessnessConfigError extends Error {
20
27
  constructor(message) {
21
28
  super(message);
@@ -1 +1 @@
1
- {"version":3,"file":"seamlessnessConfig.js","sourceRoot":"","sources":["../../src/core/seamlessnessConfig.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"seamlessnessConfig.js","sourceRoot":"","sources":["../../src/core/seamlessnessConfig.ts"],"names":[],"mappings":"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"}
@@ -1780,6 +1780,11 @@ export interface MachineCapacity {
1780
1780
  /** This machine can durably RECEIVE forwarded inbound messages (the
1781
1781
  * 'deliverMessage' receiver handler + live durable queue). */
1782
1782
  ws11DeliverReceive?: boolean;
1783
+ /** WS1.2: this machine can execute the owner-side `drain` verb (bounded
1784
+ * turn-boundary drain + claim handoff for an active-topic transfer).
1785
+ * ABSENT/false → the transfer sender degrades to today's pin-and-
1786
+ * idle-closeout path — never a doomed drain order. */
1787
+ ws12DrainReceive?: boolean;
1783
1788
  };
1784
1789
  /** Compact guard-posture summary self-reported in the capacity heartbeat
1785
1790
  * (GUARD-POSTURE-ENDPOINT-SPEC §2.3). Bound to the AUTHENTICATED sender at