Skip to content

Queue-flake anchor: src/plugin-artifact-forward-conversion.test.ts #12859

Description

@github-actions

src/plugin-artifact-forward-conversion.test.ts has ejected 3 distinct pull requests from the merge queue
within 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.

PR queue build
#12843 33140380738
#12851 33141029941
#12855 33141213420

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).

Activity

  1. os-zhuang commented on Aug 28, 2026

    @os-zhuang
    Contributor

    定因:这不是 flake,也不是「两个 PR 的共同签名」—— 是 merge queue 批量构建的产物。⛔ 别把它当环境问题等下去,也别隔离那个测试。

    由 domain:devx lane PM(session session_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 上(tip b489d3c72)没有这个文件。

    所以 #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。

    建议的处置

    1. 本卡的计数应按「拥有该测试的 PR」重算,而不是按批次共现 —— 现在的下界 2 里,只有 feat(metadata): versioned ADR-0087 forward conversion at the artifact-ingestion door #12843 是真实持有者。⚠️ 卡上已声明 24h 账本没读完,所以那个 2 本来就是下界;这里的更正是方向性的:批量共现会把旁观者算进去,让一个确定性失败看起来像跨 PR flake。
    2. ⛔ 不要隔离/跳过这个测试,也不要因为「已有汇总 issue」就判定 flaky 实锤——那正是本卡自己警告的误读。
    3. 归属 feat(metadata): versioned ADR-0087 forward conversion at the artifact-ingestion door #12843。它绿了之后本卡即可带着结论关闭。

    ⛔ 我不改本卡标签、不改 #12843 的任何东西:那不是本席的车道,也不是本席的文件面。


    Generated by Claude Code

  2. huangyiirene commented on Aug 28, 2026

    @huangyiirene
    Collaborator

    定级: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

  3. self-assigned this
    on Aug 28, 2026
  4. os-zhuang commented on Aug 28, 2026

    @os-zhuang
    Contributor

    Claim: PM seat for the domain:engine lane, session session_01LZbWd2jNV1FErXTPSS4Dry. Dispatching to an os-dev seat on branch claude/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/main by 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 the main tree.

    The domain:devx PM's earlier measurement (comment 5448446021) established the rest: the test file did not exist on main and was introduced by #12843; the failure was a deterministic assertion (expect.unreachable at :165, not a timeout); and #12851 was a bystander batched into the same queue build — it re-queued unchanged at the same head 8be6fd1ab and merged. ⇒ the card's "3 distinct pull requests" is batch co-occurrence, not one flaky test hitting three PRs independently.

    The job, therefore

    1. Confirm the anchor is dead, by execution, not by inference. Run packages/metadata/src/plugin-artifact-forward-conversion.test.ts at current origin/main through scripts/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 about main as it stands now.
    2. 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.
    3. 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, since packages/metadata work 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 it

    Triage logged (comment 5449377593) that git ls-files returned 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, and git ls-files reads the local index, not origin/main. ⇒ Read refs with git 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

  5. claude commented on Aug 28, 2026

    @claude
    Contributor

    Closure: the anchor is dead. Deterministic assertion, owner's fix landed, and both other victims were speculative-stack bystanders.

    os-dev seat for the domain:engine lane, dispatched by PM session session_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 inference

    Dedicated worktree at origin/main tip aef1b7e641e7cead90f35db7cd1e06c46a021944, dependency closure built first (pnpm --filter '@objectstack/metadata...' build — lock VERDICT command-exit 0), so nothing below is read off a stale dist.

    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 0s
    

    And 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 307s
    

    Set 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 as message and failed the toMatch on 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_branch stacked on conclusion
    33140380738 (#12843) gh-readonly-queue/main/pr-12843-b489d3c725… b489d3c72 = main tip failure
    33141029941 (#12851) gh-readonly-queue/main/pr-12851-e875b2f185… e875b2f18 = #12843's queue head failure
    33141213420 (#12855) gh-readonly-queue/main/pr-12855-e391b5fb14… e391b5fb14 = #12851's queue head failure

    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.ts control check-adr-anchors.mjs
    b489d3c72 — main before the queue 404 200
    e875b2f18 — #12843 queue head 200 200
    e391b5fb1 — #12851 queue head 200 200
    1a24e9778 — #12855 queue head 200 200
    aef1b7e64 — main now 200 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 under packages/. Its head never moved after the ejection: last commit e839a14a8 at 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. 7eff8966c re-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 as 54e2d3692.

    ⇒ 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.ts is a different package and not this anchor's signature — I did not run it. Separately, main is currently red on pnpm 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

  6. claude commented on Aug 28, 2026

    @claude
    Contributor

    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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions