instar 1.3.736 → 1.3.737
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/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/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/scaffold/templates.ts +7 -0
- package/upgrades/1.3.737.md +140 -0
- package/upgrades/side-effects/test-runner-concurrency-bound.md +173 -0
- package/upgrades/1.3.736.md +0 -57
|
@@ -0,0 +1,492 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* hostTestRunnerSemaphore — the host-wide vitest concurrency bound (test lane).
|
|
3
|
+
*
|
|
4
|
+
* Spec: docs/specs/test-runner-concurrency-bound.md (converged round 10,
|
|
5
|
+
* operator-ratified: suite cap 1, ship posture dry-run/watch-only).
|
|
6
|
+
* Constitutional standard: Bounded Blast Radius (the 2nd instance of the
|
|
7
|
+
* unbounded-per-actor-spawn class; the 1st is hostSpawnSemaphore).
|
|
8
|
+
*
|
|
9
|
+
* THE LOAD-BEARING DESIGN DECISION (§1.1): the fail-direction INVERTS from the
|
|
10
|
+
* spawn cap. This lane fails OPEN — toward ADMITTING a run — on every
|
|
11
|
+
* *provable, persistent* uncertainty (corrupt holders file, df-unconfirmed
|
|
12
|
+
* disk, provably-wedged lock, unresolvable ancestry). A false BLOCK wedges
|
|
13
|
+
* every `git push` and `/build` gate host-wide with no degradation path; a
|
|
14
|
+
* false PASS is one extra concurrent suite. A single missed lock attempt is
|
|
15
|
+
* "keep polling", never "admit" (§2.4 fail-open granularity).
|
|
16
|
+
*
|
|
17
|
+
* TWO SYMMETRIC LANES (§2.3): suite-class (cap INSTAR_HOST_TEST_MAX, default
|
|
18
|
+
* 1) and targeted-run (cap INSTAR_HOST_TEST_TARGETED_MAX, default 6). A full
|
|
19
|
+
* targeted lane THROWS the typed capacity-timeout — it never fail-open-admits
|
|
20
|
+
* (fail-open-admit is lock-wedge-only).
|
|
21
|
+
*
|
|
22
|
+
* RECLAIM POLICY (§2.4, NOT the spawn defaults): immediate reclaim of a
|
|
23
|
+
* provably-dead pid; start-time corroboration reclaims a REUSED pid pre-TTL;
|
|
24
|
+
* a max-hold TTL frees even a pid-alive holder's slot (capacity-reclaim-ONLY
|
|
25
|
+
* by default — NO process is ever signaled unless the separate, opt-in,
|
|
26
|
+
* tuning-file-armed INSTAR_HOST_TEST_TTL_SIGNAL arm is on AND posture is
|
|
27
|
+
* enforcing, and even then only after four mandatory gates).
|
|
28
|
+
*
|
|
29
|
+
* All cross-actor levers (posture, both caps, the signal arm) take their
|
|
30
|
+
* host-uniform authority from ~/.instar/host-test-runner-tuning.json; env
|
|
31
|
+
* vars are per-process overrides that are honored but LOUD when divergent
|
|
32
|
+
* (§2.9). Every consequential decision is appended to the durable event
|
|
33
|
+
* ledger (§2.8) — the soak's evidence store.
|
|
34
|
+
*/
|
|
35
|
+
/** Suite-lane cap code-default (operator-ratified: full suites one-at-a-time). */
|
|
36
|
+
export declare const HOST_TEST_SUITE_CAP_DEFAULT = 1;
|
|
37
|
+
/** Targeted-lane cap code-default (§2.3). */
|
|
38
|
+
export declare const HOST_TEST_TARGETED_CAP_DEFAULT = 6;
|
|
39
|
+
/** Tuning-file cap sanity ceilings — 4× each code-default (§2.9, pinned). */
|
|
40
|
+
export declare const HOST_TEST_SUITE_CAP_CEILING = 4;
|
|
41
|
+
export declare const HOST_TEST_TARGETED_CAP_CEILING = 24;
|
|
42
|
+
/** Max-hold TTL code-default (1h). */
|
|
43
|
+
export declare const HOST_TEST_TTL_DEFAULT_MS = 3600000;
|
|
44
|
+
/** ttlMs sanity RANGE — pinned code constants, deliberately NOT tunable (§2.4). */
|
|
45
|
+
export declare const HOST_TEST_TTL_MIN_MS = 300000;
|
|
46
|
+
export declare const HOST_TEST_TTL_MAX_MS = 14400000;
|
|
47
|
+
/** Poison sanity ceiling on holders-file row count (§2.4, pinned round 6). */
|
|
48
|
+
export declare const HOST_TEST_POISON_CEILING = 64;
|
|
49
|
+
/** Lockless fail-open storm ceiling — O_EXCL witness slots (§2.4, pinned). */
|
|
50
|
+
export declare const WEDGE_STORM_CEILING = 8;
|
|
51
|
+
/** Background-class suite-lane wait budget default (2 min, fail-loud). */
|
|
52
|
+
export declare const HOST_TEST_ACQUIRE_MS_DEFAULT = 120000;
|
|
53
|
+
/** Targeted-lane wait budget default (1 min, fail-loud THROW). */
|
|
54
|
+
export declare const HOST_TEST_TARGETED_ACQUIRE_MS_DEFAULT = 60000;
|
|
55
|
+
/** A lock older than this is provably wedged (critical section is sub-ms). */
|
|
56
|
+
export declare const LOCK_WEDGE_AGE_MS = 10000;
|
|
57
|
+
/** Per-attempt lock-acquire deadline (≫ the sub-ms critical section). */
|
|
58
|
+
export declare const LOCK_ACQUIRE_DEADLINE_MS = 250;
|
|
59
|
+
/** Acquisition poll cadence (async yielding wait — NEVER a busy spin). */
|
|
60
|
+
export declare const POLL_INTERVAL_MS = 5000;
|
|
61
|
+
export declare const POLL_JITTER_MS = 1000;
|
|
62
|
+
/** SIGTERM→SIGKILL grace window under the (opt-in) signal arm. */
|
|
63
|
+
export declare const TOMBSTONE_GRACE_MS = 30000;
|
|
64
|
+
/** Ledger rotation threshold (~5MB; segments retained per §2.8). */
|
|
65
|
+
export declare const LEDGER_ROTATE_BYTES: number;
|
|
66
|
+
/** Segment retention floor AFTER the enforce-flip decision is recorded. */
|
|
67
|
+
export declare const LEDGER_SEGMENT_FLOOR = 10;
|
|
68
|
+
/** Clock-skew allowance for start-time corroboration. */
|
|
69
|
+
export declare const START_TIME_SKEW_MS = 120000;
|
|
70
|
+
/** 80%-of-TTL warning fraction (§2.4). */
|
|
71
|
+
export declare const TTL_WARN_FRACTION = 0.8;
|
|
72
|
+
/** Targeted classification file-count limit K (§2.3). */
|
|
73
|
+
export declare const TARGETED_FILE_LIMIT = 5;
|
|
74
|
+
export type TestLane = 'suite' | 'targeted';
|
|
75
|
+
export type TestPosture = 'off' | 'dry-run' | 'enforcing';
|
|
76
|
+
export type TestRunClass = 'interactive' | 'background';
|
|
77
|
+
export interface TestRunnerPaths {
|
|
78
|
+
baseDir: string;
|
|
79
|
+
holders: string;
|
|
80
|
+
lock: string;
|
|
81
|
+
witnessDir: string;
|
|
82
|
+
tuning: string;
|
|
83
|
+
tuningBaseline: string;
|
|
84
|
+
dfMarker: string;
|
|
85
|
+
ledger: string;
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Resolve the rendezvous base dir. `INSTAR_HOST_TEST_BASE_DIR` is an INTERNAL
|
|
89
|
+
* test seam (meta-tests isolate their spawned roots into a temp universe) —
|
|
90
|
+
* it is NOT a public lever and is deliberately undocumented in §2.9.
|
|
91
|
+
*/
|
|
92
|
+
export declare function resolveTestRunnerPaths(env?: NodeJS.ProcessEnv): TestRunnerPaths;
|
|
93
|
+
export interface TestRunnerHolderRow {
|
|
94
|
+
v: 1;
|
|
95
|
+
id: string;
|
|
96
|
+
lane: TestLane;
|
|
97
|
+
pid: number;
|
|
98
|
+
hostname: string;
|
|
99
|
+
/** ms epoch of the acquire. */
|
|
100
|
+
acquiredAt: number;
|
|
101
|
+
/** Identity fingerprint: raw `ps -o lstart=` text of the holder at acquire. */
|
|
102
|
+
startedAt: string;
|
|
103
|
+
/** Clamped copy of the command line (identity fingerprint). */
|
|
104
|
+
cmd: string;
|
|
105
|
+
/** Per-row max-hold TTL, stamped at acquire, sanity-RANGED on every read. */
|
|
106
|
+
ttlMs: number;
|
|
107
|
+
state: 'held' | 'terminating';
|
|
108
|
+
runClass?: TestRunClass;
|
|
109
|
+
/** Resolved MATCHED file count for targeted-lane rows (§2.3). */
|
|
110
|
+
fileCount?: number;
|
|
111
|
+
/** Recorded group-leadership at acquire (best-effort). */
|
|
112
|
+
pgidLeader?: boolean;
|
|
113
|
+
/** Set when the sleep-wake check re-armed the TTL window once (§2.4 gate 5). */
|
|
114
|
+
reArmedAt?: number;
|
|
115
|
+
/** signal-arm tombstone bookkeeping. */
|
|
116
|
+
signaledAt?: number;
|
|
117
|
+
[k: string]: unknown;
|
|
118
|
+
}
|
|
119
|
+
export interface TestRunnerTuningFile {
|
|
120
|
+
v: 1;
|
|
121
|
+
enforcing?: boolean;
|
|
122
|
+
clampActive?: boolean;
|
|
123
|
+
maxConcurrent?: number;
|
|
124
|
+
targetedMax?: number;
|
|
125
|
+
ttlSignal?: boolean;
|
|
126
|
+
flippedAt?: string;
|
|
127
|
+
by?: string;
|
|
128
|
+
[k: string]: unknown;
|
|
129
|
+
}
|
|
130
|
+
/** Distinct exit code for capacity refusals (EX_TEMPFAIL — NOT a test failure). */
|
|
131
|
+
export declare const TEST_RUNNER_CAPACITY_EXIT_CODE = 75;
|
|
132
|
+
export declare class TestRunnerCapacityTimeoutError extends Error {
|
|
133
|
+
readonly code = "INSTAR_TEST_CAPACITY_TIMEOUT";
|
|
134
|
+
readonly exitCode = 75;
|
|
135
|
+
readonly holders: Array<{
|
|
136
|
+
pid: number;
|
|
137
|
+
ageMs: number;
|
|
138
|
+
}>;
|
|
139
|
+
constructor(lane: TestLane, budgetMs: number, holders: Array<{
|
|
140
|
+
pid: number;
|
|
141
|
+
ageMs: number;
|
|
142
|
+
}>);
|
|
143
|
+
}
|
|
144
|
+
export declare class TestRunnerStormCeilingError extends Error {
|
|
145
|
+
readonly code = "INSTAR_TEST_STORM_CEILING";
|
|
146
|
+
readonly exitCode = 75;
|
|
147
|
+
readonly slots: Array<{
|
|
148
|
+
slot: number;
|
|
149
|
+
pid: number;
|
|
150
|
+
ageMs: number;
|
|
151
|
+
}>;
|
|
152
|
+
constructor(slots: Array<{
|
|
153
|
+
slot: number;
|
|
154
|
+
pid: number;
|
|
155
|
+
ageMs: number;
|
|
156
|
+
}>);
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* Coerce a raw ttlMs to a finite integer in [HOST_TEST_TTL_MIN_MS,
|
|
160
|
+
* HOST_TEST_TTL_MAX_MS]. Uses Number() + Number.isInteger — NEVER parseInt
|
|
161
|
+
* (§2.4: "300000abc"/"300000.9" are definitively REJECTED to the default, not
|
|
162
|
+
* truncated into range). Out-of-range/NaN/non-integer ⇒ code-default + coerced.
|
|
163
|
+
*/
|
|
164
|
+
export declare function coerceTtlMs(raw: unknown): {
|
|
165
|
+
ttlMs: number;
|
|
166
|
+
coerced: boolean;
|
|
167
|
+
};
|
|
168
|
+
/** Sanity-clamp a tuning-file cap value to an integer in [1, ceiling] (§2.9). */
|
|
169
|
+
export declare function sanitizeCapValue(raw: unknown, ceiling: number, dflt: number): {
|
|
170
|
+
value: number;
|
|
171
|
+
coerced: boolean;
|
|
172
|
+
};
|
|
173
|
+
export interface ResolvedPosture {
|
|
174
|
+
posture: TestPosture;
|
|
175
|
+
/** The host-uniform authority's posture (tuning file, else code default). */
|
|
176
|
+
authority: Exclude<TestPosture, 'off'>;
|
|
177
|
+
/** Env divergence from the authority: 'weaker' | 'stronger' | null. */
|
|
178
|
+
divergence: 'weaker' | 'stronger' | null;
|
|
179
|
+
}
|
|
180
|
+
export declare function resolvePosture(env: NodeJS.ProcessEnv, tuning: TestRunnerTuningFile | null): ResolvedPosture;
|
|
181
|
+
/** Are the config-eval clamps REAL (clamp-active sub-stage or enforcing)? §2.11. */
|
|
182
|
+
export declare function resolveClampActive(posture: TestPosture, tuning: TestRunnerTuningFile | null): boolean;
|
|
183
|
+
export interface ResolvedCap {
|
|
184
|
+
cap: number;
|
|
185
|
+
source: 'env' | 'tuning' | 'default';
|
|
186
|
+
/** Tuning value was out-of-range/non-integer and resolved to the default. */
|
|
187
|
+
coerced: boolean;
|
|
188
|
+
/** Resolved (env) cap exceeds the host-uniform authority by more than 4×. */
|
|
189
|
+
divergentBeyond4x: boolean;
|
|
190
|
+
}
|
|
191
|
+
export declare function resolveCap(lane: TestLane, env: NodeJS.ProcessEnv, tuning: TestRunnerTuningFile | null): ResolvedCap;
|
|
192
|
+
export interface ResolvedTtlSignal {
|
|
193
|
+
armed: boolean;
|
|
194
|
+
/** env=1 against an unarmed authority was IGNORED (env can only DISARM). */
|
|
195
|
+
envArmIgnored: boolean;
|
|
196
|
+
}
|
|
197
|
+
export declare function resolveTtlSignal(env: NodeJS.ProcessEnv, tuning: TestRunnerTuningFile | null): ResolvedTtlSignal;
|
|
198
|
+
/** Resolve the acquire wait budget for a lane + run class (§2.9). */
|
|
199
|
+
export declare function resolveAcquireBudgetMs(lane: TestLane, runClass: TestRunClass, env?: NodeJS.ProcessEnv): number;
|
|
200
|
+
/** Stamped per-row ttl at acquire (env-read, sanity-ranged). */
|
|
201
|
+
export declare function resolveAcquireTtlMs(env?: NodeJS.ProcessEnv): {
|
|
202
|
+
ttlMs: number;
|
|
203
|
+
coerced: boolean;
|
|
204
|
+
};
|
|
205
|
+
export declare const TUNING_HASH_ABSENT = "absent";
|
|
206
|
+
export interface ResolvedTuning {
|
|
207
|
+
file: TestRunnerTuningFile | null;
|
|
208
|
+
/** sha256-12 of the raw bytes, or the 'absent' sentinel. */
|
|
209
|
+
hash: string;
|
|
210
|
+
corrupt: boolean;
|
|
211
|
+
}
|
|
212
|
+
/**
|
|
213
|
+
* Read the tuning file. Quarantine requires CONFIRMED corruption (an immediate
|
|
214
|
+
* re-read — a transient torn write must never demote the host authority);
|
|
215
|
+
* confirmed-corrupt is quarantined aside + resolved to code defaults (§2.9).
|
|
216
|
+
*/
|
|
217
|
+
export declare function readTuningFile(paths: TestRunnerPaths): ResolvedTuning;
|
|
218
|
+
/** Atomic tuning write (the recommended writer — never a raw shell redirect). */
|
|
219
|
+
export declare function writeTuningFile(paths: TestRunnerPaths, tuning: TestRunnerTuningFile): void;
|
|
220
|
+
export interface TestRunnerLedgerEvent {
|
|
221
|
+
v: 1;
|
|
222
|
+
ts: string;
|
|
223
|
+
kind: string;
|
|
224
|
+
pid: number;
|
|
225
|
+
hostname: string;
|
|
226
|
+
posture: TestPosture;
|
|
227
|
+
suiteCap: number;
|
|
228
|
+
targetedCap: number;
|
|
229
|
+
ttlSignalArmed: boolean;
|
|
230
|
+
tuningHash: string;
|
|
231
|
+
[k: string]: unknown;
|
|
232
|
+
}
|
|
233
|
+
/** Best-effort ledger append — a ledger write failure never blocks a run. */
|
|
234
|
+
export declare function appendLedgerEvent(paths: TestRunnerPaths, event: TestRunnerLedgerEvent, opts?: {
|
|
235
|
+
flipRecorded?: boolean;
|
|
236
|
+
}): void;
|
|
237
|
+
export declare function listLedgerSegments(paths: TestRunnerPaths): string[];
|
|
238
|
+
/**
|
|
239
|
+
* Bounded, torn-line-tolerant read of the newest ledger events. Spans the
|
|
240
|
+
* newest rotated SEGMENT when the live file carries no events (§2.9 —
|
|
241
|
+
* rotation must not blind the baseline read).
|
|
242
|
+
*/
|
|
243
|
+
export declare function readLedgerTail(paths: TestRunnerPaths, maxLines?: number): TestRunnerLedgerEvent[];
|
|
244
|
+
export interface TuningBaselineResult {
|
|
245
|
+
changed: boolean;
|
|
246
|
+
changedFields: string[];
|
|
247
|
+
established: boolean;
|
|
248
|
+
/** true when establishment was silent (genuinely fresh host). */
|
|
249
|
+
silentEstablish: boolean;
|
|
250
|
+
}
|
|
251
|
+
/**
|
|
252
|
+
* Detect tuning-file mutation via the content-hash baseline marker. On
|
|
253
|
+
* no-prior-baseline the LEDGER TAIL (live + newest segment) is consulted
|
|
254
|
+
* before establishing silently — marker-deletion must not launder an edit.
|
|
255
|
+
*/
|
|
256
|
+
export declare function checkTuningBaseline(paths: TestRunnerPaths, current: ResolvedTuning): TuningBaselineResult;
|
|
257
|
+
/**
|
|
258
|
+
* Resolve the host-local determination for the rendezvous dir, cached to the
|
|
259
|
+
* on-disk marker. THE §1.2 LESSON APPLIED: a FAILED probe ('unknown') is
|
|
260
|
+
* NEVER written to the marker — only a positive local/not-local
|
|
261
|
+
* classification is cacheable, so a df timeout under load disables reclaim
|
|
262
|
+
* for ONE pass, never for the process (or marker) lifetime.
|
|
263
|
+
*/
|
|
264
|
+
export declare function resolveDfLocal(paths: TestRunnerPaths, probe?: (p: string) => {
|
|
265
|
+
status: 'local' | 'not-local' | 'unknown';
|
|
266
|
+
}): {
|
|
267
|
+
local: boolean;
|
|
268
|
+
status: 'local' | 'not-local' | 'unknown';
|
|
269
|
+
};
|
|
270
|
+
export interface PidEvidence {
|
|
271
|
+
/** pid → parsed `ps lstart` start time in ms epoch (null: unobtainable). */
|
|
272
|
+
startMs: Map<number, number | null>;
|
|
273
|
+
/** pid → process group id (null: unobtainable). */
|
|
274
|
+
pgid: Map<number, number | null>;
|
|
275
|
+
}
|
|
276
|
+
export declare function gatherPidEvidence(pids: number[], pidAlive?: (pid: number) => boolean): PidEvidence;
|
|
277
|
+
/** The holder's OWN start time + cmd (fingerprint stamped at acquire). */
|
|
278
|
+
export declare function selfProcessFingerprint(): {
|
|
279
|
+
startedAt: string;
|
|
280
|
+
cmd: string;
|
|
281
|
+
};
|
|
282
|
+
export type RowKind = 'held' | 'terminating' | 'unknown-state' | 'malformed';
|
|
283
|
+
export declare function classifyRow(row: unknown): RowKind;
|
|
284
|
+
export interface HostTestRunnerSemaphoreDeps {
|
|
285
|
+
paths?: TestRunnerPaths;
|
|
286
|
+
env?: NodeJS.ProcessEnv;
|
|
287
|
+
now?: () => number;
|
|
288
|
+
hostname?: () => string;
|
|
289
|
+
pidAlive?: (pid: number) => boolean;
|
|
290
|
+
/** Injected df probe (tests). */
|
|
291
|
+
dfProbe?: (p: string) => {
|
|
292
|
+
status: 'local' | 'not-local' | 'unknown';
|
|
293
|
+
};
|
|
294
|
+
/** Injected process-signal seam (tests) — default process.kill. */
|
|
295
|
+
signal?: (pid: number, sig: NodeJS.Signals) => void;
|
|
296
|
+
/** Injected evidence gatherer (tests). */
|
|
297
|
+
gatherEvidence?: (pids: number[]) => PidEvidence;
|
|
298
|
+
/** Injected boot-time reader for the sleep-wake gate (ms epoch, null = unobtainable). */
|
|
299
|
+
bootTimeMs?: () => number | null;
|
|
300
|
+
/** INTERNAL policy parameter: sub-floor TTL for tests (never the public env). */
|
|
301
|
+
ttlMsOverride?: number;
|
|
302
|
+
/** Async sleep seam (tests shrink the poll). */
|
|
303
|
+
sleep?: (ms: number) => Promise<void>;
|
|
304
|
+
/** Poll interval override (INTERNAL test seam). */
|
|
305
|
+
pollIntervalMs?: number;
|
|
306
|
+
genId?: () => string;
|
|
307
|
+
}
|
|
308
|
+
export interface AcquireRequest {
|
|
309
|
+
lane: TestLane;
|
|
310
|
+
runClass: TestRunClass;
|
|
311
|
+
/** Resolved MATCHED file count (targeted lane). */
|
|
312
|
+
fileCount?: number;
|
|
313
|
+
/** Override budget (default resolved per §2.9). */
|
|
314
|
+
budgetMs?: number;
|
|
315
|
+
/** Called about once per poll while waiting (the §2.10 wait-line hook). */
|
|
316
|
+
onWaitTick?: (elapsedMs: number, holders: Array<{
|
|
317
|
+
pid: number;
|
|
318
|
+
ageMs: number;
|
|
319
|
+
}>) => void;
|
|
320
|
+
}
|
|
321
|
+
export type AcquireOutcome = {
|
|
322
|
+
kind: 'acquired';
|
|
323
|
+
id: string;
|
|
324
|
+
wouldBlock: boolean;
|
|
325
|
+
ttlMs: number;
|
|
326
|
+
} | {
|
|
327
|
+
kind: 'fail-open-admit';
|
|
328
|
+
cause: string;
|
|
329
|
+
witnessFile: string | null;
|
|
330
|
+
};
|
|
331
|
+
export interface PruneReport {
|
|
332
|
+
reclaimed: Array<{
|
|
333
|
+
pid: number;
|
|
334
|
+
lane?: string;
|
|
335
|
+
reason: string;
|
|
336
|
+
}>;
|
|
337
|
+
tombstonesCompleted: number;
|
|
338
|
+
liveSuite: number;
|
|
339
|
+
liveTargeted: number;
|
|
340
|
+
}
|
|
341
|
+
export declare class HostTestRunnerSemaphore {
|
|
342
|
+
readonly paths: TestRunnerPaths;
|
|
343
|
+
private readonly env;
|
|
344
|
+
private readonly now;
|
|
345
|
+
private readonly host;
|
|
346
|
+
private readonly pidAlive;
|
|
347
|
+
private readonly dfProbe;
|
|
348
|
+
private readonly signal;
|
|
349
|
+
private readonly gatherEvidence;
|
|
350
|
+
private readonly bootTimeMs;
|
|
351
|
+
private readonly ttlMsOverride?;
|
|
352
|
+
private readonly sleep;
|
|
353
|
+
private readonly pollIntervalMs;
|
|
354
|
+
private readonly genId;
|
|
355
|
+
constructor(deps?: HostTestRunnerSemaphoreDeps);
|
|
356
|
+
/** Resolve the full lever context (tuning, posture, caps, arm) once. */
|
|
357
|
+
resolveContext(): {
|
|
358
|
+
tuning: ResolvedTuning;
|
|
359
|
+
posture: ResolvedPosture;
|
|
360
|
+
suiteCap: ResolvedCap;
|
|
361
|
+
targetedCap: ResolvedCap;
|
|
362
|
+
ttlSignal: ResolvedTtlSignal;
|
|
363
|
+
clampActive: boolean;
|
|
364
|
+
};
|
|
365
|
+
ledger(kind: string, fields?: Record<string, unknown>): void;
|
|
366
|
+
private readHolders;
|
|
367
|
+
private writeHolders;
|
|
368
|
+
/**
|
|
369
|
+
* Quarantine a corrupt/poisoned holders file aside and start a fresh one,
|
|
370
|
+
* RE-HOMING any pending `terminating` tombstones (parseable path) or
|
|
371
|
+
* best-effort SALVAGING them via a line scan (unparseable path, §2.4).
|
|
372
|
+
* Returns the tombstones carried into the fresh file + whether any may have
|
|
373
|
+
* been dropped.
|
|
374
|
+
*/
|
|
375
|
+
private quarantineHolders;
|
|
376
|
+
/**
|
|
377
|
+
* Apply the test-lane ReclaimPolicy over `rows`. Evidence is gathered by the
|
|
378
|
+
* caller OUTSIDE the lock; decisions are applied here (re-validated per row).
|
|
379
|
+
* Returns kept rows + freed info. NEVER signals unless `armed && enforcing`.
|
|
380
|
+
*/
|
|
381
|
+
private applyReclaimPass;
|
|
382
|
+
private countLive;
|
|
383
|
+
/**
|
|
384
|
+
* The opt-in TTL signal path (§2.4) — four mandatory gates; a holder row is
|
|
385
|
+
* data, not a warrant. Returns 'tombstoned' | 'freed' | 'rearmed'.
|
|
386
|
+
*/
|
|
387
|
+
private signalHungHolder;
|
|
388
|
+
/** Complete (or keep) a terminating tombstone. Returns true when dropped. */
|
|
389
|
+
private completeTombstone;
|
|
390
|
+
private writeWitness;
|
|
391
|
+
/**
|
|
392
|
+
* Claim a numbered O_EXCL storm slot (§2.4). Throws TestRunnerStormCeilingError
|
|
393
|
+
* when all WEDGE_STORM_CEILING slots are held by pid-ALIVE claimants.
|
|
394
|
+
*/
|
|
395
|
+
private claimStormSlot;
|
|
396
|
+
private readSlot;
|
|
397
|
+
/**
|
|
398
|
+
* Rename a file aside with dev+ino verification (§2.4 round 9/10): capture
|
|
399
|
+
* identity BEFORE the rename, verify the moved object AFTER — on mismatch
|
|
400
|
+
* (a peer's FRESH file created in the race) drop the claim and leave the
|
|
401
|
+
* mis-grabbed file for the age sweep. Returns true when we moved the exact
|
|
402
|
+
* observed object.
|
|
403
|
+
*/
|
|
404
|
+
private renameAsideVerified;
|
|
405
|
+
/** Liveness-gated witness + storm-slot + reclaim-temp sweep (§2.4). */
|
|
406
|
+
private sweepWitnesses;
|
|
407
|
+
/** Live (pid-alive) witness records — the route's `admittedOpen` field. */
|
|
408
|
+
readAdmittedOpen(): Array<{
|
|
409
|
+
pid: number;
|
|
410
|
+
acquiredAt: number;
|
|
411
|
+
}>;
|
|
412
|
+
/**
|
|
413
|
+
* Try to take the holders lock within LOCK_ACQUIRE_DEADLINE_MS (only the
|
|
414
|
+
* sub-millisecond critical section may spin). Returns the fd or null.
|
|
415
|
+
*/
|
|
416
|
+
private takeLockBounded;
|
|
417
|
+
/**
|
|
418
|
+
* Race-safe AGE-reclaim of a provably-wedged lock (§2.4): atomic rename of
|
|
419
|
+
* the observed lock + dev+ino verify. The test lane's ONLY lock reclaim —
|
|
420
|
+
* it never pid-probes the lock (the spawn lane's legacy reclaim is not
|
|
421
|
+
* inherited).
|
|
422
|
+
*/
|
|
423
|
+
private ageReclaimWedgedLock;
|
|
424
|
+
private lockFileAgeMs;
|
|
425
|
+
acquire(req: AcquireRequest): Promise<AcquireOutcome>;
|
|
426
|
+
private jitteredPoll;
|
|
427
|
+
/**
|
|
428
|
+
* Build the holder row for THIS process. The self fingerprint + pgid are
|
|
429
|
+
* passed in by acquire() — gathered OUTSIDE the lock (§2.4 round 9), never
|
|
430
|
+
* probed from inside the critical section.
|
|
431
|
+
*/
|
|
432
|
+
private buildRow;
|
|
433
|
+
private acquireFields;
|
|
434
|
+
private flushEvents;
|
|
435
|
+
private holderAges;
|
|
436
|
+
/** The 80%-of-TTL warning timer, armed in the holding root (§2.4). */
|
|
437
|
+
private armSelfTtlWarn;
|
|
438
|
+
/** Release the slot held under `id`. Never throws; bounded lock wait. */
|
|
439
|
+
release(id: string): void;
|
|
440
|
+
private static _pruneInFlight;
|
|
441
|
+
private static _lastPruneAt;
|
|
442
|
+
/**
|
|
443
|
+
* Force a full reclaim pass (the §2.6 recovery lever). Single-flight +
|
|
444
|
+
* rate-limited (one forced pass per 5s). Returns what was reclaimed.
|
|
445
|
+
*/
|
|
446
|
+
prune(opts?: {
|
|
447
|
+
source: string;
|
|
448
|
+
force?: boolean;
|
|
449
|
+
}): PruneReport & {
|
|
450
|
+
rateLimited?: boolean;
|
|
451
|
+
};
|
|
452
|
+
status(): {
|
|
453
|
+
cap: number;
|
|
454
|
+
targetedCap: number;
|
|
455
|
+
posture: TestPosture;
|
|
456
|
+
clampActive: boolean;
|
|
457
|
+
ttlSignalArmed: boolean;
|
|
458
|
+
liveHolders: Array<{
|
|
459
|
+
pid: number;
|
|
460
|
+
hostname: string;
|
|
461
|
+
acquiredAt: number;
|
|
462
|
+
ttlMs: number;
|
|
463
|
+
state: string;
|
|
464
|
+
}>;
|
|
465
|
+
targetedHolders: Array<{
|
|
466
|
+
pid: number;
|
|
467
|
+
hostname: string;
|
|
468
|
+
acquiredAt: number;
|
|
469
|
+
ttlMs: number;
|
|
470
|
+
state: string;
|
|
471
|
+
}>;
|
|
472
|
+
admittedOpen: Array<{
|
|
473
|
+
pid: number;
|
|
474
|
+
acquiredAt: number;
|
|
475
|
+
}>;
|
|
476
|
+
suite: {
|
|
477
|
+
available: number;
|
|
478
|
+
saturated: boolean;
|
|
479
|
+
};
|
|
480
|
+
targeted: {
|
|
481
|
+
available: number;
|
|
482
|
+
saturated: boolean;
|
|
483
|
+
};
|
|
484
|
+
recentEvents: TestRunnerLedgerEvent[];
|
|
485
|
+
skipHistogram: Record<string, number>;
|
|
486
|
+
};
|
|
487
|
+
}
|
|
488
|
+
/** macOS boot time via sysctl (best-effort; null when unobtainable). */
|
|
489
|
+
export declare function readMacBootTimeMs(): number | null;
|
|
490
|
+
export declare function getHostTestRunnerSemaphore(): HostTestRunnerSemaphore;
|
|
491
|
+
export declare function _resetHostTestRunnerSemaphoreForTest(): void;
|
|
492
|
+
//# sourceMappingURL=hostTestRunnerSemaphore.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hostTestRunnerSemaphore.d.ts","sourceRoot":"","sources":["../../src/core/hostTestRunnerSemaphore.ts"],"names":[],"mappings":"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"}
|