@molecule/api-ai-tools 1.14.4 → 1.14.5
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/README.md +211 -184
- package/dist/browser-probe.d.ts +4 -4
- package/dist/browser-probe.d.ts.map +1 -1
- package/dist/browser-probe.js +5 -5
- package/dist/command-position.d.ts +15 -16
- package/dist/command-position.d.ts.map +1 -1
- package/dist/command-position.js +21 -23
- package/dist/cut-run.d.ts +9 -9
- package/dist/cut-run.js +6 -6
- package/dist/failure-kind.d.ts +6 -6
- package/dist/failure-kind.js +6 -6
- package/dist/index.d.ts +2 -2
- package/dist/index.js +2 -2
- package/dist/inline-script.d.ts +5 -5
- package/dist/inline-script.js +6 -6
- package/dist/line-diff.d.ts +2 -3
- package/dist/line-diff.d.ts.map +1 -1
- package/dist/line-diff.js +2 -3
- package/dist/no-test-run.d.ts +5 -5
- package/dist/no-test-run.d.ts.map +1 -1
- package/dist/no-test-run.js +9 -8
- package/dist/output-filter.d.ts +2 -2
- package/dist/output-filter.js +2 -2
- package/dist/pipeline-exit-note.d.ts +1 -1
- package/dist/pipeline-exit-note.js +1 -1
- package/dist/playwright-report.d.ts +1 -1
- package/dist/playwright-report.js +1 -1
- package/dist/server-command.d.ts +2 -2
- package/dist/server-command.js +2 -2
- package/dist/sleep-peek.d.ts +1 -1
- package/dist/sleep-peek.js +1 -1
- package/dist/suite-overlap.d.ts +24 -25
- package/dist/suite-overlap.d.ts.map +1 -1
- package/dist/suite-overlap.js +41 -43
- package/dist/tools.d.ts +26 -28
- package/dist/tools.d.ts.map +1 -1
- package/dist/tools.js +98 -69
- package/dist/trace-artifacts.d.ts +64 -65
- package/dist/trace-artifacts.d.ts.map +1 -1
- package/dist/trace-artifacts.js +73 -75
- package/dist/types.d.ts +5 -5
- package/dist/utilities.d.ts +107 -91
- package/dist/utilities.d.ts.map +1 -1
- package/dist/utilities.js +191 -143
- package/package.json +2 -2
package/dist/no-test-run.js
CHANGED
|
@@ -9,13 +9,13 @@
|
|
|
9
9
|
* prints with `--help`/`--version`, the same way.
|
|
10
10
|
*
|
|
11
11
|
* Every check in the platform read such a command as a whole-suite run, because each one
|
|
12
|
-
* matched the runner's NAME.
|
|
12
|
+
* matched the runner's NAME. A first Playwright command that was a config
|
|
13
13
|
* check — a config written to `/tmp`, `cp`'d beside the suite and used with `--list` — and it
|
|
14
14
|
* came back HELD, `status: not_run`, with a ~4 KB `suiteNote` telling it to send the same
|
|
15
15
|
* command with `--max-failures=15` ("uncapped it walks every test … 8–13 minutes"), beside an
|
|
16
16
|
* environment block saying the run "ran on their defaults" and an import note about a path the
|
|
17
17
|
* `cp` had already fixed. Nothing ran. The model gave up on the approach, wrote a second
|
|
18
|
-
* config, and its next command was held again (
|
|
18
|
+
* config, and its next command was held again ("same command three times" shape):
|
|
19
19
|
* two holds, zero tests, and the config check it asked for never answered.
|
|
20
20
|
*
|
|
21
21
|
* So the classifiers live here, in one place, and callers ask them instead of their own
|
|
@@ -27,8 +27,8 @@
|
|
|
27
27
|
* What counts as an invocation is COMMAND POSITION, read by `@molecule/api-ai-tools`'
|
|
28
28
|
* `commandSegments`: `npx playwright test --list`, `hurl --help` and `bash run.sh` invoke the
|
|
29
29
|
* runner, while a runner named as an argument (`grep -n playwright e2e/README.md`,
|
|
30
|
-
* `head -30 run-api-tests-hurl.sh`) invokes nothing at all.
|
|
31
|
-
*
|
|
30
|
+
* `head -30 run-api-tests-hurl.sh`) invokes nothing at all. Reading a runner script with
|
|
31
|
+
* `head -30` has had the suite-overlap hold answer "a Playwright suite is
|
|
32
32
|
* already running … wait for it", for a command that runs nothing.
|
|
33
33
|
*
|
|
34
34
|
* @module
|
|
@@ -84,9 +84,10 @@ const NO_RUN_FLAGS = {
|
|
|
84
84
|
* account for: the suite's own script (`./run-api-tests-hurl.sh`), a wrapper the executor wrote,
|
|
85
85
|
* anything that may itself start a suite. {@link commandRunsNoTests} answers false for a command
|
|
86
86
|
* carrying one — "every invocation only prints" is not a claim an unknown step can support.
|
|
87
|
-
*
|
|
88
|
-
* `hurl --version | head -2 && HOST=http://localhost:4000 ./run-api-tests-hurl.sh 2>&1 | tail -60
|
|
89
|
-
*
|
|
87
|
+
* A command like
|
|
88
|
+
* `hurl --version | head -2 && HOST=http://localhost:4000 ./run-api-tests-hurl.sh 2>&1 | tail -60`
|
|
89
|
+
* ran a suite that passed 13/13, and the supplied script was the one segment nobody could place:
|
|
90
|
+
* the
|
|
90
91
|
* whole command read as a version probe, so every "has the suite run?" reader said no for the
|
|
91
92
|
* rest of the run and the early deploy was held to the end of the list.
|
|
92
93
|
*/
|
|
@@ -207,7 +208,7 @@ function informational(runner, after) {
|
|
|
207
208
|
* position of a segment, after its wrapper prefixes. A runner named in an argument is not an
|
|
208
209
|
* invocation — `head -30 run-api-tests-hurl.sh` and `grep -n playwright e2e/README.md` name a
|
|
209
210
|
* file to read, and a `--list` written inside a file the command writes is not a flag anyone runs
|
|
210
|
-
* with
|
|
211
|
+
* with.
|
|
211
212
|
*
|
|
212
213
|
* A command that invokes no runner is NOT one of these (false): "the command runs no test" is
|
|
213
214
|
* then true for `ls`, which is not the question any caller is asking. The question is whether
|
package/dist/output-filter.d.ts
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* A run whose own command piped its output through `tail`/`head`/`grep`/`sed`/`awk`/`cut`, so the
|
|
3
3
|
* failure the runner printed is not in what came back.
|
|
4
4
|
*
|
|
5
|
-
*
|
|
5
|
+
* A command sent `hurl --variable uid=… --test /tmp/t.hurl 2>&1 | tail -6`.
|
|
6
6
|
* The six lines that survived are Hurl's closing tally; the failed assertion was above the cut.
|
|
7
7
|
* The platform, seeing a red run with no assertion block, said the cause was "the transport or the
|
|
8
8
|
* run itself" — a sentence that sends the reader at the network for a status assertion it never
|
|
@@ -50,7 +50,7 @@ export interface RunnerOutputFilter {
|
|
|
50
50
|
* {@link CommandSegment.program} is the program, once wrapper words like `timeout 280` and
|
|
51
51
|
* `npx` are taken away).
|
|
52
52
|
* @param occurrence - Which runner invocation the output belongs to, 1-based. A command can run
|
|
53
|
-
* the same runner more than once (
|
|
53
|
+
* the same runner more than once (the suite bare, then with `HOST=…`),
|
|
54
54
|
* and each invocation carries its OWN pipe; a reader judging the second walk must name the
|
|
55
55
|
* second walk's cut, never the first's.
|
|
56
56
|
* @returns The filter and the unfiltered command, or null.
|
package/dist/output-filter.js
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* A run whose own command piped its output through `tail`/`head`/`grep`/`sed`/`awk`/`cut`, so the
|
|
3
3
|
* failure the runner printed is not in what came back.
|
|
4
4
|
*
|
|
5
|
-
*
|
|
5
|
+
* A command sent `hurl --variable uid=… --test /tmp/t.hurl 2>&1 | tail -6`.
|
|
6
6
|
* The six lines that survived are Hurl's closing tally; the failed assertion was above the cut.
|
|
7
7
|
* The platform, seeing a red run with no assertion block, said the cause was "the transport or the
|
|
8
8
|
* run itself" — a sentence that sends the reader at the network for a status assertion it never
|
|
@@ -39,7 +39,7 @@ const CUTTING_FILTERS = new Set(['awk', 'cut', 'grep', 'head', 'sed', 'tail']);
|
|
|
39
39
|
* {@link CommandSegment.program} is the program, once wrapper words like `timeout 280` and
|
|
40
40
|
* `npx` are taken away).
|
|
41
41
|
* @param occurrence - Which runner invocation the output belongs to, 1-based. A command can run
|
|
42
|
-
* the same runner more than once (
|
|
42
|
+
* the same runner more than once (the suite bare, then with `HOST=…`),
|
|
43
43
|
* and each invocation carries its OWN pipe; a reader judging the second walk must name the
|
|
44
44
|
* second walk's cut, never the first's.
|
|
45
45
|
* @returns The filter and the unfiltered command, or null.
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
*
|
|
5
5
|
* `npx tsc --noEmit 2>&1 | head -40` reports `head`'s 0 while the output above it carries a type
|
|
6
6
|
* error, and `… | head -40 && tail -30 missing.log` reports `tail`'s 1 while the checker was clean —
|
|
7
|
-
* both
|
|
7
|
+
* both are the same reading. A model that trusts the code concludes
|
|
8
8
|
* "clean" and ships a build that does not compile, or hunts an error that is not there. This module
|
|
9
9
|
* says which stage produced the code, and what the output actually carries, in one sentence beside
|
|
10
10
|
* `exitCode`.
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
*
|
|
5
5
|
* `npx tsc --noEmit 2>&1 | head -40` reports `head`'s 0 while the output above it carries a type
|
|
6
6
|
* error, and `… | head -40 && tail -30 missing.log` reports `tail`'s 1 while the checker was clean —
|
|
7
|
-
* both
|
|
7
|
+
* both are the same reading. A model that trusts the code concludes
|
|
8
8
|
* "clean" and ships a build that does not compile, or hunts an error that is not there. This module
|
|
9
9
|
* says which stage produced the code, and what the output actually carries, in one sentence beside
|
|
10
10
|
* `exitCode`.
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
* preserves a file reporter the executor named ({@link ./utilities.js} `withPlaywrightRunReport`,
|
|
6
6
|
* `streamingBackgroundCommand`). That log is text: which failure a trace, a route or a locator
|
|
7
7
|
* belongs to has to be reconstructed from printed headings, and a mis-join reads one failing
|
|
8
|
-
* test's evidence as another's
|
|
8
|
+
* test's evidence as another's. Playwright already writes the answer down
|
|
9
9
|
* itself — its built-in `json` reporter records every test's own identity (project, file, line,
|
|
10
10
|
* column, title path, status, retries) and every attachment the runner saved for THAT test, path
|
|
11
11
|
* included.
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
* preserves a file reporter the executor named ({@link ./utilities.js} `withPlaywrightRunReport`,
|
|
6
6
|
* `streamingBackgroundCommand`). That log is text: which failure a trace, a route or a locator
|
|
7
7
|
* belongs to has to be reconstructed from printed headings, and a mis-join reads one failing
|
|
8
|
-
* test's evidence as another's
|
|
8
|
+
* test's evidence as another's. Playwright already writes the answer down
|
|
9
9
|
* itself — its built-in `json` reporter records every test's own identity (project, file, line,
|
|
10
10
|
* column, title path, status, retries) and every attachment the runner saved for THAT test, path
|
|
11
11
|
* included.
|
package/dist/server-command.d.ts
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
* (`molecule-dev/api/src/ai/own-server-note.ts` imports {@link SERVER_PROGRAM} and
|
|
5
5
|
* {@link BACKGROUNDED} from here), so every surface that names a server names the same commands.
|
|
6
6
|
*
|
|
7
|
-
*
|
|
7
|
+
* A probe wrote `/tmp/probe.mts` whose body imports the app's
|
|
8
8
|
* `api/src/server.ts` and calls its `create(0)`, then ran it in the FOREGROUND:
|
|
9
9
|
* `npx tsx --env-file=.env /tmp/probe.mts 2>&1 | tail -15`. The scaffold's `create()` calls
|
|
10
10
|
* `server.listen(port)` and returns the server, so the process never exits — and behind `| tail`
|
|
@@ -29,7 +29,7 @@ export declare const BACKGROUNDED: RegExp;
|
|
|
29
29
|
* when the command only names the script file — but NEVER against an inline program's code
|
|
30
30
|
* (`node -e …`, `python3 -c …`), where this text is the user's program rather than a file being
|
|
31
31
|
* run: `require('…/node_modules/vite')` imports a module, it does not start a dev server
|
|
32
|
-
* (
|
|
32
|
+
* (refused as "node starts a server" for exactly that line).
|
|
33
33
|
*/
|
|
34
34
|
export declare const SERVER_PROGRAM: RegExp;
|
|
35
35
|
/**
|
package/dist/server-command.js
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
* (`molecule-dev/api/src/ai/own-server-note.ts` imports {@link SERVER_PROGRAM} and
|
|
5
5
|
* {@link BACKGROUNDED} from here), so every surface that names a server names the same commands.
|
|
6
6
|
*
|
|
7
|
-
*
|
|
7
|
+
* A probe wrote `/tmp/probe.mts` whose body imports the app's
|
|
8
8
|
* `api/src/server.ts` and calls its `create(0)`, then ran it in the FOREGROUND:
|
|
9
9
|
* `npx tsx --env-file=.env /tmp/probe.mts 2>&1 | tail -15`. The scaffold's `create()` calls
|
|
10
10
|
* `server.listen(port)` and returns the server, so the process never exits — and behind `| tail`
|
|
@@ -31,7 +31,7 @@ export const BACKGROUNDED = /(?:^|[^&>])&(?!&|>)|\b(?:nohup|setsid)\b/;
|
|
|
31
31
|
* when the command only names the script file — but NEVER against an inline program's code
|
|
32
32
|
* (`node -e …`, `python3 -c …`), where this text is the user's program rather than a file being
|
|
33
33
|
* run: `require('…/node_modules/vite')` imports a module, it does not start a dev server
|
|
34
|
-
* (
|
|
34
|
+
* (refused as "node starts a server" for exactly that line).
|
|
35
35
|
*/
|
|
36
36
|
export const SERVER_PROGRAM = /\bserver\.[cm]?[jt]s\b|\b(?:npm|pnpm|yarn|bun)\s+(?:run\s+)?(?:start|dev|serve|preview)\b|\bvite\s+(?:preview|dev|serve)\b|\bvite(?![.\w-])(?!\s+(?:build|optimize)\b)|\bnext\s+(?:start|dev)\b|\b(?:uvicorn|gunicorn)\b|\bflask\s+run\b|\bpython\d?\s+-m\s+http\.server\b/;
|
|
37
37
|
/** Programs that run a script FILE, so the file's own source decides whether it serves. */
|
package/dist/sleep-peek.d.ts
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* A leading `sleep` in an executor's command: the seconds it would have waited, and the command
|
|
3
3
|
* that follows it.
|
|
4
4
|
*
|
|
5
|
-
*
|
|
5
|
+
* One run spent 225 s of its 60-minute clock
|
|
6
6
|
* inside `exec_command` calls of the shape `sleep N; tail <task log>`. The platform's own launch
|
|
7
7
|
* note said "peek with exec_command: tail <log>" beside "never sleep", and the only concrete
|
|
8
8
|
* instruction was the peek, so the executor built the poll by hand. Two of its three sleeps were
|
package/dist/sleep-peek.js
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* A leading `sleep` in an executor's command: the seconds it would have waited, and the command
|
|
3
3
|
* that follows it.
|
|
4
4
|
*
|
|
5
|
-
*
|
|
5
|
+
* One run spent 225 s of its 60-minute clock
|
|
6
6
|
* inside `exec_command` calls of the shape `sleep N; tail <task log>`. The platform's own launch
|
|
7
7
|
* note said "peek with exec_command: tail <log>" beside "never sleep", and the only concrete
|
|
8
8
|
* instruction was the peek, so the executor built the poll by hand. Two of its three sleeps were
|
package/dist/suite-overlap.d.ts
CHANGED
|
@@ -5,12 +5,12 @@
|
|
|
5
5
|
* Two sites ask "may a second run start now?" about the same pair of runs — the mid-run note that
|
|
6
6
|
* tells the executor what to do next while the suite it is waiting on is still going
|
|
7
7
|
* ({@link ./utilities.js} `repeatingFailureNote`), and the hold that refuses the run when it
|
|
8
|
-
* arrives (molecule-dev's `suite-overlap-hold.ts`) — and
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
8
|
+
* arrives (molecule-dev's `suite-overlap-hold.ts`) — and they used to answer it separately.
|
|
9
|
+
* A `wait_for_task` handed over a repeating cause with "the test alone reproduces the first one …
|
|
10
|
+
* start on them now, while the run keeps walking"; the executor sent exactly that re-run, and the
|
|
11
|
+
* overlap hold refused it — "A playwright suite is already running against this app and
|
|
12
|
+
* database … Wait for it." Two orders, one run, and the round trip between them was the whole
|
|
13
|
+
* cost.
|
|
14
14
|
*
|
|
15
15
|
* So the rule lives here ({@link suiteRunInTheWay}) and both of them call it: a run may start only
|
|
16
16
|
* when nothing in flight is already measuring the same app and database. What "the same app and
|
|
@@ -23,7 +23,7 @@
|
|
|
23
23
|
* WHOLE suite or a part of it. The rewriter that decides whether a background Playwright run gets
|
|
24
24
|
* `--retries=0` ({@link ./utilities.js} `streamingBackgroundCommand`) and the platform's own notes
|
|
25
25
|
* (molecule-dev's `suite-cli-override.ts`) asked it separately — a regex there, a predicate here —
|
|
26
|
-
* until
|
|
26
|
+
* until a run showed the two answers were never the same question
|
|
27
27
|
* ({@link isDiagnosisRun}).
|
|
28
28
|
*
|
|
29
29
|
* @module
|
|
@@ -65,7 +65,7 @@ export declare function namesSuiteConfig(command: string): boolean;
|
|
|
65
65
|
* The flag rides the same statement the runner does: a `cd`, an env prefix and a `timeout` before
|
|
66
66
|
* it are left exactly as they were, and so is everything chained after the run (`| tail -50`).
|
|
67
67
|
*
|
|
68
|
-
*
|
|
68
|
+
* A fix-round re-run dropped the
|
|
69
69
|
* `--config playwright.conduit.config.ts` both earlier runs had carried, so Playwright started with
|
|
70
70
|
* NO base URL and all 10 failures were `page.goto: Cannot navigate to invalid URL` — a failure list
|
|
71
71
|
* that says nothing about the app. The platform composes commands back to the executor too (the
|
|
@@ -81,21 +81,21 @@ export declare function withSuiteConfig(command: string, config: string | null |
|
|
|
81
81
|
* The whole-suite command made scoped to the tests it should re-run instead: the same
|
|
82
82
|
* invocation — same launcher, same settings — with the named `file:line`s in place of every
|
|
83
83
|
* positional selection the run carried (a spec file, a suite directory or a regex filter),
|
|
84
|
-
* `--last-failed` dropped (it re-runs the tests that never ran too
|
|
84
|
+
* `--last-failed` dropped (it re-runs the tests that never ran too) and
|
|
85
85
|
* `--retries=0` set (a re-run of a known failure does not need to pay for retries) — except the
|
|
86
86
|
* re-run of a run against a DEPLOYED URL, which keeps the suite's own retries and tracing
|
|
87
87
|
* (`options.suiteSettings`).
|
|
88
88
|
*
|
|
89
89
|
* The re-run keeps the run's `> <file>` redirect only in the sense of keeping its OUTPUT there:
|
|
90
90
|
* the target is rewritten to a fresh sibling ({@link redirectRunnerOutputsToFreshFiles}), so a
|
|
91
|
-
* re-run never overwrites the log the run itself is the evidence for
|
|
92
|
-
* and the setup around the run keeps its own file writes untouched
|
|
91
|
+
* re-run never overwrites the log the run itself is the evidence for —
|
|
92
|
+
* and the setup around the run keeps its own file writes untouched. A
|
|
93
93
|
* `tail`/`head`/`cat`/`grep` chained after the run that reads that exact log is shown the fresh
|
|
94
|
-
* sibling instead, so the re-run displays the run it performed
|
|
94
|
+
* sibling instead, so the re-run displays the run it performed.
|
|
95
95
|
*
|
|
96
96
|
* `config` is the config the run was measured under ({@link withSuiteConfig}): the narrowed re-run
|
|
97
97
|
* carries it whenever the command itself does not, so a run that dropped `--config` cannot be
|
|
98
|
-
* handed back a command with the same defect (
|
|
98
|
+
* handed back a command with the same defect (every failing test was
|
|
99
99
|
* `Cannot navigate to invalid URL` because the re-run loaded no base URL).
|
|
100
100
|
*
|
|
101
101
|
* @param command - The whole-suite run's command.
|
|
@@ -105,7 +105,7 @@ export declare function withSuiteConfig(command: string, config: string | null |
|
|
|
105
105
|
* command this returns is one Playwright can match.
|
|
106
106
|
* @param excluded - The test titles the request carves out. They are inverted out
|
|
107
107
|
* (`--grep-invert`) so a re-run of the failing locations cannot report one of them again —
|
|
108
|
-
*
|
|
108
|
+
* a re-run of the whole 139-test suite spends ~4 minutes to be told about
|
|
109
109
|
* a test the request had already said does not count.
|
|
110
110
|
* @param config - The config the run loaded, when the caller knows it; added when the command
|
|
111
111
|
* does not name one.
|
|
@@ -113,13 +113,13 @@ export declare function withSuiteConfig(command: string, config: string | null |
|
|
|
113
113
|
* resolved against when the command does not `cd` anywhere.
|
|
114
114
|
* @param env - The settings the REQUEST requires of the suite and this run left out
|
|
115
115
|
* ({@link withRunEnv}): the re-run carries them, so a re-run of a run measured in the wrong
|
|
116
|
-
* mode is not measured in that mode again
|
|
116
|
+
* mode is not measured in that mode again.
|
|
117
117
|
* @param options - `suiteSettings` for the re-run of a run against a DEPLOYED URL: it keeps the
|
|
118
118
|
* suite's own retries and tracing instead of the diagnosis ones. The graded measurement is the
|
|
119
119
|
* suite's own settings, and a retry is what leaves a failing test's trace there; the platform's
|
|
120
120
|
* `--retries=0` and its `--trace=retain-on-failure` are both a stricter measurement than the
|
|
121
|
-
* one that was graded, and
|
|
122
|
-
*
|
|
121
|
+
* one that was graded, and the recording alone turned three budget-bound deployed tests into
|
|
122
|
+
* timeouts.
|
|
123
123
|
* @returns The scoped command, or the command unchanged when it runs no Playwright suite.
|
|
124
124
|
*/
|
|
125
125
|
export declare function scopedRerunCommand(command: string, locations: readonly string[], excluded?: readonly string[], config?: string | null, cwd?: string | null, env?: readonly RunEnvSetting[], options?: {
|
|
@@ -132,12 +132,12 @@ export interface RunEnvSetting {
|
|
|
132
132
|
}
|
|
133
133
|
/**
|
|
134
134
|
* The command with the request's required settings put in front of its RUN statement — the ONE
|
|
135
|
-
* place every composed re-run gets them
|
|
135
|
+
* place every composed re-run gets them.
|
|
136
136
|
*
|
|
137
137
|
* The settings are written at the statement's own assignment offset, never in front of the whole
|
|
138
138
|
* command: a shell binds an assignment there to the statement's program, while one in front of the
|
|
139
139
|
* whole command is the environment of its FIRST statement alone (`APP_BASE=… cd app && npx
|
|
140
|
-
* playwright test` sets the variable for `cd
|
|
140
|
+
* playwright test` sets the variable for `cd`). A name the command
|
|
141
141
|
* gives a different value is replaced, and one it already gives the required value is left as
|
|
142
142
|
* written. When the parse cannot place the statement (a run inside a nested `sh -c '…'`), the
|
|
143
143
|
* settings become `export`s, which no statement boundary can swallow.
|
|
@@ -161,8 +161,7 @@ export interface SuiteRunInFlight {
|
|
|
161
161
|
target: string;
|
|
162
162
|
/**
|
|
163
163
|
* Whether the command being judged STOPS this run before starting its own — a kill comes first,
|
|
164
|
-
* so a run the command itself stops is not in the way (
|
|
165
|
-
* `kill 19408 … ; npx playwright test …`).
|
|
164
|
+
* so a run the command itself stops is not in the way (`kill 19408 … ; npx playwright test …`).
|
|
166
165
|
*/
|
|
167
166
|
stoppedByCommand?: boolean;
|
|
168
167
|
}
|
|
@@ -237,10 +236,10 @@ export declare function isPlatformProofLaunch(input: unknown): boolean;
|
|
|
237
236
|
* ({@link ./utilities.js} `streamingBackgroundCommand`) — a diagnosis walks each failure once,
|
|
238
237
|
* while the run the suite is judged by keeps the suite's own retries; and
|
|
239
238
|
* - the platform's own notes (molecule-dev's `suite-cli-override.ts`), which must not tell the
|
|
240
|
-
* executor to drop the `--retries=0` the platform itself has just added —
|
|
241
|
-
*
|
|
239
|
+
* executor to drop the `--retries=0` the platform itself has just added — a contradiction
|
|
240
|
+
* filed three times.
|
|
242
241
|
*
|
|
243
|
-
* Until
|
|
242
|
+
* Until then they were a regex and a predicate that only LOOKED alike, and the
|
|
244
243
|
* gap was exactly the run the platform had asked for: its `testRunNote` says "run the whole suite
|
|
245
244
|
* once with `--max-failures=0`", and the rewriter read that cap flag as a capped diagnosis and
|
|
246
245
|
* stripped the suite's retries from the uncapped proof run that follows a deploy — the one run the
|
|
@@ -256,7 +255,7 @@ export declare function isPlatformProofLaunch(input: unknown): boolean;
|
|
|
256
255
|
* When the caller passes those approved titles ({@link DiagnosisRunContext}) and the inverted
|
|
257
256
|
* pattern names one of them — the request's own "except …" scope written as the flag, which
|
|
258
257
|
* molecule-dev's `invertDecision` reads the same way — the run still walks the whole proof scope,
|
|
259
|
-
* and it is not a diagnosis.
|
|
258
|
+
* and it is not a diagnosis. The deployed proof carried exactly
|
|
260
259
|
* that exclusion, the rewriter added `--retries=0` to it, and the run lost the suite's retries on
|
|
261
260
|
* the one walk where a network blip is likeliest.
|
|
262
261
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"suite-overlap.d.ts","sourceRoot":"","sources":["../src/suite-overlap.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AAaH;;;;;;;;;GASG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAEvD;AAED;;;;;;;;;GASG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAoB1D;AAKD;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAEzD;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,CAS1F;
|
|
1
|
+
{"version":3,"file":"suite-overlap.d.ts","sourceRoot":"","sources":["../src/suite-overlap.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AAaH;;;;;;;;;GASG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAEvD;AAED;;;;;;;;;GASG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAoB1D;AAKD;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAEzD;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,CAS1F;AA2VD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4CG;AACH,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,SAAS,MAAM,EAAE,EAC5B,QAAQ,GAAE,SAAS,MAAM,EAAO,EAChC,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,EACtB,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,EACnB,GAAG,GAAE,SAAS,aAAa,EAAO,EAClC,OAAO,GAAE;IAAE,aAAa,CAAC,EAAE,OAAO,CAAA;CAAO,GACxC,MAAM,CA2DR;AAED,4DAA4D;AAC5D,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,EAAE,MAAM,CAAA;CACd;AAmCD;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,GAAE,SAAS,aAAa,EAAO,GAAG,MAAM,CAe3F;AAuOD;;;;;;GAMG;AACH,MAAM,WAAW,gBAAgB;IAC/B,+FAA+F;IAC/F,SAAS,EAAE,OAAO,CAAA;IAClB,oFAAoF;IACpF,MAAM,EAAE,MAAM,CAAA;IACd;;;OAGG;IACH,gBAAgB,CAAC,EAAE,OAAO,CAAA;CAC3B;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,gBAAgB,CAAC,CAAC,SAAS,gBAAgB,EACzD,SAAS,EAAE;IAAE,MAAM,EAAE,MAAM,CAAA;CAAE,EAC7B,QAAQ,EAAE,SAAS,CAAC,EAAE,GACrB,CAAC,GAAG,IAAI,CAMV;AAqHD;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC;;;OAGG;IACH,kBAAkB,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;IACtC;;;;;;;;;;;;;OAaG;IACH,aAAa,CAAC,EAAE,OAAO,CAAA;CACxB;AAED;;;;;;;;;GASG;AACH,eAAO,MAAM,cAAc,EAAE,OAAO,MAA4D,CAAA;AAEhG;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAM7D;AAmCD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkDG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,mBAAmB,GAAG,OAAO,CA2BtF"}
|
package/dist/suite-overlap.js
CHANGED
|
@@ -5,12 +5,12 @@
|
|
|
5
5
|
* Two sites ask "may a second run start now?" about the same pair of runs — the mid-run note that
|
|
6
6
|
* tells the executor what to do next while the suite it is waiting on is still going
|
|
7
7
|
* ({@link ./utilities.js} `repeatingFailureNote`), and the hold that refuses the run when it
|
|
8
|
-
* arrives (molecule-dev's `suite-overlap-hold.ts`) — and
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
8
|
+
* arrives (molecule-dev's `suite-overlap-hold.ts`) — and they used to answer it separately.
|
|
9
|
+
* A `wait_for_task` handed over a repeating cause with "the test alone reproduces the first one …
|
|
10
|
+
* start on them now, while the run keeps walking"; the executor sent exactly that re-run, and the
|
|
11
|
+
* overlap hold refused it — "A playwright suite is already running against this app and
|
|
12
|
+
* database … Wait for it." Two orders, one run, and the round trip between them was the whole
|
|
13
|
+
* cost.
|
|
14
14
|
*
|
|
15
15
|
* So the rule lives here ({@link suiteRunInTheWay}) and both of them call it: a run may start only
|
|
16
16
|
* when nothing in flight is already measuring the same app and database. What "the same app and
|
|
@@ -23,7 +23,7 @@
|
|
|
23
23
|
* WHOLE suite or a part of it. The rewriter that decides whether a background Playwright run gets
|
|
24
24
|
* `--retries=0` ({@link ./utilities.js} `streamingBackgroundCommand`) and the platform's own notes
|
|
25
25
|
* (molecule-dev's `suite-cli-override.ts`) asked it separately — a regex there, a predicate here —
|
|
26
|
-
* until
|
|
26
|
+
* until a run showed the two answers were never the same question
|
|
27
27
|
* ({@link isDiagnosisRun}).
|
|
28
28
|
*
|
|
29
29
|
* @module
|
|
@@ -94,7 +94,7 @@ export function namesSuiteConfig(command) {
|
|
|
94
94
|
* The flag rides the same statement the runner does: a `cd`, an env prefix and a `timeout` before
|
|
95
95
|
* it are left exactly as they were, and so is everything chained after the run (`| tail -50`).
|
|
96
96
|
*
|
|
97
|
-
*
|
|
97
|
+
* A fix-round re-run dropped the
|
|
98
98
|
* `--config playwright.conduit.config.ts` both earlier runs had carried, so Playwright started with
|
|
99
99
|
* NO base URL and all 10 failures were `page.goto: Cannot navigate to invalid URL` — a failure list
|
|
100
100
|
* that says nothing about the app. The platform composes commands back to the executor too (the
|
|
@@ -305,21 +305,21 @@ const GREP_PATTERN_FLAGS = new Set(['-e', '--regexp', '-f', '--file']);
|
|
|
305
305
|
* The postlude statements that DISPLAY the run's own report, with the exact file that run wrote
|
|
306
306
|
* pointed at the fresh sibling the re-run writes instead.
|
|
307
307
|
*
|
|
308
|
-
*
|
|
309
|
-
*
|
|
310
|
-
*
|
|
311
|
-
*
|
|
312
|
-
*
|
|
308
|
+
* A recipe the platform handed the executor ended
|
|
309
|
+
* `> /tmp/e2e-local.log.rerun.log 2>&1; echo EXIT=$?; tail -80 /tmp/e2e-local.log`. The writer
|
|
310
|
+
* moved to the fresh sibling and the trailing tail did not, so the narrowed re-run displayed the
|
|
311
|
+
* walk it was narrowed FROM — and a builder following that recipe read the previous walk's
|
|
312
|
+
* failures as the result of the run it had just done.
|
|
313
313
|
*
|
|
314
314
|
* Only the EXACT file a runner statement (or its `tee`) wrote moves, and only in a statement AFTER
|
|
315
|
-
* the run: the setup in front of it keeps every byte
|
|
315
|
+
* the run: the setup in front of it keeps every byte, and a read of any other file is left
|
|
316
316
|
* alone. The value is compared whole — `/tmp/full.log` never matches `/tmp/full.log.bak` — and
|
|
317
317
|
* inside shell quotes the operand's own quoting survives (`"/tmp/my walk.log"` stays quoted).
|
|
318
318
|
*
|
|
319
319
|
* The bound is deliberate: a display this reader set does not recognise (a `wc`, a path held in a
|
|
320
320
|
* variable, a path the command builds) is left exactly as written rather than guessed at. Those
|
|
321
|
-
* shapes are not the ones the platform emits, and rewriting a word by resemblance is how
|
|
322
|
-
*
|
|
321
|
+
* shapes are not the ones the platform emits, and rewriting a word by resemblance is how a setup
|
|
322
|
+
* redirect was corrupted.
|
|
323
323
|
*
|
|
324
324
|
* @param command - The composed command.
|
|
325
325
|
* @param statements - The statements carrying the run's own output.
|
|
@@ -401,14 +401,14 @@ function freshReportReadEdits(command, statements, fresh) {
|
|
|
401
401
|
* changed.
|
|
402
402
|
*
|
|
403
403
|
* A re-run composed from a run's own command keeps the run's redirect by construction, and the
|
|
404
|
-
* run wrote the walk's only report to that file:
|
|
404
|
+
* run wrote the walk's only report to that file: the platform handed over *"Send this
|
|
405
405
|
* once the run ends: … npx playwright test …/articles.spec.ts:32 --retries=0 … > /tmp/pw-full.log
|
|
406
406
|
* 2>&1"* — the ONE narrowed re-run that was about to check the fixes would have overwritten the
|
|
407
407
|
* full walk's log, destroying the other 11 failures' error reports. Following the platform's own
|
|
408
408
|
* advice must never destroy the evidence it was based on.
|
|
409
409
|
*
|
|
410
410
|
* Only the run's OWN stream moves. What surrounds it is SETUP and POSTLUDE, and those writes are
|
|
411
|
-
* the command's meaning, not a report:
|
|
411
|
+
* the command's meaning, not a report: a composed command was
|
|
412
412
|
* `printf '/index.html 200' > app/public/_redirects && npx playwright test specs/auth.spec.ts
|
|
413
413
|
* > /tmp/full.log 2>&1` with its SPA fallback written to `_redirects.rerun.log`, so the re-run
|
|
414
414
|
* measured an app with no fallback at all. A heredoc config, a `.env` the command writes and a
|
|
@@ -418,8 +418,7 @@ function freshReportReadEdits(command, statements, fresh) {
|
|
|
418
418
|
* Every statement chained after the run (`; echo EXIT $? > /tmp/done`) is postlude and keeps its
|
|
419
419
|
* own writes, but the DISPLAY of the run's report is part of the same run: a `tail`, `head`, `cat`
|
|
420
420
|
* or `grep` after the run that reads the exact file it wrote is pointed at the fresh sibling too
|
|
421
|
-
* ({@link freshReportReadEdits}), so a re-run shows its own output instead of the walk's
|
|
422
|
-
* (xr-molecule-flash-o03).
|
|
421
|
+
* ({@link freshReportReadEdits}), so a re-run shows its own output instead of the walk's.
|
|
423
422
|
*
|
|
424
423
|
* @param command - The composed command.
|
|
425
424
|
* @returns The command whose suite-run redirects write to a fresh target.
|
|
@@ -444,21 +443,21 @@ function redirectRunnerOutputsToFreshFiles(command) {
|
|
|
444
443
|
* The whole-suite command made scoped to the tests it should re-run instead: the same
|
|
445
444
|
* invocation — same launcher, same settings — with the named `file:line`s in place of every
|
|
446
445
|
* positional selection the run carried (a spec file, a suite directory or a regex filter),
|
|
447
|
-
* `--last-failed` dropped (it re-runs the tests that never ran too
|
|
446
|
+
* `--last-failed` dropped (it re-runs the tests that never ran too) and
|
|
448
447
|
* `--retries=0` set (a re-run of a known failure does not need to pay for retries) — except the
|
|
449
448
|
* re-run of a run against a DEPLOYED URL, which keeps the suite's own retries and tracing
|
|
450
449
|
* (`options.suiteSettings`).
|
|
451
450
|
*
|
|
452
451
|
* The re-run keeps the run's `> <file>` redirect only in the sense of keeping its OUTPUT there:
|
|
453
452
|
* the target is rewritten to a fresh sibling ({@link redirectRunnerOutputsToFreshFiles}), so a
|
|
454
|
-
* re-run never overwrites the log the run itself is the evidence for
|
|
455
|
-
* and the setup around the run keeps its own file writes untouched
|
|
453
|
+
* re-run never overwrites the log the run itself is the evidence for —
|
|
454
|
+
* and the setup around the run keeps its own file writes untouched. A
|
|
456
455
|
* `tail`/`head`/`cat`/`grep` chained after the run that reads that exact log is shown the fresh
|
|
457
|
-
* sibling instead, so the re-run displays the run it performed
|
|
456
|
+
* sibling instead, so the re-run displays the run it performed.
|
|
458
457
|
*
|
|
459
458
|
* `config` is the config the run was measured under ({@link withSuiteConfig}): the narrowed re-run
|
|
460
459
|
* carries it whenever the command itself does not, so a run that dropped `--config` cannot be
|
|
461
|
-
* handed back a command with the same defect (
|
|
460
|
+
* handed back a command with the same defect (every failing test was
|
|
462
461
|
* `Cannot navigate to invalid URL` because the re-run loaded no base URL).
|
|
463
462
|
*
|
|
464
463
|
* @param command - The whole-suite run's command.
|
|
@@ -468,7 +467,7 @@ function redirectRunnerOutputsToFreshFiles(command) {
|
|
|
468
467
|
* command this returns is one Playwright can match.
|
|
469
468
|
* @param excluded - The test titles the request carves out. They are inverted out
|
|
470
469
|
* (`--grep-invert`) so a re-run of the failing locations cannot report one of them again —
|
|
471
|
-
*
|
|
470
|
+
* a re-run of the whole 139-test suite spends ~4 minutes to be told about
|
|
472
471
|
* a test the request had already said does not count.
|
|
473
472
|
* @param config - The config the run loaded, when the caller knows it; added when the command
|
|
474
473
|
* does not name one.
|
|
@@ -476,13 +475,13 @@ function redirectRunnerOutputsToFreshFiles(command) {
|
|
|
476
475
|
* resolved against when the command does not `cd` anywhere.
|
|
477
476
|
* @param env - The settings the REQUEST requires of the suite and this run left out
|
|
478
477
|
* ({@link withRunEnv}): the re-run carries them, so a re-run of a run measured in the wrong
|
|
479
|
-
* mode is not measured in that mode again
|
|
478
|
+
* mode is not measured in that mode again.
|
|
480
479
|
* @param options - `suiteSettings` for the re-run of a run against a DEPLOYED URL: it keeps the
|
|
481
480
|
* suite's own retries and tracing instead of the diagnosis ones. The graded measurement is the
|
|
482
481
|
* suite's own settings, and a retry is what leaves a failing test's trace there; the platform's
|
|
483
482
|
* `--retries=0` and its `--trace=retain-on-failure` are both a stricter measurement than the
|
|
484
|
-
* one that was graded, and
|
|
485
|
-
*
|
|
483
|
+
* one that was graded, and the recording alone turned three budget-bound deployed tests into
|
|
484
|
+
* timeouts.
|
|
486
485
|
* @returns The scoped command, or the command unchanged when it runs no Playwright suite.
|
|
487
486
|
*/
|
|
488
487
|
export function scopedRerunCommand(command, locations, excluded = [], config, cwd, env = [], options = {}) {
|
|
@@ -572,12 +571,12 @@ function withoutEnvWord(command, name) {
|
|
|
572
571
|
}
|
|
573
572
|
/**
|
|
574
573
|
* The command with the request's required settings put in front of its RUN statement — the ONE
|
|
575
|
-
* place every composed re-run gets them
|
|
574
|
+
* place every composed re-run gets them.
|
|
576
575
|
*
|
|
577
576
|
* The settings are written at the statement's own assignment offset, never in front of the whole
|
|
578
577
|
* command: a shell binds an assignment there to the statement's program, while one in front of the
|
|
579
578
|
* whole command is the environment of its FIRST statement alone (`APP_BASE=… cd app && npx
|
|
580
|
-
* playwright test` sets the variable for `cd
|
|
579
|
+
* playwright test` sets the variable for `cd`). A name the command
|
|
581
580
|
* gives a different value is replaced, and one it already gives the required value is left as
|
|
582
581
|
* written. When the parse cannot place the statement (a run inside a nested `sh -c '…'`), the
|
|
583
582
|
* settings become `export`s, which no statement boundary can swallow.
|
|
@@ -659,9 +658,8 @@ const LOCATION_LINE = /^(.*?)(:\d+(?::\d+)?)$/;
|
|
|
659
658
|
* suffix the absolute path still contains (`fixtures/…/articles.spec.ts:3` matches).
|
|
660
659
|
*
|
|
661
660
|
* A location without a leading dot is left alone: it is either absolute or already a suffix of the
|
|
662
|
-
* absolute path, and rewriting it against a mis-guessed base could only break it
|
|
663
|
-
*
|
|
664
|
-
* these" command).
|
|
661
|
+
* absolute path, and rewriting it against a mis-guessed base could only break it ("No tests
|
|
662
|
+
* found", and the platform's own "Re-run just these" command).
|
|
665
663
|
*
|
|
666
664
|
* @param locations - The failing `file:line`s as the run's log printed them.
|
|
667
665
|
* @param command - The run's command, for its own `cd`s.
|
|
@@ -684,7 +682,7 @@ function playwrightLocations(locations, command, cwd) {
|
|
|
684
682
|
*
|
|
685
683
|
* A value here is never a positional selection however much it looks like a path:
|
|
686
684
|
* `--config playwright.config.ts` names the config the run was measured under, and dropping it
|
|
687
|
-
* because it ends in `.ts` would re-create
|
|
685
|
+
* because it ends in `.ts` would re-create the defect exactly (a re-run with no base URL).
|
|
688
686
|
*/
|
|
689
687
|
const SUITE_VALUE_FLAGS = new Set([
|
|
690
688
|
'--add-reporter',
|
|
@@ -740,10 +738,10 @@ const ARGUMENT_REDIRECT_OPERATOR = /^(?:\d*|&)(?:<<<|<<-?|>>?\|?|<>|>&|<&)$/;
|
|
|
740
738
|
*
|
|
741
739
|
* The re-run is "just these", and Playwright OR-s every positional argument into one selection:
|
|
742
740
|
* ANY leftover positional re-admits tests the re-run is supposed to skip. A bare spec file
|
|
743
|
-
* re-admits all of that file's tests (
|
|
744
|
-
*
|
|
741
|
+
* re-admits all of that file's tests (~297 s for one file and fourteen duplicates; 32 tests
|
|
742
|
+
* instead of 8). A suite DIRECTORY
|
|
745
743
|
* is the same argument and re-admits the WHOLE walk even beside fourteen exact `file:line`s —
|
|
746
|
-
*
|
|
744
|
+
* A suggested "Re-run just these" kept
|
|
747
745
|
* `/workspace/fixtures/realworld/specs/e2e` after `--config playwright.config.ts`, so the command
|
|
748
746
|
* said 14 locations and selected every spec again. A regex positional filter selects files the
|
|
749
747
|
* same way and goes too.
|
|
@@ -850,7 +848,7 @@ const PLAYWRIGHT_RUN = /^(?:@playwright\/test|playwright)(?:@\S+)?\s+test(?=\s|$
|
|
|
850
848
|
* Both rewrites that compose a command ({@link withSuiteConfig}, {@link scopedRerunCommand}) read
|
|
851
849
|
* the run through the shared shell parse — the same answer every classifier gets — instead of
|
|
852
850
|
* searching the text for `playwright test`. The search missed the runner reached by file (`node
|
|
853
|
-
* <path>/@playwright/test/cli.js test
|
|
851
|
+
* <path>/@playwright/test/cli.js test`), so a narrowed re-run of that run
|
|
854
852
|
* silently stayed the whole suite.
|
|
855
853
|
*
|
|
856
854
|
* `afterRunner` is the offset just past the runner's own words (`playwright test`): the
|
|
@@ -1005,10 +1003,10 @@ function boundsFailures(command) {
|
|
|
1005
1003
|
* ({@link ./utilities.js} `streamingBackgroundCommand`) — a diagnosis walks each failure once,
|
|
1006
1004
|
* while the run the suite is judged by keeps the suite's own retries; and
|
|
1007
1005
|
* - the platform's own notes (molecule-dev's `suite-cli-override.ts`), which must not tell the
|
|
1008
|
-
* executor to drop the `--retries=0` the platform itself has just added —
|
|
1009
|
-
*
|
|
1006
|
+
* executor to drop the `--retries=0` the platform itself has just added — a contradiction
|
|
1007
|
+
* filed three times.
|
|
1010
1008
|
*
|
|
1011
|
-
* Until
|
|
1009
|
+
* Until then they were a regex and a predicate that only LOOKED alike, and the
|
|
1012
1010
|
* gap was exactly the run the platform had asked for: its `testRunNote` says "run the whole suite
|
|
1013
1011
|
* once with `--max-failures=0`", and the rewriter read that cap flag as a capped diagnosis and
|
|
1014
1012
|
* stripped the suite's retries from the uncapped proof run that follows a deploy — the one run the
|
|
@@ -1024,7 +1022,7 @@ function boundsFailures(command) {
|
|
|
1024
1022
|
* When the caller passes those approved titles ({@link DiagnosisRunContext}) and the inverted
|
|
1025
1023
|
* pattern names one of them — the request's own "except …" scope written as the flag, which
|
|
1026
1024
|
* molecule-dev's `invertDecision` reads the same way — the run still walks the whole proof scope,
|
|
1027
|
-
* and it is not a diagnosis.
|
|
1025
|
+
* and it is not a diagnosis. The deployed proof carried exactly
|
|
1028
1026
|
* that exclusion, the rewriter added `--retries=0` to it, and the run lost the suite's retries on
|
|
1029
1027
|
* the one walk where a network blip is likeliest.
|
|
1030
1028
|
*
|