@a11ign/screenreader-fleet 0.1.0 → 0.3.0
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/capture-client.d.mts +0 -1
- package/dist/capture-client.mjs +144 -306
- package/dist/check-worker-code.d.mts +0 -1
- package/dist/check-worker-code.mjs +42 -141
- package/dist/cli-flags.d.mts +0 -1
- package/dist/cli-flags.mjs +33 -179
- package/dist/code-drift.d.mts +0 -1
- package/dist/command-line-census.d.mts +0 -1
- package/dist/compare-workers.d.mts +0 -1
- package/dist/compare-workers.mjs +383 -255
- package/dist/control-plane-isolation.d.mts +0 -1
- package/dist/deploy-worker.d.mts +0 -1
- package/dist/deploy-worker.mjs +101 -242
- package/dist/doctor.d.mts +0 -1
- package/dist/doctor.mjs +361 -809
- package/dist/fleet-consistency.d.mts +0 -1
- package/dist/fleet-consistency.mjs +155 -379
- package/dist/fleet-env.d.mts +0 -1
- package/dist/fleet-env.mjs +148 -438
- package/dist/fleet-scripts.d.mts +0 -1
- package/dist/git-safe-env.d.mts +0 -1
- package/dist/guest-run.d.mts +0 -1
- package/dist/host-address.d.mts +0 -1
- package/dist/host-address.mjs +19 -90
- package/dist/host-capacity.d.mts +0 -1
- package/dist/host-capacity.mjs +22 -136
- package/dist/host-metrics.d.mts +0 -1
- package/dist/index.d.ts +0 -1
- package/dist/index.mjs +231 -0
- package/dist/local-vm.d.ts +0 -1
- package/dist/measure-guard.d.mts +0 -1
- package/dist/normalise-fleet.d.mts +0 -1
- package/dist/npm-cli-executable.d.mts +0 -1
- package/dist/probe-outcome.d.mts +0 -1
- package/dist/probe-outcome.mjs +50 -96
- package/dist/protocol-guard.d.mts +0 -1
- package/dist/source-walk.d.mts +0 -1
- package/dist/src_fleet-scripts_mjs.mjs +16 -0
- package/dist/src_git-safe-env_mjs.mjs +9 -0
- package/dist/src_utm-deprecated_mjs.mjs +4 -0
- package/dist/transient-fault.d.mts +0 -1
- package/dist/transient-fault.mjs +21 -81
- package/dist/utm-deprecated.d.mts +0 -1
- package/dist/worker-code-check.d.mts +0 -1
- package/dist/worker-code-check.mjs +127 -76
- package/dist/worker-health.d.mts +0 -1
- package/dist/worker-health.mjs +16 -61
- package/dist/worker-http.d.mts +0 -1
- package/dist/worker-http.mjs +42 -234
- package/dist/worker-stats.d.mts +0 -1
- package/package.json +12 -5
- package/dist/capture-client.d.mts.map +0 -1
- package/dist/capture-client.mjs.map +0 -1
- package/dist/check-worker-code.d.mts.map +0 -1
- package/dist/check-worker-code.mjs.map +0 -1
- package/dist/cli-flags.d.mts.map +0 -1
- package/dist/cli-flags.mjs.map +0 -1
- package/dist/code-drift.d.mts.map +0 -1
- package/dist/code-drift.mjs +0 -284
- package/dist/code-drift.mjs.map +0 -1
- package/dist/command-line-census.d.mts.map +0 -1
- package/dist/command-line-census.mjs +0 -96
- package/dist/command-line-census.mjs.map +0 -1
- package/dist/compare-workers.d.mts.map +0 -1
- package/dist/compare-workers.mjs.map +0 -1
- package/dist/control-plane-isolation.d.mts.map +0 -1
- package/dist/control-plane-isolation.mjs +0 -67
- package/dist/control-plane-isolation.mjs.map +0 -1
- package/dist/deploy-worker.d.mts.map +0 -1
- package/dist/deploy-worker.mjs.map +0 -1
- package/dist/doctor.d.mts.map +0 -1
- package/dist/doctor.mjs.map +0 -1
- package/dist/fleet-consistency.d.mts.map +0 -1
- package/dist/fleet-consistency.mjs.map +0 -1
- package/dist/fleet-env.d.mts.map +0 -1
- package/dist/fleet-env.mjs.map +0 -1
- package/dist/fleet-scripts.d.mts.map +0 -1
- package/dist/fleet-scripts.mjs +0 -41
- package/dist/fleet-scripts.mjs.map +0 -1
- package/dist/git-safe-env.d.mts.map +0 -1
- package/dist/git-safe-env.mjs +0 -44
- package/dist/git-safe-env.mjs.map +0 -1
- package/dist/guest-run.d.mts.map +0 -1
- package/dist/guest-run.mjs +0 -164
- package/dist/guest-run.mjs.map +0 -1
- package/dist/host-address.d.mts.map +0 -1
- package/dist/host-address.mjs.map +0 -1
- package/dist/host-capacity.d.mts.map +0 -1
- package/dist/host-capacity.mjs.map +0 -1
- package/dist/host-metrics.d.mts.map +0 -1
- package/dist/host-metrics.mjs +0 -201
- package/dist/host-metrics.mjs.map +0 -1
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js +0 -25
- package/dist/index.js.map +0 -1
- package/dist/local-vm.d.ts.map +0 -1
- package/dist/local-vm.js +0 -360
- package/dist/local-vm.js.map +0 -1
- package/dist/measure-guard.d.mts.map +0 -1
- package/dist/measure-guard.mjs +0 -73
- package/dist/measure-guard.mjs.map +0 -1
- package/dist/normalise-fleet.d.mts.map +0 -1
- package/dist/normalise-fleet.mjs +0 -76
- package/dist/normalise-fleet.mjs.map +0 -1
- package/dist/npm-cli-executable.d.mts.map +0 -1
- package/dist/npm-cli-executable.mjs +0 -159
- package/dist/npm-cli-executable.mjs.map +0 -1
- package/dist/probe-outcome.d.mts.map +0 -1
- package/dist/probe-outcome.mjs.map +0 -1
- package/dist/protocol-guard.d.mts.map +0 -1
- package/dist/protocol-guard.mjs +0 -121
- package/dist/protocol-guard.mjs.map +0 -1
- package/dist/source-walk.d.mts.map +0 -1
- package/dist/source-walk.mjs +0 -56
- package/dist/source-walk.mjs.map +0 -1
- package/dist/transient-fault.d.mts.map +0 -1
- package/dist/transient-fault.mjs.map +0 -1
- package/dist/utm-deprecated.d.mts.map +0 -1
- package/dist/utm-deprecated.mjs +0 -23
- package/dist/utm-deprecated.mjs.map +0 -1
- package/dist/worker-code-check.d.mts.map +0 -1
- package/dist/worker-code-check.mjs.map +0 -1
- package/dist/worker-health.d.mts.map +0 -1
- package/dist/worker-health.mjs.map +0 -1
- package/dist/worker-http.d.mts.map +0 -1
- package/dist/worker-http.mjs.map +0 -1
- package/dist/worker-stats.d.mts.map +0 -1
- package/dist/worker-stats.mjs +0 -143
- package/dist/worker-stats.mjs.map +0 -1
|
@@ -1,159 +0,0 @@
|
|
|
1
|
-
// A DELIBERATE, DISCLOSED DUPLICATE of `scripts/npm-cli-executable.mjs` at the repo root.
|
|
2
|
-
//
|
|
3
|
-
// #492: never spawn `npx`/`npm` at all -- resolve npm's own CLI script and run it through
|
|
4
|
-
// `process.execPath`, since Node's CVE-2024-27980 fix permanently made `spawn`/`spawnSync`/`execFileSync`
|
|
5
|
-
// refuse to launch a `.bat`/`.cmd` file directly without `shell` (and `ceo`'s ruling is no `shell: true`,
|
|
6
|
-
// anywhere). See `scripts/npm-cli-executable.mjs`'s own header for the full incident and the two-layout
|
|
7
|
-
// resolution this file duplicates behaviourally.
|
|
8
|
-
//
|
|
9
|
-
// This package publishes `check-worker-code.mjs` and `deploy-worker.mjs` as `bin` entries
|
|
10
|
-
// (`package.json`), so every file they import -- `doctor.mjs` among them -- ships in the published
|
|
11
|
-
// tarball and can only import from INSIDE `@a11ign/screenreader-fleet`. The repo-root `scripts/` directory
|
|
12
|
-
// does not exist once this package is installed from npm, so importing it here would work in this
|
|
13
|
-
// monorepo and break for every real consumer. That is the entire reason this file exists rather than a
|
|
14
|
-
// relative import to the root: not stylistic preference, a publish-boundary constraint (see ADR 0004,
|
|
15
|
-
// and `git-safe-env.mjs`'s own header beside this file for the identical shape).
|
|
16
|
-
//
|
|
17
|
-
// #2890: `pnpmCliInvocation` (#2301) and the two helpers it uses are copied verbatim, because `doctor.mjs`
|
|
18
|
-
// spawns pnpm now, not npm; the npm half stays so the pin below keeps comparing whole files.
|
|
19
|
-
//
|
|
20
|
-
// Kept behaviourally identical to `scripts/npm-cli-executable.mjs` and pinned equal to it by
|
|
21
|
-
// `npm-cli-executable.test.ts`, which is this repo's own remedy #3 ("pin them equal with a test") for a
|
|
22
|
-
// fact that CANNOT be stated once because the two copies cross a package-publishing boundary neither can
|
|
23
|
-
// import through.
|
|
24
|
-
import { existsSync, realpathSync } from "node:fs";
|
|
25
|
-
import { join, dirname, delimiter } from "node:path";
|
|
26
|
-
/**
|
|
27
|
-
* @param {"npx" | "npm"} name
|
|
28
|
-
* @returns {string}
|
|
29
|
-
*/
|
|
30
|
-
function cliScriptName(name) {
|
|
31
|
-
return name === "npx" ? "npx-cli.js" : "npm-cli.js";
|
|
32
|
-
}
|
|
33
|
-
/**
|
|
34
|
-
* @param {"npx" | "npm"} name
|
|
35
|
-
* @returns {string[]}
|
|
36
|
-
*/
|
|
37
|
-
export function npmCliScriptCandidates(name) {
|
|
38
|
-
const script = cliScriptName(name);
|
|
39
|
-
const nodeDir = dirname(process.execPath);
|
|
40
|
-
const fixed = [
|
|
41
|
-
join(nodeDir, "node_modules", "npm", "bin", script),
|
|
42
|
-
join(nodeDir, "..", "lib", "node_modules", "npm", "bin", script),
|
|
43
|
-
];
|
|
44
|
-
const fromPath = pathDerivedCandidate(name, script);
|
|
45
|
-
return fromPath === null ? fixed : [...fixed, fromPath];
|
|
46
|
-
}
|
|
47
|
-
/**
|
|
48
|
-
* #1268: THE THIRD LAYOUT. Debian and Ubuntu package npm at `/usr/share/nodejs/npm/bin/`, nowhere near
|
|
49
|
-
* `node`, and put `/usr/bin/npm` and `/usr/bin/npx` on PATH as symlinks straight to the CLI scripts. So
|
|
50
|
-
* the executable on PATH, symlinks resolved, IS the script (Debian) or sits in the script's directory
|
|
51
|
-
* (the upstream tarball's `bin/npx` wrapper). Tried LAST so the two fixed layouts keep their order on
|
|
52
|
-
* the platforms they were measured on; `null` when nothing named `name` is on PATH, so the candidate
|
|
53
|
-
* list never carries a path that cannot exist. Found by the first `npm ci` on the agents host.
|
|
54
|
-
* @param {"npx" | "npm"} name
|
|
55
|
-
* @param {string} script
|
|
56
|
-
* @returns {string | null}
|
|
57
|
-
*/
|
|
58
|
-
function pathDerivedCandidate(name, script) {
|
|
59
|
-
for (const dir of (process.env.PATH ?? "").split(delimiter)) {
|
|
60
|
-
if (dir === "")
|
|
61
|
-
continue;
|
|
62
|
-
const executable = join(dir, name);
|
|
63
|
-
if (!existsSync(executable))
|
|
64
|
-
continue;
|
|
65
|
-
const real = realpathSync(executable);
|
|
66
|
-
return real.endsWith(script) ? real : join(dirname(real), script);
|
|
67
|
-
}
|
|
68
|
-
return null;
|
|
69
|
-
}
|
|
70
|
-
/**
|
|
71
|
-
* @param {"npx" | "npm"} name
|
|
72
|
-
* @returns {string}
|
|
73
|
-
*/
|
|
74
|
-
export function resolveNpmCliScript(name) {
|
|
75
|
-
const candidates = npmCliScriptCandidates(name);
|
|
76
|
-
const found = candidates.find((path) => existsSync(path));
|
|
77
|
-
if (!found) {
|
|
78
|
-
throw new Error(`could not find npm's own ${cliScriptName(name)} beside this Node install -- tried:\n`
|
|
79
|
-
+ candidates.map((path) => ` ${path}`).join("\n"));
|
|
80
|
-
}
|
|
81
|
-
return found;
|
|
82
|
-
}
|
|
83
|
-
/**
|
|
84
|
-
* @param {"npx" | "npm"} name
|
|
85
|
-
* @param {string[]} args
|
|
86
|
-
* @returns {{ command: string, args: string[] }}
|
|
87
|
-
*/
|
|
88
|
-
export function npmCliInvocation(name, args) {
|
|
89
|
-
return { command: process.execPath, args: [resolveNpmCliScript(name), ...args] };
|
|
90
|
-
}
|
|
91
|
-
/**
|
|
92
|
-
* #2301: `pnpm <args>` WITHOUT SPAWNING A `.cmd`, for the same reason `npmCliInvocation` exists, and with the
|
|
93
|
-
* added problem that pnpm is not always ON `PATH` at all: this host and the Windows workers run it as
|
|
94
|
-
* `corepack pnpm` (`packageManager` in the root manifest pins the version), while a CI runner has the
|
|
95
|
-
* shim `pnpm/action-setup` puts there. Three ways to reach it, tried in this order, each ending in an argv
|
|
96
|
-
* that `execFileSync` can run with no shell:
|
|
97
|
-
*
|
|
98
|
-
* 1. `npm_execpath`, when this process was itself started BY pnpm (`pnpm run ...`, `pnpm exec ...`): pnpm
|
|
99
|
-
* says which script it is, so nothing is searched for and no other pnpm can be picked up by mistake.
|
|
100
|
-
* 2. a `pnpm` on `PATH`: the executable itself on POSIX; on Windows the shim is `pnpm.cmd`, so the
|
|
101
|
-
* `pnpm.cjs` beside it is run through `process.execPath` instead.
|
|
102
|
-
* 3. `corepack` on `PATH`, the same way: `corepack pnpm` on POSIX, `corepack.js` beside `node.exe`
|
|
103
|
-
* through `process.execPath` on Windows.
|
|
104
|
-
*
|
|
105
|
-
* Throws NAMING WHAT WAS TRIED, for the reason `resolveNpmCliScript` does.
|
|
106
|
-
* @param {string[]} args
|
|
107
|
-
* @returns {{ command: string, args: string[] }}
|
|
108
|
-
*/
|
|
109
|
-
export function pnpmCliInvocation(args) {
|
|
110
|
-
const fromParent = process.env.npm_execpath ?? "";
|
|
111
|
-
if (/pnpm\.c?js$/.test(fromParent) && existsSync(fromParent)) {
|
|
112
|
-
return { command: process.execPath, args: [fromParent, ...args] };
|
|
113
|
-
}
|
|
114
|
-
const shim = onPath("pnpm");
|
|
115
|
-
if (shim !== null)
|
|
116
|
-
return shimInvocation(shim, join("node_modules", "pnpm", "bin", "pnpm.cjs"), args);
|
|
117
|
-
const corepack = onPath("corepack");
|
|
118
|
-
if (corepack !== null) {
|
|
119
|
-
return shimInvocation(corepack, join("node_modules", "corepack", "dist", "corepack.js"), ["pnpm", ...args]);
|
|
120
|
-
}
|
|
121
|
-
throw new Error("could not find pnpm: `npm_execpath` is not a pnpm script, and neither `pnpm` nor `corepack` "
|
|
122
|
-
+ "is on PATH. `packageManager` in the root package.json names the version -- `corepack enable` or "
|
|
123
|
-
+ "`pnpm/action-setup` provides it.");
|
|
124
|
-
}
|
|
125
|
-
/**
|
|
126
|
-
* The first executable called `name` on PATH, or `null`. On Windows the executable is `name.cmd`, which
|
|
127
|
-
* `existsSync` finds only when the extension is tried, so both spellings are.
|
|
128
|
-
* @param {string} name
|
|
129
|
-
* @returns {string | null}
|
|
130
|
-
*/
|
|
131
|
-
function onPath(name) {
|
|
132
|
-
for (const dir of (process.env.PATH ?? "").split(delimiter)) {
|
|
133
|
-
if (dir === "")
|
|
134
|
-
continue;
|
|
135
|
-
for (const candidate of [join(dir, name), join(dir, `${name}.cmd`)]) {
|
|
136
|
-
if (existsSync(candidate))
|
|
137
|
-
return candidate;
|
|
138
|
-
}
|
|
139
|
-
}
|
|
140
|
-
return null;
|
|
141
|
-
}
|
|
142
|
-
/**
|
|
143
|
-
* A POSIX shim is spawned as it is; a `.cmd` shim is never spawned (CVE-2024-27980, see the header), so the
|
|
144
|
-
* package script it wraps is run through `process.execPath`, found beside the shim (the layout `pnpm add -g`
|
|
145
|
-
* and `pnpm/action-setup` share) or beside `node` (corepack's).
|
|
146
|
-
* @param {string} shim
|
|
147
|
-
* @param {string} script the wrapped script, relative to the shim's directory or to `node`'s
|
|
148
|
-
* @param {string[]} args
|
|
149
|
-
* @returns {{ command: string, args: string[] }}
|
|
150
|
-
*/
|
|
151
|
-
function shimInvocation(shim, script, args) {
|
|
152
|
-
if (!shim.endsWith(".cmd"))
|
|
153
|
-
return { command: shim, args };
|
|
154
|
-
const found = [join(dirname(shim), script), join(dirname(process.execPath), script)].find((path) => existsSync(path));
|
|
155
|
-
if (found === undefined)
|
|
156
|
-
throw new Error(`${shim} is a .cmd shim and its script ${script} is not beside it or beside node`);
|
|
157
|
-
return { command: process.execPath, args: [found, ...args] };
|
|
158
|
-
}
|
|
159
|
-
//# sourceMappingURL=npm-cli-executable.mjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"npm-cli-executable.mjs","sourceRoot":"","sources":["../src/npm-cli-executable.mjs"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"probe-outcome.d.mts","sourceRoot":"","sources":["../src/probe-outcome.mjs"],"names":[],"mappings":"AAuDA;;;;GAIG;AACH,oCAJW,MAAM,2BACN;IAAE,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,YAAY,CAAA;CAAE,GAC5C,OAAO,CAAC,KAAK,CAAC,CAmB1B;AAMD;;;;;;;GAOG;AACH,qCAJW,KAAK,yBACL;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,GACpC,MAAM,CAalB;AArED,iDAAiD;AAEjD;;;;;;;;;;;;;;;;;GAiBG;AACH,sCAAuC,KAAM,CAAC;AA0B9C,qGAAqG;AACrG,+BAC6E;;;;;;;;;;;;;;;;;;;;;;;;;;oBAvDhE;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,GAAG,CAAA;CAAE,GAAG;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,GAAG,CAAA;CAAE,GAC1E;IAAE,OAAO,EAAE,WAAW,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,GAAG,CAAA;CAAE,GACrD;IAAE,OAAO,EAAE,SAAS,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GACvC;IAAE,OAAO,EAAE,WAAW,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,OAAO,CAAA;CAAE;2BAIrD,OAAO,WAAW;4BAFJ,mBAAmB"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"probe-outcome.mjs","sourceRoot":"","sources":["../src/probe-outcome.mjs"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"protocol-guard.d.mts","sourceRoot":"","sources":["../src/protocol-guard.mjs"],"names":[],"mappings":"AAqDA;;;;;;GAMG;AACH,oEAJW;IAAE,KAAK,EAAE,MAAM,GAAC,MAAM,GAAC,IAAI,CAAC;IAAC,MAAM,EAAE;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,GAAC,MAAM,GAAC,IAAI,CAAA;KAAC,EAAE,CAAC;IACpF,OAAO,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,GACnC;IAAE,MAAM,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAmChD;AAED;;;;;;;;GAQG;AACH,sCAHW,MAAM,EAAE,GACN,OAAO,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,GAAC,MAAM,GAAC,IAAI,CAAA;CAAC,EAAE,CAAC,CAqBrE;AA9ED,oCAG6G"}
|
package/dist/protocol-guard.mjs
DELETED
|
@@ -1,121 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* REFUSE A DEPLOY THAT WOULD SILENTLY INVALIDATE THE CORPUS.
|
|
3
|
-
*
|
|
4
|
-
* `CAPTURE_PROTOCOL_VERSION` is a capture-cache key. Shipping a change to it invalidates every cached
|
|
5
|
-
* capture — `RECAPTURE_COST` below says how many a full re-run produces — and that is sometimes exactly
|
|
6
|
-
* what you want. What must never happen is it going out without somebody deciding.
|
|
7
|
-
*
|
|
8
|
-
* **The guard existed and reached only the DEPRECATED path.** `deploy-worker.mjs` refuses without
|
|
9
|
-
* `--allow-protocol-change`, and that script is `utmctl file push` against a VM UUID: it cannot reach a
|
|
10
|
-
* bare-metal worker and fails immediately off macOS. Every box in `inventory.yml` is bare metal and
|
|
11
|
-
* deploys through `fleet:deploy`, which had no such check. So the only live deploy path was the unguarded
|
|
12
|
-
* one — this repo's signature defect (a remedy that reaches one call site when the behaviour reaches
|
|
13
|
-
* several) with the remedy on the path nobody uses.
|
|
14
|
-
*
|
|
15
|
-
* **This asks the FLEET, not git, and that is the stronger question.** The UTM guard compares the working
|
|
16
|
-
* tree against HEAD, which answers "did I commit the bump". Useful, and not the thing at risk: what
|
|
17
|
-
* decides whether the cache survives is whether the version about to ship differs from the one the boxes
|
|
18
|
-
* are *already serving*, because that is the version every cached capture was stamped under. Reading it
|
|
19
|
-
* from `/health` also means the check shares no failure mode with the action — the deploy goes over SSH,
|
|
20
|
-
* the verification over HTTP — which is this repo's rule after a hash-check that returned EMPTY whenever
|
|
21
|
-
* the channel it used was broken, and read as a flaky tool rather than a failed deploy.
|
|
22
|
-
*/
|
|
23
|
-
import { requestJson } from "./worker-http.mjs";
|
|
24
|
-
/**
|
|
25
|
-
* WHAT A FULL RECAPTURE COSTS, in the words the two deploy refusals print -- derived here and shown, not
|
|
26
|
-
* retyped (#2244). The refusals printed 2,122, a count from 2026-07-26; on 2026-09-23 the cache held 4,500
|
|
27
|
-
* captures across 1,715 cases.
|
|
28
|
-
*
|
|
29
|
-
* **The population is what a full RE-RUN produces, not what the cache holds.** A run captures each case
|
|
30
|
-
* `manifest.json` lists, twice; the cache holds 4,500 captures because it also holds cases the manifest no
|
|
31
|
-
* longer lists, and a protocol bump does not make those cost anything, since nothing will ask for them
|
|
32
|
-
* again. So 1,715 x 2 = 3,430 is the price an operator is deciding on, and 4,500 is not.
|
|
33
|
-
*
|
|
34
|
-
* The inputs are `orchestrator`'s reading on the corpus host, 2026-09-23T14:26Z (#1561 comment
|
|
35
|
-
* 5796655391), and are not re-measured here. This file cannot read the manifest -- the control host that
|
|
36
|
-
* runs the guard does not have the corpus -- so the reading is dated in the message itself, where a stale
|
|
37
|
-
* one is visible to the person who acts on it.
|
|
38
|
-
*
|
|
39
|
-
* **NO WALL-CLOCK.** This used to say "about four hours of fleet time". That was a rate times the 1,061-case
|
|
40
|
-
* corpus of 2026-07-26 on a fleet of a size nothing in this file can read, and #2155 dropped its own estimates for the same
|
|
41
|
-
* reason. The rate is what `npm run fleet:status` can show; the product is somebody's to time.
|
|
42
|
-
*/
|
|
43
|
-
const MANIFEST_CASES = 1715;
|
|
44
|
-
const CAPTURES_PER_CASE = 2;
|
|
45
|
-
export const RECAPTURE_COST = `${(MANIFEST_CASES * CAPTURES_PER_CASE).toLocaleString("en-US")} captures `
|
|
46
|
-
+ `(${MANIFEST_CASES.toLocaleString("en-US")} cases in manifest.json x ${CAPTURES_PER_CASE}, read `
|
|
47
|
-
+ "2026-09-23T14:26Z; how long that takes depends on the fleet, so time a run rather than trust a figure)";
|
|
48
|
-
/** How long a worker gets to answer `/health` before it counts as unreachable. */
|
|
49
|
-
const HEALTH_TIMEOUT_MS = 5_000;
|
|
50
|
-
/**
|
|
51
|
-
* Decide whether a deploy may proceed.
|
|
52
|
-
*
|
|
53
|
-
* @param {{ local: number|string|null, served: {worker: string, protocol: number|string|null}[],
|
|
54
|
-
* allowed: boolean, source?: string }} input
|
|
55
|
-
* @returns {{ refuse: boolean, message: string }}
|
|
56
|
-
*/
|
|
57
|
-
export function protocolVerdict({ local, served, allowed, source }) {
|
|
58
|
-
if (local === null || local === undefined) {
|
|
59
|
-
// NAMES THE FILE IT WAS GIVEN, never a hardcoded one. This message said "from capture-core.mjs" while
|
|
60
|
-
// the caller had long since been pointed elsewhere, so the one sentence a broken guard prints sent the
|
|
61
|
-
// reader to a file that was not the problem.
|
|
62
|
-
return { refuse: true, message: `cannot read CAPTURE_PROTOCOL_VERSION from ${source ?? "the worker "
|
|
63
|
-
+ "source"}, so this deploy cannot say whether it would invalidate the corpus. That is a broken `
|
|
64
|
-
+ "guard, not a clean one." };
|
|
65
|
-
}
|
|
66
|
-
const reachable = served.filter((s) => s.protocol !== null && s.protocol !== undefined);
|
|
67
|
-
// EXAMINED NOTHING IS NOT AGREEMENT. If no worker answered, the guard has no opinion — and a guard with
|
|
68
|
-
// no opinion that reports success is the `evidence:check` defect: it exited 0 saying "evidence unchanged"
|
|
69
|
-
// having compared 2 of 48, because its own guard covered only `compared === 0` and called that "the
|
|
70
|
-
// extreme case rather than a different one". Nothing here is the extreme case of that; it IS that.
|
|
71
|
-
if (reachable.length === 0) {
|
|
72
|
-
return { refuse: !allowed, message: "no worker answered /health, so nothing could say which "
|
|
73
|
-
+ `CAPTURE_PROTOCOL_VERSION the fleet is serving. Local is ${local}. Deploying blind could invalidate `
|
|
74
|
-
+ "every cached capture. Check `npm run fleet:status`, or pass --allow-protocol-change if you mean it." };
|
|
75
|
-
}
|
|
76
|
-
const differing = reachable.filter((s) => String(s.protocol) !== String(local));
|
|
77
|
-
if (differing.length === 0)
|
|
78
|
-
return { refuse: false, message: "" };
|
|
79
|
-
const detail = differing.map((s) => ` ${s.worker} serves ${s.protocol}`).join("\n");
|
|
80
|
-
if (allowed) {
|
|
81
|
-
return { refuse: false, message: `\n Deploying CAPTURE_PROTOCOL_VERSION ${local} as requested.\n${detail}\n`
|
|
82
|
-
+ " Every cached capture becomes invalid and the next run recaptures all of them.\n" };
|
|
83
|
-
}
|
|
84
|
-
return { refuse: true, message: `\nREFUSING TO DEPLOY: this checkout has CAPTURE_PROTOCOL_VERSION = ${local}, and the fleet does not.\n\n`
|
|
85
|
-
+ `${detail}\n\n`
|
|
86
|
-
+ "That value is a capture-cache key, so deploying it invalidates every cached capture and forces a\n"
|
|
87
|
-
+ `full recapture: ${RECAPTURE_COST}.\n\n`
|
|
88
|
-
+ " If that is what you want: npm run fleet:deploy -- --allow-protocol-change\n"
|
|
89
|
-
+ " If it is not: check what changed in packages/nvda-worker/src/capture-core.mjs\n" };
|
|
90
|
-
}
|
|
91
|
-
/**
|
|
92
|
-
* Ask each worker which protocol it serves.
|
|
93
|
-
*
|
|
94
|
-
* A worker that cannot be reached reports `null` rather than being dropped, so the caller can tell "the
|
|
95
|
-
* fleet agrees" from "we could not ask" — the distinction the verdict above turns on.
|
|
96
|
-
*
|
|
97
|
-
* @param {string[]} urls
|
|
98
|
-
* @returns {Promise<{worker: string, protocol: number|string|null}[]>}
|
|
99
|
-
*/
|
|
100
|
-
export async function servedProtocols(urls) {
|
|
101
|
-
return Promise.all(urls.map(async (url) => {
|
|
102
|
-
try {
|
|
103
|
-
// `requestJson`, not `fetch` -- the same worker JSON API this repo's own audit found duplicated with
|
|
104
|
-
// its own timeout mechanism at several other call sites (worker-http.mjs's own header), and this one
|
|
105
|
-
// is on the deploy-guard path: a swallowed truncation here would misreport a fleet mid-protocol-bump
|
|
106
|
-
// as unreachable rather than as differing, silently weakening the one check standing between a
|
|
107
|
-
// deploy and an unannounced cache wipe.
|
|
108
|
-
const response = await requestJson(`${url.replace(/\/$/, "")}/health`, { timeoutMs: HEALTH_TIMEOUT_MS });
|
|
109
|
-
// `?? null` and never `?? 0`: a worker predating the field has no opinion, and reading absence as a
|
|
110
|
-
// number is the defect this project pays for most often. `response.json` is `undefined` rather than
|
|
111
|
-
// a throw on unparseable JSON (requestJson's own contract), which `?.` already treats as "no opinion".
|
|
112
|
-
return { worker: url, protocol: response.json?.environment?.captureProtocol ?? null };
|
|
113
|
-
}
|
|
114
|
-
catch {
|
|
115
|
-
// Deliberately not rethrown: unreachable is a VERDICT here, handled by `protocolVerdict`, not an
|
|
116
|
-
// error. Swallowing it would be wrong only if nothing downstream distinguished it, and something does.
|
|
117
|
-
return { worker: url, protocol: null };
|
|
118
|
-
}
|
|
119
|
-
}));
|
|
120
|
-
}
|
|
121
|
-
//# sourceMappingURL=protocol-guard.mjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"protocol-guard.mjs","sourceRoot":"","sources":["../src/protocol-guard.mjs"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"source-walk.d.mts","sourceRoot":"","sources":["../src/source-walk.mjs"],"names":[],"mappings":"AAiCA;;;;;GAKG;AACH,uCAHW;IAAE,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,GACf,KAAK,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAkBnC;AA3BD,8FAA8F;AAC9F,8BAAkF"}
|
package/dist/source-walk.mjs
DELETED
|
@@ -1,56 +0,0 @@
|
|
|
1
|
-
// @ts-check
|
|
2
|
-
/**
|
|
3
|
-
* Every source file under `packages/`, so a guard can be written over what EXISTS rather than over a list.
|
|
4
|
-
*
|
|
5
|
-
* This repo's most expensive recurring shape is a check that only examines the places somebody already
|
|
6
|
-
* thought of. Two instances are recorded in `budget-ladder.test.ts` alone: the worker-file list that let a
|
|
7
|
-
* file deploy invisibly, and the ladder guard that read ONE hardcoded path and therefore could not see
|
|
8
|
-
* `capture-real-pages.mjs` declaring 300 s against a 520 s hard timeout — inverted, on the client that
|
|
9
|
-
* needed it most.
|
|
10
|
-
*
|
|
11
|
-
* Extracted here because there were about to be TWO copies of the walk: one for capture budgets and one for
|
|
12
|
-
* `--worker` validation. A duplicated discovery is a discovery that drifts, which is the same defect one
|
|
13
|
-
* level up.
|
|
14
|
-
*
|
|
15
|
-
* `dist` is excluded because it is build output of the very files being checked, so including it
|
|
16
|
-
* double-counts and reports a stale copy as a violation after the source has been fixed. Test files are
|
|
17
|
-
* excluded because a guard asserting on other guards' source is noise.
|
|
18
|
-
*
|
|
19
|
-
* Dot-directories are skipped, as `.gitignore` would, because this walk reads the FILESYSTEM and a test may
|
|
20
|
-
* plant a transient one inside the repository (`corpus-backup.test.ts` does, as `.corpus-backup-mutation-*`,
|
|
21
|
-
* so a copied script can resolve `node_modules`). Listing it and reading the file after the other test has
|
|
22
|
-
* removed it failed `pnpm run verify` with ENOENT (#3337, after #2876 and #1919). No tracked source lives in
|
|
23
|
-
* one, and a dot-directory is not a place a guard's population should come from.
|
|
24
|
-
*/
|
|
25
|
-
import { readFileSync, readdirSync } from "node:fs";
|
|
26
|
-
import { join, dirname } from "node:path";
|
|
27
|
-
import { fileURLToPath } from "node:url";
|
|
28
|
-
/** The `packages/` directory, resolved from this module rather than from the caller's cwd. */
|
|
29
|
-
export const PACKAGES = join(dirname(fileURLToPath(import.meta.url)), "..", "..");
|
|
30
|
-
const SKIPPED_DIRECTORY = /^(node_modules|dist|\..*)$/;
|
|
31
|
-
/**
|
|
32
|
-
* Every non-test source file under `packages/`, as `[relativePath, source]`.
|
|
33
|
-
*
|
|
34
|
-
* @param {{ root?: string }} [options]
|
|
35
|
-
* @returns {Array<[string, string]>}
|
|
36
|
-
*/
|
|
37
|
-
export function sourceFiles({ root = PACKAGES } = {}) {
|
|
38
|
-
/** @type {Array<[string, string]>} */
|
|
39
|
-
const found = [];
|
|
40
|
-
/** @param {string} dir */
|
|
41
|
-
const walk = (dir) => {
|
|
42
|
-
for (const entry of readdirSync(dir, { withFileTypes: true })) {
|
|
43
|
-
const path = join(dir, entry.name);
|
|
44
|
-
if (entry.isDirectory()) {
|
|
45
|
-
if (!SKIPPED_DIRECTORY.test(entry.name))
|
|
46
|
-
walk(path);
|
|
47
|
-
}
|
|
48
|
-
else if (/\.(mjs|ts)$/.test(entry.name) && !entry.name.includes(".test.")) {
|
|
49
|
-
found.push([path.slice(root.length + 1), readFileSync(path, "utf8")]);
|
|
50
|
-
}
|
|
51
|
-
}
|
|
52
|
-
};
|
|
53
|
-
walk(root);
|
|
54
|
-
return found;
|
|
55
|
-
}
|
|
56
|
-
//# sourceMappingURL=source-walk.mjs.map
|
package/dist/source-walk.mjs.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"source-walk.mjs","sourceRoot":"","sources":["../src/source-walk.mjs"],"names":[],"mappings":"AAAA,YAAY;AACZ;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AACpD,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,8FAA8F;AAC9F,MAAM,CAAC,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;AAElF,MAAM,iBAAiB,GAAG,4BAA4B,CAAC;AAEvD;;;;;GAKG;AACH,MAAM,UAAU,WAAW,CAAC,EAAE,IAAI,GAAG,QAAQ,EAAE,GAAG,EAAE;IAClD,sCAAsC;IACtC,MAAM,KAAK,GAAG,EAAE,CAAC;IACjB,0BAA0B;IAC1B,MAAM,IAAI,GAAG,CAAC,GAAG,EAAE,EAAE;QACnB,KAAK,MAAM,KAAK,IAAI,WAAW,CAAC,GAAG,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;YAC9D,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;YACnC,IAAI,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;gBACxB,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;oBAAE,IAAI,CAAC,IAAI,CAAC,CAAC;YACtD,CAAC;iBAAM,IAAI,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAC5E,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,EAAE,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC;YACxE,CAAC;QACH,CAAC;IACH,CAAC,CAAC;IACF,IAAI,CAAC,IAAI,CAAC,CAAC;IACX,OAAO,KAAK,CAAC;AACf,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"transient-fault.d.mts","sourceRoot":"","sources":["../src/transient-fault.mjs"],"names":[],"mappings":"AAsEA;;;GAGG;AACH,mCAHW,OAAO,GACL,OAAO,CAanB"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"transient-fault.mjs","sourceRoot":"","sources":["../src/transient-fault.mjs"],"names":[],"mappings":"AAAA,YAAY;AACZ;;;;;;;;;;;;;;GAcG;AACH,yGAAyG;AACzG,0GAA0G;AAC1G,0GAA0G;AAC1G,gGAAgG;AAChG,OAAO,EAAE,KAAK,EAAE,MAAM,4CAA4C,CAAC;AAEnE;;;;;;;;;;GAUG;AACH,MAAM,SAAS,GAAG,IAAI,MAAM,CAAC;IAC3B,cAAc,EAAE,cAAc,EAAE,YAAY,EAAE,gBAAgB,EAAE,WAAW,EAAE,SAAS;IACtF,0CAA0C;IAC1C,0BAA0B;IAC1B,cAAc;CACf,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC;AAElB;;;;;;GAMG;AACH,MAAM,gBAAgB,GAAG,IAAI,GAAG,CAAC,CAAC,KAAK,CAAC,kBAAkB,EAAE,KAAK,CAAC,0BAA0B,CAAC,CAAC,CAAC;AAE/F;;;;;;;;;;;;;;;GAeG;AACH,MAAM,uBAAuB,GAAG,IAAI,GAAG,CAAC;IACtC,cAAc,EAAE,YAAY,EAAE,cAAc,EAAE,aAAa,EAAE,UAAU;IACvE,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,yBAAyB,EAAE,sBAAsB;CACrF,CAAC,CAAC;AAEH;;;GAGG;AACH,MAAM,UAAU,WAAW,CAAC,KAAK;IAC/B,MAAM,OAAO,GAAG,6EAA6E,CAAC,CAAC,KAAK,CAAC,CAAC;IACtG,gGAAgG;IAChG,6FAA6F;IAC7F,kEAAkE;IAClE,IAAI,gBAAgB,CAAC,GAAG,CAAC,OAAO,EAAE,IAAI,IAAI,EAAE,CAAC;QAAE,OAAO,IAAI,CAAC;IAC3D,IAAI,uBAAuB,CAAC,GAAG,CAAC,OAAO,EAAE,IAAI,IAAI,EAAE,CAAC;QAAE,OAAO,IAAI,CAAC;IAClE,sGAAsG;IACtG,4FAA4F;IAC5F,IAAI,uBAAuB,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,EAAE,IAAI,IAAI,EAAE,CAAC;QAAE,OAAO,IAAI,CAAC;IACzE,OAAO,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,OAAO,IAAI,KAAK,IAAI,EAAE,CAAC,CAAC,CAAC;AACjE,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"utm-deprecated.d.mts","sourceRoot":"","sources":["../src/utm-deprecated.mjs"],"names":[],"mappings":"AAcA;;;GAGG;AACH,wCAHW,MAAM,QAShB"}
|
package/dist/utm-deprecated.mjs
DELETED
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
// @ts-check
|
|
2
|
-
// One deprecation notice, said the same way everywhere it applies.
|
|
3
|
-
//
|
|
4
|
-
// architecture-audit.md §8: "the deprecated UTM path is still the CLI's default" — ~2,460 lines of
|
|
5
|
-
// UTM-only code still ship, and until this file existed, using any of them said nothing about it. The
|
|
6
|
-
// repository owner stated plainly on 2026-09-05: "The UTM is deprecated, that was a testing thing." This
|
|
7
|
-
// is the loud half CLAUDE.md's own rule calls for: "a deprecated path that is still the first one
|
|
8
|
-
// documented is not deprecated" — printing nothing at the point of use is the runtime version of that
|
|
9
|
-
// same mistake.
|
|
10
|
-
//
|
|
11
|
-
// A notice, not a refusal: some of these entry points are still how an existing UTM guest is reached
|
|
12
|
-
// (worker-ctl.sh status, for instance), and this file does not decide which are safe to keep working —
|
|
13
|
-
// that is a separate proposal. This only makes sure nobody reaches any of them without being told.
|
|
14
|
-
/**
|
|
15
|
-
* @param {string} what The command or module the caller is about to run — named so the message is
|
|
16
|
-
* specific to what actually fired, not a generic banner every UTM-adjacent file prints identically.
|
|
17
|
-
*/
|
|
18
|
-
export function warnUtmDeprecated(what) {
|
|
19
|
-
process.stderr.write(`DEPRECATED: ${what} manages a local UTM worker VM. UTM was a testing path and is not the fleet.\n` +
|
|
20
|
-
"Capture on the bare-metal fleet instead: npm run fleet:status, npm run fleet:deploy. See CLAUDE.md's\n" +
|
|
21
|
-
'"Working on a Mac" section.\n');
|
|
22
|
-
}
|
|
23
|
-
//# sourceMappingURL=utm-deprecated.mjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"utm-deprecated.mjs","sourceRoot":"","sources":["../src/utm-deprecated.mjs"],"names":[],"mappings":"AAAA,YAAY;AACZ,mEAAmE;AACnE,EAAE;AACF,mGAAmG;AACnG,sGAAsG;AACtG,yGAAyG;AACzG,kGAAkG;AAClG,sGAAsG;AACtG,gBAAgB;AAChB,EAAE;AACF,qGAAqG;AACrG,uGAAuG;AACvG,mGAAmG;AAEnG;;;GAGG;AACH,MAAM,UAAU,iBAAiB,CAAC,IAAI;IACpC,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,eAAe,IAAI,gFAAgF;QACnG,wGAAwG;QACxG,+BAA+B,CAChC,CAAC;AACJ,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"worker-code-check.d.mts","sourceRoot":"","sources":["../src/worker-code-check.mjs"],"names":[],"mappings":"AAiEA;;;;;;;;;;;;;GAaG;AACH,qDAHW,MAAM,EAAE,YACR;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,OAAO,CAAC;IAAC,IAAI,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,GAAC,IAAI,CAAC,CAAC;IAAC,aAAa,CAAC,EAAE,MAAM,EAAE,CAAA;CAAC,iBAIlH;AAvBM,6CAA+D;0BAVvB,kBAAkB;kCAAlB,kBAAkB;kCAAlB,kBAAkB;+BAAlB,kBAAkB;4BAAlB,kBAAkB;kCAAlB,kBAAkB"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"worker-code-check.mjs","sourceRoot":"","sources":["../src/worker-code-check.mjs"],"names":[],"mappings":"AAAA,YAAY;AACZ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6CG;AACH,OAAO,EAAE,SAAS,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,cAAc,EAAE,WAAW,EACnF,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAElE,sGAAsG;AACtG,yGAAyG;AACzG,iGAAiG;AACjG,yGAAyG;AACzG,oFAAoF;AACpF,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,0CAA0C,CAAC;AAExF,oGAAoG;AACpG,MAAM,CAAC,MAAM,kBAAkB,GAAG,GAAG,EAAE,CAAC,WAAW,CAAC,eAAe,EAAE,CAAC,CAAC;AAEvE,kFAAkF;AAClF,2GAA2G;AAC3G,4FAA4F;AAC5F,OAAO,EAAE,SAAS,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,cAAc,EAAE,WAAW,EAAE,iBAAiB,EAAE,CAAC;AAE3G;;;;;;;;;;;;;GAaG;AACH,MAAM,CAAC,KAAK,UAAU,2BAA2B,CAAC,OAAO,EAAE,OAAO,GAAG,EAAE;IACrE,OAAO,kBAAkB,CAAC,kBAAkB,EAAE,EAAE,OAAO,EAAE,EAAE,GAAG,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,EAAE,CAAC,CAAC;AACzG,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"worker-health.d.mts","sourceRoot":"","sources":["../src/worker-health.mjs"],"names":[],"mappings":"AACA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH;;;;;;;;;;;;;;;GAeG;AACH,uCAHW;IAAE,IAAI,CAAC,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,IAAI,GAAG,SAAS,GACpD,OAAO,CAKnB;AAQD;;;GAGG;AACH,qCAHW;IAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,GAAG,SAAS,GAC9E;IAAE,QAAQ,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,aAAa,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CAqBtF"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"worker-health.mjs","sourceRoot":"","sources":["../src/worker-health.mjs"],"names":[],"mappings":"AAAA,YAAY;AACZ;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH;;;;;;;;;;;;;;;GAeG;AACH,MAAM,UAAU,cAAc,CAAC,MAAM;IACnC,IAAI,CAAC,MAAM;QAAE,OAAO,KAAK,CAAC;IAC1B,OAAO,CAAC,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,KAAK,KAAK,KAAK,CAAC;AAChD,CAAC;AAED,oGAAoG;AACpG,MAAM,qBAAqB,GAAG,CAAC,CAAC;AAEhC,wFAAwF;AACxF,MAAM,uBAAuB,GAAG,GAAG,CAAC;AAEpC;;;GAGG;AACH,MAAM,UAAU,YAAY,CAAC,MAAM;IACjC,MAAM,QAAQ,GAAG,MAAM,EAAE,QAAQ,IAAI,CAAC,CAAC;IACvC,MAAM,UAAU,GAAG,MAAM,EAAE,UAAU,IAAI,CAAC,CAAC;IAC3C,+FAA+F;IAC/F,MAAM,SAAS,GAAG,QAAQ,GAAG,CAAC,MAAM,EAAE,QAAQ,IAAI,CAAC,CAAC,CAAC;IACrD,IAAI,SAAS,GAAG,qBAAqB,EAAE,CAAC;QACtC,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC;IAChE,CAAC;IACD,MAAM,aAAa,GAAG,UAAU,GAAG,SAAS,CAAC;IAC7C,IAAI,aAAa,IAAI,uBAAuB,EAAE,CAAC;QAC7C,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,aAAa,EAAE,CAAC;IAC1D,CAAC;IACD,OAAO;QACL,QAAQ,EAAE,IAAI;QACd,aAAa;QACb,MAAM,EAAE,GAAG,UAAU,OAAO,SAAS,4CAA4C;YAC/E,IAAI,IAAI,CAAC,KAAK,CAAC,aAAa,GAAG,GAAG,CAAC,mEAAmE;YACtG,oGAAoG;KACvG,CAAC;AACJ,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"worker-http.d.mts","sourceRoot":"","sources":["../src/worker-http.mjs"],"names":[],"mappings":"AAoGA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,uCAJW,MAAM,GAAG,IAAI,GAAG,SAAS,eACzB;IAAE,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,GACjB,MAAM,CA0BlB;AAED;;;;;;;;;;;GAWG;AACH,iCATW,MAAM,gCACN;IAAE,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,OAAO,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,GACrD,OAAO,CAAC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,OAAO,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,GAAG,CAAA;CAAE,CAAC,CAwF7E;AAtMD;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,wCAAyC,MAAO,CAAC;AAEjD;;;;;;;;;;;;;;;;;;GAkBG;AACH,iCAAkC,KAAM,CAAC"}
|
package/dist/worker-http.mjs.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"worker-http.mjs","sourceRoot":"","sources":["../src/worker-http.mjs"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"worker-stats.d.mts","sourceRoot":"","sources":["../src/worker-stats.mjs"],"names":[],"mappings":"AAuCA,4FAA4F;AAC5F,wEAAwE;AACxE,iCADY,MAAM,EAAE,KAAiB,MAAM,GAAc,MAAM,GAAC,IAAI,CAOnE;AAED;;;;;GAKG;AACH;;;GAGG;AACH,iCAHW,MAAM,EAAE,GACN,OAAO,GAAC,IAAI,CAexB;AAOD;;;;;;;;;;;;GAYG;AACH,gDAJW,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,GACtB;IAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAAC,OAAO,EAAE,MAAM,GAAC,IAAI,CAAC;IAAC,OAAO,EAAE,MAAM,GAAC,IAAI,CAAC;IAC3E,eAAe,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAqCzD;AAED;;;;;;;;;;GAUG;AACH,sCAJW,MAAM,CAAC,MAAM,EAAE;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAC,CAAC,GACpD,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC,CAUzC;;;;;;;;sBAtHY;IAAC,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAC/D,GAAG,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAC"}
|
package/dist/worker-stats.mjs
DELETED
|
@@ -1,143 +0,0 @@
|
|
|
1
|
-
// @ts-check
|
|
2
|
-
/**
|
|
3
|
-
* Robust statistics for comparing workers, and an explicit refusal to call a difference real when the
|
|
4
|
-
* samples do not support it.
|
|
5
|
-
*
|
|
6
|
-
* This module exists because of a specific, repeated mistake: concluding from one measurement. Over one
|
|
7
|
-
* session a 2x difference between two guests was attributed, in turn, to the display being blanked, to
|
|
8
|
-
* in-memory accumulation, to background CPU, to Edge's launch, to the Edge profile, to the sweep, and to
|
|
9
|
-
* Edge's startup boost. Every one of those was a single measurement, and every one was wrong.
|
|
10
|
-
*
|
|
11
|
-
* Two things caused that, and both are fixed here rather than in a comment.
|
|
12
|
-
*
|
|
13
|
-
* **Means lied.** One 63 s outlier in an eight-run sample moved the mean by 5 s and made a healthy
|
|
14
|
-
* worker look broken. Capture time has a long right tail by nature — a mute screen reader costs ~86 s
|
|
15
|
-
* against a normal ~12 s — so the mean measures how often the tail was hit, not what a capture costs.
|
|
16
|
-
* The median and the interquartile range do not move when one run goes bad.
|
|
17
|
-
*
|
|
18
|
-
* **Sequential sampling confounded.** Measuring worker A for five minutes and then worker B for five
|
|
19
|
-
* minutes attributes any drift in the host during those ten minutes to the difference between the
|
|
20
|
-
* workers. Interleaving round-robin makes drift common to all of them.
|
|
21
|
-
*/
|
|
22
|
-
/**
|
|
23
|
-
* One worker's samples, summarised.
|
|
24
|
-
*
|
|
25
|
-
* Named as a typedef rather than repeated inline because four functions pass it around, and this module's
|
|
26
|
-
* whole purpose is refusing to claim a difference the samples do not support — so `q1`, `q3` and `iqr`
|
|
27
|
-
* travelling together, as one thing with one name, is the point rather than a formality.
|
|
28
|
-
*
|
|
29
|
-
* @typedef {{n: number, median: number, q1: number, q3: number, iqr: number,
|
|
30
|
-
* min: number, max: number}} Summary
|
|
31
|
-
*/
|
|
32
|
-
/** Below this many rounds, report the numbers but never claim a difference. */
|
|
33
|
-
const MIN_ROUNDS_FOR_A_VERDICT = 5;
|
|
34
|
-
/** @param {number[]} values @returns {number[]} */
|
|
35
|
-
const sorted = (values) => [...values].sort((a, b) => a - b);
|
|
36
|
-
/** Linear-interpolated quantile. Fine for the sample sizes here and has no dependencies. */
|
|
37
|
-
/** @param {number[]} values @param {number} q @returns {number|null} */
|
|
38
|
-
export function quantile(values, q) {
|
|
39
|
-
if (!values.length)
|
|
40
|
-
return null;
|
|
41
|
-
const s = sorted(values);
|
|
42
|
-
const position = (s.length - 1) * q;
|
|
43
|
-
const low = Math.floor(position), high = Math.ceil(position);
|
|
44
|
-
return low === high ? s[low] : s[low] + (s[high] - s[low]) * (position - low);
|
|
45
|
-
}
|
|
46
|
-
/**
|
|
47
|
-
* The shape of one worker's samples.
|
|
48
|
-
*
|
|
49
|
-
* `iqr` is the spread that matters: half the runs fall inside it, so two workers whose IQRs overlap are
|
|
50
|
-
* not distinguishable by these samples however different their medians look.
|
|
51
|
-
*/
|
|
52
|
-
/**
|
|
53
|
-
* @param {number[]} values
|
|
54
|
-
* @returns {Summary|null}
|
|
55
|
-
*/
|
|
56
|
-
export function describe(values) {
|
|
57
|
-
if (!values.length)
|
|
58
|
-
return null;
|
|
59
|
-
// Non-null by construction: `quantile` returns null only for an empty list, and the guard above has
|
|
60
|
-
// already excluded that. Written as a local rather than an assertion so the reason is stated once.
|
|
61
|
-
const q1 = /** @type {number} */ (quantile(values, 0.25));
|
|
62
|
-
const q3 = /** @type {number} */ (quantile(values, 0.75));
|
|
63
|
-
return {
|
|
64
|
-
n: values.length,
|
|
65
|
-
median: /** @type {number} */ (quantile(values, 0.5)),
|
|
66
|
-
q1, q3, iqr: q3 - q1,
|
|
67
|
-
min: Math.min(...values),
|
|
68
|
-
max: Math.max(...values),
|
|
69
|
-
};
|
|
70
|
-
}
|
|
71
|
-
/** Do two interquartile ranges overlap at all? @param {Summary} a @param {Summary} b */
|
|
72
|
-
function overlaps(a, b) {
|
|
73
|
-
return a.q1 <= b.q3 && b.q1 <= a.q3;
|
|
74
|
-
}
|
|
75
|
-
/**
|
|
76
|
-
* Compare workers and say, conservatively, whether a difference is supported.
|
|
77
|
-
*
|
|
78
|
-
* The bar is deliberately crude and deliberately strict: medians must differ by more than the wider
|
|
79
|
-
* worker's IQR, and the two IQRs must not overlap. That is a weaker claim than a significance test and a
|
|
80
|
-
* much stronger one than "the mean was higher", which is what produced every wrong conclusion this
|
|
81
|
-
* module was written after. When the samples do not clear it, the verdict is "not distinguishable" —
|
|
82
|
-
* which is a real answer, not a failure to find one.
|
|
83
|
-
*
|
|
84
|
-
* @param {Record<string, number[]>} samplesByWorker
|
|
85
|
-
* @returns {{ stats: Record<string, Summary>, slowest: string|null, fastest: string|null,
|
|
86
|
-
* distinguishable: boolean, verdict: string }}
|
|
87
|
-
*/
|
|
88
|
-
export function compareWorkers(samplesByWorker) {
|
|
89
|
-
/** @type {Record<string, Summary>} */
|
|
90
|
-
const stats = {};
|
|
91
|
-
for (const [worker, values] of Object.entries(samplesByWorker)) {
|
|
92
|
-
const description = describe(values);
|
|
93
|
-
if (description)
|
|
94
|
-
stats[worker] = description;
|
|
95
|
-
}
|
|
96
|
-
const names = Object.keys(stats);
|
|
97
|
-
if (names.length < 2) {
|
|
98
|
-
return { stats, slowest: null, fastest: null, distinguishable: false, verdict: "need at least two workers with samples" };
|
|
99
|
-
}
|
|
100
|
-
const rounds = Math.min(...names.map((n) => stats[n].n));
|
|
101
|
-
const byMedian = [...names].sort((a, b) => stats[a].median - stats[b].median);
|
|
102
|
-
const fastest = byMedian[0], slowest = byMedian[byMedian.length - 1];
|
|
103
|
-
const gap = stats[slowest].median - stats[fastest].median;
|
|
104
|
-
const widest = Math.max(stats[fastest].iqr, stats[slowest].iqr);
|
|
105
|
-
if (rounds < MIN_ROUNDS_FOR_A_VERDICT) {
|
|
106
|
-
return {
|
|
107
|
-
stats, slowest, fastest, distinguishable: false,
|
|
108
|
-
verdict: `only ${rounds} round(s) — too few to claim anything. Run at least ${MIN_ROUNDS_FOR_A_VERDICT}.`,
|
|
109
|
-
};
|
|
110
|
-
}
|
|
111
|
-
if (gap <= widest || overlaps(stats[fastest], stats[slowest])) {
|
|
112
|
-
return {
|
|
113
|
-
stats, slowest, fastest, distinguishable: false,
|
|
114
|
-
verdict: `NOT DISTINGUISHABLE: medians differ by ${gap.toFixed(1)} but the spread is ${widest.toFixed(1)} ` +
|
|
115
|
-
"and the interquartile ranges overlap. These samples do not support a difference between the workers.",
|
|
116
|
-
};
|
|
117
|
-
}
|
|
118
|
-
return {
|
|
119
|
-
stats, slowest, fastest, distinguishable: true,
|
|
120
|
-
verdict: `${slowest} is slower than ${fastest} by ${gap.toFixed(1)} (medians), ` +
|
|
121
|
-
`with non-overlapping interquartile ranges over ${rounds} interleaved rounds.`,
|
|
122
|
-
};
|
|
123
|
-
}
|
|
124
|
-
/**
|
|
125
|
-
* Recovery rate per worker — the reliability statistic, as opposed to the speed one.
|
|
126
|
-
*
|
|
127
|
-
* Counted from the worker's own `vitals.recoveries` across the run, because a guest whose screen reader
|
|
128
|
-
* keeps dying still returns evidence and still records zero failures. Speed and reliability are separate
|
|
129
|
-
* questions and a fast worker can be the unreliable one.
|
|
130
|
-
*
|
|
131
|
-
* @param {Record<string, {recoveries: number, captures: number}>} deltas
|
|
132
|
-
* @returns {Record<string, number | null>} null where the worker captured nothing — "no idea", which
|
|
133
|
-
* must not be confused with a rate of zero ("perfectly reliable").
|
|
134
|
-
*/
|
|
135
|
-
export function recoveryRates(deltas) {
|
|
136
|
-
/** @type {Record<string, number | null>} */
|
|
137
|
-
const rates = {};
|
|
138
|
-
for (const [worker, d] of Object.entries(deltas)) {
|
|
139
|
-
rates[worker] = d.captures > 0 ? d.recoveries / d.captures : null;
|
|
140
|
-
}
|
|
141
|
-
return rates;
|
|
142
|
-
}
|
|
143
|
-
//# sourceMappingURL=worker-stats.mjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"worker-stats.mjs","sourceRoot":"","sources":["../src/worker-stats.mjs"],"names":[],"mappings":"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"}
|