instar 1.3.819 → 1.3.821
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 +498 -3
- package/dist/commands/server.js.map +1 -1
- package/dist/config/ConfigDefaults.d.ts.map +1 -1
- package/dist/config/ConfigDefaults.js +69 -0
- package/dist/config/ConfigDefaults.js.map +1 -1
- package/dist/core/BackupManager.d.ts +10 -0
- package/dist/core/BackupManager.d.ts.map +1 -1
- package/dist/core/BackupManager.js +16 -0
- package/dist/core/BackupManager.js.map +1 -1
- package/dist/core/BoundedJsonlAudit.d.ts +37 -0
- package/dist/core/BoundedJsonlAudit.d.ts.map +1 -0
- package/dist/core/BoundedJsonlAudit.js +87 -0
- package/dist/core/BoundedJsonlAudit.js.map +1 -0
- package/dist/core/JudgmentProvenanceLog.d.ts +144 -0
- package/dist/core/JudgmentProvenanceLog.d.ts.map +1 -0
- package/dist/core/JudgmentProvenanceLog.js +301 -0
- package/dist/core/JudgmentProvenanceLog.js.map +1 -0
- package/dist/core/MachineIdentity.d.ts.map +1 -1
- package/dist/core/MachineIdentity.js +2 -0
- package/dist/core/MachineIdentity.js.map +1 -1
- package/dist/core/OwnerDarkLadder.d.ts +108 -0
- package/dist/core/OwnerDarkLadder.d.ts.map +1 -0
- package/dist/core/OwnerDarkLadder.js +229 -0
- package/dist/core/OwnerDarkLadder.js.map +1 -0
- package/dist/core/PostUpdateMigrator.d.ts +10 -0
- package/dist/core/PostUpdateMigrator.d.ts.map +1 -1
- package/dist/core/PostUpdateMigrator.js +106 -0
- package/dist/core/PostUpdateMigrator.js.map +1 -1
- package/dist/core/SpawnAdmission.d.ts +218 -0
- package/dist/core/SpawnAdmission.d.ts.map +1 -0
- package/dist/core/SpawnAdmission.js +440 -0
- package/dist/core/SpawnAdmission.js.map +1 -0
- package/dist/core/devGatedFeatures.d.ts.map +1 -1
- package/dist/core/devGatedFeatures.js +24 -0
- package/dist/core/devGatedFeatures.js.map +1 -1
- package/dist/core/machineCoherenceManifest.d.ts.map +1 -1
- package/dist/core/machineCoherenceManifest.js +30 -0
- package/dist/core/machineCoherenceManifest.js.map +1 -1
- package/dist/core/types.d.ts +87 -0
- package/dist/core/types.d.ts.map +1 -1
- package/dist/core/types.js.map +1 -1
- package/dist/monitoring/DuplicateSessionReconciler.d.ts +225 -0
- package/dist/monitoring/DuplicateSessionReconciler.d.ts.map +1 -0
- package/dist/monitoring/DuplicateSessionReconciler.js +544 -0
- package/dist/monitoring/DuplicateSessionReconciler.js.map +1 -0
- package/dist/monitoring/FailureAnalyzer.d.ts.map +1 -1
- package/dist/monitoring/FailureAnalyzer.js +40 -1
- package/dist/monitoring/FailureAnalyzer.js.map +1 -1
- package/dist/monitoring/FailureLedger.d.ts +9 -0
- package/dist/monitoring/FailureLedger.d.ts.map +1 -1
- package/dist/monitoring/FailureLedger.js +21 -4
- package/dist/monitoring/FailureLedger.js.map +1 -1
- package/dist/scaffold/templates.d.ts.map +1 -1
- package/dist/scaffold/templates.js +2 -1
- package/dist/scaffold/templates.js.map +1 -1
- package/dist/server/AgentServer.d.ts +5 -0
- package/dist/server/AgentServer.d.ts.map +1 -1
- package/dist/server/AgentServer.js +4 -0
- package/dist/server/AgentServer.js.map +1 -1
- package/dist/server/CapabilityIndex.d.ts.map +1 -1
- package/dist/server/CapabilityIndex.js +9 -0
- package/dist/server/CapabilityIndex.js.map +1 -1
- package/dist/server/fileRoutes.d.ts +16 -0
- package/dist/server/fileRoutes.d.ts.map +1 -1
- package/dist/server/fileRoutes.js +46 -0
- package/dist/server/fileRoutes.js.map +1 -1
- package/dist/server/routes.d.ts +7 -0
- package/dist/server/routes.d.ts.map +1 -1
- package/dist/server/routes.js +99 -0
- package/dist/server/routes.js.map +1 -1
- package/dist/testing/selfActionRegistry.d.ts.map +1 -1
- package/dist/testing/selfActionRegistry.js +89 -0
- package/dist/testing/selfActionRegistry.js.map +1 -1
- package/package.json +1 -1
- package/scripts/lib/self-action-detect.mjs +2 -0
- package/skills/instar-dev/templates/side-effects-artifact.md +8 -0
- package/skills/spec-converge/SKILL.md +1 -0
- package/skills/spec-converge/scripts/write-convergence-tag.mjs +71 -0
- package/src/data/builtin-manifest.json +65 -65
- package/src/scaffold/templates.ts +2 -1
- package/upgrades/1.3.820.md +25 -0
- package/upgrades/1.3.821.md +22 -0
- package/upgrades/side-effects/ownership-gated-spawn-increment-1.md +166 -0
- package/upgrades/side-effects/two-node-harness-increment2-entry-gate.md +64 -0
|
@@ -0,0 +1,225 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DuplicateSessionReconciler — Layer B of ownership-gated-spawn-and-judgment-
|
|
3
|
+
* within-floors (§3.2): converge the OWNERSHIP RECORD when the same
|
|
4
|
+
* conversation is live on two or more machines, so the EXISTING gated closeout
|
|
5
|
+
* (SessionReaper's topic-moved sweeper) can close the non-owner copy through
|
|
6
|
+
* its normal path. **The reconciler never kills a session** — it repairs
|
|
7
|
+
* records; the closeout's own guards (fresh re-checks, veto breaker,
|
|
8
|
+
* terminate-time re-probe) do every close.
|
|
9
|
+
*
|
|
10
|
+
* The 2026-07-10 incident's healing gap in one line: the duplicate detector
|
|
11
|
+
* was observe-only and request-driven (only ran when a dashboard polled), and
|
|
12
|
+
* both machines' cleanup separately refused the duplicates (`not-lease-holder`
|
|
13
|
+
* on one side, `open-commitment` on the other) — two individually-correct
|
|
14
|
+
* guards jointly making a duplicate immortal.
|
|
15
|
+
*
|
|
16
|
+
* Deterministic core (all ambiguity ESCALATES, never guesses):
|
|
17
|
+
* - §3.2.0 substrate gate: refuses to arm on an in-memory ownership store
|
|
18
|
+
* (fleet default) — a loud `substrate-not-ready` status, never silent.
|
|
19
|
+
* - §3.2.1 discovery on the serving-lease holder only, tick-paced, fresh
|
|
20
|
+
* direct probe before ANY record write; per-tick caps (P17).
|
|
21
|
+
* - §3.2.2 intended-owner evidence ladder: hard pin (never a quarantined
|
|
22
|
+
* one) → highest ADMISSIBLE ownershipEpoch → server-registered live
|
|
23
|
+
* autonomous run (probe-confirmed) → J2/escalate. Rule-2/rule-3
|
|
24
|
+
* contradiction, both-self-with-equal-epochs, both-live-runs, and CAS
|
|
25
|
+
* 409s always escalate. "Most recent user interaction" is deliberately
|
|
26
|
+
* NOT a rule — the non-owner duplicate often has the latest message
|
|
27
|
+
* BECAUSE of the bug.
|
|
28
|
+
* - §3.2.3 convergence: ONE fenced CAS naming the intended owner (journal
|
|
29
|
+
* replication fast-forwards every peer), then peer-echo confirmation
|
|
30
|
+
* within `echoConfirmTicks`; no echo → ONE aggregated
|
|
31
|
+
* `convergence-not-observed` escalation (P17).
|
|
32
|
+
* - §3.2.5 P19 breaker: a topic re-duplicating past the threshold stops
|
|
33
|
+
* being auto-reconciled and raises ONE item; record FLIPS and
|
|
34
|
+
* echoed-but-unhealed episodes count; transfer-traceable episodes are
|
|
35
|
+
* excluded from the clamp (but ≥3/24h raise an observability-only item).
|
|
36
|
+
* - Registry-error freeze: while the SpawnAdmission error episode is open,
|
|
37
|
+
* the reconciler pauses (same fault domain — §3.1 row e).
|
|
38
|
+
*
|
|
39
|
+
* Increment-1 posture: dev-gated + dryRun — detection, evidence ladder, and
|
|
40
|
+
* would-converge decisions run and journal; NO CAS lands, NO closeout arms
|
|
41
|
+
* until a deliberate dryRun:false (and the substrate gate holds regardless).
|
|
42
|
+
*/
|
|
43
|
+
import type { BoundedJsonlAudit } from '../core/BoundedJsonlAudit.js';
|
|
44
|
+
export interface DuplicateCandidate {
|
|
45
|
+
/** `${platform}:${platformId}` — the conversation identity. */
|
|
46
|
+
key: string;
|
|
47
|
+
platform: string;
|
|
48
|
+
platformId: string;
|
|
49
|
+
/** Machines with a LIVE session for this conversation. */
|
|
50
|
+
machines: Array<{
|
|
51
|
+
machineId: string;
|
|
52
|
+
sessions: string[];
|
|
53
|
+
}>;
|
|
54
|
+
}
|
|
55
|
+
export interface ReconcilerConfigView {
|
|
56
|
+
enabled: boolean;
|
|
57
|
+
dryRun: boolean;
|
|
58
|
+
reconcilerTickMs: number;
|
|
59
|
+
maxReconcilesPerTick: number;
|
|
60
|
+
maxConvergenceWritesPerTick: number;
|
|
61
|
+
echoConfirmTicks: number;
|
|
62
|
+
breakerThreshold: number;
|
|
63
|
+
breakerWindowMs: number;
|
|
64
|
+
}
|
|
65
|
+
export interface OwnershipViewRow {
|
|
66
|
+
machineId: string;
|
|
67
|
+
owner: string | null;
|
|
68
|
+
epoch: number;
|
|
69
|
+
/** Origin-stamp validated (§3 epoch hygiene) — inadmissible rows never count. */
|
|
70
|
+
admissible: boolean;
|
|
71
|
+
}
|
|
72
|
+
export type IntendedOwnerVerdict = {
|
|
73
|
+
kind: 'owner';
|
|
74
|
+
owner: string;
|
|
75
|
+
rule: 'hard-pin' | 'highest-epoch' | 'live-run';
|
|
76
|
+
detail: string;
|
|
77
|
+
} | {
|
|
78
|
+
kind: 'escalate';
|
|
79
|
+
reason: string;
|
|
80
|
+
};
|
|
81
|
+
export interface ReconcilerDeps {
|
|
82
|
+
selfMachineId: () => string | null;
|
|
83
|
+
holdsLease: () => boolean;
|
|
84
|
+
/** §3.2.0 — durable + replicated ownership substrate live pool-wide. */
|
|
85
|
+
substrateReady: () => {
|
|
86
|
+
ready: boolean;
|
|
87
|
+
reason?: string;
|
|
88
|
+
};
|
|
89
|
+
/** §3.1 row e — freeze while a registry-error episode is open (same fault domain). */
|
|
90
|
+
errorEpisodeOpen: () => boolean;
|
|
91
|
+
/** One authority in motion per topic: in-flight transfer / open stale-owner episode / active hold. */
|
|
92
|
+
topicHasAuthorityInMotion: (sessionKey: string) => boolean;
|
|
93
|
+
/** Candidate discovery (lease-holder bounded fan-out, or the pool poll-cache where live). */
|
|
94
|
+
discoverCandidates: () => Promise<{
|
|
95
|
+
candidates: DuplicateCandidate[];
|
|
96
|
+
degraded?: string;
|
|
97
|
+
}>;
|
|
98
|
+
/**
|
|
99
|
+
* Fresh direct probe (5s budget in the wiring): does the machine still hold a
|
|
100
|
+
* LIVE copy of this conversation? Cache rows are never acted on (§3.2.1).
|
|
101
|
+
*/
|
|
102
|
+
probeLiveCopy: (machineId: string, key: string) => Promise<{
|
|
103
|
+
ok: boolean;
|
|
104
|
+
live: boolean;
|
|
105
|
+
}>;
|
|
106
|
+
/** Pin store read — a quarantined pin never counts (§3.2.2 rule 1). */
|
|
107
|
+
readPin: (sessionKey: string) => {
|
|
108
|
+
pinned: boolean;
|
|
109
|
+
preferredMachine?: string | null;
|
|
110
|
+
quarantined?: boolean;
|
|
111
|
+
} | null;
|
|
112
|
+
/** Every machine's replicated registry view for this key (§3.2.2 rule 2). */
|
|
113
|
+
readOwnershipViews: (sessionKey: string) => OwnershipViewRow[];
|
|
114
|
+
/**
|
|
115
|
+
* §3.2.2 rule 3 — journal-replicated live-run registration, confirmed by an
|
|
116
|
+
* authenticated live probe to the hosting machine (never a bare poll row).
|
|
117
|
+
*/
|
|
118
|
+
liveRunHosts: (sessionKey: string) => Promise<Array<{
|
|
119
|
+
machineId: string;
|
|
120
|
+
registeredAt: number;
|
|
121
|
+
confirmed: boolean;
|
|
122
|
+
}>>;
|
|
123
|
+
/** The fenced convergence CAS (lease epoch + record epoch ride the wiring). */
|
|
124
|
+
casConverge: (sessionKey: string, owner: string) => {
|
|
125
|
+
ok: boolean;
|
|
126
|
+
reason?: string;
|
|
127
|
+
};
|
|
128
|
+
/** Peer-echo: does `machineId`'s OWN registry view now name `owner`? */
|
|
129
|
+
peerEchoObserved: (sessionKey: string, owner: string, machineId: string) => Promise<boolean>;
|
|
130
|
+
/**
|
|
131
|
+
* Arm the existing closeout for the non-owner copy (reap-log reason
|
|
132
|
+
* `duplicate-reconciled`) — the sweeper's own guards still decide the close.
|
|
133
|
+
*/
|
|
134
|
+
armCloseout: (sessionKey: string, owner: string) => void;
|
|
135
|
+
raiseAttention: (item: {
|
|
136
|
+
id: string;
|
|
137
|
+
title: string;
|
|
138
|
+
body: string;
|
|
139
|
+
priority: 'high' | 'medium';
|
|
140
|
+
}) => void;
|
|
141
|
+
journal: BoundedJsonlAudit;
|
|
142
|
+
provenance?: (row: {
|
|
143
|
+
component: string;
|
|
144
|
+
decisionPoint: string;
|
|
145
|
+
context: Record<string, unknown>;
|
|
146
|
+
optionsPresented: string[];
|
|
147
|
+
decision: string;
|
|
148
|
+
reason: string;
|
|
149
|
+
floor: string;
|
|
150
|
+
fallbackRung: string;
|
|
151
|
+
}) => void;
|
|
152
|
+
log: (msg: string) => void;
|
|
153
|
+
now?: () => number;
|
|
154
|
+
}
|
|
155
|
+
/** §3.2.5 — receive-side type clamp for replicated breaker rows. */
|
|
156
|
+
export declare function clampBreakerRow(row: unknown): {
|
|
157
|
+
key: string;
|
|
158
|
+
count: number;
|
|
159
|
+
lastAt: string;
|
|
160
|
+
} | null;
|
|
161
|
+
export interface ReconcilerTickReport {
|
|
162
|
+
at: string;
|
|
163
|
+
ran: boolean;
|
|
164
|
+
skippedReason?: string;
|
|
165
|
+
candidates: number;
|
|
166
|
+
reconciled: number;
|
|
167
|
+
wouldConverge: number;
|
|
168
|
+
escalations: number;
|
|
169
|
+
echoConfirmed: number;
|
|
170
|
+
echoTimeouts: number;
|
|
171
|
+
breakerClamped: number;
|
|
172
|
+
}
|
|
173
|
+
export interface ReconcilerStatus {
|
|
174
|
+
enabled: boolean;
|
|
175
|
+
dryRun: boolean;
|
|
176
|
+
substrate: {
|
|
177
|
+
ready: boolean;
|
|
178
|
+
reason?: string;
|
|
179
|
+
};
|
|
180
|
+
lastTick: ReconcilerTickReport | null;
|
|
181
|
+
openEpisodes: number;
|
|
182
|
+
breaker: Array<{
|
|
183
|
+
key: string;
|
|
184
|
+
episodes: number;
|
|
185
|
+
clamped: boolean;
|
|
186
|
+
}>;
|
|
187
|
+
counters: Record<string, number>;
|
|
188
|
+
config: Omit<ReconcilerConfigView, 'enabled' | 'dryRun'>;
|
|
189
|
+
}
|
|
190
|
+
export declare class DuplicateSessionReconciler {
|
|
191
|
+
private readonly deps;
|
|
192
|
+
private cfg;
|
|
193
|
+
private readonly nowFn;
|
|
194
|
+
private episodes;
|
|
195
|
+
/** §3.2.5 per-topic re-duplication episode opens within the window. */
|
|
196
|
+
private breakerEpisodes;
|
|
197
|
+
/** Topics whose episode is transfer-traceable this window (excluded from the clamp). */
|
|
198
|
+
private transferTraceable;
|
|
199
|
+
private lastTick;
|
|
200
|
+
private substrateNotReadySince;
|
|
201
|
+
private substratePauseItemRaised;
|
|
202
|
+
private counters;
|
|
203
|
+
constructor(cfg: ReconcilerConfigView, deps: ReconcilerDeps);
|
|
204
|
+
setConfig(cfg: ReconcilerConfigView): void;
|
|
205
|
+
/** One reconciler pass. Returns the report (also retained for status()). */
|
|
206
|
+
tick(): Promise<ReconcilerTickReport>;
|
|
207
|
+
private finish;
|
|
208
|
+
private noteSubstrateNotReady;
|
|
209
|
+
/** Reconcile one duplicate candidate. */
|
|
210
|
+
private reconcileOne;
|
|
211
|
+
/** §3.2.2 — the evidence ladder. */
|
|
212
|
+
private intendedOwner;
|
|
213
|
+
private checkPendingEchoes;
|
|
214
|
+
private openOrGetEpisode;
|
|
215
|
+
/** Record a topic-moved (transfer-traceable) episode — excluded from the clamp. */
|
|
216
|
+
noteTransferTraceable(key: string): void;
|
|
217
|
+
private bumpBreaker;
|
|
218
|
+
/** §3.2.5 — also consulted by the owner-dark ladder (clamp to rung 3). */
|
|
219
|
+
breakerClamped(key: string, now?: number): boolean;
|
|
220
|
+
private escalateOnce;
|
|
221
|
+
private journalRow;
|
|
222
|
+
private provenanceRow;
|
|
223
|
+
status(): ReconcilerStatus;
|
|
224
|
+
}
|
|
225
|
+
//# sourceMappingURL=DuplicateSessionReconciler.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DuplicateSessionReconciler.d.ts","sourceRoot":"","sources":["../../src/monitoring/DuplicateSessionReconciler.ts"],"names":[],"mappings":"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"}
|