instar 1.3.736 → 1.3.738
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/devPreflight.d.ts +21 -0
- package/dist/commands/devPreflight.d.ts.map +1 -1
- package/dist/commands/devPreflight.js +36 -2
- package/dist/commands/devPreflight.js.map +1 -1
- package/dist/commands/server.d.ts.map +1 -1
- package/dist/commands/server.js +30 -0
- package/dist/commands/server.js.map +1 -1
- package/dist/config/ConfigDefaults.d.ts.map +1 -1
- package/dist/config/ConfigDefaults.js +13 -0
- package/dist/config/ConfigDefaults.js.map +1 -1
- package/dist/core/PostUpdateMigrator.d.ts.map +1 -1
- package/dist/core/PostUpdateMigrator.js +12 -0
- package/dist/core/PostUpdateMigrator.js.map +1 -1
- package/dist/core/SessionManager.d.ts.map +1 -1
- package/dist/core/SessionManager.js +12 -0
- package/dist/core/SessionManager.js.map +1 -1
- package/dist/core/WriteDomainRegistry.d.ts.map +1 -1
- package/dist/core/WriteDomainRegistry.js +22 -0
- package/dist/core/WriteDomainRegistry.js.map +1 -1
- package/dist/core/hostSemaphoreCore.d.ts +115 -0
- package/dist/core/hostSemaphoreCore.d.ts.map +1 -0
- package/dist/core/hostSemaphoreCore.js +215 -0
- package/dist/core/hostSemaphoreCore.js.map +1 -0
- package/dist/core/hostSpawnSemaphore.d.ts +8 -9
- package/dist/core/hostSpawnSemaphore.d.ts.map +1 -1
- package/dist/core/hostSpawnSemaphore.js +48 -126
- package/dist/core/hostSpawnSemaphore.js.map +1 -1
- package/dist/core/hostTestRunnerSemaphore.d.ts +492 -0
- package/dist/core/hostTestRunnerSemaphore.d.ts.map +1 -0
- package/dist/core/hostTestRunnerSemaphore.js +1648 -0
- package/dist/core/hostTestRunnerSemaphore.js.map +1 -0
- package/dist/core/promptClauses.d.ts +110 -0
- package/dist/core/promptClauses.d.ts.map +1 -0
- package/dist/core/promptClauses.js +125 -0
- package/dist/core/promptClauses.js.map +1 -0
- package/dist/core/testRunnerRunClassifier.d.ts +128 -0
- package/dist/core/testRunnerRunClassifier.d.ts.map +1 -0
- package/dist/core/testRunnerRunClassifier.js +382 -0
- package/dist/core/testRunnerRunClassifier.js.map +1 -0
- package/dist/core/types.d.ts +21 -0
- package/dist/core/types.d.ts.map +1 -1
- package/dist/core/types.js.map +1 -1
- package/dist/data/llmBenchCoverage.d.ts +4 -0
- package/dist/data/llmBenchCoverage.d.ts.map +1 -1
- package/dist/data/llmBenchCoverage.js +72 -0
- package/dist/data/llmBenchCoverage.js.map +1 -1
- package/dist/monitoring/guardManifest.d.ts.map +1 -1
- package/dist/monitoring/guardManifest.js +26 -0
- package/dist/monitoring/guardManifest.js.map +1 -1
- package/dist/scaffold/templates.d.ts.map +1 -1
- package/dist/scaffold/templates.js +7 -0
- package/dist/scaffold/templates.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/routes.d.ts.map +1 -1
- package/dist/server/routes.js +150 -0
- package/dist/server/routes.js.map +1 -1
- package/package.json +1 -1
- package/scripts/lib/test-runner-selfdisable-patterns.mjs +326 -0
- package/scripts/pre-push-test-runner-selfdisable.mjs +81 -0
- package/src/data/builtin-manifest.json +64 -64
- package/src/data/llmBenchCoverage.ts +111 -0
- package/src/scaffold/templates.ts +7 -0
- package/upgrades/1.3.737.md +140 -0
- package/upgrades/1.3.738.md +73 -0
- package/upgrades/side-effects/authority-clause-standard.md +67 -0
- package/upgrades/side-effects/test-runner-concurrency-bound.md +173 -0
- package/upgrades/1.3.736.md +0 -57
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"WriteDomainRegistry.d.ts","sourceRoot":"","sources":["../../src/core/WriteDomainRegistry.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"WriteDomainRegistry.d.ts","sourceRoot":"","sources":["../../src/core/WriteDomainRegistry.ts"],"names":[],"mappings":"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"}
|
|
@@ -202,6 +202,28 @@ export function buildWriteDomainRegistry(opts) {
|
|
|
202
202
|
note: 'canary fixtures are finally-cleaned rows in the per-machine topic-memory SQLite (reserved negative topic ids); the D8 decision log is per-machine soak evidence; file-level arm shipped in FileClassifier sync exclusions (.instar/topic-memory.db + logs/response-review-decisions.jsonl)',
|
|
203
203
|
},
|
|
204
204
|
});
|
|
205
|
+
// ── Test-runner concurrency-bound recovery lever (test-runner-concurrency-bound §2.6/§2.7) ──
|
|
206
|
+
// Machine-local by construction: the semaphore bounds THIS machine's CPU
|
|
207
|
+
// cores, so its holders file is an OS-level rendezvous at ~/.instar/
|
|
208
|
+
// host-test-runner-holders.json — outside any git repo (a lock-file peer),
|
|
209
|
+
// never git-synced. POST /prune only removes dead/TTL-expired holder rows to
|
|
210
|
+
// restore capacity — fully ephemeral and rebuildable (a re-run regenerates
|
|
211
|
+
// everything it touches). Machine-locality is doubly enforced in the design:
|
|
212
|
+
// df-local determination gates all reclaim, and a foreign-hostname holder on a
|
|
213
|
+
// (mis)synced ~/.instar is DROPPED, so the count never converges across
|
|
214
|
+
// machines even if the path is userspace-synced (Dropbox/iCloud). The GET
|
|
215
|
+
// status route is a pure read (non-mutating) and needs no classification.
|
|
216
|
+
reg.add({
|
|
217
|
+
kind: 'route',
|
|
218
|
+
method: 'POST',
|
|
219
|
+
pathPrefix: '/test-runner-limiter/prune',
|
|
220
|
+
domain: 'machine-local',
|
|
221
|
+
story: {
|
|
222
|
+
logical: 'ephemeral-rebuildable',
|
|
223
|
+
onSharedGitSyncedPath: false,
|
|
224
|
+
note: 'holders file is a machine-local OS rendezvous at ~/.instar/host-test-runner-holders.json (outside any git tree); prune reclaims only dead/expired rows (capacity bookkeeping, fully rebuildable); df-local gate + foreign-hostname-holder drop prevent cross-machine convergence even on a userspace-synced home',
|
|
225
|
+
},
|
|
226
|
+
});
|
|
205
227
|
return reg;
|
|
206
228
|
}
|
|
207
229
|
//# sourceMappingURL=WriteDomainRegistry.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"WriteDomainRegistry.js","sourceRoot":"","sources":["../../src/core/WriteDomainRegistry.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"WriteDomainRegistry.js","sourceRoot":"","sources":["../../src/core/WriteDomainRegistry.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* hostSemaphoreCore — shared holder-set semaphore primitives.
|
|
3
|
+
*
|
|
4
|
+
* Extraction seam per docs/specs/test-runner-concurrency-bound.md §2.1: the
|
|
5
|
+
* proven MECHANICS of `hostSpawnSemaphore.ts` (the 2026-06-20 fork-bomb floor)
|
|
6
|
+
* are extracted here so the test-runner lane can reuse them WITHOUT inheriting
|
|
7
|
+
* spawn-lane POLICY. What moves into the core:
|
|
8
|
+
*
|
|
9
|
+
* - the exclusive O_CREAT|O_EXCL lock primitive — but lock-RECLAIM policy is
|
|
10
|
+
* a PARAMETER of the consumer, not the core: the spawn lane keeps its
|
|
11
|
+
* legacy pid-death unlink reclaim (`legacyPidDeathLockReclaim`, preserved
|
|
12
|
+
* bug-for-bug — see the defect note on that function), while the test lane
|
|
13
|
+
* uses ONLY its own race-safe age-reclaim (atomic rename + dev+ino verify,
|
|
14
|
+
* implemented in hostTestRunnerSemaphore.ts) and NEVER calls the legacy
|
|
15
|
+
* reclaim;
|
|
16
|
+
* - holders-file atomic write (temp+rename) and the safe read;
|
|
17
|
+
* - the `df -P` host-local determination (fail-closed classifier);
|
|
18
|
+
* - the prune-dead pass, taking a ReclaimPolicy parameter (NOT the spawn
|
|
19
|
+
* cap's hardcoded `pidDead && heartbeatStale && dfLocal`).
|
|
20
|
+
*
|
|
21
|
+
* ReclaimPolicy contract (the authoritative statement — this fixes the
|
|
22
|
+
* HOLDER_STALE_MS doc-code contradiction found in review): the SPAWN lane
|
|
23
|
+
* reclaims a holder only when its pid is dead (PRIMARY signal) AND its
|
|
24
|
+
* heartbeat is stale past HOLDER_STALE_MS (SECONDARY signal) AND the holders
|
|
25
|
+
* file is df-confirmed host-local. It is an AND conjunction — a live-pid
|
|
26
|
+
* holder is never reclaimed by heartbeat alone, and a dead-pid holder is kept
|
|
27
|
+
* until its heartbeat also goes stale. The TEST lane passes a different
|
|
28
|
+
* policy (immediate dead-pid reclaim + start-time corroboration + max-hold
|
|
29
|
+
* TTL) — see hostTestRunnerSemaphore.ts §2.4.
|
|
30
|
+
*
|
|
31
|
+
* The singleton + config layer is NOT extracted (two caps cannot share one
|
|
32
|
+
* singleton) — each lane keeps its own thin configure/get/reset trio.
|
|
33
|
+
*/
|
|
34
|
+
/** Pure FD1 classifier over the `df -P` device-source column. FAIL-CLOSED. */
|
|
35
|
+
export declare function classifyDfSourceLocal(source: string): boolean;
|
|
36
|
+
/**
|
|
37
|
+
* Detailed df probe. Distinguishes a POSITIVE not-local classification from a
|
|
38
|
+
* FAILED probe ('unknown') — the distinction the 2026-07-01 §1.2 root-cause
|
|
39
|
+
* hinges on: the spawn lane memoizes a boolean, so a df TIMEOUT under load is
|
|
40
|
+
* cached forever as "not local" and silently disables all reclaim for the
|
|
41
|
+
* process lifetime. Consumers that cache MUST NOT cache an 'unknown' result.
|
|
42
|
+
*/
|
|
43
|
+
export declare function probeDfHostLocalDetailed(p: string, timeoutMs?: number): {
|
|
44
|
+
status: 'local' | 'not-local' | 'unknown';
|
|
45
|
+
source?: string;
|
|
46
|
+
};
|
|
47
|
+
/**
|
|
48
|
+
* Boolean df probe (the spawn lane's historical shape). FAIL-CLOSED: anything
|
|
49
|
+
* not positively confirmable as local (including a failed probe) is false.
|
|
50
|
+
*/
|
|
51
|
+
export declare function probeDfHostLocal(p: string, timeoutMs?: number): boolean;
|
|
52
|
+
/**
|
|
53
|
+
* Write `body` to `filePath` atomically via temp+rename (same filesystem).
|
|
54
|
+
* The temp file is opened O_CREAT|O_EXCL with the given mode; on any error the
|
|
55
|
+
* temp is best-effort removed (via the SafeFsExecutor funnel) and the error
|
|
56
|
+
* rethrown.
|
|
57
|
+
*/
|
|
58
|
+
export declare function atomicWriteFileSync(filePath: string, body: string, opts: {
|
|
59
|
+
mode?: number;
|
|
60
|
+
operation: string;
|
|
61
|
+
}): void;
|
|
62
|
+
export type LockTakeResult = {
|
|
63
|
+
ok: true;
|
|
64
|
+
fd: number;
|
|
65
|
+
} | {
|
|
66
|
+
ok: false;
|
|
67
|
+
reason: 'held' | 'error';
|
|
68
|
+
};
|
|
69
|
+
/**
|
|
70
|
+
* ONE attempt to take the exclusive lock at `lockPath` (O_CREAT|O_EXCL) and
|
|
71
|
+
* stamp `record` into it. Returns the open fd on success; `held` when another
|
|
72
|
+
* process holds it; `error` on any other failure (the caller decides its own
|
|
73
|
+
* fail direction — the core never does).
|
|
74
|
+
*/
|
|
75
|
+
export declare function tryTakeLockOnce(lockPath: string, record: string): LockTakeResult;
|
|
76
|
+
/** Release the lock taken by `tryTakeLockOnce`. Idempotent, never throws. */
|
|
77
|
+
export declare function releaseLock(lockPath: string, fd: number | null, operation: string): void;
|
|
78
|
+
/**
|
|
79
|
+
* LEGACY spawn-lane lock reclaim — remove the lock file when its recorded
|
|
80
|
+
* holder pid is dead (or the record is unparseable). Preserved BUG-FOR-BUG
|
|
81
|
+
* from HostSpawnSemaphore.reclaimStaleLock so the extraction changes nothing
|
|
82
|
+
* about spawn behavior (the golden test pins it).
|
|
83
|
+
*
|
|
84
|
+
* KNOWN DEFECTS (surfaced by the test-runner-concurrency-bound §2.1 review;
|
|
85
|
+
* the fix is the tracked spawn-lane back-port, NOT this extraction):
|
|
86
|
+
* - non-atomic unlink-then-recreate: two contenders can both observe a dead
|
|
87
|
+
* lock, both unlink, both enter — a holders row can be lost to
|
|
88
|
+
* last-write-wins;
|
|
89
|
+
* - torn-read hazard: the lock is created then written in TWO steps, so a
|
|
90
|
+
* contender can read an empty just-created lock, hit the parse catch, and
|
|
91
|
+
* unlink a LIVE lock;
|
|
92
|
+
* - `{pid, at}` carries no hostname and reclaim is not df-gated: on a synced
|
|
93
|
+
* home a peer machine pid-probes a foreign, locally-meaningless pid.
|
|
94
|
+
* The TEST lane does NOT use this function at all (age-reclaim-only, §2.4).
|
|
95
|
+
*/
|
|
96
|
+
export declare function legacyPidDeathLockReclaim(lockPath: string, pidAlive: (pid: number) => boolean): boolean;
|
|
97
|
+
export interface ReclaimContext {
|
|
98
|
+
nowMs: number;
|
|
99
|
+
hostname: string;
|
|
100
|
+
pidAlive: (pid: number) => boolean;
|
|
101
|
+
/** df-confirmed host-local? Policies that reclaim MUST gate on this. */
|
|
102
|
+
dfLocal: boolean;
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Per-row reclaim decision. Return true ⇒ the row is RECLAIMED (dropped from
|
|
106
|
+
* the holders set). The policy owns its own fail direction — the core applies
|
|
107
|
+
* it mechanically.
|
|
108
|
+
*/
|
|
109
|
+
export type HolderReclaimPolicy<Row> = (row: Row, ctx: ReclaimContext) => boolean;
|
|
110
|
+
/**
|
|
111
|
+
* The prune-dead pass: drop rows that are not well-formed, then apply the
|
|
112
|
+
* lane's ReclaimPolicy to each remaining row. Pure — no I/O.
|
|
113
|
+
*/
|
|
114
|
+
export declare function pruneHolders<Row>(rows: unknown[], isWellFormed: (r: unknown) => r is Row, policy: HolderReclaimPolicy<Row>, ctx: ReclaimContext): Row[];
|
|
115
|
+
//# sourceMappingURL=hostSemaphoreCore.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hostSemaphoreCore.d.ts","sourceRoot":"","sources":["../../src/core/hostSemaphoreCore.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AASH,8EAA8E;AAC9E,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAM7D;AAED;;;;;;GAMG;AACH,wBAAgB,wBAAwB,CACtC,CAAC,EAAE,MAAM,EACT,SAAS,SAAO,GACf;IAAE,MAAM,EAAE,OAAO,GAAG,WAAW,GAAG,SAAS,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,CAiBhE;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,MAAM,EAAE,SAAS,SAAO,GAAG,OAAO,CAErE;AAID;;;;;GAKG;AACH,wBAAgB,mBAAmB,CACjC,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,GACzC,IAAI,CAeN;AAID,MAAM,MAAM,cAAc,GACtB;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,GACxB;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAA;CAAE,CAAC;AAE5C;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,cAAc,CAkBhF;AAED,6EAA6E;AAC7E,wBAAgB,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,IAAI,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI,CAaxF;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,yBAAyB,CACvC,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,GACjC,OAAO,CAwBT;AAID,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC;IACnC,wEAAwE;IACxE,OAAO,EAAE,OAAO,CAAC;CAClB;AAED;;;;GAIG;AACH,MAAM,MAAM,mBAAmB,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,cAAc,KAAK,OAAO,CAAC;AAElF;;;GAGG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAC9B,IAAI,EAAE,OAAO,EAAE,EACf,YAAY,EAAE,CAAC,CAAC,EAAE,OAAO,KAAK,CAAC,IAAI,GAAG,EACtC,MAAM,EAAE,mBAAmB,CAAC,GAAG,CAAC,EAChC,GAAG,EAAE,cAAc,GAClB,GAAG,EAAE,CAQP"}
|
|
@@ -0,0 +1,215 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* hostSemaphoreCore — shared holder-set semaphore primitives.
|
|
3
|
+
*
|
|
4
|
+
* Extraction seam per docs/specs/test-runner-concurrency-bound.md §2.1: the
|
|
5
|
+
* proven MECHANICS of `hostSpawnSemaphore.ts` (the 2026-06-20 fork-bomb floor)
|
|
6
|
+
* are extracted here so the test-runner lane can reuse them WITHOUT inheriting
|
|
7
|
+
* spawn-lane POLICY. What moves into the core:
|
|
8
|
+
*
|
|
9
|
+
* - the exclusive O_CREAT|O_EXCL lock primitive — but lock-RECLAIM policy is
|
|
10
|
+
* a PARAMETER of the consumer, not the core: the spawn lane keeps its
|
|
11
|
+
* legacy pid-death unlink reclaim (`legacyPidDeathLockReclaim`, preserved
|
|
12
|
+
* bug-for-bug — see the defect note on that function), while the test lane
|
|
13
|
+
* uses ONLY its own race-safe age-reclaim (atomic rename + dev+ino verify,
|
|
14
|
+
* implemented in hostTestRunnerSemaphore.ts) and NEVER calls the legacy
|
|
15
|
+
* reclaim;
|
|
16
|
+
* - holders-file atomic write (temp+rename) and the safe read;
|
|
17
|
+
* - the `df -P` host-local determination (fail-closed classifier);
|
|
18
|
+
* - the prune-dead pass, taking a ReclaimPolicy parameter (NOT the spawn
|
|
19
|
+
* cap's hardcoded `pidDead && heartbeatStale && dfLocal`).
|
|
20
|
+
*
|
|
21
|
+
* ReclaimPolicy contract (the authoritative statement — this fixes the
|
|
22
|
+
* HOLDER_STALE_MS doc-code contradiction found in review): the SPAWN lane
|
|
23
|
+
* reclaims a holder only when its pid is dead (PRIMARY signal) AND its
|
|
24
|
+
* heartbeat is stale past HOLDER_STALE_MS (SECONDARY signal) AND the holders
|
|
25
|
+
* file is df-confirmed host-local. It is an AND conjunction — a live-pid
|
|
26
|
+
* holder is never reclaimed by heartbeat alone, and a dead-pid holder is kept
|
|
27
|
+
* until its heartbeat also goes stale. The TEST lane passes a different
|
|
28
|
+
* policy (immediate dead-pid reclaim + start-time corroboration + max-hold
|
|
29
|
+
* TTL) — see hostTestRunnerSemaphore.ts §2.4.
|
|
30
|
+
*
|
|
31
|
+
* The singleton + config layer is NOT extracted (two caps cannot share one
|
|
32
|
+
* singleton) — each lane keeps its own thin configure/get/reset trio.
|
|
33
|
+
*/
|
|
34
|
+
import fs from 'node:fs';
|
|
35
|
+
import { execFileSync } from 'node:child_process';
|
|
36
|
+
import { SafeFsExecutor } from './SafeFsExecutor.js';
|
|
37
|
+
// ── df -P host-local determination (fail-closed) ─────────────────────────
|
|
38
|
+
/** Pure FD1 classifier over the `df -P` device-source column. FAIL-CLOSED. */
|
|
39
|
+
export function classifyDfSourceLocal(source) {
|
|
40
|
+
if (!source)
|
|
41
|
+
return false;
|
|
42
|
+
if (source.startsWith('//'))
|
|
43
|
+
return false; // SMB/CIFS //host/share → network
|
|
44
|
+
if (/^[^/][^:]*:/.test(source))
|
|
45
|
+
return false; // NFS host:/path → network
|
|
46
|
+
if (source.startsWith('/dev/'))
|
|
47
|
+
return true; // a real block device → local
|
|
48
|
+
return false; // map/tmpfs/anything unrecognized → fail-closed
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Detailed df probe. Distinguishes a POSITIVE not-local classification from a
|
|
52
|
+
* FAILED probe ('unknown') — the distinction the 2026-07-01 §1.2 root-cause
|
|
53
|
+
* hinges on: the spawn lane memoizes a boolean, so a df TIMEOUT under load is
|
|
54
|
+
* cached forever as "not local" and silently disables all reclaim for the
|
|
55
|
+
* process lifetime. Consumers that cache MUST NOT cache an 'unknown' result.
|
|
56
|
+
*/
|
|
57
|
+
export function probeDfHostLocalDetailed(p, timeoutMs = 3000) {
|
|
58
|
+
let out;
|
|
59
|
+
try {
|
|
60
|
+
// lint-allow-sync-spawn: a bounded (3s) one-shot host-FS classification,
|
|
61
|
+
// run once per cold start and cached by callers on SUCCESS only — never on
|
|
62
|
+
// the hot acquire path.
|
|
63
|
+
out = execFileSync('df', ['-P', p], { timeout: timeoutMs, encoding: 'utf-8' });
|
|
64
|
+
}
|
|
65
|
+
catch {
|
|
66
|
+
// @silent-fallback-ok: df unavailable/timed out ⇒ we could not PROBE — the
|
|
67
|
+
// caller must treat this as unknown (reclaim disabled this pass), never
|
|
68
|
+
// cache it as a positive not-local classification.
|
|
69
|
+
return { status: 'unknown' };
|
|
70
|
+
}
|
|
71
|
+
const lines = out.trim().split('\n');
|
|
72
|
+
if (lines.length < 2)
|
|
73
|
+
return { status: 'unknown' }; // unparseable → unknown
|
|
74
|
+
const source = lines[1]?.trim().split(/\s+/)[0] ?? '';
|
|
75
|
+
return { status: classifyDfSourceLocal(source) ? 'local' : 'not-local', source };
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Boolean df probe (the spawn lane's historical shape). FAIL-CLOSED: anything
|
|
79
|
+
* not positively confirmable as local (including a failed probe) is false.
|
|
80
|
+
*/
|
|
81
|
+
export function probeDfHostLocal(p, timeoutMs = 3000) {
|
|
82
|
+
return probeDfHostLocalDetailed(p, timeoutMs).status === 'local';
|
|
83
|
+
}
|
|
84
|
+
// ── Atomic file write (temp + rename) ────────────────────────────────────
|
|
85
|
+
/**
|
|
86
|
+
* Write `body` to `filePath` atomically via temp+rename (same filesystem).
|
|
87
|
+
* The temp file is opened O_CREAT|O_EXCL with the given mode; on any error the
|
|
88
|
+
* temp is best-effort removed (via the SafeFsExecutor funnel) and the error
|
|
89
|
+
* rethrown.
|
|
90
|
+
*/
|
|
91
|
+
export function atomicWriteFileSync(filePath, body, opts) {
|
|
92
|
+
const tmp = `${filePath}.tmp.${process.pid}.${Math.random().toString(36).slice(2, 8)}`;
|
|
93
|
+
try {
|
|
94
|
+
const fd = fs.openSync(tmp, 'wx', opts.mode ?? 0o600);
|
|
95
|
+
fs.writeSync(fd, body);
|
|
96
|
+
fs.closeSync(fd);
|
|
97
|
+
fs.renameSync(tmp, filePath); // atomic on the same filesystem
|
|
98
|
+
}
|
|
99
|
+
catch (err) {
|
|
100
|
+
try {
|
|
101
|
+
SafeFsExecutor.safeUnlinkSync(tmp, { operation: `${opts.operation}:cleanup-tmp` });
|
|
102
|
+
}
|
|
103
|
+
catch {
|
|
104
|
+
/* @silent-fallback-ok: best-effort tmp cleanup — the original error is rethrown */
|
|
105
|
+
}
|
|
106
|
+
throw err;
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* ONE attempt to take the exclusive lock at `lockPath` (O_CREAT|O_EXCL) and
|
|
111
|
+
* stamp `record` into it. Returns the open fd on success; `held` when another
|
|
112
|
+
* process holds it; `error` on any other failure (the caller decides its own
|
|
113
|
+
* fail direction — the core never does).
|
|
114
|
+
*/
|
|
115
|
+
export function tryTakeLockOnce(lockPath, record) {
|
|
116
|
+
let fd = null;
|
|
117
|
+
try {
|
|
118
|
+
fd = fs.openSync(lockPath, 'wx', 0o600); // O_CREAT|O_EXCL
|
|
119
|
+
fs.writeSync(fd, record);
|
|
120
|
+
return { ok: true, fd };
|
|
121
|
+
}
|
|
122
|
+
catch (err) {
|
|
123
|
+
const e = err;
|
|
124
|
+
if (fd !== null) {
|
|
125
|
+
try {
|
|
126
|
+
fs.closeSync(fd);
|
|
127
|
+
}
|
|
128
|
+
catch {
|
|
129
|
+
/* @silent-fallback-ok: closing a maybe-invalid fd during error unwind is benign */
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
if (e.code === 'EEXIST')
|
|
133
|
+
return { ok: false, reason: 'held' };
|
|
134
|
+
return { ok: false, reason: 'error' };
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
/** Release the lock taken by `tryTakeLockOnce`. Idempotent, never throws. */
|
|
138
|
+
export function releaseLock(lockPath, fd, operation) {
|
|
139
|
+
if (fd !== null) {
|
|
140
|
+
try {
|
|
141
|
+
fs.closeSync(fd);
|
|
142
|
+
}
|
|
143
|
+
catch {
|
|
144
|
+
/* @silent-fallback-ok: closing an already-closed/invalid fd on lock-release is benign */
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
try {
|
|
148
|
+
SafeFsExecutor.safeUnlinkSync(lockPath, { operation });
|
|
149
|
+
}
|
|
150
|
+
catch {
|
|
151
|
+
/* @silent-fallback-ok: a missing lock on release is fine — release is idempotent */
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* LEGACY spawn-lane lock reclaim — remove the lock file when its recorded
|
|
156
|
+
* holder pid is dead (or the record is unparseable). Preserved BUG-FOR-BUG
|
|
157
|
+
* from HostSpawnSemaphore.reclaimStaleLock so the extraction changes nothing
|
|
158
|
+
* about spawn behavior (the golden test pins it).
|
|
159
|
+
*
|
|
160
|
+
* KNOWN DEFECTS (surfaced by the test-runner-concurrency-bound §2.1 review;
|
|
161
|
+
* the fix is the tracked spawn-lane back-port, NOT this extraction):
|
|
162
|
+
* - non-atomic unlink-then-recreate: two contenders can both observe a dead
|
|
163
|
+
* lock, both unlink, both enter — a holders row can be lost to
|
|
164
|
+
* last-write-wins;
|
|
165
|
+
* - torn-read hazard: the lock is created then written in TWO steps, so a
|
|
166
|
+
* contender can read an empty just-created lock, hit the parse catch, and
|
|
167
|
+
* unlink a LIVE lock;
|
|
168
|
+
* - `{pid, at}` carries no hostname and reclaim is not df-gated: on a synced
|
|
169
|
+
* home a peer machine pid-probes a foreign, locally-meaningless pid.
|
|
170
|
+
* The TEST lane does NOT use this function at all (age-reclaim-only, §2.4).
|
|
171
|
+
*/
|
|
172
|
+
export function legacyPidDeathLockReclaim(lockPath, pidAlive) {
|
|
173
|
+
try {
|
|
174
|
+
const raw = fs.readFileSync(lockPath, 'utf-8');
|
|
175
|
+
const obj = JSON.parse(raw);
|
|
176
|
+
const pid = typeof obj?.pid === 'number' ? obj.pid : null;
|
|
177
|
+
if (pid !== null && pidAlive(pid))
|
|
178
|
+
return false; // live holder — wait
|
|
179
|
+
// Dead (or unparseable) lock holder — reclaim.
|
|
180
|
+
SafeFsExecutor.safeUnlinkSync(lockPath, { operation: 'hostSemaphoreCore.legacyPidDeathLockReclaim' });
|
|
181
|
+
return true;
|
|
182
|
+
}
|
|
183
|
+
catch {
|
|
184
|
+
// @silent-fallback-ok: a read/parse failure on the lock means we couldn't
|
|
185
|
+
// confirm a live holder; treat as reclaimable so a corrupt lock can't wedge
|
|
186
|
+
// the cap permanently. The O_EXCL re-create still races safely.
|
|
187
|
+
try {
|
|
188
|
+
SafeFsExecutor.safeUnlinkSync(lockPath, {
|
|
189
|
+
operation: 'hostSemaphoreCore.legacyPidDeathLockReclaim:corrupt',
|
|
190
|
+
});
|
|
191
|
+
return true;
|
|
192
|
+
}
|
|
193
|
+
catch {
|
|
194
|
+
// @silent-fallback-ok: couldn't remove the corrupt lock (a race with
|
|
195
|
+
// another reclaimer) — report not-reclaimed; the caller waits + retries.
|
|
196
|
+
return false;
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
/**
|
|
201
|
+
* The prune-dead pass: drop rows that are not well-formed, then apply the
|
|
202
|
+
* lane's ReclaimPolicy to each remaining row. Pure — no I/O.
|
|
203
|
+
*/
|
|
204
|
+
export function pruneHolders(rows, isWellFormed, policy, ctx) {
|
|
205
|
+
const out = [];
|
|
206
|
+
for (const r of rows) {
|
|
207
|
+
if (!isWellFormed(r))
|
|
208
|
+
continue; // drop garbage rows
|
|
209
|
+
if (policy(r, ctx))
|
|
210
|
+
continue; // policy says reclaim
|
|
211
|
+
out.push(r);
|
|
212
|
+
}
|
|
213
|
+
return out;
|
|
214
|
+
}
|
|
215
|
+
//# sourceMappingURL=hostSemaphoreCore.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hostSemaphoreCore.js","sourceRoot":"","sources":["../../src/core/hostSemaphoreCore.ts"],"names":[],"mappings":"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"}
|
|
@@ -36,6 +36,8 @@
|
|
|
36
36
|
* BOUNDED INGRESS (P3) lives in the wrapper (SpawnCapIntelligenceProvider) via
|
|
37
37
|
* poll-retry against `acquire()` — this module is the pure counting primitive.
|
|
38
38
|
*/
|
|
39
|
+
import { classifyDfSourceLocal } from './hostSemaphoreCore.js';
|
|
40
|
+
export { classifyDfSourceLocal };
|
|
39
41
|
/** One live holder of a spawn slot. */
|
|
40
42
|
/**
|
|
41
43
|
* The two reservation lanes (F5, docs/specs/spawn-cap-interactive-priority.md).
|
|
@@ -82,11 +84,12 @@ export declare function clampInteractiveReserves(cap: number, ri: number | undef
|
|
|
82
84
|
ri: number;
|
|
83
85
|
rb: number;
|
|
84
86
|
};
|
|
85
|
-
/** Heartbeat staleness window
|
|
86
|
-
*
|
|
87
|
-
*
|
|
88
|
-
*
|
|
89
|
-
*
|
|
87
|
+
/** Heartbeat staleness window. A holder is reclaimed only when its pid is dead
|
|
88
|
+
* (PRIMARY signal) AND its heartbeat is older than this (SECONDARY signal) AND
|
|
89
|
+
* the holders file is df-confirmed host-local — an AND conjunction (see the
|
|
90
|
+
* authoritative ReclaimPolicy contract in hostSemaphoreCore.ts). Kept long
|
|
91
|
+
* (a slow `claude -p` cold-start + run can legitimately exceed a minute); a
|
|
92
|
+
* live-pid holder is NEVER reclaimed regardless of heartbeat. */
|
|
90
93
|
export declare const HOLDER_STALE_MS: number;
|
|
91
94
|
/**
|
|
92
95
|
* FD1 (from ResumeQueue) — is `p` on a HOST-LOCAL filesystem? FAIL-CLOSED:
|
|
@@ -97,8 +100,6 @@ export declare const HOLDER_STALE_MS: number;
|
|
|
97
100
|
* core/ never depends on monitoring/.
|
|
98
101
|
*/
|
|
99
102
|
export declare function isPathHostLocalDefault(p: string): boolean;
|
|
100
|
-
/** Pure FD1 classifier over the `df -P` device-source column. FAIL-CLOSED. */
|
|
101
|
-
export declare function classifyDfSourceLocal(source: string): boolean;
|
|
102
103
|
export interface HostSpawnSemaphoreDeps {
|
|
103
104
|
/** Absolute path to the holders file. Default `~/.instar/host-spawn-holders.json`. */
|
|
104
105
|
holdersPath?: string;
|
|
@@ -217,8 +218,6 @@ export declare class HostSpawnSemaphore {
|
|
|
217
218
|
* brief; a crashed lock-holder's stale lock is reclaimed by pid-death.
|
|
218
219
|
*/
|
|
219
220
|
private withLock;
|
|
220
|
-
/** Remove the lock file if its recorded holder pid is dead (crash recovery). */
|
|
221
|
-
private reclaimStaleLock;
|
|
222
221
|
private ensureDir;
|
|
223
222
|
}
|
|
224
223
|
/** Default holders file path: `~/.instar/host-spawn-holders.json` (host-local). */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hostSpawnSemaphore.d.ts","sourceRoot":"","sources":["../../src/core/hostSpawnSemaphore.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqCG;
|
|
1
|
+
{"version":3,"file":"hostSpawnSemaphore.d.ts","sourceRoot":"","sources":["../../src/core/hostSpawnSemaphore.ts"],"names":[],"mappings":"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"}
|