Repository navigation
Queue-flake anchor: src/plugin-artifact-forward-conversion.test.ts #12859
Description
Activity
定因:这不是 flake,也不是「两个 PR 的共同签名」—— 是 merge queue 批量构建的产物。⛔ 别把它当环境问题等下去,也别隔离那个测试。
由
domain:devxlane PM(sessionsession_01PfaSTikked61BkcsB5Rn69)测,我是本次被弹出的 #12851 的 PM。本卡说自己「是一个名字,不是诊断」并请人定因——下面是定因。关键测量:那个测试文件在 main 上根本不存在
git ls-tree -r --name-only origin/main | grep -i 'artifact-forward' → 无输出 git ls-tree -r --name-only <#12843 head 7eff8966c> | grep -i 'artifact-forward' .changeset/artifact-forward-conversion-door.md packages/metadata-core/src/artifact-forward-conversion.test.ts packages/metadata-core/src/artifact-forward-conversion.ts packages/metadata/src/plugin-artifact-forward-conversion.test.ts ← 就是它⇒
src/plugin-artifact-forward-conversion.test.ts由 #12843 引入,main 上(tipb489d3c72)没有这个文件。所以 #12851 不可能是「第二个弹出它的 PR」
#12851 的 diff 是一个文件、一段注释:
scripts/check-durability-degradation-log-level.mjs,+143 行,零删除、零非注释行(按^[-+]过滤后非注释非空的新增行 = 0)。它碰不到packages/metadata,也不携带那个测试。那个测试之所以在 #12851 的队列构建里跑,只是因为队列把两张 PR 批在一起建。⇒ 表格里的「2 distinct pull requests」是批次共现,不是同一个不稳定测试独立命中两张 PR。一张 PR 拥有它(#12843),另一张是旁观者。
旁证,同一个 head、零改动: #12851 被弹出后重新排队,于 2026-08-28T04:27:04Z 合并,head 仍是
8be6fd1ab。它从来不需要修任何东西。失败原因行指向真实行为,不是负载
按本仓分诊评论自己的判读规则:超时多半是负载,断言才指向行为改变。这次是断言:
AssertionError: expected 'expected "the strict parse must refus…' to match /allowRestore|allowPurge/读 #12843 head 上那个文件,形状对得上(行号为
7eff8966c)::155 expect(firstGrant.allowRestore).toBe(false); // was the residue value :156 firstGrant.allowRestore = true; // ← 改成 NON-default 值 … :165 expect.unreachable('the strict parse must refuse'); } catch (…) { :168 expect(message).toContain('allowRestore'); :169 expect(message).toContain('was removed in @objectstack/spec 17 (#12497, ADR-0049)');
⇒
:165的expect.unreachable触发了 —— 严格解析没有拒绝;它自己的报错文本随后成了:168检查的message,于是报出上面那条断言失败。这是一个确定性的行为不符,重排一万次也不会变绿。⚠️ 一条我没有证实、留给该 PR 主人的线索(⛔ 转述,非测量):main 上第二新的提交1ffee5122(#12845,03:23Z)正是改这块的——「RETIRED 键携带 schema 默认值时不再拒绝、作为惰性残留被剥离;allowRestore/allowPurge: true保持 #12497 的拒绝逐字节不变」。#12843 的 head 已经含有1ffee5122,所以这不是基线陈旧那么简单;两者的交互需要该 PR 的主人自己读。我没有去 root-cause 别人车道的 PR,也没有推任何东西到 #12843。建议的处置
- 本卡的计数应按「拥有该测试的 PR」重算,而不是按批次共现 —— 现在的下界 2 里,只有 feat(metadata): versioned ADR-0087 forward conversion at the artifact-ingestion door #12843 是真实持有者。
⚠️ 卡上已声明 24h 账本没读完,所以那个 2 本来就是下界;这里的更正是方向性的:批量共现会把旁观者算进去,让一个确定性失败看起来像跨 PR flake。 - ⛔ 不要隔离/跳过这个测试,也不要因为「已有汇总 issue」就判定 flaky 实锤——那正是本卡自己警告的误读。
- 归属 feat(metadata): versioned ADR-0087 forward conversion at the artifact-ingestion door #12843。它绿了之后本卡即可带着结论关闭。
⛔ 我不改本卡标签、不改 #12843 的任何东西:那不是本席的车道,也不是本席的文件面。
Generated by Claude Code
- 本卡的计数应按「拥有该测试的 PR」重算,而不是按批次共现 —— 现在的下界 2 里,只有 feat(metadata): versioned ADR-0087 forward conversion at the artifact-ingestion door #12843 是真实持有者。
huangyiirene commented
on Aug 28, 2026 CollaboratorMore actions定级:
Task·tests·domain:engine·pm:queue—— 优先级高于普通队列项,理由是它的代价由全车道共担分诊座位,session
session_01Aujz2zykf5LXt3T98gRsGe。路由(实测,并且第一次测错了)
git ls-tree -r --name-only origin/main | grep plugin-artifact-forward-conversion → packages/metadata/src/plugin-artifact-forward-conversion.test.ts 阳性对照(已知存在的文件):check-governed-merges.mjs → 1 ✅⇒
packages/metadata*按车道表归domain:engine(2026-08-19 合并后,原domain:metadata已退役)。⚠️ 第一次我用git ls-files查,得到零,而我配的"阴性对照"也是零 —— 那不是对照。 真实原因是本地检出陈旧:该文件是新加的,git ls-files读本地索引而非origin/main。⇒ 又一次「陈旧检出把存在读成缺席」,记在这里因为下一个人查这个文件时会踩同一个坑。为什么它不该按普通队列项排
它已经在收税,而且税基是全仓:24 小时内把 3 个不同的 PR 踢出合并队列(#12843 · #12851 · #12855)。每一次弹出都是一次完整的队列重建 + 重跑,代价落在与本卡无关的车道上。
⇒ 建议
domain:engine席把它排在普通队列项之前。⛔ 但我不打优先级标签 —— 常设指令 ④ 明确优先级是读时派生、不落标签。⛔ 硬围栏:修法里有一整类被明令排除
卡自己写了,而它是最容易被违反的那条:
No test is skipped, quarantined or re-queued by it, and no PR is labelled by it — weakening a gate stays a human act.
⇒ ⛔ 不得用
skip/it.skip/describe.skip/ 加进任何 quarantine 清单 / 放宽断言 来让队列变绿。那是门禁削弱,属人工地板,要维护者裁。本卡不授权任何这类动作。
✅ 允许的出口只有两个:修好真因,或给出"它不是缺陷"的理由并据此关卡。第一步已经由卡本身指定,照做即可
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)
⭐ 那句括号是本卡最有价值的一句:超时和断言失败打印同一行 FAIL,诊断却相反。⇒ 派发前必答项就是这一条 —— 先取 REASON,再决定这是 flake、负载/时序悬崖、排队 PR 之间的语义冲突,还是真回归。⛔ 不要跳过它直接猜"又是 flake"。
⚠️ 一条相关性,是线索不是结论三个受害 PR 全部集中在最近数小时,而
packages/metadata-core/src/artifact-forward-conversion.ts与packages/metadata/src/plugin.ts(applyArtifactForwardConversions的两个落点)正是本周 ADR-0087 转换工作的改动面 —— #12772(priority:p0·target:v17)的修复 PR #12843 就是三个受害者之一。⇒ 值得先查的假设:这不是随机 flake,而是转换门刚落地后的时序/语义面。⛔ 但这是假设,不是诊断 —— 我没有读任何一个 PR 的 REASON 行,也没有跑这个测试。定级依据的是文件位置与弹出计数,不是因果。
相关
#12772(p0,转换门)· #12844(同一批字节的第二个未转换读者,
domain:cli)· #12843 / #12851 / #12855(三个受害 PR)· #4859 / #10128(立卡的工作流本身)
Generated by Claude Code
Claim: PM seat for the
domain:enginelane, sessionsession_01LZbWd2jNV1FErXTPSS4Dry. Dispatching to anos-devseat on branchclaude/issue-12859-queue-flake-anchor-artifact-forward.Clause-②: no — self-assessed, not inferred from surface. This card's expected outcome is a measurement and a closure, not a behaviour change: no accept/reject boundary moves and no public surface widens.
⚠️ If the seat finds a real remaining defect and the fix does move a boundary, re-assess and say so in the report rather than carrying this answer forward.⭐ The diagnosis this card asked for already exists — and it says the owner has landed
The card says of itself: "This issue is a NAME, not a diagnosis", and its exit is "decide the cause, and close this issue with the fix or with the reason it is not one." Two seats have since done the deciding, and the owner's fix has landed. Measured on
origin/mainby this PM:git log --oneline origin/main --grep='#12843' 54e2d3692 feat(metadata): versioned ADR-0087 forward conversion at the artifact-ingestion door (#12843) git ls-tree -r --name-only origin/main | grep artifact-forward packages/metadata/src/plugin-artifact-forward-conversion.test.ts ← present packages/metadata-core/src/artifact-forward-conversion.test.ts packages/metadata-core/src/artifact-forward-conversion.ts⇒ #12843 — the PR that owns the test file — has merged. Positive control on the same query shape:
scripts/check-adr-anchors.mjs→ 1 hit, so that is a real read of themaintree.The
domain:devxPM's earlier measurement (comment 5448446021) established the rest: the test file did not exist onmainand was introduced by #12843; the failure was a deterministic assertion (expect.unreachableat:165, not a timeout); and #12851 was a bystander batched into the same queue build — it re-queued unchanged at the same head8be6fd1aband merged. ⇒ the card's "3 distinct pull requests" is batch co-occurrence, not one flaky test hitting three PRs independently.The job, therefore
- Confirm the anchor is dead, by execution, not by inference. Run
packages/metadata/src/plugin-artifact-forward-conversion.test.tsat currentorigin/mainthroughscripts/pm/os-verify-lock.sh, foreground, and read the verdict off the lock's own VERDICT line and vitest's own summary.⚠️ A green run is the reading; "feat(metadata): versioned ADR-0087 forward conversion at the artifact-ingestion door #12843 merged so it must be green" is not — a merge-queue pass is evidence about the queue build, not aboutmainas it stands now. - Check the third victim. Gate: every ROOT_DIR_WATCH_HINTS declaration stays readable as a literal #12855 has not been accounted for by anyone — the devx comment covers feat(metadata): versioned ADR-0087 forward conversion at the artifact-ingestion door #12843 and docs(gate): record the measured triage that parks the parameterless-catch read-seam criterion #12851 only. Determine whether it too was a bystander or something else.
⚠️ Do not assume it mirrors docs(gate): record the measured triage that parks the parameterless-catch read-seam criterion #12851. - Then close Queue-flake anchor: src/plugin-artifact-forward-conversion.test.ts #12859 with the conclusion and the readings, or — if the test is not green at
main— stop and report to this card rather than fixing it, sincepackages/metadatawork would then belong to whoever owns the live defect.
⛔ Hard fences, carried verbatim from the card and triage
The card's own line, which triage restated as the most-likely-violated rule:
No test is skipped, quarantined or re-queued by it, and no PR is labelled by it — weakening a gate stays a human act.
⛔ No
skip/it.skip/describe.skip, no quarantine list, no loosened assertion, no re-queue-to-green. Gate weakening is the manual floor and needs a maintainer ruling — this dispatch does not authorize any of it. The only two exits are: the real cause is fixed, or a stated reason it is not a defect.⛔ Also not this card's: root-causing or pushing to another lane's PR.
⚠️ One stale-checkout trap, recorded because two seats already hit itTriage logged (comment 5449377593) that
git ls-filesreturned zero for this file and their negative control also returned zero — so it was not a control at all. The real cause was a stale local checkout: the file is new, andgit ls-filesreads the local index, notorigin/main. ⇒ Read refs withgit show <ref>:<path>/git ls-tree <ref>, never the working tree, and make every zero-hit a reading by firing a positive control first.
Generated by Claude Code
- Confirm the anchor is dead, by execution, not by inference. Run
Closure: the anchor is dead. Deterministic assertion, owner's fix landed, and both other victims were speculative-stack bystanders.
os-devseat for thedomain:enginelane, dispatched by PM sessionsession_01LZbWd2jNV1FErXTPSS4Dry. No code was written, no branch pushed, no PR opened — this card asked for a measurement and a disposition, and both are below.Clause-②: no (self-assessed, not carried forward from the dispatch). Nothing here moves an accept/reject boundary or widens a public surface: the only artifacts produced are readings and this closure.
1. The test is green at
origin/main— by execution, not by inferenceDedicated worktree at
origin/maintipaef1b7e641e7cead90f35db7cd1e06c46a021944, dependency closure built first (pnpm --filter '@objectstack/metadata...' build— lockVERDICT command-exit 0), so nothing below is read off a staledist.The file this anchor names:
scripts/pm/os-verify-lock.sh -c "pnpm --filter @objectstack/metadata exec vitest run --maxWorkers=2 src/plugin-artifact-forward-conversion.test.ts" RUN v4.1.10 packages/metadata Test Files 1 passed (1) Tests 6 passed (6) os-verify-lock: VERDICT command-exit 0 · held the lock 12s · waited 0sAnd its whole package, which is what the queue build actually ran:
scripts/pm/os-verify-lock.sh -c "pnpm --filter @objectstack/metadata exec vitest run --maxWorkers=2" Test Files 36 passed (36) Tests 665 passed (665) os-verify-lock: VERDICT command-exit 0 · held the lock 34s · waited 307sSet against the ejecting build's own summary —
Test Files 1 failed | 35 passed (36)/Tests 1 failed | 663 passed (664).
2. The REASON line, read first-hand from the job log
From #12843's own queue build 33140380738, job
Test Core (2/6)— the card's first instruction was to get this line, so here it is unabridged:FAIL src/plugin-artifact-forward-conversion.test.ts > artifact door — the conversion is versioned, not a blanket amnesty (#12772) > an artifact claiming the CURRENT spec version with the same keys still refuses with the tombstone AssertionError: expected 'expected "the strict parse must refus…' to match /allowRestore|allowPurge/ - Expected: /allowRestore|allowPurge/ + Received: "expected \"the strict parse must refuse\" not to be reached" ❯ src/plugin-artifact-forward-conversion.test.ts:144:29 142| } catch (e: any) { 143| const message = String(e?.message ?? e); 144| expect(message).toMatch(/allowRestore|allowPurge/);⇒ An assertion, not a timeout — the two the card warns print the same FAIL line and mean opposite things.
expect.unreachable('the strict parse must refuse')fired because the strict parse did not refuse; its own message was then caught asmessageand failed thetoMatchon the next line. Re-queueing this would never have gone green, which is precisely why it took three PRs down with it.
3. Why three PRs: speculative stacking, not flakiness — and not batching either
The queue branch names carry the stack, each suffix naming the base it was speculatively built on:
queue build head_branchstacked on conclusion 33140380738 (#12843) gh-readonly-queue/main/pr-12843-b489d3c725…b489d3c72=maintipfailure 33141029941 (#12851) gh-readonly-queue/main/pr-12851-e875b2f185…e875b2f18= #12843's queue headfailure 33141213420 (#12855) gh-readonly-queue/main/pr-12855-e391b5fb14…e391b5fb14= #12851's queue headfailure So #12843's broken test was physically present in all three trees. Measured directly, contents-at-ref, with a positive control on every row so a 404 is a real read of a real tree and not a stale-checkout zero:
ref plugin-artifact-forward-conversion.test.tscontrol check-adr-anchors.mjsb489d3c72—mainbefore the queue404 200 e875b2f18— #12843 queue head200 200 e391b5fb1— #12851 queue head200 200 1a24e9778— #12855 queue head200 200 aef1b7e64—mainnow200 200 That is both controls this card's stale-checkout note asked for: a positive control on every row, and the marker genuinely absent on an earlier ref, so its presence is specific to the stack rather than ambient.
⚠️ One refinement to the earlier account. Comment 5448446021 read this as the queue "batching two PRs into one build". The runs say otherwise: three separate builds, each stacked on the previous one's head. The consequence is identical — a PR ahead of you ejects you — but the distinction matters for how this anchor's counter should be read. Under stacking, every PR queued behind a broken one inherits the break, so the count tracks queue depth, not flakiness. A deterministic single-owner failure will keep manufacturing "distinct PRs" for as long as the queue is deep.#12855 specifically — nobody had accounted for it
Its own build 33141213420, job
Test Core (2/6), contains exactly one FAIL in the entire log, and it is the inherited one:⎯⎯⎯⎯⎯⎯⎯ Failed Tests 1 ⎯⎯⎯⎯⎯⎯⎯ AssertionError: expected 'expected "the strict parse must refus…' to match /allowRestore|allowPurge/ Test Files 1 failed | 35 passed (36) ::error file=…/packages/metadata/src/plugin-artifact-forward-conversion.test.ts#12855's own diff is 3 files, +370/−0 —
.github/workflows/lint.yml,package.json,scripts/check-watch-hint-literal.mjs— and zero files underpackages/. Its head never moved after the ejection: last commite839a14a8at 03:53:04Z, before its queue build even started (04:13:57Z), and it merged unchanged at 04:27:04Z — the same second as #12851.⇒ #12855 is a bystander, like #12851. Measured independently rather than assumed to mirror it, as the dispatch required.
4. The fix, and who made it
#12843's commits either side of its 04:14:59Z ejection:
b02ec8148 03:35:18Z chore(runtime): classify the metadata-core mirror's notice-code literal … ← the tree the queue actually built f4a6b0cf3 04:17:20Z Merge remote-tracking branch 'origin/main' … 7eff8966c 04:26:31Z test(metadata): re-aim the refuse-direction pin at the surviving refusal surface under the #12845 …The pin that failed asserted that a retired key at the current spec version refuses. The #12845 ruling (maintainer, 2026-08-28) had just narrowed that boundary underneath it: only a non-default retired value still refuses, while the emitted default parses as inert residue stripped silently at the schema layer.
7eff8966cre-aimed the pin at the surviving refusal surface and split direction two in half — the file goes 189 → 244 lines and gains one test, which is exactly the 664 → 665 between the queue build's count and today's. #12843 merged 06:13:41Z as54e2d3692.⇒ Cause: a deterministic assertion owned by #12843, produced by a boundary that moved under it mid-flight, and fixed on that PR before it landed. Not a flake, not a load/timing cliff, not a semantic conflict between queued PRs, and not a live regression on
main.No further ejection has been recorded: the body's own last-refreshed line still names build 33141213420, and the triage workflow rewrites that line on every ejection.
5. Disposition
Closing — the card's first exit: the real cause was found and its fix has landed.
⛔ Fences honoured, stated explicitly because the card and triage both flagged them as the most-likely-violated rule here: nothing was skipped, quarantined, re-queued, loosened or labelled. No
skip/it.skip/describe.skip, no quarantine entry, no assertion touched, no PR labelled, and nothing pushed to #12843, #12851 or #12855. Gate weakening remains a human act and was not needed.⚠️ Not measured, so not claimed:packages/metadata-core/src/artifact-forward-conversion.test.tsis a different package and not this anchor's signature — I did not run it. Separately,mainis currently red onpnpm check:adr-anchors(#12913, fix in flight as #12917); unrelated to this card, untouched, and it does not touch the vitest runs above.
Generated by Claude Code
Generated by Claude Code
os-dev-report
{ "issue": 12859, "status": "done", "branch": null, "pr": null, "premise_still_valid": true, "clause_2": "no — self-assessed, agreeing with the dispatch's expectation. Nothing produced here moves an accept/reject boundary or widens a public surface: no code was written, no test touched, no gate altered. The deliverables are readings, a closure, and one unassigned finding issue.", "summary": "No code was needed and none was written. The anchor is dead. (1) The named test is green at current origin/main by execution: 1 file / 6 tests, and its whole package 36 files / 665 tests, both under the shared verify lock. (2) The cause was a deterministic assertion, not a timeout, owned solely by #12843 — expect.unreachable('the strict parse must refuse') fired at :144 because the #12845 ruling (maintainer, 2026-08-28) had narrowed the retired-key refusal boundary under it; #12843's own commit 7eff8966c re-aimed the pin and the PR merged as 54e2d3692. (3) #12855, which nobody had accounted for, is a bystander — measured independently, not assumed to mirror #12851. Its own queue build's single FAIL is the inherited metadata assertion, its diff touches zero files under packages/, its head never moved after the ejection, and it merged unchanged. Mechanism refinement over the earlier record: this is GitHub speculative STACKING, not one batched build — three separate builds, each stacked on the previous one's head. #12859 closed as completed with the full readings.", "step_1_execution_readings": { "ref": "origin/main tip aef1b7e641e7cead90f35db7cd1e06c46a021944", "worktree": "/home/user/objectstack-12859 (dedicated, removed at teardown)", "prerequisite_build": "pnpm --filter '@objectstack/metadata...' build -> os-verify-lock: VERDICT command-exit 0 · held the lock 291s (4m51s) · waited 0s (deps built first so nothing is read off a stale dist)", "named_file_run": { "command": "scripts/pm/os-verify-lock.sh -c \"pnpm --filter @objectstack/metadata exec vitest run --maxWorkers=2 src/plugin-artifact-forward-conversion.test.ts\"", "lock_verdict_line": "os-verify-lock: VERDICT command-exit 0 · held the lock 12s · waited 0s", "vitest_summary_lines": [ "Test Files 1 passed (1)", "Tests 6 passed (6)" ], "zero_match_check": "not a zero-match run — 'Test Files 1 passed (1)' confirms the pattern matched the intended file" }, "whole_package_run": { "command": "scripts/pm/os-verify-lock.sh -c \"pnpm --filter @objectstack/metadata exec vitest run --maxWorkers=2\"", "lock_verdict_line": "os-verify-lock: VERDICT command-exit 0 · held the lock 34s · waited 307s (5m07s)", "vitest_summary_lines": [ "Test Files 36 passed (36)", "Tests 665 passed (665)" ], "contrast_with_ejecting_build": "the queue build's own summary was 'Test Files 1 failed | 35 passed (36)' / 'Tests 1 failed | 663 passed (664)'; the 664->665 delta is the test #12843's fix commit added" }, "conclusion": "GREEN at main by execution. The 'merged, therefore green' inference was not relied on." }, "step_2_pr_12855_finding": { "verdict": "bystander — ejected by speculative-stack inheritance, not by anything it did", "measured_independently": true, "its_own_diff": "3 files, +370/-0: .github/workflows/lint.yml, package.json, scripts/check-watch-hint-literal.mjs — zero files under packages/", "its_queue_build": "33141213420, branch gh-readonly-queue/main/pr-12855-e391b5fb14... — stacked on #12851's queue head, itself stacked on #12843's queue head e875b2f18", "its_only_failure": "job Test Core (2/6) (98752304135) contains exactly ONE FAIL in the whole log: AssertionError: expected 'expected \"the strict parse must refus...' to match /allowRestore|allowPurge/ in packages/metadata/src/plugin-artifact-forward-conversion.test.ts", "head_never_moved": "last commit e839a14a8 at 03:53:04Z — before its queue build even started (04:13:57Z); merged UNCHANGED at 04:27:04Z, the same second as #12851", "file_presence_control": "contents-at-ref with positive control scripts/check-adr-anchors.mjs=200 on every row: test file 404 at b489d3c72 (main before the queue), 200 at all three queue heads and at main now — so the 404 is a real read and the marker is specific to the stack", "refinement_to_prior_record": "comment 5448446021 read this as 'the queue batching two PRs into one build'. The runs say speculative STACKING: three separate builds, each on the previous one's head. Same consequence, different mechanism — and it matters, because stacking means the distinct-PR count tracks queue depth rather than flakiness." }, "step_3_disposition": { "taken": "closed #12859 as completed", "exit_used": "the card's first exit — the real cause was found and its fix has landed", "closure_comment": "https://github.com/objectstack-ai/objectstack/issues/12859#issuecomment-5450893008", "cause_recorded": "deterministic assertion owned by #12843 (expect.unreachable at :144, first-hand from job log 98749725731), caused by the #12845 boundary moving under the pin mid-flight, fixed by #12843's commit 7eff8966c and merged as 54e2d3692; #12851 and #12855 were speculative-stack bystanders", "fences_honoured": "nothing skipped, quarantined, re-queued, loosened or labelled; no skip/it.skip/describe.skip, no quarantine entry, no assertion touched, no PR labelled, nothing pushed to #12843 / #12851 / #12855; packages/spec untouched; content/docs/releases/ untouched" }, "tests": "All runs at origin/main tip aef1b7e641e7cead90f35db7cd1e06c46a021944 in a dedicated worktree, every heavy run through scripts/pm/os-verify-lock.sh in the foreground, verdicts read off the lock's own VERDICT line and vitest's own summary (never a bare $?; exit code captured before any pipe). (1) deps: pnpm --filter '@objectstack/metadata...' build -> VERDICT command-exit 0. (2) the anchor's file: vitest run src/plugin-artifact-forward-conversion.test.ts -> VERDICT command-exit 0, 'Test Files 1 passed (1)' / 'Tests 6 passed (6)'. (3) the whole package, matching what the queue build ran: -> VERDICT command-exit 0, 'Test Files 36 passed (36)' / 'Tests 665 passed (665)'. No prerequisite refusal, no 124/143 timeout, no zero-match filter run. NOT MEASURED, so not claimed: packages/metadata-core/src/artifact-forward-conversion.test.ts (a different package, not this anchor's signature) was not run. No ablation applies — nothing was mutated.", "mcp_calls": "0 — the whole run went through git plus repo-scoped REST (probe returned 200 from this seat); no MCP GitHub calls were made, reads or writes", "open_questions": [], "out_of_scope_findings": [ "filed as #12933 (unassigned, label `finding` only, no pm:queue): merge-queue-triage counts speculative-stack inheritance as 'distinct pull requests', so a deterministic single-owner failure manufactures victims in proportion to queue depth — searched all 343 open issues first (positive control: 'queue-flake' returned #12859), nothing existing covered it; #4859 and #10128 are both closed, so a standalone finding with back-links was the right home" ], "notes": [ "Deliberate, declared deviation from the standing 'push the empty branch first' rule: the dispatch scoped the branch as conditional ('only if you end up needing one') and this card produced no commits. A worktree was created on claude/issue-12859-queue-flake-anchor-artifact-forward solely to run the test at origin/main; it carries zero commits, was never pushed, and was removed at teardown. Reporting branch: null because nothing exists on the remote.", "main is separately red on pnpm check:adr-anchors (#12913, fix in flight as #12917) — flagged by the dispatch as not this card's, not touched, and it does not affect the vitest runs above." ] }
Generated by Claude Code
src/plugin-artifact-forward-conversion.test.tshas ejected 3 distinct pull requests from the merge queuewithin a rolling 24 hours. This issue is the single place for that conversation;
it is refreshed by the merge-queue-triage workflow on every further ejection.
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 distinct 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 33141213420 (PR #12855).
Filed by the merge-queue-triage workflow (#4859, aggregation #10128).