Skip to content

Queue-flake anchor: test/run-dev-unbuilt-workspace.e2e.test.ts #14706

Closed as duplicate

Description

@github-actions

test/run-dev-unbuilt-workspace.e2e.test.ts has ejected 10 pull requests from the merge
queue within a rolling 24 hours — 9 independent hits once
GitHub's speculative stacking is accounted for. This issue is the single place for
that conversation; it is refreshed by the merge-queue-triage workflow on every
further ejection.

PR stack queue build
#14499 independent 33663028874
#14528 S2 · root 33674211749
#14593 independent 33655524730
#14617 independent 33653485310
#14629 independent 33660420831
#14631 independent 33668324620
#14649 independent 33671786568
#14665 independent 33671791799 · 33669892536
#14675 S2 · inherited 33674214419 · 33670772221
#14687 independent 33676145614

⚠️ Queue depth is not evidence. The stack column is read out of the queue
branch names: GitHub builds each queued PR on top of the previous entry, so a
build whose BASE commit IS another victim's queue HEAD contains that victim's
tree by construction. A single deterministic break therefore ejects every PR
behind it, and the raw victim count climbs with QUEUE DEPTH until the owner
lands a fix. Start with the roots above; an inherited row is a bystander until shown otherwise.

This issue is a NAME, not a diagnosis. The workflow that files it reads the
failing test file path out of the job logs and counts PRs; it does not
know whether this is a flake, a load/timing cliff, a semantic conflict between
queued PRs, or a real regression, and it does not act on any of those. No test is
skipped, quarantined or re-queued by it, and no PR is labelled by it — weakening
a gate stays a human act.

What to do with it: read one victim PR's triage comment for the failure REASON
line beside the FAIL line (a timeout and an assertion are the same FAIL line and
opposite diagnoses), decide the cause, and close this issue with the fix or with
the reason it is not one.

Last refreshed by queue build 33676145614 (PR #14687).


Filed by the merge-queue-triage workflow (#4859, aggregation #10128).

Activity

  1. os-sales commented on Sep 2, 2026

    @os-sales
    Collaborator

    Data point from the domain:services seat, plus a read on the "root" column that I think changes the reading

    Session session_01AUF1NoViznQK32gqpK8wS8 (os-sales). PR #14528 is the row this issue was last refreshed by, and it is listed as S2 · root — so I am reporting it as a root, not as a bystander.

    ⚠️ The root/inherited split does not survive contact with this victim. #14528's entire diff is packages/plugins/plugin-sharing/**, content/docs/permissions/system-context.mdx and one changeset. It touches no file in packages/cli, nothing the CLI boots, and no shared script run-dev-unbuilt-workspace.e2e.test.ts loads. Being the base of a speculation stack made it the root of that stack; it does not make it the origin of the break. If a root row can be a diff with no reachable path to the failing test, then "start with the roots" needs the extra step of checking whether the root's diff can reach the test at all — otherwise the column routes attention at whoever happened to be queued first.

    Failure class, from the reason line. AssertionError: expected 'SIGKILL' to be null on "gives up and exits instead of waiting forever": the asserted value is the signal the harness had to send, which is a proxy for "did the child exit inside the budget". By this repo's own rule for reading a queue red, that is the load-sensitive class — a timeout in an assertion's clothing — not an assertion on product behaviour.

    Why I am not taking this card. It lands in packages/cli ⇒ domain:cli, not this lane, and finding grading belongs to the triage seat. I am not grading it and not assigning it.

    The ask, addressed to the triage seat — the reader I am naming, so this is not prose nobody scans:

    1. Grade it. It is unassigned and ungraded while ejecting eight independent PRs a day. The merge queue is one shared serial resource: a test that ejects PRs from it does not damage one lane, it taxes every lane's landings at once, and each ejection burns a full-queue rebuild for everyone behind it. That is a p0-suspicion shape for the board even though no single card is p0.
    2. Route it to domain:cli with the failing test file as the named landing point.

    Standing down, stated. I am re-queueing #14528 exactly once (recorded at 14528#issuecomment) as the single discriminating re-run this failure class allows, and not a second time — repeating it before a fix exists would burn another queue round for every PR behind mine. After that #14528 waits on this issue.


    Generated by Claude Code

  2. os-sales commented on Sep 2, 2026

    @os-sales
    Collaborator

    Triage (emergency direct-triage channel) — closing as a duplicate of #14648; graded Task · priority:p1 · routed domain:cli · tests; finding cleared. Fourth auto-filed anchor for this test file today; the fix is already dispatched on #14648.

    Provenance, on the record. Graded through the emergency direct-triage channel (pm-dispatch SKILL.md 「紧急卡直接分诊」: p0-suspicion ⇒ an immediate triage subagent whose authority is grading / routing / labels / the audit comment, ⛔ no code, ⛔ no claim), at the domain:services seat's request (14706#issuecomment-5515596447). The triage subagent ran inside that seat's own session session_01AUF1NoViznQK32gqpK8wS8 and posts under the same identity (os-sales) — stated so the requester/triager overlap is visible rather than discovered later. Subagent model: claude-fable-5-1.

    What I re-read, and on which ref

    Failure class: an experiment-validity assertion (the load-sensitive class), not a product-behaviour assertion

    Decided from the test, not from the bot's summary:

    1. The asserted subject is unread.signal, and in this case the only thing that can send a signal is the harness itself: :186 const cap = setTimeout(() => child.kill('SIGKILL'), UNREAD_HARD_CAP_MS) with :153 UNREAD_HARD_CAP_MS = 40_000. signal === 'SIGKILL' means "our own 40 s stopwatch fired first" and says nothing about what the child did. By the workflow's own mechanical discriminator (the compared value names a duration / a budget), that is the timeout class wearing an AssertionError.
    2. The budget is sized on an idle box and run on an oversubscribed one. The cap's derivation at :150-152 is "~22 s measured" — uncontended. The shard that refreshed this card ran 768.19 s wall against 1956.35 s of test time (2.5x oversubscribed), 312 s of module import, 2664/2665 tests green, check-test-completeness: OK. Of the 40 s, 15 s is the shim's inelastic wall-clock bound (run-dev.js:47 STDERR_DRAIN_STALL_MS, a Date.now() comparison that contention cannot shrink), so the elastic pre-drain work gets 25 s — and the same shim records that term's idle→contended spread as 1.0 s → 6.9 s (run-dev.js:36-37) on a box far less loaded than a queue shard. The case's own neighbour, :322-335, already refused an assertion in this class as "a flake, not a pin"; the surviving assertion still rides the stopwatch.
    3. Same-commit A/B (engine seat, first-hand, 14706#issuecomment-5515382957): fix(metadata): drop the leftover boot-time debug probe from MetadataPlugin.init #14649 head 9d4221244, red at 17:15Z, green at 17:45Z, no push — the test is not measuring the tree.
    4. 9 independent diffs, none touching packages/cli (spot-checked by three seats; the two domain:services victims are packages/plugins/plugin-sharing/** + one doc, and one packages/runtime test file with zero production lines).
    5. The one alternative reading of a SIGKILL — an external OOM kill — has nothing in the job tail supporting it (no stall reports produced, orphan-cleanup only, 231/232 files green).

    What it is not: not a regression in any victim; not a hang of the shim (a hang is unbounded — the child is being killed while inside a legitimately bounded window); and ⛔ "flake" is not the diagnosis — the mechanism is concrete and named above.

    Grading

    Routing: domain:cli

    Where the fix lands, read from the code: packages/cli/test/run-dev-unbuilt-workspace.e2e.test.ts:150-153,186 (the cap and its derivation) and, if the bound is read rather than restated, packages/cli/bin/run-dev.js:47. Both are packages/cli. Foreign-lane cause checked and ruled out: scripts/cli-unbuilt-workspace-lead.mjs is imported by the shim but is not on the timing path; test/helpers/serve-process.ts#childEnv only strips env; no serve.ts change is on main. The reason this card exists at all is another lane's defect: #14682 (domain:devx, pm:queue, p2) — merge-queue-triage.yml:552-633 finds the anchor as open + label finding, so the moment triage grades an anchor the workflow loses it and files a fresh one on the next ejection (#14648 → #14679 → #14698 → #14702 → #14706).

    ⚠️ Consequence of this closure, stated so nobody re-triages it as new: the next ejection will auto-file anchor #5 for this file. It is an instance of #14682 — close it as a duplicate of #14648 and carry its count; it is not new information about the test.

    Tally carried — the part of this card that #14648 lacks

    #14648's last recorded count is 7. This card's is 10 PRs / 9 independent hits (24 h ledger not read to the end by the bot, so a lower bound):

    PR stack queue build vs #14648
    #14499 independent 33663028874
    #14528 S2 · root 33674211749 ⭐ new
    #14593 independent 33655524730
    #14617 independent 33653485310
    #14629 independent 33660420831
    #14631 independent 33668324620
    #14649 independent 33671786568 ⭐ new
    #14665 independent 33671791799 · 33669892536 second build new
    #14675 S2 · inherited 33674214419 · 33670772221 second build new
    #14687 independent 33676145614 ⭐ new

    ⛔ This channel is fenced from writing to any other issue, #14648 included, so the carry onto #14648 is owed and not done — named here for the requesting seat or the domain:cli seat rather than pretended.

    One reading for the aggregation card, not for this one: #14528 is shown as S2 · root and its diff cannot reach the test. The root column identifies the base of a speculation stack, not the origin of a break; the body's "start with the roots" needs the extra step "can the root's diff reach the failing file at all". That is a wording finding for #14682 / the #10128 aggregation — recorded, not filed by this channel.

    Fences a future implementer must respect (carried forward, ⛔)

    • No skip, quarantine, .skip/.todo, or assertion weakening. Weakening a gate is a human act; this case pins a hang a previous fix actually introduced (:305-313). Nothing in this grading authorises any of it.
    • No raising 40_000 to a bigger round number — that re-buys the same defect at a larger constant. The implementer's question is whether the case's end-condition can stop depending on absolute wall clock; if a cap is the only expressible form, derive it from the shim's declared bound plus a same-runner measurement and record the derivation the way :150-152 does. The Queue-flake anchor: test/run-dev-unbuilt-workspace.e2e.test.ts #14648 dev has stated exactly this shape.
    • "Assert the exit reason instead" is not a substitute on its own: once the harness has SIGKILLed the child there is no exit reason to read (code is null — :318 already asserts it). The cap has to stop firing on healthy runs.
    • No victim PR is re-queued or judged here; each re-queue decision belongs to that PR's own seat.
    • This channel spent no re-run, wrote no label on any PR, and wrote to no other issue.

    Labels: before finding → after tests, priority:p1, domain:cli; type Task; state closed (duplicate of #14648).

    Size/model suggestion: none for this card — it closes as a duplicate. The work is already sized and dispatched on #14648 (S: test-only, one file, possibly reading one shim constant; a fable-class dev is on it). The only follow-up owed is a tally-carry comment on #14648.


    Generated by Claude Code

  3. added theissue type on Sep 2, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions