instar 1.3.652 → 1.3.654

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 (31) hide show
  1. package/dist/commands/server.d.ts.map +1 -1
  2. package/dist/commands/server.js +388 -3
  3. package/dist/commands/server.js.map +1 -1
  4. package/dist/core/configCoherence.d.ts +46 -5
  5. package/dist/core/configCoherence.d.ts.map +1 -1
  6. package/dist/core/configCoherence.js +101 -12
  7. package/dist/core/configCoherence.js.map +1 -1
  8. package/dist/core/devGatedFeatures.d.ts.map +1 -1
  9. package/dist/core/devGatedFeatures.js +12 -0
  10. package/dist/core/devGatedFeatures.js.map +1 -1
  11. package/dist/core/ownershipFollowsLiveWork.d.ts +68 -0
  12. package/dist/core/ownershipFollowsLiveWork.d.ts.map +1 -0
  13. package/dist/core/ownershipFollowsLiveWork.js +95 -0
  14. package/dist/core/ownershipFollowsLiveWork.js.map +1 -0
  15. package/dist/core/types.d.ts +26 -0
  16. package/dist/core/types.d.ts.map +1 -1
  17. package/dist/core/types.js.map +1 -1
  18. package/dist/messaging/stuckMessageRecovery.d.ts +12 -0
  19. package/dist/messaging/stuckMessageRecovery.d.ts.map +1 -1
  20. package/dist/messaging/stuckMessageRecovery.js +12 -0
  21. package/dist/messaging/stuckMessageRecovery.js.map +1 -1
  22. package/dist/monitoring/SessionRecovery.d.ts +73 -0
  23. package/dist/monitoring/SessionRecovery.d.ts.map +1 -1
  24. package/dist/monitoring/SessionRecovery.js +113 -0
  25. package/dist/monitoring/SessionRecovery.js.map +1 -1
  26. package/package.json +1 -1
  27. package/src/data/builtin-manifest.json +2 -2
  28. package/upgrades/1.3.653.md +85 -0
  29. package/upgrades/1.3.654.md +26 -0
  30. package/upgrades/side-effects/mesh-coherence-live-state-honesty.md +53 -0
  31. package/upgrades/side-effects/ownership-follows-live-work.md +137 -0
@@ -13,15 +13,13 @@
13
13
  *
14
14
  * Pure + deterministic → fully unit-testable.
15
15
  */
16
+ import type { MeshTransportConfig } from './types.js';
16
17
  export interface ConfigCoherenceWarning {
17
18
  code: string;
18
19
  message: string;
19
20
  }
20
21
  interface MultiMachineLike {
21
- meshTransport?: {
22
- enabled?: boolean;
23
- priorities?: Record<string, number>;
24
- };
22
+ meshTransport?: Pick<MeshTransportConfig, 'enabled' | 'priorityTailscale' | 'priorityLan' | 'priorityCloudflare' | 'bindHost'>;
25
23
  sessionPool?: {
26
24
  stage?: string;
27
25
  enabled?: boolean;
@@ -35,5 +33,48 @@ interface MultiMachineLike {
35
33
  * harmless no-ops, so we don't warn.
36
34
  */
37
35
  export declare function checkMultiMachineConfigCoherence(mm: MultiMachineLike | undefined, isMultiMachine: boolean): ConfigCoherenceWarning[];
38
- export {};
36
+ /** The self-entry advertised endpoint shape, consumed by `checkMeshLiveStateCoherence`
37
+ * as a BOOLEAN PRESENCE signal only (see the no-leak invariant). */
38
+ export interface MeshLiveState {
39
+ /** The live resolved server bind host (e.g. '0.0.0.0' | '::' | '192.168.1.50' |
40
+ * '127.0.0.1'). PROCESS-LOCAL and OPERATOR-CONFIG-DERIVED (it comes from this machine's
41
+ * own resolveMeshBindHost over config.host / meshTransport.bindHost — NOT from peer data),
42
+ * so it is SAFE to render verbatim in a warning string (no peer-controlled value, no
43
+ * no-leak concern). b.1 treats it as "mesh is up" when it is ANY non-loopback host —
44
+ * NOT only the wildcards (see `boundWide`). LIMITATION (R3): this is the RESOLVED-INTENDED
45
+ * bind (the boot constant from resolveMeshBindHost over config.host / meshTransport.bindHost),
46
+ * NOT the post-bind actual listening address. The bind cannot change without a restart, so a
47
+ * boot-constant signal is correct; reading AgentServer's real post-.listen() address is out
48
+ * of scope. */
49
+ boundHost?: string;
50
+ /** The self-entry advertised endpoints, from idMgr.getMachineEndpoints(selfId).
51
+ * CONSUMED AS A BOOLEAN PRESENCE SIGNAL ONLY (length > 0) — never as an address,
52
+ * instruction, or authorization. See the security no-leak invariant below. */
53
+ selfEndpoints?: import('./types.js').MeshEndpoint[];
54
+ /** Milliseconds since this process booted, from `process.uptime() * 1000` — a MONOTONIC
55
+ * clock (immune to wall-clock jumps / NTP steps; no boot-timestamp capture needed). Gates
56
+ * the b.2 "inert" warning so it cannot false-fire during the legitimate boot-warmup window.
57
+ * (Decision #8.) */
58
+ uptimeMs?: number;
59
+ }
60
+ /** Warmup grace: past this uptime, a config-on machine with no advertised endpoints warns.
61
+ * Comfortably past a healthy first advertise; tunable via the flag's `warmupGraceMs`. */
62
+ declare const MESH_WARMUP_GRACE_MS = 120000;
63
+ /**
64
+ * Compare the CONFIG's intended mesh-transport state against the LIVE running state.
65
+ * Signal-only — returns advisory warnings, never throws. Pure over (config, live).
66
+ *
67
+ * SECURITY / NO-LEAK INVARIANT (Decision #11): a warning string NEVER interpolates an
68
+ * endpoint VALUE (host, IP, URL) from the peer-writable, git-synced self-entry. It
69
+ * interpolates ONLY (i) integer COUNTS and (ii) the PROCESS-LOCAL bound-host string (which
70
+ * the operator's own config produced — not peer data). `selfEndpoints` is consumed as a
71
+ * boolean `length > 0` presence signal ONLY — never rendered, never treated as an address
72
+ * or instruction. This keeps a hostile/garbage peer-written self-entry from steering the
73
+ * warning text. (Unit-asserted — see Tests.)
74
+ *
75
+ * CONTRACT: `mm` is the RESOLVED/EFFECTIVE config (ConfigDefaults merged) — see Fix (c)'s
76
+ * merged-config note and Decision #9.
77
+ */
78
+ export declare function checkMeshLiveStateCoherence(mm: MultiMachineLike | undefined, isMultiMachine: boolean, live: MeshLiveState, warmupGraceMs?: number): ConfigCoherenceWarning[];
79
+ export { MESH_WARMUP_GRACE_MS };
39
80
  //# sourceMappingURL=configCoherence.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"configCoherence.d.ts","sourceRoot":"","sources":["../../src/core/configCoherence.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,MAAM,WAAW,sBAAsB;IACrC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,UAAU,gBAAgB;IACxB,aAAa,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,OAAO,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;KAAE,CAAC;IAC3E,WAAW,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC;IACpD,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;;;;GAKG;AACH,wBAAgB,gCAAgC,CAC9C,EAAE,EAAE,gBAAgB,GAAG,SAAS,EAChC,cAAc,EAAE,OAAO,GACtB,sBAAsB,EAAE,CAgC1B"}
1
+ {"version":3,"file":"configCoherence.d.ts","sourceRoot":"","sources":["../../src/core/configCoherence.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAEtD,MAAM,WAAW,sBAAsB;IACrC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,UAAU,gBAAgB;IAIxB,aAAa,CAAC,EAAE,IAAI,CAClB,mBAAmB,EACnB,SAAS,GAAG,mBAAmB,GAAG,aAAa,GAAG,oBAAoB,GAAG,UAAU,CACpF,CAAC;IACF,WAAW,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC;IACpD,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;;;;GAKG;AACH,wBAAgB,gCAAgC,CAC9C,EAAE,EAAE,gBAAgB,GAAG,SAAS,EAChC,cAAc,EAAE,OAAO,GACtB,sBAAsB,EAAE,CA8C1B;AAED;qEACqE;AACrE,MAAM,WAAW,aAAa;IAC5B;;;;;;;;;oBASgB;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;mFAE+E;IAC/E,aAAa,CAAC,EAAE,OAAO,YAAY,EAAE,YAAY,EAAE,CAAC;IACpD;;;yBAGqB;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;0FAC0F;AAC1F,QAAA,MAAM,oBAAoB,SAAU,CAAC;AAErC;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,2BAA2B,CACzC,EAAE,EAAE,gBAAgB,GAAG,SAAS,EAChC,cAAc,EAAE,OAAO,EACvB,IAAI,EAAE,aAAa,EAInB,aAAa,GAAE,MAA6B,GAC3C,sBAAsB,EAAE,CA0D1B;AAED,OAAO,EAAE,oBAAoB,EAAE,CAAC"}
@@ -34,19 +34,108 @@ export function checkMultiMachineConfigCoherence(mm, isMultiMachine) {
34
34
  'session transfer is active but the mesh is single-rope, reintroducing the lease flap. Set meshTransport.enabled=true.',
35
35
  });
36
36
  }
37
- // 2) Mesh rope priorities must be DISTINCT positive integers (a tie makes rope
38
- // selection nondeterministic).
39
- const pri = mm.meshTransport?.priorities;
40
- if (pri && typeof pri === 'object') {
41
- const vals = Object.values(pri).filter((v) => typeof v === 'number');
42
- const bad = vals.filter((v) => !Number.isInteger(v) || v <= 0);
43
- if (bad.length > 0) {
44
- warnings.push({ code: 'mesh-priority-nonpositive', message: `multiMachine.meshTransport.priorities must be positive integers; got ${JSON.stringify(bad)}.` });
45
- }
46
- if (new Set(vals).size !== vals.length) {
47
- warnings.push({ code: 'mesh-priority-collision', message: `multiMachine.meshTransport.priorities has duplicate values (${JSON.stringify(vals)}) — rope selection is nondeterministic.` });
48
- }
37
+ // 2) Mesh rope priorities must be DISTINCT positive integers (a tie makes rope selection
38
+ // nondeterministic). The canonical contract — types.ts:2175 — ships the FLAT keys
39
+ // priorityTailscale/Lan/Cloudflare (10/20/30); there is NO `.priorities` dict in the
40
+ // type or in ConfigDefaults, so the dict check this replaces was always dead code
41
+ // (Fix (c) / Decision #4 — mesh-coherence-live-state-honesty). `mm` is the RESOLVED/
42
+ // effective config (ConfigDefaults merged), so a user override of one key is validated
43
+ // against the effective values of the others (Decision #9).
44
+ const flat = [
45
+ ['priorityTailscale', mm.meshTransport?.priorityTailscale],
46
+ ['priorityLan', mm.meshTransport?.priorityLan],
47
+ ['priorityCloudflare', mm.meshTransport?.priorityCloudflare],
48
+ ];
49
+ const flatDefined = flat.filter(([, v]) => typeof v === 'number');
50
+ const flatBad = flatDefined.filter(([, v]) => !Number.isInteger(v) || v <= 0);
51
+ if (flatBad.length > 0) {
52
+ warnings.push({
53
+ code: 'mesh-priority-nonpositive',
54
+ message: `multiMachine.meshTransport rope priorities must be positive integers; got ${JSON.stringify(Object.fromEntries(flatBad))}.`,
55
+ });
56
+ }
57
+ const flatVals = flatDefined.map(([, v]) => v);
58
+ if (new Set(flatVals).size !== flatVals.length) {
59
+ warnings.push({
60
+ code: 'mesh-priority-collision',
61
+ message: `multiMachine.meshTransport rope priorities have duplicate values (${JSON.stringify(Object.fromEntries(flatDefined))}) — rope selection is nondeterministic.`,
62
+ });
63
+ }
64
+ return warnings;
65
+ }
66
+ /** Warmup grace: past this uptime, a config-on machine with no advertised endpoints warns.
67
+ * Comfortably past a healthy first advertise; tunable via the flag's `warmupGraceMs`. */
68
+ const MESH_WARMUP_GRACE_MS = 120_000; // 2 minutes
69
+ /**
70
+ * Compare the CONFIG's intended mesh-transport state against the LIVE running state.
71
+ * Signal-only — returns advisory warnings, never throws. Pure over (config, live).
72
+ *
73
+ * SECURITY / NO-LEAK INVARIANT (Decision #11): a warning string NEVER interpolates an
74
+ * endpoint VALUE (host, IP, URL) from the peer-writable, git-synced self-entry. It
75
+ * interpolates ONLY (i) integer COUNTS and (ii) the PROCESS-LOCAL bound-host string (which
76
+ * the operator's own config produced — not peer data). `selfEndpoints` is consumed as a
77
+ * boolean `length > 0` presence signal ONLY — never rendered, never treated as an address
78
+ * or instruction. This keeps a hostile/garbage peer-written self-entry from steering the
79
+ * warning text. (Unit-asserted — see Tests.)
80
+ *
81
+ * CONTRACT: `mm` is the RESOLVED/EFFECTIVE config (ConfigDefaults merged) — see Fix (c)'s
82
+ * merged-config note and Decision #9.
83
+ */
84
+ export function checkMeshLiveStateCoherence(mm, isMultiMachine, live,
85
+ // warmup grace is a PARAMETER (the wiring resolves it from the flag's `warmupGraceMs` ??
86
+ // the const and passes it in), so the tuning knob is actually READ. Defaults to the const
87
+ // so unit tests and any caller omitting it keep the 2-min behavior.
88
+ warmupGraceMs = MESH_WARMUP_GRACE_MS) {
89
+ const warnings = [];
90
+ if (!mm || !isMultiMachine)
91
+ return warnings;
92
+ const configMeshOff = mm.meshTransport?.enabled === false;
93
+ // "wide" must mean NOT-LOOPBACK, not is-wildcard (R2-M10). resolveMeshBindHost can return a
94
+ // SPECIFIC non-loopback host when the operator sets meshTransport.bindHost (e.g.
95
+ // '192.168.1.50') or a non-loopback config.host — the live process is then mesh-UP on that
96
+ // host even though boundHost is neither '0.0.0.0' nor '::'. (Mirrors the isLoopback predicate
97
+ // in resolveMeshBindHost, MeshUrlAdvertiser.ts:229.) `undefined` (no bind observed) is treated
98
+ // as loopback/inert → not wide.
99
+ const boundWide = !(live.boundHost === '127.0.0.1' ||
100
+ live.boundHost === 'localhost' ||
101
+ live.boundHost === '::1' ||
102
+ live.boundHost === undefined);
103
+ // selfEndpoints is peer-writable/git-synced — boolean presence ONLY, corroborating-only.
104
+ const hasEndpoints = (live.selfEndpoints?.length ?? 0) > 0;
105
+ // (b.1) Config says mesh OFF, but the PROCESS-LOCAL bind is still non-loopback (wide) → a
106
+ // runtime flip without a restart. PRIMARY signal = `boundWide` (process-local, can't
107
+ // change without a restart). `hasEndpoints` is CORROBORATING-only — a stale peer-written
108
+ // self-entry must NOT be able to fire this alone (the registry is a shared file).
109
+ if (configMeshOff && boundWide) {
110
+ const corroboration = hasEndpoints
111
+ ? ` (and the self-entry still advertises ${live.selfEndpoints?.length ?? 0} mesh endpoint(s))`
112
+ : '';
113
+ warnings.push({
114
+ code: 'mesh-config-off-but-live-on',
115
+ message: 'multiMachine.meshTransport.enabled=false in config, but the running server is still ' +
116
+ // boundHost is operator-config-derived/process-local — safe to render the SPECIFIC
117
+ // host (e.g. '0.0.0.0', '::', or '192.168.1.50'); NO peer endpoint value is leaked.
118
+ `bound ${live.boundHost} (non-loopback)${corroboration} — the disable has ` +
119
+ 'not taken effect; a restart will apply it. (Advisory only — these codes carry no ' +
120
+ 'contract for automated remediation; the operator decides whether to restart.)',
121
+ });
122
+ }
123
+ // (b.2) Config says mesh ON, but the live self-entry advertises NO ropes → this machine is
124
+ // not currently advertising mesh endpoints in its self-entry. Fire once uptime has
125
+ // passed the warmup grace, so a healthy boot's brief empty window does not false-fire,
126
+ // while a FIRST advertise that NEVER lands (dead/rate-limited tunnel, identity never
127
+ // ready) — the MOST important inert case — still warns shortly after boot (Decision #8).
128
+ const warmupOver = (live.uptimeMs ?? 0) >= warmupGraceMs;
129
+ if (!configMeshOff && warmupOver && !hasEndpoints) {
130
+ warnings.push({
131
+ code: 'mesh-config-on-but-live-inert',
132
+ message: 'multiMachine.meshTransport.enabled is on, but this machine is not currently ' +
133
+ 'advertising any mesh endpoints in its self-entry. Check identity readiness, the ' +
134
+ 'network interfaces (Tailscale/LAN), and the tunnel; restart only if endpoints are ' +
135
+ 'expected and absent. (Advisory only — no remediation contract; the operator decides.)',
136
+ });
49
137
  }
50
138
  return warnings;
51
139
  }
140
+ export { MESH_WARMUP_GRACE_MS };
52
141
  //# sourceMappingURL=configCoherence.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"configCoherence.js","sourceRoot":"","sources":["../../src/core/configCoherence.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAaH;;;;;GAKG;AACH,MAAM,UAAU,gCAAgC,CAC9C,EAAgC,EAChC,cAAuB;IAEvB,MAAM,QAAQ,GAA6B,EAAE,CAAC;IAC9C,IAAI,CAAC,EAAE,IAAI,CAAC,cAAc;QAAE,OAAO,QAAQ,CAAC;IAE5C,gFAAgF;IAChF,4EAA4E;IAC5E,4EAA4E;IAC5E,MAAM,YAAY,GAAG,EAAE,CAAC,WAAW,EAAE,OAAO,KAAK,KAAK,IAAI,EAAE,CAAC,WAAW,EAAE,KAAK,KAAK,eAAe,CAAC;IACpG,IAAI,EAAE,CAAC,aAAa,EAAE,OAAO,KAAK,KAAK,IAAI,YAAY,EAAE,CAAC;QACxD,QAAQ,CAAC,IAAI,CAAC;YACZ,IAAI,EAAE,8BAA8B;YACpC,OAAO,EACL,4GAA4G;gBAC5G,uHAAuH;SAC1H,CAAC,CAAC;IACL,CAAC;IAED,+EAA+E;IAC/E,kCAAkC;IAClC,MAAM,GAAG,GAAG,EAAE,CAAC,aAAa,EAAE,UAAU,CAAC;IACzC,IAAI,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;QACnC,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC;QACrE,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QAC/D,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACnB,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,2BAA2B,EAAE,OAAO,EAAE,wEAAwE,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC;QAChK,CAAC;QACD,IAAI,IAAI,GAAG,CAAC,IAAI,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,MAAM,EAAE,CAAC;YACvC,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,yBAAyB,EAAE,OAAO,EAAE,+DAA+D,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,yCAAyC,EAAE,CAAC,CAAC;QAC5L,CAAC;IACH,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC"}
1
+ {"version":3,"file":"configCoherence.js","sourceRoot":"","sources":["../../src/core/configCoherence.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,EA4X/C,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,MAAM,MAAM,gBAAgB,GACxB,aAAa,GACb,cAAc,GACd,gBAAgB,GAChB,sBAAsB,GACtB,iBAAiB,CAAC;AAEtB,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,EA2InD,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,EAwY/C,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,MAAM,MAAM,gBAAgB,GACxB,aAAa,GACb,cAAc,GACd,gBAAgB,GAChB,sBAAsB,GACtB,iBAAiB,CAAC;AAEtB,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,EA2InD,CAAC;AAEF;;;GAGG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAO5E"}
@@ -216,6 +216,12 @@ export const DEV_GATED_FEATURES = [
216
216
  description: 'Transfer fix (live-user-channel-proof spec §7.2) — swaps the in-memory session-ownership store for a DURABLE per-session store + the OwnershipApplier that materializes ownership on the target from the REPLICATED placement journal, so a topic seat genuinely moves between machines.',
217
217
  justification: 'Coordinates between the operator\'s OWN machines only — no external egress. The durable store is a per-session atomic JSON write (a cache of journal-decided ownership, not a new authority); the applier only ADOPTS a placement strictly newer than local via fast-forward CAS (it can never clobber a fresher local decision) and runs OFF the routing hot path on an interval; fully reversible (flip back to InMemory — the journal remains the source of truth); single-machine = no-op (no peer placements to apply). No destructive action, no third-party spend. Runs live (dryRun N/A — no destructive write to gate) on dev / dark on fleet.',
218
218
  },
219
+ {
220
+ name: 'ownershipFollowsLiveWork',
221
+ configPath: 'multiMachine.ownershipFollowsLiveWork',
222
+ description: 'Ownership Follows Live Work (docs/specs/ownership-follows-live-work.md) — the ownership-record correction PR #1258 deferred: release-on-complete (A) + claim-on-autonomous-spawn (B) + a per-topic double-dispatch recovery gate (D), so the SessionOwnership record self-corrects toward where the live session actually is.',
223
+ justification: 'Coordinates the operator\'s OWN machines only — no external egress, no third-party spend, no destructive fs/git action. Parts A/B add TWO fenced-epoch CAS callsites to the EXISTING replicated ownership lifecycle (the same SessionOwnershipRegistry.cas + emitPlacement path the user-move release/transfer already use): every write is best-effort, CAS-fenced at epoch+1, loses safely to a higher epoch, and is NEVER forced (force-claim stays the reconciler\'s death-evidence verb). Part D\'s ownerOf read is a SIGNAL that only ever WITHHOLDS a local re-run / forwards to the owner — it can never cause a new kill or a new send (strictly reduces double-dispatch). Single-machine agents are a strict no-op (_meshSelfId null short-circuits every gate). Runs live (no destructive write warrants a dry-run) on dev / dark on fleet. Spec\'s fleet-promotion exit is an evidence-gated dev soak.',
224
+ },
219
225
  {
220
226
  name: 'canonicalHistoryConversationDiscipline',
221
227
  configPath: 'threadline.canonicalHistory.conversationDiscipline.enabled',
@@ -292,6 +298,12 @@ export const DEV_GATED_FEATURES = [
292
298
  description: 'Boot health beacon — a minimal /health responder during the heavy boot phase.',
293
299
  justification: 'D4-verified read-only: binds a localhost-only inbound /health socket during boot and cleanly releases it before the real server binds; zero outbound (no fetch/Telegram), no spend, no destructive action.',
294
300
  },
301
+ {
302
+ name: 'meshCoherenceLiveCheck',
303
+ configPath: 'monitoring.meshCoherenceLiveCheck.enabled',
304
+ description: 'Periodic mesh config-vs-live-state coherence check (signal-only log warnings; per-feature metric). Spec: docs/specs/mesh-coherence-live-state-honesty.md.',
305
+ justification: 'Signal-only periodic log line; reads only own config + own registry self-entry (boolean presence) + own resolved bind host; no egress, no spend, no mutation, no destructive action — safe to soak live on a dev agent. Transition-only emit + capped half-open-breaker backoff bound the output; the live read is throw-wrapped (fails toward silence).',
306
+ },
295
307
  // ── multi-machine replicated-store memory family (WS2.1–WS2.6) — the 7 stateSync
296
308
  // stores, MOVED from DARK_GATE_EXCLUSIONS on 2026-06-13 per operator directive
297
309
  // topic 13481 ("NOTHING should ship dark on development agents — every
@@ -1 +1 @@
1
- {"version":3,"file":"devGatedFeatures.js","sourceRoot":"","sources":["../../src/core/devGatedFeatures.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAoBH,MAAM,CAAC,MAAM,kBAAkB,GAAsB;IACnD;QACE,IAAI,EAAE,yBAAyB;QAC/B,UAAU,EAAE,6CAA6C;QACzD,WAAW,EAAE,+MAA+M;QAC5N,aAAa,EAAE,ikBAAikB;KACjlB;IACD;QACE,IAAI,EAAE,eAAe;QACrB,UAAU,EAAE,kCAAkC;QAC9C,WAAW,EAAE,mDAAmD;QAChE,aAAa,EAAE,uGAAuG;KACvH;IACD;QACE,IAAI,EAAE,kBAAkB;QACxB,UAAU,EAAE,uCAAuC;QACnD,WAAW,EAAE,kCAAkC;QAC/C,aAAa,EAAE,yGAAyG;KACzH;IACD;QACE,IAAI,EAAE,gBAAgB;QACtB,UAAU,EAAE,mCAAmC;QAC/C,WAAW,EAAE,gDAAgD;QAC7D,aAAa,EAAE,sGAAsG;KACtH;IACD;QACE,IAAI,EAAE,YAAY;QAClB,UAAU,EAAE,iCAAiC;QAC7C,WAAW,EAAE,2CAA2C;QACxD,aAAa,EAAE,wGAAwG;KACxH;IACD;QACE,IAAI,EAAE,kBAAkB;QACxB,UAAU,EAAE,6CAA6C;QACzD,WAAW,EAAE,gCAAgC;QAC7C,aAAa,EAAE,sGAAsG;KACtH;IACD;QACE,IAAI,EAAE,qBAAqB;QAC3B,UAAU,EAAE,sCAAsC;QAClD,WAAW,EAAE,mDAAmD;QAChE,aAAa,EAAE,8FAA8F;KAC9G;IACD;QACE,IAAI,EAAE,6BAA6B;QACnC,UAAU,EAAE,sCAAsC;QAClD,WAAW,EAAE,gDAAgD;QAC7D,aAAa,EAAE,yGAAyG;KACzH;IACD;QACE,IAAI,EAAE,cAAc;QACpB,UAAU,EAAE,sBAAsB;QAClC,WAAW,EAAE,iEAAiE;QAC9E,aAAa,EAAE,sDAAsD;KACtE;IACD;QACE,IAAI,EAAE,8BAA8B;QACpC,UAAU,EAAE,uCAAuC;QACnD,WAAW,EAAE,oEAAoE;QACjF,aAAa,EAAE,yDAAyD;KACzE;IACD;QACE,IAAI,EAAE,eAAe;QACrB,UAAU,EAAE,kCAAkC;QAC9C,WAAW,EAAE,8EAA8E;QAC3F,aAAa,EAAE,qNAAqN;KACrO;IACD;QACE,IAAI,EAAE,sBAAsB;QAC5B,UAAU,EAAE,uDAAuD;QACnE,WAAW,EAAE,wPAAwP;QACrQ,aAAa,EAAE,srBAAsrB;KACtsB;IACD;QACE,IAAI,EAAE,qBAAqB;QAC3B,UAAU,EAAE,sDAAsD;QAClE,WAAW,EAAE,sMAAsM;QACnN,aAAa,EAAE,2hBAA2hB;KAC3iB;IACD;QACE,IAAI,EAAE,eAAe;QACrB,UAAU,EAAE,uBAAuB;QACnC,WAAW,EAAE,+EAA+E;QAC5F,aAAa,EAAE,yNAAyN;KACzO;IACD;QACE,IAAI,EAAE,sBAAsB;QAC5B,UAAU,EAAE,+CAA+C;QAC3D,WAAW,EAAE,uLAAuL;QACpM,aAAa,EAAE,otBAAotB;KACpuB;IACD;QACE,IAAI,EAAE,oBAAoB;QAC1B,UAAU,EAAE,4BAA4B;QACxC,WAAW,EAAE,mEAAmE;QAChF,aAAa,EAAE,mOAAmO;KACnP;IACD;QACE,IAAI,EAAE,aAAa;QACnB,UAAU,EAAE,gCAAgC;QAC5C,WAAW,EAAE,wJAAwJ;QACrK,aAAa,EAAE,wnBAAwnB;KACxoB;IACD;QACE,IAAI,EAAE,sBAAsB;QAC5B,UAAU,EAAE,+CAA+C;QAC3D,WAAW,EAAE,+MAA+M;QAC5N,aAAa,EAAE,69BAA69B;KAC7+B;IACD,gFAAgF;IAChF,+EAA+E;IAC/E,8EAA8E;IAC9E,gFAAgF;IAChF,0EAA0E;IAC1E,kFAAkF;IAClF,mFAAmF;IACnF,oFAAoF;IACpF,oFAAoF;IACpF,qFAAqF;IACrF,6EAA6E;IAC7E,+EAA+E;IAC/E,iFAAiF;IACjF,+EAA+E;IAC/E,2EAA2E;IAC3E,gFAAgF;IAChF,iFAAiF;IACjF,+EAA+E;IAC/E;QACE,IAAI,EAAE,aAAa;QACnB,UAAU,EAAE,uCAAuC;QACnD,WAAW,EAAE,+IAA+I;QAC5J,aAAa,EAAE,8YAA8Y;KAC9Z;IACD;QACE,IAAI,EAAE,eAAe;QACrB,UAAU,EAAE,yCAAyC;QACrD,WAAW,EAAE,8JAA8J;QAC3K,aAAa,EAAE,0aAA0a;KAC1b;IACD;QACE,IAAI,EAAE,gBAAgB;QACtB,UAAU,EAAE,0CAA0C;QACtD,WAAW,EAAE,2MAA2M;QACxN,aAAa,EAAE,gcAAgc;KAChd;IACD;QACE,IAAI,EAAE,iBAAiB;QACvB,UAAU,EAAE,sCAAsC;QAClD,WAAW,EAAE,wMAAwM;QACrN,aAAa,EAAE,muBAAmuB;KACnvB;IACD;QACE,IAAI,EAAE,eAAe;QACrB,UAAU,EAAE,yCAAyC;QACrD,WAAW,EAAE,0OAA0O;QACvP,aAAa,EAAE,mcAAmc;KACnd;IACD;QACE,IAAI,EAAE,kBAAkB;QACxB,UAAU,EAAE,4CAA4C;QACxD,WAAW,EAAE,kPAAkP;QAC/P,aAAa,EAAE,+oBAA+oB;KAC/pB;IACD;QACE,IAAI,EAAE,eAAe;QACrB,UAAU,EAAE,yCAAyC;QACrD,WAAW,EAAE,wGAAwG;QACrH,aAAa,EAAE,qRAAqR;KACrS;IACD;QACE,IAAI,EAAE,eAAe;QACrB,UAAU,EAAE,yCAAyC;QACrD,WAAW,EAAE,2UAA2U;QACxV,aAAa,EAAE,qTAAqT;KACrU;IACD;QACE,IAAI,EAAE,cAAc;QACpB,UAAU,EAAE,iCAAiC;QAC7C,WAAW,EAAE,gNAAgN;QAC7N,aAAa,EAAE,gpBAAgpB;KAChqB;IACD;QACE,IAAI,EAAE,gBAAgB;QACtB,UAAU,EAAE,mCAAmC;QAC/C,WAAW,EAAE,2ZAA2Z;QACxa,aAAa,EAAE,+lBAA+lB;KAC/mB;IACD;QACE,IAAI,EAAE,kBAAkB;QACxB,UAAU,EAAE,uCAAuC;QACnD,WAAW,EAAE,0RAA0R;QACvS,aAAa,EAAE,ynBAAynB;KACzoB;IACD;QACE,IAAI,EAAE,wCAAwC;QAC9C,UAAU,EAAE,4DAA4D;QACxE,WAAW,EACT,2KAA2K;QAC7K,aAAa,EACX,2OAA2O;KAC9O;IACD;QACE,IAAI,EAAE,2BAA2B;QACjC,UAAU,EAAE,8CAA8C;QAC1D,WAAW,EACT,6IAA6I;QAC/I,aAAa,EACX,uKAAuK;KAC1K;IACD;QACE,IAAI,EAAE,4BAA4B;QAClC,UAAU,EAAE,qCAAqC;QACjD,WAAW,EACT,0IAA0I;QAC5I,aAAa,EACX,ieAAie;KACpe;IACD;QACE,IAAI,EAAE,sBAAsB;QAC5B,UAAU,EAAE,yCAAyC;QACrD,WAAW,EACT,6HAA6H;QAC/H,aAAa,EACX,8UAA8U;KACjV;IACD;QACE,IAAI,EAAE,aAAa;QACnB,UAAU,EAAE,gCAAgC;QAC5C,WAAW,EACT,kKAAkK;QACpK,aAAa,EACX,wiBAAwiB;KAC3iB;IACD;QACE,IAAI,EAAE,uBAAuB;QAC7B,UAAU,EAAE,0CAA0C;QACtD,WAAW,EACT,2OAA2O;QAC7O,aAAa,EACX,gqBAAgqB;KACnqB;IACD,gFAAgF;IAChF,iFAAiF;IACjF,yEAAyE;IACzE,gFAAgF;IAChF;QACE,IAAI,EAAE,sBAAsB;QAC5B,UAAU,EAAE,yCAAyC;QACrD,WAAW,EAAE,qFAAqF;QAClG,aAAa,EAAE,mOAAmO;KACnP;IACD;QACE,IAAI,EAAE,8BAA8B;QACpC,UAAU,EAAE,iDAAiD;QAC7D,WAAW,EAAE,mKAAmK;QAChL,aAAa,EAAE,4fAA4f;KAC5gB;IACD;QACE,IAAI,EAAE,qBAAqB;QAC3B,UAAU,EAAE,wCAAwC;QACpD,WAAW,EAAE,2LAA2L;QACxM,aAAa,EAAE,8wBAA8wB;KAC9xB;IACD;QACE,IAAI,EAAE,iBAAiB;QACvB,UAAU,EAAE,oCAAoC;QAChD,WAAW,EAAE,mFAAmF;QAChG,aAAa,EAAE,uWAAuW;KACvX;IACD;QACE,IAAI,EAAE,kBAAkB;QACxB,UAAU,EAAE,qCAAqC;QACjD,WAAW,EAAE,yEAAyE;QACtF,aAAa,EAAE,6cAA6c;KAC7d;IACD;QACE,IAAI,EAAE,kBAAkB;QACxB,UAAU,EAAE,qCAAqC;QACjD,WAAW,EAAE,+EAA+E;QAC5F,aAAa,EAAE,4MAA4M;KAC5N;IACD,kFAAkF;IAClF,kFAAkF;IAClF,0EAA0E;IAC1E,oFAAoF;IACpF,qFAAqF;IACrF,sFAAsF;IACtF,8EAA8E;IAC9E,6EAA6E;IAC7E,sFAAsF;IACtF,qFAAqF;IACrF,qFAAqF;IACrF,oFAAoF;IACpF,kEAAkE;IAClE,gFAAgF;IAChF,mFAAmF;IACnF,oDAAoD;IACpD;QACE,IAAI,EAAE,sBAAsB;QAC5B,UAAU,EAAE,4CAA4C;QACxD,WAAW,EAAE,yFAAyF;QACtG,aAAa,EAAE,6WAA6W;KAC7X;IACD;QACE,IAAI,EAAE,wBAAwB;QAC9B,UAAU,EAAE,8CAA8C;QAC1D,WAAW,EAAE,+GAA+G;QAC5H,aAAa,EAAE,waAAwa;KACxb;IACD;QACE,IAAI,EAAE,oBAAoB;QAC1B,UAAU,EAAE,0CAA0C;QACtD,WAAW,EAAE,uHAAuH;QACpI,aAAa,EAAE,6UAA6U;KAC7V;IACD;QACE,IAAI,EAAE,oBAAoB;QAC1B,UAAU,EAAE,0CAA0C;QACtD,WAAW,EAAE,4HAA4H;QACzI,aAAa,EAAE,qVAAqV;KACrW;IACD;QACE,IAAI,EAAE,2BAA2B;QACjC,UAAU,EAAE,iDAAiD;QAC7D,WAAW,EAAE,qIAAqI;QAClJ,aAAa,EAAE,2bAA2b;KAC3c;IACD;QACE,IAAI,EAAE,uBAAuB;QAC7B,UAAU,EAAE,6CAA6C;QACzD,WAAW,EAAE,kHAAkH;QAC/H,aAAa,EAAE,0aAA0a;KAC1b;IACD;QACE,IAAI,EAAE,wBAAwB;QAC9B,UAAU,EAAE,8CAA8C;QAC1D,WAAW,EAAE,kHAAkH;QAC/H,aAAa,EAAE,kjBAAkjB;KAClkB;IACD;QACE,IAAI,EAAE,0BAA0B;QAChC,UAAU,EAAE,gDAAgD;QAC5D,WAAW,EAAE,+QAA+Q;QAC5R,aAAa,EAAE,2hBAA2hB;KAC3iB;IACD;QACE,IAAI,EAAE,8BAA8B;QACpC,UAAU,EAAE,oDAAoD;QAChE,WAAW,EAAE,8VAA8V;QAC3W,aAAa,EAAE,wkBAAwkB;KACxlB;IACD;QACE,IAAI,EAAE,wBAAwB;QAC9B,UAAU,EAAE,8CAA8C;QAC1D,WAAW,EAAE,2dAA2d;QACxe,aAAa,EAAE,2oBAA2oB;KAC3pB;IACD,gFAAgF;IAChF,sFAAsF;IACtF,qFAAqF;IACrF,uFAAuF;IACvF,8DAA8D;IAC9D;QACE,IAAI,EAAE,4BAA4B;QAClC,UAAU,EAAE,gDAAgD;QAC5D,WAAW,EAAE,wMAAwM;QACrN,aAAa,EAAE,skBAAskB;KACtlB;IACD;QACE,IAAI,EAAE,8BAA8B;QACpC,UAAU,EAAE,kDAAkD;QAC9D,WAAW,EAAE,2NAA2N;QACxO,aAAa,EAAE,mgBAAmgB;KACnhB;IACD;QACE,IAAI,EAAE,4BAA4B;QAClC,UAAU,EAAE,sCAAsC;QAClD,WAAW,EAAE,iPAAiP;QAC9P,aAAa,EAAE,4nBAA4nB;KAC5oB;CACF,CAAC;AA0CF,MAAM,CAAC,MAAM,oBAAoB,GAAwB;IACvD,+EAA+E;IAC/E;QACE,UAAU,EAAE,kCAAkC;QAC9C,QAAQ,EAAE,aAAa;QACvB,MAAM,EAAE,+CAA+C;KACxD;IACD;QACE,UAAU,EAAE,wCAAwC;QACpD,QAAQ,EAAE,aAAa;QACvB,MAAM,EAAE,iDAAiD;KAC1D;IACD;QACE,UAAU,EAAE,qCAAqC;QACjD,QAAQ,EAAE,aAAa;QACvB,MAAM,EAAE,+CAA+C;KACxD;IACD,gFAAgF;IAChF,+EAA+E;IAC/E,oFAAoF;IACpF,6DAA6D;IAC7D,wEAAwE;IACxE;QACE,UAAU,EAAE,8BAA8B;QAC1C,QAAQ,EAAE,cAAc;QACxB,MAAM,EAAE,mDAAmD;KAC5D;IACD;QACE,UAAU,EAAE,gCAAgC;QAC5C,QAAQ,EAAE,cAAc;QACxB,MAAM,EAAE,iIAAiI;KAC1I;IACD;QACE,UAAU,EAAE,qCAAqC;QACjD,QAAQ,EAAE,cAAc;QACxB,MAAM,EAAE,gGAAgG;KACzG;IACD,uFAAuF;IACvF;QACE,UAAU,EAAE,qDAAqD;QACjE,QAAQ,EAAE,iBAAiB;QAC3B,MAAM,EAAE,kCAAkC;KAC3C;IACD;QACE,UAAU,EAAE,2CAA2C;QACvD,QAAQ,EAAE,iBAAiB;QAC3B,MAAM,EAAE,kCAAkC;KAC3C;IACD;QACE,UAAU,EAAE,+BAA+B;QAC3C,QAAQ,EAAE,iBAAiB;QAC3B,MAAM,EAAE,qDAAqD;KAC9D;IACD,qDAAqD;IACrD;QACE,UAAU,EAAE,kCAAkC;QAC9C,QAAQ,EAAE,sBAAsB;QAChC,MAAM,EAAE,8CAA8C;KACvD;IACD;QACE,UAAU,EAAE,+CAA+C;QAC3D,QAAQ,EAAE,sBAAsB;QAChC,MAAM,EAAE,kGAAkG;KAC3G;IACD;QACE,UAAU,EAAE,mDAAmD;QAC/D,QAAQ,EAAE,sBAAsB;QAChC,MAAM,EAAE,+FAA+F;KACxG;IACD,8EAA8E;IAC9E,kFAAkF;IAClF,iFAAiF;IACjF,gFAAgF;IAChF,mFAAmF;IACnF,6EAA6E;IAC7E,oFAAoF;IACpF,sFAAsF;IACtF,8EAA8E;IAC9E,+EAA+E;IAC/E,6EAA6E;IAC7E,iFAAiF;IACjF;QACE,UAAU,EAAE,qCAAqC;QACjD,QAAQ,EAAE,gBAAgB;QAC1B,MAAM,EAAE,4RAA4R;KACrS;IACD;QACE,UAAU,EAAE,wDAAwD;QACpE,QAAQ,EAAE,gBAAgB;QAC1B,MAAM,EAAE,4dAA4d;KACre;IACD;QACE,UAAU,EAAE,4DAA4D;QACxE,QAAQ,EAAE,gBAAgB;QAC1B,MAAM,EAAE,scAAsc;KAC/c;IACD;QACE,UAAU,EAAE,oDAAoD;QAChE,QAAQ,EAAE,gBAAgB;QAC1B,MAAM,EAAE,inBAAinB;KAC1nB;IACD;QACE,UAAU,EAAE,+BAA+B;QAC3C,QAAQ,EAAE,gBAAgB;QAC1B,MAAM,EAAE,uMAAuM;KAChN;IACD;QACE,UAAU,EAAE,kDAAkD;QAC9D,QAAQ,EAAE,gBAAgB;QAC1B,MAAM,EAAE,ymBAAymB;KAClnB;IACD;QACE,UAAU,EAAE,2CAA2C;QACvD,QAAQ,EAAE,gBAAgB;QAC1B,MAAM,EAAE,gXAAgX;KACzX;IACD;QACE,UAAU,EAAE,6CAA6C;QACzD,QAAQ,EAAE,gBAAgB;QAC1B,MAAM,EAAE,uVAAuV;KAChW;IACD,sDAAsD;IACtD;QACE,UAAU,EAAE,uCAAuC;QACnD,QAAQ,EAAE,cAAc;QACxB,MAAM,EAAE,wXAAwX;KACjY;IACD,gFAAgF;IAChF,uFAAuF;IACvF;QACE,UAAU,EAAE,gBAAgB;QAC5B,QAAQ,EAAE,sBAAsB;QAChC,MAAM,EAAE,8NAA8N;KACvO;IACD;QACE,UAAU,EAAE,gBAAgB;QAC5B,QAAQ,EAAE,sBAAsB;QAChC,MAAM,EAAE,gQAAgQ;KACzQ;CACF,CAAC;AAEF;;;GAGG;AACH,MAAM,UAAU,eAAe,CAAC,MAAe,EAAE,UAAkB;IACjE,IAAI,GAAG,GAAY,MAAM,CAAC;IAC1B,KAAK,MAAM,GAAG,IAAI,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;QACxC,IAAI,GAAG,IAAI,IAAI,IAAI,OAAO,GAAG,KAAK,QAAQ;YAAE,OAAO,SAAS,CAAC;QAC7D,GAAG,GAAI,GAA+B,CAAC,GAAG,CAAC,CAAC;IAC9C,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC"}
1
+ {"version":3,"file":"devGatedFeatures.js","sourceRoot":"","sources":["../../src/core/devGatedFeatures.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAoBH,MAAM,CAAC,MAAM,kBAAkB,GAAsB;IACnD;QACE,IAAI,EAAE,yBAAyB;QAC/B,UAAU,EAAE,6CAA6C;QACzD,WAAW,EAAE,+MAA+M;QAC5N,aAAa,EAAE,ikBAAikB;KACjlB;IACD;QACE,IAAI,EAAE,eAAe;QACrB,UAAU,EAAE,kCAAkC;QAC9C,WAAW,EAAE,mDAAmD;QAChE,aAAa,EAAE,uGAAuG;KACvH;IACD;QACE,IAAI,EAAE,kBAAkB;QACxB,UAAU,EAAE,uCAAuC;QACnD,WAAW,EAAE,kCAAkC;QAC/C,aAAa,EAAE,yGAAyG;KACzH;IACD;QACE,IAAI,EAAE,gBAAgB;QACtB,UAAU,EAAE,mCAAmC;QAC/C,WAAW,EAAE,gDAAgD;QAC7D,aAAa,EAAE,sGAAsG;KACtH;IACD;QACE,IAAI,EAAE,YAAY;QAClB,UAAU,EAAE,iCAAiC;QAC7C,WAAW,EAAE,2CAA2C;QACxD,aAAa,EAAE,wGAAwG;KACxH;IACD;QACE,IAAI,EAAE,kBAAkB;QACxB,UAAU,EAAE,6CAA6C;QACzD,WAAW,EAAE,gCAAgC;QAC7C,aAAa,EAAE,sGAAsG;KACtH;IACD;QACE,IAAI,EAAE,qBAAqB;QAC3B,UAAU,EAAE,sCAAsC;QAClD,WAAW,EAAE,mDAAmD;QAChE,aAAa,EAAE,8FAA8F;KAC9G;IACD;QACE,IAAI,EAAE,6BAA6B;QACnC,UAAU,EAAE,sCAAsC;QAClD,WAAW,EAAE,gDAAgD;QAC7D,aAAa,EAAE,yGAAyG;KACzH;IACD;QACE,IAAI,EAAE,cAAc;QACpB,UAAU,EAAE,sBAAsB;QAClC,WAAW,EAAE,iEAAiE;QAC9E,aAAa,EAAE,sDAAsD;KACtE;IACD;QACE,IAAI,EAAE,8BAA8B;QACpC,UAAU,EAAE,uCAAuC;QACnD,WAAW,EAAE,oEAAoE;QACjF,aAAa,EAAE,yDAAyD;KACzE;IACD;QACE,IAAI,EAAE,eAAe;QACrB,UAAU,EAAE,kCAAkC;QAC9C,WAAW,EAAE,8EAA8E;QAC3F,aAAa,EAAE,qNAAqN;KACrO;IACD;QACE,IAAI,EAAE,sBAAsB;QAC5B,UAAU,EAAE,uDAAuD;QACnE,WAAW,EAAE,wPAAwP;QACrQ,aAAa,EAAE,srBAAsrB;KACtsB;IACD;QACE,IAAI,EAAE,qBAAqB;QAC3B,UAAU,EAAE,sDAAsD;QAClE,WAAW,EAAE,sMAAsM;QACnN,aAAa,EAAE,2hBAA2hB;KAC3iB;IACD;QACE,IAAI,EAAE,eAAe;QACrB,UAAU,EAAE,uBAAuB;QACnC,WAAW,EAAE,+EAA+E;QAC5F,aAAa,EAAE,yNAAyN;KACzO;IACD;QACE,IAAI,EAAE,sBAAsB;QAC5B,UAAU,EAAE,+CAA+C;QAC3D,WAAW,EAAE,uLAAuL;QACpM,aAAa,EAAE,otBAAotB;KACpuB;IACD;QACE,IAAI,EAAE,oBAAoB;QAC1B,UAAU,EAAE,4BAA4B;QACxC,WAAW,EAAE,mEAAmE;QAChF,aAAa,EAAE,mOAAmO;KACnP;IACD;QACE,IAAI,EAAE,aAAa;QACnB,UAAU,EAAE,gCAAgC;QAC5C,WAAW,EAAE,wJAAwJ;QACrK,aAAa,EAAE,wnBAAwnB;KACxoB;IACD;QACE,IAAI,EAAE,sBAAsB;QAC5B,UAAU,EAAE,+CAA+C;QAC3D,WAAW,EAAE,+MAA+M;QAC5N,aAAa,EAAE,69BAA69B;KAC7+B;IACD,gFAAgF;IAChF,+EAA+E;IAC/E,8EAA8E;IAC9E,gFAAgF;IAChF,0EAA0E;IAC1E,kFAAkF;IAClF,mFAAmF;IACnF,oFAAoF;IACpF,oFAAoF;IACpF,qFAAqF;IACrF,6EAA6E;IAC7E,+EAA+E;IAC/E,iFAAiF;IACjF,+EAA+E;IAC/E,2EAA2E;IAC3E,gFAAgF;IAChF,iFAAiF;IACjF,+EAA+E;IAC/E;QACE,IAAI,EAAE,aAAa;QACnB,UAAU,EAAE,uCAAuC;QACnD,WAAW,EAAE,+IAA+I;QAC5J,aAAa,EAAE,8YAA8Y;KAC9Z;IACD;QACE,IAAI,EAAE,eAAe;QACrB,UAAU,EAAE,yCAAyC;QACrD,WAAW,EAAE,8JAA8J;QAC3K,aAAa,EAAE,0aAA0a;KAC1b;IACD;QACE,IAAI,EAAE,gBAAgB;QACtB,UAAU,EAAE,0CAA0C;QACtD,WAAW,EAAE,2MAA2M;QACxN,aAAa,EAAE,gcAAgc;KAChd;IACD;QACE,IAAI,EAAE,iBAAiB;QACvB,UAAU,EAAE,sCAAsC;QAClD,WAAW,EAAE,wMAAwM;QACrN,aAAa,EAAE,muBAAmuB;KACnvB;IACD;QACE,IAAI,EAAE,eAAe;QACrB,UAAU,EAAE,yCAAyC;QACrD,WAAW,EAAE,0OAA0O;QACvP,aAAa,EAAE,mcAAmc;KACnd;IACD;QACE,IAAI,EAAE,kBAAkB;QACxB,UAAU,EAAE,4CAA4C;QACxD,WAAW,EAAE,kPAAkP;QAC/P,aAAa,EAAE,+oBAA+oB;KAC/pB;IACD;QACE,IAAI,EAAE,eAAe;QACrB,UAAU,EAAE,yCAAyC;QACrD,WAAW,EAAE,wGAAwG;QACrH,aAAa,EAAE,qRAAqR;KACrS;IACD;QACE,IAAI,EAAE,eAAe;QACrB,UAAU,EAAE,yCAAyC;QACrD,WAAW,EAAE,2UAA2U;QACxV,aAAa,EAAE,qTAAqT;KACrU;IACD;QACE,IAAI,EAAE,cAAc;QACpB,UAAU,EAAE,iCAAiC;QAC7C,WAAW,EAAE,gNAAgN;QAC7N,aAAa,EAAE,gpBAAgpB;KAChqB;IACD;QACE,IAAI,EAAE,gBAAgB;QACtB,UAAU,EAAE,mCAAmC;QAC/C,WAAW,EAAE,2ZAA2Z;QACxa,aAAa,EAAE,+lBAA+lB;KAC/mB;IACD;QACE,IAAI,EAAE,kBAAkB;QACxB,UAAU,EAAE,uCAAuC;QACnD,WAAW,EAAE,0RAA0R;QACvS,aAAa,EAAE,ynBAAynB;KACzoB;IACD;QACE,IAAI,EAAE,0BAA0B;QAChC,UAAU,EAAE,uCAAuC;QACnD,WAAW,EAAE,+TAA+T;QAC5U,aAAa,EAAE,o3BAAo3B;KACp4B;IACD;QACE,IAAI,EAAE,wCAAwC;QAC9C,UAAU,EAAE,4DAA4D;QACxE,WAAW,EACT,2KAA2K;QAC7K,aAAa,EACX,2OAA2O;KAC9O;IACD;QACE,IAAI,EAAE,2BAA2B;QACjC,UAAU,EAAE,8CAA8C;QAC1D,WAAW,EACT,6IAA6I;QAC/I,aAAa,EACX,uKAAuK;KAC1K;IACD;QACE,IAAI,EAAE,4BAA4B;QAClC,UAAU,EAAE,qCAAqC;QACjD,WAAW,EACT,0IAA0I;QAC5I,aAAa,EACX,ieAAie;KACpe;IACD;QACE,IAAI,EAAE,sBAAsB;QAC5B,UAAU,EAAE,yCAAyC;QACrD,WAAW,EACT,6HAA6H;QAC/H,aAAa,EACX,8UAA8U;KACjV;IACD;QACE,IAAI,EAAE,aAAa;QACnB,UAAU,EAAE,gCAAgC;QAC5C,WAAW,EACT,kKAAkK;QACpK,aAAa,EACX,wiBAAwiB;KAC3iB;IACD;QACE,IAAI,EAAE,uBAAuB;QAC7B,UAAU,EAAE,0CAA0C;QACtD,WAAW,EACT,2OAA2O;QAC7O,aAAa,EACX,gqBAAgqB;KACnqB;IACD,gFAAgF;IAChF,iFAAiF;IACjF,yEAAyE;IACzE,gFAAgF;IAChF;QACE,IAAI,EAAE,sBAAsB;QAC5B,UAAU,EAAE,yCAAyC;QACrD,WAAW,EAAE,qFAAqF;QAClG,aAAa,EAAE,mOAAmO;KACnP;IACD;QACE,IAAI,EAAE,8BAA8B;QACpC,UAAU,EAAE,iDAAiD;QAC7D,WAAW,EAAE,mKAAmK;QAChL,aAAa,EAAE,4fAA4f;KAC5gB;IACD;QACE,IAAI,EAAE,qBAAqB;QAC3B,UAAU,EAAE,wCAAwC;QACpD,WAAW,EAAE,2LAA2L;QACxM,aAAa,EAAE,8wBAA8wB;KAC9xB;IACD;QACE,IAAI,EAAE,iBAAiB;QACvB,UAAU,EAAE,oCAAoC;QAChD,WAAW,EAAE,mFAAmF;QAChG,aAAa,EAAE,uWAAuW;KACvX;IACD;QACE,IAAI,EAAE,kBAAkB;QACxB,UAAU,EAAE,qCAAqC;QACjD,WAAW,EAAE,yEAAyE;QACtF,aAAa,EAAE,6cAA6c;KAC7d;IACD;QACE,IAAI,EAAE,kBAAkB;QACxB,UAAU,EAAE,qCAAqC;QACjD,WAAW,EAAE,+EAA+E;QAC5F,aAAa,EAAE,4MAA4M;KAC5N;IACD;QACE,IAAI,EAAE,wBAAwB;QAC9B,UAAU,EAAE,2CAA2C;QACvD,WAAW,EAAE,2JAA2J;QACxK,aAAa,EAAE,0VAA0V;KAC1W;IACD,kFAAkF;IAClF,kFAAkF;IAClF,0EAA0E;IAC1E,oFAAoF;IACpF,qFAAqF;IACrF,sFAAsF;IACtF,8EAA8E;IAC9E,6EAA6E;IAC7E,sFAAsF;IACtF,qFAAqF;IACrF,qFAAqF;IACrF,oFAAoF;IACpF,kEAAkE;IAClE,gFAAgF;IAChF,mFAAmF;IACnF,oDAAoD;IACpD;QACE,IAAI,EAAE,sBAAsB;QAC5B,UAAU,EAAE,4CAA4C;QACxD,WAAW,EAAE,yFAAyF;QACtG,aAAa,EAAE,6WAA6W;KAC7X;IACD;QACE,IAAI,EAAE,wBAAwB;QAC9B,UAAU,EAAE,8CAA8C;QAC1D,WAAW,EAAE,+GAA+G;QAC5H,aAAa,EAAE,waAAwa;KACxb;IACD;QACE,IAAI,EAAE,oBAAoB;QAC1B,UAAU,EAAE,0CAA0C;QACtD,WAAW,EAAE,uHAAuH;QACpI,aAAa,EAAE,6UAA6U;KAC7V;IACD;QACE,IAAI,EAAE,oBAAoB;QAC1B,UAAU,EAAE,0CAA0C;QACtD,WAAW,EAAE,4HAA4H;QACzI,aAAa,EAAE,qVAAqV;KACrW;IACD;QACE,IAAI,EAAE,2BAA2B;QACjC,UAAU,EAAE,iDAAiD;QAC7D,WAAW,EAAE,qIAAqI;QAClJ,aAAa,EAAE,2bAA2b;KAC3c;IACD;QACE,IAAI,EAAE,uBAAuB;QAC7B,UAAU,EAAE,6CAA6C;QACzD,WAAW,EAAE,kHAAkH;QAC/H,aAAa,EAAE,0aAA0a;KAC1b;IACD;QACE,IAAI,EAAE,wBAAwB;QAC9B,UAAU,EAAE,8CAA8C;QAC1D,WAAW,EAAE,kHAAkH;QAC/H,aAAa,EAAE,kjBAAkjB;KAClkB;IACD;QACE,IAAI,EAAE,0BAA0B;QAChC,UAAU,EAAE,gDAAgD;QAC5D,WAAW,EAAE,+QAA+Q;QAC5R,aAAa,EAAE,2hBAA2hB;KAC3iB;IACD;QACE,IAAI,EAAE,8BAA8B;QACpC,UAAU,EAAE,oDAAoD;QAChE,WAAW,EAAE,8VAA8V;QAC3W,aAAa,EAAE,wkBAAwkB;KACxlB;IACD;QACE,IAAI,EAAE,wBAAwB;QAC9B,UAAU,EAAE,8CAA8C;QAC1D,WAAW,EAAE,2dAA2d;QACxe,aAAa,EAAE,2oBAA2oB;KAC3pB;IACD,gFAAgF;IAChF,sFAAsF;IACtF,qFAAqF;IACrF,uFAAuF;IACvF,8DAA8D;IAC9D;QACE,IAAI,EAAE,4BAA4B;QAClC,UAAU,EAAE,gDAAgD;QAC5D,WAAW,EAAE,wMAAwM;QACrN,aAAa,EAAE,skBAAskB;KACtlB;IACD;QACE,IAAI,EAAE,8BAA8B;QACpC,UAAU,EAAE,kDAAkD;QAC9D,WAAW,EAAE,2NAA2N;QACxO,aAAa,EAAE,mgBAAmgB;KACnhB;IACD;QACE,IAAI,EAAE,4BAA4B;QAClC,UAAU,EAAE,sCAAsC;QAClD,WAAW,EAAE,iPAAiP;QAC9P,aAAa,EAAE,4nBAA4nB;KAC5oB;CACF,CAAC;AA0CF,MAAM,CAAC,MAAM,oBAAoB,GAAwB;IACvD,+EAA+E;IAC/E;QACE,UAAU,EAAE,kCAAkC;QAC9C,QAAQ,EAAE,aAAa;QACvB,MAAM,EAAE,+CAA+C;KACxD;IACD;QACE,UAAU,EAAE,wCAAwC;QACpD,QAAQ,EAAE,aAAa;QACvB,MAAM,EAAE,iDAAiD;KAC1D;IACD;QACE,UAAU,EAAE,qCAAqC;QACjD,QAAQ,EAAE,aAAa;QACvB,MAAM,EAAE,+CAA+C;KACxD;IACD,gFAAgF;IAChF,+EAA+E;IAC/E,oFAAoF;IACpF,6DAA6D;IAC7D,wEAAwE;IACxE;QACE,UAAU,EAAE,8BAA8B;QAC1C,QAAQ,EAAE,cAAc;QACxB,MAAM,EAAE,mDAAmD;KAC5D;IACD;QACE,UAAU,EAAE,gCAAgC;QAC5C,QAAQ,EAAE,cAAc;QACxB,MAAM,EAAE,iIAAiI;KAC1I;IACD;QACE,UAAU,EAAE,qCAAqC;QACjD,QAAQ,EAAE,cAAc;QACxB,MAAM,EAAE,gGAAgG;KACzG;IACD,uFAAuF;IACvF;QACE,UAAU,EAAE,qDAAqD;QACjE,QAAQ,EAAE,iBAAiB;QAC3B,MAAM,EAAE,kCAAkC;KAC3C;IACD;QACE,UAAU,EAAE,2CAA2C;QACvD,QAAQ,EAAE,iBAAiB;QAC3B,MAAM,EAAE,kCAAkC;KAC3C;IACD;QACE,UAAU,EAAE,+BAA+B;QAC3C,QAAQ,EAAE,iBAAiB;QAC3B,MAAM,EAAE,qDAAqD;KAC9D;IACD,qDAAqD;IACrD;QACE,UAAU,EAAE,kCAAkC;QAC9C,QAAQ,EAAE,sBAAsB;QAChC,MAAM,EAAE,8CAA8C;KACvD;IACD;QACE,UAAU,EAAE,+CAA+C;QAC3D,QAAQ,EAAE,sBAAsB;QAChC,MAAM,EAAE,kGAAkG;KAC3G;IACD;QACE,UAAU,EAAE,mDAAmD;QAC/D,QAAQ,EAAE,sBAAsB;QAChC,MAAM,EAAE,+FAA+F;KACxG;IACD,8EAA8E;IAC9E,kFAAkF;IAClF,iFAAiF;IACjF,gFAAgF;IAChF,mFAAmF;IACnF,6EAA6E;IAC7E,oFAAoF;IACpF,sFAAsF;IACtF,8EAA8E;IAC9E,+EAA+E;IAC/E,6EAA6E;IAC7E,iFAAiF;IACjF;QACE,UAAU,EAAE,qCAAqC;QACjD,QAAQ,EAAE,gBAAgB;QAC1B,MAAM,EAAE,4RAA4R;KACrS;IACD;QACE,UAAU,EAAE,wDAAwD;QACpE,QAAQ,EAAE,gBAAgB;QAC1B,MAAM,EAAE,4dAA4d;KACre;IACD;QACE,UAAU,EAAE,4DAA4D;QACxE,QAAQ,EAAE,gBAAgB;QAC1B,MAAM,EAAE,scAAsc;KAC/c;IACD;QACE,UAAU,EAAE,oDAAoD;QAChE,QAAQ,EAAE,gBAAgB;QAC1B,MAAM,EAAE,inBAAinB;KAC1nB;IACD;QACE,UAAU,EAAE,+BAA+B;QAC3C,QAAQ,EAAE,gBAAgB;QAC1B,MAAM,EAAE,uMAAuM;KAChN;IACD;QACE,UAAU,EAAE,kDAAkD;QAC9D,QAAQ,EAAE,gBAAgB;QAC1B,MAAM,EAAE,ymBAAymB;KAClnB;IACD;QACE,UAAU,EAAE,2CAA2C;QACvD,QAAQ,EAAE,gBAAgB;QAC1B,MAAM,EAAE,gXAAgX;KACzX;IACD;QACE,UAAU,EAAE,6CAA6C;QACzD,QAAQ,EAAE,gBAAgB;QAC1B,MAAM,EAAE,uVAAuV;KAChW;IACD,sDAAsD;IACtD;QACE,UAAU,EAAE,uCAAuC;QACnD,QAAQ,EAAE,cAAc;QACxB,MAAM,EAAE,wXAAwX;KACjY;IACD,gFAAgF;IAChF,uFAAuF;IACvF;QACE,UAAU,EAAE,gBAAgB;QAC5B,QAAQ,EAAE,sBAAsB;QAChC,MAAM,EAAE,8NAA8N;KACvO;IACD;QACE,UAAU,EAAE,gBAAgB;QAC5B,QAAQ,EAAE,sBAAsB;QAChC,MAAM,EAAE,gQAAgQ;KACzQ;CACF,CAAC;AAEF;;;GAGG;AACH,MAAM,UAAU,eAAe,CAAC,MAAe,EAAE,UAAkB;IACjE,IAAI,GAAG,GAAY,MAAM,CAAC;IAC1B,KAAK,MAAM,GAAG,IAAI,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;QACxC,IAAI,GAAG,IAAI,IAAI,IAAI,OAAO,GAAG,KAAK,QAAQ;YAAE,OAAO,SAAS,CAAC;QAC7D,GAAG,GAAI,GAA+B,CAAC,GAAG,CAAC,CAAC;IAC9C,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC"}
@@ -0,0 +1,68 @@
1
+ /**
2
+ * ownershipFollowsLiveWork — pure decision helpers for the Ownership Follows Live
3
+ * Work feature (docs/specs/ownership-follows-live-work.md).
4
+ *
5
+ * Parts A (release-on-complete) and B (claim-on-spawn) are wired into server.ts
6
+ * closures (the only scope where `ownReg`/`emitPlacement`/`_meshSelfId` are all in
7
+ * lexical view). To keep the DECISION logic single-sourced AND unit-testable
8
+ * (Structure > Willpower — a 10-line tested helper beats a 100-line untestable
9
+ * closure), the gate predicates live HERE as pure functions; the server closures
10
+ * call them and then perform the CAS + emitPlacement pairing. Part D's recovery
11
+ * decision lives in SessionRecovery (its deps are injected, so it is testable in
12
+ * place); these helpers cover A + B.
13
+ *
14
+ * Every helper is fail-CLOSED (A & B are uniformly fail-closed per the spec's
15
+ * safe-direction table): any uncertainty resolves to "withhold the write".
16
+ */
17
+ import type { SessionOwnershipRecord } from './SessionOwnership.js';
18
+ export declare function ownershipNonce(machineId: string, verb: string, sessionKey: string): string;
19
+ /**
20
+ * Part A — should the COMPLETING session's machine issue a `release`?
21
+ *
22
+ * Release ONLY when ALL hold (fail-closed otherwise):
23
+ * (a) the feature is on AND this machine has a mesh id,
24
+ * (b) `owner === self` and the record status is `active`,
25
+ * (c) the session-identity guard (FD9): no DIFFERENT live session is bound to the
26
+ * topic — compared by the STABLE per-instance key `startedAt`, NOT the
27
+ * reusable tmux name. Fail-closed/withhold if instance identity is unprovable
28
+ * (either `startedAt` missing).
29
+ *
30
+ * @param p.enabled resolved flag (false ⇒ never release).
31
+ * @param p.selfMachineId this machine's mesh id (null ⇒ never release).
32
+ * @param p.record the current ownership record (null ⇒ never release).
33
+ * @param p.completingStartedAt the completing session's stable instance key.
34
+ * @param p.liveStartedAt the CURRENT live session's stable instance key for
35
+ * this topic, or null when no live session is bound (⇒ proceed: best-effort safe
36
+ * direction; Part B's claim-on-spawn re-establishes ownership for a not-yet-bound
37
+ * respawn). `undefined` is treated the same as `null` (no live session).
38
+ */
39
+ export declare function shouldReleaseOnComplete(p: {
40
+ enabled: boolean;
41
+ selfMachineId: string | null;
42
+ record: SessionOwnershipRecord | null;
43
+ completingStartedAt: string | null | undefined;
44
+ liveStartedAt: string | null | undefined;
45
+ }): boolean;
46
+ /** Part B claim plan — the ordered CAS steps the autonomous spawn should perform. */
47
+ export type ClaimOnSpawnPlan = {
48
+ action: 'place-then-claim';
49
+ } | {
50
+ action: 'noop';
51
+ } | {
52
+ action: 'audit-owned-elsewhere';
53
+ owner: string | null;
54
+ status: string;
55
+ };
56
+ /**
57
+ * Part B — what should an autonomous spawn do for the topic's ownership record?
58
+ *
59
+ * NEVER force-claims a peer-owned topic (FD3): an `active`/`transferring`/`placing`
60
+ * record owned by a PEER yields `audit-owned-elsewhere` (withhold + ONE neutral
61
+ * audit row). Fail-closed when off / single-machine (`noop`).
62
+ */
63
+ export declare function planClaimOnSpawn(p: {
64
+ enabled: boolean;
65
+ selfMachineId: string | null;
66
+ record: SessionOwnershipRecord | null;
67
+ }): ClaimOnSpawnPlan;
68
+ //# sourceMappingURL=ownershipFollowsLiveWork.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ownershipFollowsLiveWork.d.ts","sourceRoot":"","sources":["../../src/core/ownershipFollowsLiveWork.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAGH,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAapE,wBAAgB,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,CAE1F;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,uBAAuB,CAAC,CAAC,EAAE;IACzC,OAAO,EAAE,OAAO,CAAC;IACjB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,MAAM,EAAE,sBAAsB,GAAG,IAAI,CAAC;IACtC,mBAAmB,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IAC/C,aAAa,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;CAC1C,GAAG,OAAO,CAkBV;AAED,qFAAqF;AACrF,MAAM,MAAM,gBAAgB,GACxB;IAAE,MAAM,EAAE,kBAAkB,CAAA;CAAE,GAC9B;IAAE,MAAM,EAAE,MAAM,CAAA;CAAE,GAClB;IAAE,MAAM,EAAE,uBAAuB,CAAC;IAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAE9E;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAAC,CAAC,EAAE;IAClC,OAAO,EAAE,OAAO,CAAC;IACjB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,MAAM,EAAE,sBAAsB,GAAG,IAAI,CAAC;CACvC,GAAG,gBAAgB,CAOnB"}
@@ -0,0 +1,95 @@
1
+ /**
2
+ * ownershipFollowsLiveWork — pure decision helpers for the Ownership Follows Live
3
+ * Work feature (docs/specs/ownership-follows-live-work.md).
4
+ *
5
+ * Parts A (release-on-complete) and B (claim-on-spawn) are wired into server.ts
6
+ * closures (the only scope where `ownReg`/`emitPlacement`/`_meshSelfId` are all in
7
+ * lexical view). To keep the DECISION logic single-sourced AND unit-testable
8
+ * (Structure > Willpower — a 10-line tested helper beats a 100-line untestable
9
+ * closure), the gate predicates live HERE as pure functions; the server closures
10
+ * call them and then perform the CAS + emitPlacement pairing. Part D's recovery
11
+ * decision lives in SessionRecovery (its deps are injected, so it is testable in
12
+ * place); these helpers cover A + B.
13
+ *
14
+ * Every helper is fail-CLOSED (A & B are uniformly fail-closed per the spec's
15
+ * safe-direction table): any uncertainty resolves to "withhold the write".
16
+ */
17
+ import { randomUUID } from 'node:crypto';
18
+ /**
19
+ * FD10 — the SINGLE nonce source for the three new ownership-CAS callsites (Part A
20
+ * release-on-complete, Part B place+claim). The replay-guard key is
21
+ * `(sessionKey, sender, ownershipEpoch)`; the existing release callsite mints a
22
+ * millisecond-resolution nonce, so a release→re-place→release on the SAME
23
+ * sessionKey within one ms could collide and have a legitimately-distinct action
24
+ * dropped as a replay. This helper appends a process-monotonic counter AND a
25
+ * randomUUID, so per-process uniqueness holds regardless of clock resolution. One
26
+ * helper = the format can never drift between callsites.
27
+ */
28
+ let _ownershipNonceSeq = 0;
29
+ export function ownershipNonce(machineId, verb, sessionKey) {
30
+ return `${machineId}:${verb}:${sessionKey}:${Date.now()}:${++_ownershipNonceSeq}:${randomUUID()}`;
31
+ }
32
+ /**
33
+ * Part A — should the COMPLETING session's machine issue a `release`?
34
+ *
35
+ * Release ONLY when ALL hold (fail-closed otherwise):
36
+ * (a) the feature is on AND this machine has a mesh id,
37
+ * (b) `owner === self` and the record status is `active`,
38
+ * (c) the session-identity guard (FD9): no DIFFERENT live session is bound to the
39
+ * topic — compared by the STABLE per-instance key `startedAt`, NOT the
40
+ * reusable tmux name. Fail-closed/withhold if instance identity is unprovable
41
+ * (either `startedAt` missing).
42
+ *
43
+ * @param p.enabled resolved flag (false ⇒ never release).
44
+ * @param p.selfMachineId this machine's mesh id (null ⇒ never release).
45
+ * @param p.record the current ownership record (null ⇒ never release).
46
+ * @param p.completingStartedAt the completing session's stable instance key.
47
+ * @param p.liveStartedAt the CURRENT live session's stable instance key for
48
+ * this topic, or null when no live session is bound (⇒ proceed: best-effort safe
49
+ * direction; Part B's claim-on-spawn re-establishes ownership for a not-yet-bound
50
+ * respawn). `undefined` is treated the same as `null` (no live session).
51
+ */
52
+ export function shouldReleaseOnComplete(p) {
53
+ if (!p.enabled || !p.selfMachineId)
54
+ return false; // dark / single-machine
55
+ const rec = p.record;
56
+ if (!rec)
57
+ return false; // no record → nothing to release
58
+ if (rec.ownerMachineId !== p.selfMachineId)
59
+ return false; // peer-owned / not ours
60
+ if (rec.status !== 'active')
61
+ return false; // FSM would reject; short-circuit
62
+ // (c) session-identity guard.
63
+ const live = p.liveStartedAt;
64
+ if (live == null)
65
+ return true; // no live session bound → proceed (best-effort safe direction)
66
+ const completing = p.completingStartedAt;
67
+ // Fail-closed if instance identity is unprovable (either side missing).
68
+ if (!live || !completing)
69
+ return false;
70
+ // A DIFFERENT live instance is bound (newer startedAt) → withhold the release
71
+ // (it would orphan a live session's record — "released record, live session").
72
+ if (String(live) !== String(completing))
73
+ return false;
74
+ // Same instance (the one that just completed) → release.
75
+ return true;
76
+ }
77
+ /**
78
+ * Part B — what should an autonomous spawn do for the topic's ownership record?
79
+ *
80
+ * NEVER force-claims a peer-owned topic (FD3): an `active`/`transferring`/`placing`
81
+ * record owned by a PEER yields `audit-owned-elsewhere` (withhold + ONE neutral
82
+ * audit row). Fail-closed when off / single-machine (`noop`).
83
+ */
84
+ export function planClaimOnSpawn(p) {
85
+ if (!p.enabled || !p.selfMachineId)
86
+ return { action: 'noop' }; // dark / single-machine
87
+ const rec = p.record;
88
+ if (!rec || rec.status === 'released')
89
+ return { action: 'place-then-claim' };
90
+ if (rec.status === 'active' && rec.ownerMachineId === p.selfMachineId)
91
+ return { action: 'noop' };
92
+ // active/transferring/placing owned by a PEER → never force-claim.
93
+ return { action: 'audit-owned-elsewhere', owner: rec.ownerMachineId ?? null, status: rec.status };
94
+ }
95
+ //# sourceMappingURL=ownershipFollowsLiveWork.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ownershipFollowsLiveWork.js","sourceRoot":"","sources":["../../src/core/ownershipFollowsLiveWork.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAGzC;;;;;;;;;GASG;AACH,IAAI,kBAAkB,GAAG,CAAC,CAAC;AAC3B,MAAM,UAAU,cAAc,CAAC,SAAiB,EAAE,IAAY,EAAE,UAAkB;IAChF,OAAO,GAAG,SAAS,IAAI,IAAI,IAAI,UAAU,IAAI,IAAI,CAAC,GAAG,EAAE,IAAI,EAAE,kBAAkB,IAAI,UAAU,EAAE,EAAE,CAAC;AACpG,CAAC;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,UAAU,uBAAuB,CAAC,CAMvC;IACC,IAAI,CAAC,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,CAAC,aAAa;QAAE,OAAO,KAAK,CAAC,CAAC,wBAAwB;IAC1E,MAAM,GAAG,GAAG,CAAC,CAAC,MAAM,CAAC;IACrB,IAAI,CAAC,GAAG;QAAE,OAAO,KAAK,CAAC,CAAC,iCAAiC;IACzD,IAAI,GAAG,CAAC,cAAc,KAAK,CAAC,CAAC,aAAa;QAAE,OAAO,KAAK,CAAC,CAAC,wBAAwB;IAClF,IAAI,GAAG,CAAC,MAAM,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC,CAAC,kCAAkC;IAE7E,8BAA8B;IAC9B,MAAM,IAAI,GAAG,CAAC,CAAC,aAAa,CAAC;IAC7B,IAAI,IAAI,IAAI,IAAI;QAAE,OAAO,IAAI,CAAC,CAAC,+DAA+D;IAC9F,MAAM,UAAU,GAAG,CAAC,CAAC,mBAAmB,CAAC;IACzC,wEAAwE;IACxE,IAAI,CAAC,IAAI,IAAI,CAAC,UAAU;QAAE,OAAO,KAAK,CAAC;IACvC,8EAA8E;IAC9E,+EAA+E;IAC/E,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,MAAM,CAAC,UAAU,CAAC;QAAE,OAAO,KAAK,CAAC;IACtD,yDAAyD;IACzD,OAAO,IAAI,CAAC;AACd,CAAC;AAQD;;;;;;GAMG;AACH,MAAM,UAAU,gBAAgB,CAAC,CAIhC;IACC,IAAI,CAAC,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,CAAC,aAAa;QAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC,wBAAwB;IACvF,MAAM,GAAG,GAAG,CAAC,CAAC,MAAM,CAAC;IACrB,IAAI,CAAC,GAAG,IAAI,GAAG,CAAC,MAAM,KAAK,UAAU;QAAE,OAAO,EAAE,MAAM,EAAE,kBAAkB,EAAE,CAAC;IAC7E,IAAI,GAAG,CAAC,MAAM,KAAK,QAAQ,IAAI,GAAG,CAAC,cAAc,KAAK,CAAC,CAAC,aAAa;QAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;IACjG,mEAAmE;IACnE,OAAO,EAAE,MAAM,EAAE,uBAAuB,EAAE,KAAK,EAAE,GAAG,CAAC,cAAc,IAAI,IAAI,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC;AACpG,CAAC"}
@@ -2202,6 +2202,21 @@ export interface MultiMachineConfig {
2202
2202
  * replication a clean no-op.
2203
2203
  */
2204
2204
  coherenceJournal?: CoherenceJournalUserConfig;
2205
+ /**
2206
+ * Ownership Follows Live Work (docs/specs/ownership-follows-live-work.md) — the
2207
+ * defense-in-depth correction that makes the SessionOwnership RECORD track where
2208
+ * the live work actually is: a session that COMPLETES releases (Part A), an
2209
+ * autonomous session that SPAWNS claims (Part B), and a non-router recovery path
2210
+ * gates on per-topic ownership before re-running (Part D). DELIBERATELY OMITTED
2211
+ * from ConfigDefaults so resolveDevAgentGate decides at runtime (LIVE on a dev
2212
+ * agent / DARK on the fleet) — a literal `false` would force-dark the dev agent.
2213
+ * OFF (or single-machine, `_meshSelfId` null) = byte-identical legacy behavior:
2214
+ * no release-on-complete, no claim-on-spawn, recovery runs its existing logic.
2215
+ * Every new ownership write is the existing fenced-epoch CAS, best-effort, never
2216
+ * forced; Part D's `ownerOf` read is a SIGNAL (forward-vs-rerun), never a new
2217
+ * authority. Registered in DEV_GATED_FEATURES (not DARK_GATE_EXCLUSIONS).
2218
+ */
2219
+ ownershipFollowsLiveWork?: boolean;
2205
2220
  /**
2206
2221
  * Replicated-store foundation (multi-machine-replicated-store-foundation.md
2207
2222
  * §10). The substrate that lets independent stores (preferences, relationships,
@@ -5204,6 +5219,17 @@ export interface MonitoringConfig {
5204
5219
  * analyst ran — the deliberate reversal of over-silence (default true). */
5205
5220
  digestEvenWhenCalm?: boolean;
5206
5221
  };
5222
+ /** Periodic mesh config-vs-live-state coherence check (signal-only log warnings).
5223
+ * Dev-gated dark: `enabled` OMITTED ⇒ resolveDevAgentGate (live-on-dev / dark-fleet).
5224
+ * Spec: docs/specs/mesh-coherence-live-state-honesty.md. */
5225
+ meshCoherenceLiveCheck?: {
5226
+ enabled?: boolean;
5227
+ /** Override MESH_WARMUP_GRACE_MS (default 120000) for the b.2 gate. */
5228
+ warmupGraceMs?: number;
5229
+ /** Hard ceiling on coherence lines logged per process (default: unbounded;
5230
+ * transition-only already bounds normal operation). */
5231
+ emitCap?: number;
5232
+ };
5207
5233
  }
5208
5234
  export type TelemetryLevel = 'basic' | 'usage';
5209
5235
  export interface TelemetryConfig {