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.
- package/dist/commands/server.d.ts.map +1 -1
- package/dist/commands/server.js +388 -3
- package/dist/commands/server.js.map +1 -1
- package/dist/core/configCoherence.d.ts +46 -5
- package/dist/core/configCoherence.d.ts.map +1 -1
- package/dist/core/configCoherence.js +101 -12
- package/dist/core/configCoherence.js.map +1 -1
- package/dist/core/devGatedFeatures.d.ts.map +1 -1
- package/dist/core/devGatedFeatures.js +12 -0
- package/dist/core/devGatedFeatures.js.map +1 -1
- package/dist/core/ownershipFollowsLiveWork.d.ts +68 -0
- package/dist/core/ownershipFollowsLiveWork.d.ts.map +1 -0
- package/dist/core/ownershipFollowsLiveWork.js +95 -0
- package/dist/core/ownershipFollowsLiveWork.js.map +1 -0
- package/dist/core/types.d.ts +26 -0
- package/dist/core/types.d.ts.map +1 -1
- package/dist/core/types.js.map +1 -1
- package/dist/messaging/stuckMessageRecovery.d.ts +12 -0
- package/dist/messaging/stuckMessageRecovery.d.ts.map +1 -1
- package/dist/messaging/stuckMessageRecovery.js +12 -0
- package/dist/messaging/stuckMessageRecovery.js.map +1 -1
- package/dist/monitoring/SessionRecovery.d.ts +73 -0
- package/dist/monitoring/SessionRecovery.d.ts.map +1 -1
- package/dist/monitoring/SessionRecovery.js +113 -0
- package/dist/monitoring/SessionRecovery.js.map +1 -1
- package/package.json +1 -1
- package/src/data/builtin-manifest.json +2 -2
- package/upgrades/1.3.653.md +85 -0
- package/upgrades/1.3.654.md +26 -0
- package/upgrades/side-effects/mesh-coherence-live-state-honesty.md +53 -0
- 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
|
-
|
|
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;
|
|
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
|
-
//
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
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;
|
|
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,
|
|
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":"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"}
|
|
1
|
+
{"version":3,"file":"devGatedFeatures.js","sourceRoot":"","sources":["../../src/core/devGatedFeatures.ts"],"names":[],"mappings":"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"}
|
|
@@ -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"}
|
package/dist/core/types.d.ts
CHANGED
|
@@ -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 {
|