Repository navigation
ci(rerun-safety): measure the rerun property even when pass 1 is red - #18746
Conversation
`Rerun Safety` died in `pass 1` on 13 of the 17 consecutive red nights ending 2026-08-31, which skipped `pass 2` entirely — so the one property the workflow exists to assert went unmeasured, behind a red that reads exactly like the red it exists to report. The pass-1 killer moved across the streak (verify x6, cli x4+2, plugin-auth x1, under two different failure kinds), so "keep pass 1 green" was never a reachable end state. Both passes now always run and `scripts/rerun-safety-verdict.mjs` compares their failing task sets, reporting in one line whether the property was MEASURED and what it said. A red pass 1 still fails the job. Also gives `published-entry-node-env-source-reroute.test.ts` the 120s bound its own `spawnSync` already declared, replacing vitest's unchosen 5000ms default that its 2.5-3.6s legs were being judged against, and raises the job backstop 120 -> 170 min (a green two-pass run measured 115). Claude-Session: https://claude.ai/code/session_01DvvamiacK328idtBYJBxV3 Co-authored-by: Claude <noreply@anthropic.com>
`pnpm check:entry-guard` red: the module exports `failingTasks` / `verdict` / `renderVerdict`, so its top-level dispatch would end an importer mid-import. Claude-Session: https://claude.ai/code/session_01DvvamiacK328idtBYJBxV3 Co-authored-by: Claude <noreply@anthropic.com>
…nightly `check:pm-dispatch-gates` refuses a SCHEDULED-ONLY gate family: every discovered family must reach a workflow declaring a PR-time event, so a board sweep is never routed into a per-PR gate list. Invoking `--self-test` from `rerun-safety-nightly.yml` (schedule + workflow_dispatch only) made it the tree's first. Wired as `check:rerun-safety-verdict` in lint.yml instead, self-test half only — the measurement half reads two log paths and two exit codes that exist only inside the nightly job. Claude-Session: https://claude.ai/code/session_01DvvamiacK328idtBYJBxV3 Co-authored-by: Claude <noreply@anthropic.com>
📓 Docs Drift CheckNothing in this diff resolved to a documentable surface (no symbol, route or SDK anchor derived from 0 changed package(s)), so this run has no opinion about the docs. What this run could not see
Coarse fallback — 0 page(s) merely mention a changed package (the pre-#9192 predicate, kept for the deliberately-wide backstop): |
⛔ merge queue 构建失败 — 先分诊,再决定要不要重排队列构建 35259161595 红了。队列跑的是全量套件(PR 侧 CI 只跑 affected 子集), 失败的 job(日志抽取,best effort):
跨 PR 相同签名(24h,按失败测试文件聚合):
历史信号:
分诊清单:
Generated by Claude Code · merge-queue-triage workflow (#4859) |
Standing down on the queue red — it is not this PR's, and the one allowed re-queue follows
The failing check, and why it is not this PR's
Three readings, each one measured rather than argued:
⇒ ⛔ Not this PR's regression. ⛔ And not called a flake either — see below, it has a named class and a card. ⛔ No fix exists to port yet — and the class is already filedThis is not an unexplained red. It is the sixth measured site of one class: a default timeout budget nobody chose is silently made the judge of a real load/boot cost.
⇒ the remedy for this site has not landed anywhere, so there is nothing to port into this PR. ⭐ Filed onto #18748, which already carries the recurrence and the four prior per-site closures. ⛔ Widening this PR to fix a What happens nextThe one re-queue the rules allow, spent now and recorded here, so it is not spent twice. ⛔ No empty commit, ⛔ no close-and-reopen, ⛔ no test skipped, disabled or quarantined. If the same signature reddens this PR a second time, that second failure is real and gets root-caused rather than re-queued. Read by the Generated by Claude Code |
…l three 'not addressed here' clauses had been answered (objectstack-ai#18765) Fixes objectstack-ai#18652 `.changeset/client-get-session-envelope-and-refresh-read.md` is **pending release input**, not a note: `changeset version` copies it verbatim into `packages/client/CHANGELOG.md`, which is in `@objectstack/client`'s published `files[]` and ships in the npm tarball. AGENTS.md's release-owned table states the deadline in its own words — *"Your PR's input is its **changeset**, on a hard, unwatched deadline: the release that consumes it deletes that input and publishes the sentence."* ##⚠️ This PR corrects a pending changeset it did not author — read this first `check:empty-changeset`'s real scan **reds on this PR by design** and asks for exactly this paragraph. Its own text names the two classes and their opposite remedies; this is the **DELIBERATE CORRECTION** class, and the gate says *"this gate stays red either way, and staying red is what puts the decision in front of a person instead of routing around it."* - **The note:** `.changeset/client-get-session-envelope-and-refresh-read.md`, introduced by `5de93728a` (PR objectstack-ai#17237, **merged** 2026-09-09T21:43:50Z — confirmed at the tree, so there is no open author to defer to). - **What changed under it:** its closing paragraph was an **undated, present-tense** register of what that change left undone, and all three of its clauses had since been falsified on `origin/main` by other cards' landings (readings below). - **⛔ Not the collision class.** No changeset filename was drawn or overwritten here; this PR adds none. ⛔ Do not restore the file from the merge base — that republishes three false sentences. - ⛔ **I have deliberately NOT applied `skip-changeset`.** It would exempt the `changeset-check` job **wholesale** (`lint.yml`'s own note on the self-test split says so), which is the one label that would silence this refusal. Suppressing it is the routing-around the gate forbids, so the label decision is left to a human. ## Readings — measured on this checkout, ⛔ not relayed from the citing cards Each clause, the commit that falsified it, and its ancestry on `origin/main` (`git merge-base --is-ancestor SHA origin/main`, where **exit 0 is self-proving**): | clause, as it read | measured now | falsified by | ancestor? | |:--|:--|:--|:--| | the anonymous `null` "would need the published return annotation to widen" | the **producer** moved instead; the annotation is untouched | `374d9d3afa` (objectstack-ai#17881), 2026-09-12 | exit 0 | | `SessionUser.image` "declared `z.string().optional()`" | `image: z.string().nullish().describe('Avatar URL')` — `packages/spec/src/api/auth.zod.ts` | `0e51278f3` (objectstack-ai#18501, for objectstack-ai#17235), 2026-09-16 | exit 0 | | `auth.login` / `auth.register` "normalize into `data` but set no `success`" | both run `normalizeSessionResponse`, which returns `{ success: true, ...body, data }` | `01388fe81` (objectstack-ai#17791, for objectstack-ai#17234), 2026-09-12 | exit 0 | **Clause 1, at the definition rather than a call site.** `packages/plugins/plugin-auth/src/anonymous-session-refusal.ts:124` `refuseAnonymousSession` keys on the **answer shape** and on nothing else — three early returns: `isGetSessionPath(endpointPath)`, `response.status !== 200`, and `body.trim() !== ANONYMOUS_BODY` where `ANONYMOUS_BODY = 'null'` (compared as **text**, so `'0'` / `'""'` / `'false'` are left alone). It never reads how the caller became anonymous, so *never signed in*, *unknown cookie* and *revoked session* all convert alike. `ANONYMOUS_SESSION_REFUSAL_STATUS = 401`, and it is wired at `auth-manager.ts:5679`, the one seam every vendor route passes through. ⇒ the anonymous answer is not a `null` outside the declared type; it is a **rejection**, which a `Promise` of `SessionResponse` annotation already permits. ## What the diff does, and the one design choice in it Each clause is **kept as what it recorded**, anchored to when it was written (*"sat outside … when this change was written"*), with the landing that answered it beside it. Two reasons that shape rather than a straight fact-swap: 1. A fact-swap re-arms the same defect — the census's own header names the cause: *"prose does not re-measure itself"*. A dated clause cannot be falsified again. 2. It is the same rule the card's own fence applies one paragraph up: the better-auth **1.7.2** transcript is correct **because** it is dated and attributed. ⛔ That transcript is untouched — verified by needle (`better-auth 1.7.2` and `(anonymous) -> 200 null` both still present at lines 10 and 14). ## Scope note — clauses 2 and 3 were outside the card's fence Card objectstack-ai#18652 fenced scope to clause 1 and marked clause 2 **not re-measured, in either direction**; clause 3 it did not mention. I measured both and they are false too, so fixing clause 1 alone was not available: the sentence enumerates (*"**Two** answers stay outside the declared type"*), so a clause-1-only repair would have had to **newly author** the surviving false clauses into release input — strictly worse than what was there. Same defect class, same sentence, same file, no new verification surface. ⇒ folded in, declared here, and reported separately to the dispatching seat. Strip the last two rows if the seat disagrees; the diff is one paragraph. ## Tests / gates — the pin question, answered with three readings ⛔ **NOT MEASURED: nothing in this repo can pin changeset prose**, and it is not an untried idea — the repo has ruled against building it. Three measurements, none of them my own instrument: 1. **Step 49, `check:pm-changeset-deadline-census`** — its header: *"REPORT-ONLY: it fails nothing and gates nothing."* It measures **path presence**, never prose; its own blind-spot list says *"`window-open` means the FILE exists, never that the card's sentence about it is still correct."* Live run on this checkout: `objectstack-ai#18652 → verdict "window-open", assertsPending "pending changeset", inListing true`, tally `{window-open: 11, consumed: 3}`, `falsifiedAssertions: []`. The row is **identical before and after this diff** (I amend, not delete). ⇒ reachable, but structurally unable to fail. Not a pin. 2. **Step 122, `check:changeset-gate-self-tests`** — `lint.yml`'s own note: *"The SELF-TEST halves only — the real scans stay in pr-automation.yml's `changeset-check`."* `dispatch-gates` scores self-test-only families *"checker-health only … NOT a PR verdict."* Green here and green without this diff. Not a pin. 3. **Building one is forbidden right now.** `changeset-deadline-census.mjs`: *"⛔ This file is deliberately NOT the enforcement half … report-only first, the census is the deliverable, expansion only when the census reads zero including its blind spot."* The census reads **3 exposed**, not zero. Independently, `.changeset/**` is a ruled scan exemption — *"a changeset is that record before it is compiled into a CHANGELOG"* (`packages/objectql/src/action-owner-key-single-source.test.ts`, `NOT_A_STALE_MENTION`). And the file is consumed and deleted at the next release, so a pin reading that path becomes a phantom check by construction. ⭐ The one reachable instrument that **does** respond to this diff is a third the roster reading did not name — `check-empty-changeset.mjs`'s real scan — and its polarity is **inverted**: it is green without this change and red with it, on the **act**, not the prose. That is the human-confirmation gate above, not a pin. **Derived sweep** — `node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack` at `aefbf5927`, all 18 derived commands plus `check:changeset-fixed` (flagged ⛔ *roster under `.changeset`*) run locally: ``` adr0087 --base 0 no-major --base 0 closing-parity 0 comment-mask-corpus 0 adr0087 --self 0 no-major --self 0 closing-parity 0 driver-memory-census 0 empty-changeset --self 0 release-rehearsal --self 0 changeset-gate-self-tests 0 pm-changeset-deadline-census 0 nul-bytes 0 objectui-changeset 0 published-files 0 refd-timer-probe 0 watch-hint-literal 0 changeset-fixed 0 empty-changeset --base 1 <- THE DESIGNED RED, declared above ``` - **NOT MEASURED: `check:rerun-safety-verdict`.** `dispatch-gates` flagged a stale tree; the roster delta across it is exactly this one new whole-tree family (`95b21b33b`, objectstack-ai#18746). It does not exist in this checkout, so `pnpm` exited 254 (script-not-found) — ⛔ that is not a red gate and not a pass. It is self-test-only and reads only its own fixtures, so it cannot judge this diff either way. - **No control characters**: `grep -naP '[\x00-\x08\x0b\x0c\x0e-\x1f\x7f]'` over the changed file exits 1 (clean), beyond `check:nul-bytes`. - **No `pnpm lint` narrowing claimed, and no build/test**: this diff compiles nothing and is read by no test. `turbo`'s graph is not consulted because the path is in no package. ## Does this diff owe a changeset of its own? — measured, ⛔ not assumed **No, and adding one would be a defect.** `@objectstack/client`'s published `files[]` is `["dist","README.md","CHANGELOG.md"]`; `.changeset/**` is not in it, and this diff moves no `dist` byte. The published text that *does* move is this very entry — so the amended changeset **is** the release input. A second changeset would emit a second CHANGELOG bullet correcting the first, which is the shape AGENTS.md forbids by name: *"Factual error in a released entry → amend that entry in a dedicated docs-only PR, ⛔ never an erratum in a later entry."* Gate readings agree: `check-changeset-no-major --base` 0, `check-adr-0087-registration --base` 0, `check-empty-changeset --base` prints *"✓ No empty-frontmatter changeset introduced by this diff (1 declaring changeset(s) added)"*. ⛔ `major` does not exist in this launch window and nothing here is breaking. Clause-②: no No key moves, no accept set widens or narrows, no export changes, no error code or `ERROR_CODE_LEDGER` entry moves, and no `packages/spec` path is touched. The diff is prose inside one pending changeset; zero lines of shipped code change. ## ⛔ Reported, not touched: the open Version Packages PR **objectstack-ai#17076 `chore: version packages` is OPEN and already renders this entry** — at its head `1c0ce1713` the changeset is **absent** (contents API `404`, against a `200` positive control on `.changeset/config.json`) and the paragraph is compiled into `packages/client/CHANGELOG.md:506`. ⛔ I did not touch that PR, ran no release, and merged nothing. ⭐ **But an open Version Packages PR does not mean the window has closed, and the dispatch order's reading that it does is falsified by the repo's own workflow.** That branch is a **derived artefact, regenerated from scratch**: - `release.yml`'s `version-pr` job is `if: github.event_name == 'schedule' || (… workflow_dispatch && inputs.refresh_version_pr)` — ⛔ **not** `push`; the file's own note: *"this job regenerates the PR from scratch, so the newest run's result is the one that was wanted anyway"*, and *"renders changesets that are already committed on main, so lateness costs nothing."* - The mechanism, quoted in that file from changesets/action v1: `git reset --hard SHA` → `pnpm run version` → `git push … --force`. - Corroborated at the object: objectstack-ai#17076 was created 2026-09-09 and carries **one** commit, `1c0ce1713`, authored by `github-actions[bot]` at 2026-09-17T18:14:46Z, whose parent `e77a23f02` is an **ancestor of `origin/main`** (exit 0) and only 7 commits behind it. Created eight days before the commit it holds ⇒ force-rebuilt. ⇒ The window closes when a **release consumes** the changeset (AGENTS.md's wording), i.e. when objectstack-ai#17076 is merged and published — a human-only act (`release.yml`: *"TWO LANES, ONE INVARIANT: ONLY A HUMAN PUBLISHES."*). Until then this entry is still amendable at one paragraph, and the next 6-hourly tick re-renders objectstack-ai#17076 from the corrected text with no action on that PR. The deadline is real and this PR is inside it. --- 🤖 Generated with [Claude Code](https://claude.com/claude-code) https://claude.ai/code/session_01DvvamiacK328idtBYJBxV3 --- _Generated by [Claude Code](https://claude.ai/code/session_01DvvamiacK328idtBYJBxV3)_ --- ### Landing note added by the dispatching seat (objectstack-ai#6024) — clearing a red that was the seat's, not this PR's The earlier red on `The card this PR closes must claim this branch` was caused by the **claim comment's shape**, not by anything in this diff: the seat's claim on objectstack-ai#18652 opened `**CLAIM · …**`, and `scripts/check-closing-target-claim.mjs` selects a comment by a line beginning `Claim:` plus a **separate** `Branch:` directive line. Fixed on the card (`5720097499`), measured before and after — `check-clause2-carriers --pair 18765` went from `EXIT=4 / claim.selected: none` to `EXIT=0 / 1 comment(s) in the pool`, both carriers reading `no`. That guard is body- and comment-scoped and re-fires only on a `pull_request` or `merge_group` event, so **this edit is the event that re-judges it** — ⛔ not an empty commit, which the deliverer correctly refused, and ⛔ not a push, since the seat has ruled that all three clauses stay and no further code change is owed.⚠️ The two remaining reds are **by design** and are not touched by this edit: `check-empty-changeset` asks in its own words for a human to confirm the DELIBERATE CORRECTION class, and `pr-automation.yml`'s `changeset-check` counts only **added** changesets (this PR amends one and adds zero). The ruling request is on objectstack-ai#18652 (`5720153848`). ⛔ `skip-changeset` is deliberately NOT applied — it exempts that job wholesale and would silence the refusal that exists to put this decision in front of a person. --- _Generated by [Claude Code](https://claude.ai/code)_ Co-authored-by: Claude <noreply@anthropic.com>
Fixes #18590
Clause-②: no
Rerun Safety(workflow323746634) has been red onmainand the card'sfinding was that it dies in
Test suite — pass 1, so the rerun property itexists to measure has never been measured. The card marked two premises NOT
ESTABLISHED and asked for them to be measured first. Both were. One of them is
refuted, and that is what decided where the fix goes.
Premise 1 — "do all ten failures share one cause?" — REFUTED
The card read only the newest run's log. Reading the whole streak back through
the workflow-scoped runs API and each job's check-run annotations:
The streak is 17 nights, not 10. Last success was
33355711750,2026-08-31. And the failures do not share a cause — not the failing package, not
even the failing step:
@objectstack/cli#testTest timed out in 5000ms@objectstack/verify#testAssertionError@objectstack/plugin-auth#test@objectstack/cli#test@objectstack/core#test,@objectstack/objectql#testTwo consequences the card could not see from one log:
readings the streak contains — the property is not merely unmeasured, it is
intermittently measured, which is worse, because nothing said which nights
were which.
verify'sharness.host-resolution.test.tswasthe killer for six nights and is green on today's
main(verifiedlocally:
Test Files 1 passed (11 tests)). It was fixed, andcliinheritedthe job.
So "get pass 1 green" is not a reachable end state on a trunk that goes red like
any other trunk — it was reached, repeatedly, and the instrument went dark again
each time. That is why the fix is not a fix to whichever test is red tonight.
Premise 2 — "does that file time out outside this workflow?" — the control fired
Run locally on an idle box holding the shared verify lock,
--project integration:Green outside the workflow — but a different leg failed, and it failed the
same way. Re-run with the budget lifted (
--testTimeout=120000), all five passand the true costs are
3000 / 2526 / 2742 / 3599 / 2467ms.⭐ This refines the card's lead rather than confirming it. The card read
"all three legs time out regardless of
NODE_ENV" as the signature of the spawnharness. The sharper reading: all FIVE legs cost 2.5–3.6s against a 5000ms
budget nobody chose, so which legs redden is decided by machine load. In the
workflow the three non-neutralised legs died and both CONTROL legs lived;
locally the reverse happened. Same file, same commit, disjoint casualties — the
casualty list is a function of the runner, not of anything under test.
(The card's own reasoning that this is not about
NODE_ENVstands, and isstrengthened:
NODE_ENVdoes not correlate with the casualties in either run.)What this changes
1. The instrument —
pass 2no longer depends onpass 1being green.github/workflows/rerun-safety-nightly.yml: pass 1 now records its exitcode instead of ending the job with it, pass 2 runs
if: always(), and a newverdict step owns the job's exit status.
scripts/rerun-safety-verdict.mjscompares the two passes' failing task sets andreports, in one line, whether the rerun property was MEASURED and what it
said:
RERUN_SAFERERUN_UNSAFEBASELINE_FLAKYBASELINE_BROKEN— rerun property CLEANRERUN_UNSAFE_ON_BROKEN_BASELINESTALL⛔ Nothing is weakened and nothing is skipped. A red pass 1 still fails the
job, exactly as the workflow header intends. What changed is that a broken trunk
now costs the instrument its baseline instead of its reading — and a
stall is the only remaining state that reports NOT MEASURED, which is the honest
answer for a stall.
The task-set parser reads three spellings because no one of them is sufficient:
turbo's
Failed:footer under-reports (measured on the 2026-09-08 run, itnamed
verifyalone whileplugin-auth,runtimeandclienthad each printedELIFECYCLE in the same run), so the footer, the per-task
ERROR commandline andthe streaming
ELIFECYCLEprefix are unioned.2. The proximate cause — the shadow budget on the named file
packages/cli/test/published-entry-node-env-source-reroute.test.tsnow statesCHILD_BUDGET_MS = 120_000once and hands it to both its ownspawnSyncandeach of its five legs.
⛔ This is not "raise the timeout until it passes", and the card is owed the
argument:
(a) Why it cannot mask a real rerun failure. It raises no bound. The
spawnSyncin this file already declared 120s — chosen, and the same number theother spawning suites in
packages/cli/test/pin (27 of 48 integration-tierfiles here carry an explicit per-test timeout; this one was in the minority that
does not). The child is still killed at exactly 120s. What is removed is a
second, lower, unchosen bound — vitest's 5000ms default — that was shadowing
the chosen one, and that could never have bounded a
spawnSyncanyway, because asynchronous spawn blocks the worker's event loop and vitest cannot interrupt it.
The 5000ms number never bounded anything; it only relabelled a completed slow
spawn as a failure after the fact.
(b) The reading that still discriminates the two. Previously a hung child and
a slow child arrived as the same information-free line —
Error: Test timed out in 5000ms, attributed to theit()and naming nothing about the child. They arenow separated:
runPublishedEntryraises a named error when the child waskilled by its own bound (
error.code === 'ETIMEDOUT'/signal === 'SIGTERM'),carrying the env, the neutralise flag and the elapsed ms, and saying in the
message that this is a hung child rather than a slow one. A slow child stays a
pass whose duration vitest prints, against the five measured costs recorded in
the file's header.
3. The job backstop — a second latent way this instrument goes dark
timeout-minutes: 120→170. The last four green two-pass runs took 74,89, 103 and 115 minutes, so a healthy run was within five minutes of being
killed by its own backstop — and this PR makes pass 2 run on the nights pass 1 is
red, which is exactly when a 115-minute run is likely. ⛔ This is not a stall
budget:
run-with-stall-guardstill declares a stall after 15 minutes of frozenoutput on either pass, so a genuine hang is still caught in 15 minutes and never
at this number.
4. The self-test is wired at PR time, not in the nightly
check:pm-dispatch-gatesrefuses a SCHEDULED-ONLY gate family: everydiscovered family must reach a workflow declaring a PR-time event. Invoking
--self-testfromrerun-safety-nightly.yml(schedule +workflow_dispatchonly) made it this tree's first — the gate caught it, by name. It is wired as
pnpm check:rerun-safety-verdictinlint.ymlinstead.Reverse verification (ablation)
Through
scripts/ablation-replace.mjs, so the mutation's landing and therestore's byte-identity are the tool's own verdict:
Direction as predicted (turns red), and the ablated union falls back to exactly
the under-report the union exists to close.
Verification
Measured at
24f5253ca.pnpm lintrepo-wide —eslint . --no-inline-config, full population, nonarrowing: exit 0.
node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstackderived 92 commands at this HEAD; all run, exit codes recorded and
reconciled with
--ran.node scripts/rerun-safety-verdict.mjs --self-test— 15 batteries, 15registered, exit 0.
packages/clisuite, pluspackages/verify'sharness.host-resolution.test.tsas the premise-1 control.
NOT MEASURED, declared:
main, so no PR can make it red or green.The change is proven by local reproduction and by the ablation above; it is
not verified by the instrument itself and must not be read as if it were.
The first real reading arrives on the first nightly after this lands.
pnpm check:dual-build-cjs-loads— exit 3, PREREQUISITE NOT MET: it readsbuilt output and this tree has no full
pnpm build. Not a pass and not a red.This diff adds no published bytes, so it cannot move that gate.
Cross-face declaration
The claim comment warned that touching vitest tiering configuration would be
a repo-wide shared predicate and therefore a cross-face effect. ⛔ It is not
touched.
packages/cli/vitest-tiers.tsandpackages/cli/vitest.config.tsareboth unmodified. The edited test file keeps both signals that place it
(
node:child_process+ therun.jsentry basename), so it stays in theintegrationtier and no file moves between tiers.Changeset
skip-changeset, measured rather than assumed:@objectstack/cliships["dist", "README.md", "CHANGELOG.md"]—test/is not published; the rootpackage is
private, soscripts/and.github/are not published either. Grepof the built
packages/cli/distfor the symbols this PR introduces(
CHILD_BUDGET_MS,killedByOwnBound,rerun-safety-verdict) returns zerohits, with a positive control (
enableAutoTranspile) hitting three files inthe same grep. No published bytes move.
Acceptance notes
Noted, not filed — none of these is in this card's scope, and each is recorded
here rather than acted on:
@objectstack/core#test×3,@objectstack/objectql#test×1, on 09-01/04/06/07) are real rerun-safetyreadings that were taken and never acted on. Triage ruled explicitly that
the rerun-unsafe tests are not this card's business while the instrument is
mute. With the instrument repaired they will re-report themselves on the next
nightly, attributed, which is the right time to pick them up. Carrier: the
first nightly run after this lands.
packages/cli/test/published-entry-stderr-error-listener.test.tsis the otherspawning file in this directory with no explicit per-test timeout, so it is the
next candidate to redden the same way under load. Not measured here, and not
changed — naming it so the next occurrence is recognised rather than
rediscovered. Carrier: whoever picks up the next
cli#testnightly red.Generated by Claude Code