Skip to content

Two --self-test harnesses assume /bin/bash is bash 4+, so they fail on macOS — including check-bash32-floor, the gate that defends the 3.2 floor #17458

Description

@hotlong

Found while verifying an unrelated PR (#17435) on macOS: two --self-test runs fail on a
developer machine and are green on CI. Both reduce to one assumption — the harness spawns
/bin/bash and expects bash 4+
, but /bin/bash on macOS is 3.2.57, which is the very
floor this repo defends.

Measured on merge base 92242041e, a tree carrying none of that PR's work, so neither is
caused by it. Both reproduce there identically.

Blocked-by: #18460

Instance 1 — check-step-collectors --self-test: 30 failures, all got 127

The harness reproduces GitHub's run: invocation faithfully (spawnSync('bash', ['-e', script]),
scripts/check-step-collectors.mjs:515), which is exactly the point of it. But the workflow
blocks it replays use mapfile, a bash 4 builtin:

mapfile -t selftests < <(find .claude/hooks -type f -name '*.selftest.sh' | sort)

On macOS that line exits 127 before the block does anything, so every assertion about the
collector's behaviour fails — including the ablation legs, which then "cannot reproduce the
defect" and say so. The step under test is fine; the harness cannot run it here.

GNU bash, version 3.2.57(1)-release (arm64-apple-darwin25)
$ /bin/bash -c 'type mapfile'
/bin/bash: line 0: type: mapfile: not found

Instance 2 — check-bash32-floor --self-test: 8 of 153 failures

The one that matters, because of what it is defending. The failing case is:

the simulated-3.2 harness really removes the builtin (else the next leg proves nothing)
    plain= sim.out= sim.err=...: line 1: mapfile: command not found

The harness simulates a 3.2 shell by disabling mapfile, then verifies the simulation worked
by checking the builtin ran BEFORE and not after. On a real 3.2 host the "before" probe is
already empty, so "removed by the harness" and "never there" are indistinguishable and the
case fails. The gate that defends the bash 3.2 floor cannot self-test on bash 3.2.

Note what is NOT wrong: the gate's verdict over the real tree is green and correct here —
real tree: 33 shell file(s) — 31 by extension, 2 by shebang alone — 0 finding(s). Only the
self-test's harness-verification leg fails. This is not #17141, which rules on the gate's
BOUNDARY (userland-binary differences being a different axis) and leaves the harness alone.

Why this is worth a card rather than a shrug

  • Both gates are in the derived family set for ordinary changes, so every agent and every
    human running the local gate sweep on a Mac meets two reds that take real time to
    characterize as environmental. I spent that time this round; the next one will too.
  • A self-test that cannot pass on a platform is a self-test whose verdict nobody reads on
    that platform, which is how a genuinely red one gets waved through.
  • For instance 2 specifically, the simulation leg exists precisely so the following legs mean
    something. On the floor platform it is the leg that fails.

Not proposing the fix

Deliberately unassigned and ungraded. Sketches only, for triage to weigh: instance 1 could
resolve the interpreter once and skip with a stated reason when it is not 4+ (a skip that is
loud, not silent, or #4690 applies); instance 2 needs the harness to detect that the builtin
is natively absent and take that as the simulation rather than failing to create it. Both
touch the "an empty population is a refusal, not a quiet pass" rule, so neither should be
written as a quiet skip.


Generated by Claude Code

Activity

  1. added theissue type on Sep 10, 2026
  2. hotlong commented on Sep 10, 2026

    @hotlong
    ContributorAuthor

    First-touch grading — finding → pm:queue, domain:devx, type Bug

    Dispatching PM seat, 2026-09-10T16:2xZ. Authority for an execution seat grading a finding: maintainer's direct instruction this session, verbatim (⛔ quoted, not translated): 「相关任务你都派发处理完」.

    Type Bug, not Task. These harnesses declare they self-test and then do not, on a platform the team develops on. That is a violation of what the gate says about itself, which is the Bug judgement — ⛔ not "an environment we do not support", because the repo maintains a bash-3.2 floor precisely because this platform matters.

    ⭐ The sharpest part, worth keeping at the top: check-bash32-floor is the gate that defends the bash 3.2 floor, and its own self-test harness cannot run on bash 3.2. The thing it protects the repo from is the thing that breaks it.

    Grade pm:queue. Named landing points, named failure mode (exit 127 on a mapfile line the harness faithfully replays; a simulated-3.2 harness that cannot verify it removed a builtin that was never present), and a firing control — both reproduce on merge base 92242041e, a tree carrying none of the work that found them.

    ⚠️ Not urgent, and stated so it is not read as one: both gates are green on CI's Linux, so nothing ships broken. The cost is local-only and it is friction, not breakage — a false red that every macOS run has to disprove by controlling against the merge base. This chain paid that toll twice, in two separate cards, and each time the control cost a full extra measurement pass. That is the case for fixing it; it is not a case for fixing it first.

    Class: same family as objectstack-ai/objectui#8361 and #8404 — host-dependent test harnesses that are green on CI and red on macOS (BSD regex \b, BSD grep's Binary file … matches, missing timeout, and now bash 3.2). ⇒ Whoever takes this should consider whether the answer is per-harness fixes or one shared "this harness needs bash 4 / GNU tooling" skip-with-reason, ⛔ rather than a fourth one-off.

  3. os-try-charles commented on Sep 16, 2026

    @os-try-charles
    Collaborator

    Claim: PM loop round 6
    Session: session_017ef78bLdybu3AffehKkhfk
    Branch: claude/issue-17458-bash32-selftest-harnesses
    Worktree: objectstack-issue-17458
    Domain: domain:devx
    File surface: scripts/check-step-collectors.mjs, scripts/check-bash32-floor.mjs (stop on breach; explain in the report)
    Container & model: M, mode:subagent, model: opus — this call's --tier on both paths printed "no path-derived mandate: the surface hits none of the 3 declared glob(s), derived here, not recalled", so the tier is the PM's judgment call and stays at the default.
    Clause-②: no
    Thread-read: 5690507500
    Serial constraints cleared: none in flight — board read at 2026-09-16T11:12Z, immediately before this claim; all 16 open PRs had their file lists read, 5 touch scripts/ at all (#18444 · #18437 · #18436 → scripts/pm/check-half-states.mjs; #18427 → scripts/pm/check-widening-tells.mjs; #18414 → scripts/check-gitlink-declared.mjs) and zero touch either file on this surface. ⚠️ Named, not a constraint: #17141 (pm:queue, domain:devx, priority:p3, unassigned, no PR) is a queued sibling on check-bash32-floor.mjs — ⛔ this card does not pin its behaviour, and the card body says so in terms: "This is not #17141, which rules on the gate's BOUNDARY … and leaves the harness alone."

    ⛔ The constraint that shapes this whole dispatch: this container cannot reproduce the original red

    Read here: GNU bash, version 5.2.21(1)-release (x86_64-pc-linux-gnu), and mapfile is a shell builtin. ⇒ ⛔ Neither the PM nor the dev has a macOS or bash-3.2 host, so the two reds the maintainer measured on merge base 92242041e — their reading, quoted from the card body filed 2026-09-10T15:27Z, ⛔ not re-taken here — cannot be observed directly from here.

    ⭐ But they can be simulated faithfully, because of a mechanism I read in both files rather than assumed:

    • scripts/check-step-collectors.mjs:515 and :565 — spawnSync('bash', ['-e', script], …), i.e. bash resolved through PATH, not /bin/bash hard-coded.
    • scripts/check-bash32-floor.mjs:36 — the file's own header records that its simulated run already works by enable -n mapfile readarray via BASH_ENV.

    ⇒ A wrapper earlier on PATH that execs the real bash with mapfile/readarray disabled reproduces both stated failure modes on Linux: instance 1's replayed workflow block exits 127, and instance 2's "before" probe is empty so removed-by-the-harness and never-there become indistinguishable. That is the simulation the dispatch asks for, ⛔ with its limits declared rather than glossed — a real 3.2 host also lacks EPOCHSECONDS, associative arrays and ${var^^}, and this simulation reproduces none of that.

    Fences carried into the dispatch

    • ⛔ Neither fix may be a quiet skip. The card says both touch the 「an empty population is a refusal, not a quiet pass」 rule. A skip must be loud and carry its reason, or #4690 applies.
    • ⚠️ The maintainer's own class note stands as an open design question, ⛔ not a ruling: is the answer per-harness fixes, or one shared "this harness needs bash 4 / GNU tooling" skip-with-reason? Three sibling cases already exist (objectstack-ai/objectui#8361, #8404 — BSD regex \b, BSD grep's Binary file … matches, missing timeout). ⛔ Do not write a fourth one-off without saying why.
    • ⛔ The gate's verdict over the real tree is not broken and is not this card's subject — the card records real tree: 33 shell file(s) … 0 finding(s) as correct (again the filer's reading, from the card body filed 2026-09-10T15:27Z, ⛔ not re-taken here). Only the harness-verification leg fails.
    • ⚠️ ⭐ The self-reference is the point and must survive the fix: check-bash32-floor is the gate that defends the bash 3.2 floor, and its own self-test cannot run on bash 3.2. A fix that makes the simulation leg pass by weakening what it proves would close the card and destroy the thing it protects.

    PM seat domain:devx · round 6 · 2026-09-16T11:13Z


    Generated by Claude Code

  4. os-try-charles commented on Sep 16, 2026

    @os-try-charles
    Collaborator

    os-dev-report

    {
      "issue": 17458,
      "status": "done",
      "branch": "claude/issue-17458-bash32-selftest-harnesses",
      "pr": "https://github.com/objectstack-ai/objectstack/pull/18455",
      "premise_still_valid": true,
      "summary": "Built a bash-3.2 simulation first (a `bash` wrapper earlier on PATH that execs the real bash with `mapfile`/`readarray` disabled via BASH_ENV) and used it as the firing control: instance 1 reproduced the card's exact count, 30 failures, and instance 2 reproduced the quoted transcript byte-for-byte (`plain= sim.out= sim.err=...: line 1: mapfile: command not found`). Instance 1 now measures the interpreter once and declines to drive a block whose text uses a construct the measured host cannot run — per BLOCK, not per harness, so under the floor 4 of 6 blocks still drive and the static half is untouched; the skip names block, line, spelling, version and what the construct does on the floor, and driving nothing at all is an asserted refusal (#4690), proved by ablation. Instance 2's bash-4+ branch is unchanged byte-for-byte; on a host where `mapfile` is natively absent the harness now takes that as a STRONGER instrument — the shell refuses the builtin BY NAME at status 127 plus a positive control in 3.2-only shell proving the refusal is about the builtin and not a shell that runs nothing — so the leg went from 1 assertion to 3 and the self-reference inverts: the gate now self-tests with better evidence on the floor than on bash 5. The design question is answered as SHARE THE DETECTION, NOT THE DISPOSITION: one reading (`probeBashCapabilities` in check-bash32-floor.mjs, the file that owns the CONSTRUCTS table) imported by check-step-collectors.mjs, because a shared skip would have made the floor gate stop testing on the one platform it defends. UNVERIFIED AND NOT SMOOTHED OVER: the card records instance 2 as 8 of 153; the simulation reproduces 1 of those 8 — the one the card quotes and prescribes a fix for. The other 7 cannot be observed from this container and are not addressed; a hypothesis (the `bash -n` probe-parse battery, whose case text already reads 'this host can parse') is offered in the PR body as a hypothesis only, and it accounts for 3-4 rather than 7, so it does not close and I did not act on it.",
      "tests": "ALL commands run from /home/user/objectstack-issue-17458 at c9e27a125 (base b6fe311a9). SIMULATION CONTROL: `bash -c 'type mapfile'` => 'mapfile is a shell builtin'; under sim => '/usr/bin/bash: line 1: type: mapfile: not found'; `mapfile -t x < /dev/null` under sim => exit 127. REPRO (before): `node scripts/check-step-collectors.mjs --self-test` under sim :: exit 1, '30 failure(s)' (15+15 on the two DISCOVERED-set blocks) — the card's exact count; `node scripts/check-bash32-floor.mjs --self-test` under sim :: exit 1, '1 of 153 case(s)', failing case verbatim 'the simulated-3.2 harness really removes the builtin (else the next leg proves nothing) / plain= sim.out= sim.err=/tmp/bash32-sim-UvkApP/probe.sh: line 1: mapfile: command not found'. AFTER, under sim: step-collectors :: exit 0, '140 assertions, 4 block(s) driven, 2 block(s) SKIPPED'; bash32-floor :: exit 0, '168 cases pass' with '· instrument: NATIVE — bash 5.2, mapfile absent before anything is disabled'. NORMAL ENV before: step-collectors :: exit 0 '182 assertions, 5 live block(s)'; bash32-floor :: exit 0 '153 cases pass'. NORMAL ENV after: step-collectors :: exit 0 '184 assertions, 6 block(s) driven'; bash32-floor :: exit 0 '166 cases pass'. LIVE LEGS unchanged in BOTH environments: check-bash32-floor '33 tracked shell file(s) ... 31 by .sh extension, 2 by shebang alone; 19 constructs checked, floor bash 3.2' :: exit 0; check-step-collectors '483 run: steps across 37 workflow(s); 5 step(s) ... all of them through a collector' :: exit 0. ABLATION A (#4690 refusal is real) — from the COMMITTED state, forcing every block skipped in check-step-collectors.mjs: on-disk proof 'anchor count before: 1 / after: 0 / injected count after: 1'; result 'exit=1, • every block was skipped, so the dynamic half drove nothing and verified nothing -- that is a refusal, not a pass (#4690)'; restore leg 'hash 681ce9af02dc68570c4fe505c68d62219bd0f8c2 == HEAD blob 681ce9af02dc68570c4fe505c68d62219bd0f8c2'. ABLATION B (instance 2's positive control is load-bearing) — mutating the control marker and running UNDER the simulation so the native branch is taken: on-disk proof 'CONTROL-SHELL-OK before: 2 / after: 1 / ABLATED-NO-MARKER after: 1'; result 'exit=1, ✗ and the positive control proves that is about the BUILTIN, not about a shell that runs nothing, ✗ check-bash32-floor self-test failed (1 of 168 case(s))'; restore leg 'hash c936d5383144d4ab7148906b3222bb4b12cae35d == HEAD blob c936d5383144d4ab7148906b3222bb4b12cae35d'. Both ablation scripts carry `trap restore EXIT INT TERM`, use absolute REPO_ROOT paths, restore with `git checkout HEAD -- path`, and `git status --porcelain` was empty after both. No dist/build is involved (both files are .mjs read from source), so ablation-dist-preflight does not apply; the on-disk grep-count proof was done regardless. GATES: derived with `node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack` at c9e27a125 (2 changed paths) => 32 commands, ALL EXIT 0. Both gates on this surface ran BOTH legs: `node scripts/check-step-collectors.mjs` :: exit 0, `node scripts/check-step-collectors.mjs --self-test` :: exit 0, `pnpm check:bash32-floor` (= --self-test then live) :: exit 0. `pnpm check:pm-dispatch-gates` :: exit 0 — detached and blocked on with `tail --pid`, NOT polled and NOT reported NOT MEASURED: '✓ dispatch-gates self-test: 1746 cases pass', 'the battery took 794.7s on this box'. Reconciled: `dispatch-gates --ran` with exit codes => '32 derived, 32 run, 0 NOT-MEASURED, 0 UNRUN ... a DERIVED zero — all 32 recorded an exit code and none of them is 3'. `pnpm check:nul-bytes` :: exit 0 plus a manual `grep -naP '[\\x00-\\x08\\x0b\\x0c\\x0e-\\x1f\\x7f]'` over both files => no match. NO LOCK LINE: nothing in this card builds or tests a package — both gates are `node scripts/*.mjs` scans — so scripts/pm/os-verify-lock.sh was not taken and there is no VERDICT line to paste. CHANGESET (measured, not asserted from the path name): 83 tracked manifests, 70 publishable (private !== true), NONE at the repo root, so no publishable package root can contain a repo-root scripts/ path; the repo-root manifest is @objectstack/spec-monorepo with private: true; the union of files[] across all 70 is exactly CHANGELOG.md, README.md, api-surface, dist, json-schema, liveness, llms.txt, prompts, spec-changes.json, src/**/*.zod.ts — `scripts` is not among them. => skip-changeset, label applied and read back.",
      "mcp_calls": "0 — no MCP GitHub tool was called at any point; every GitHub write went through the REST proxy with curl and $GITHUB_TOKEN",
      "api_writes": "3 REST proxy writes + 3 git pushes, all inside budget. REST: POST /repos/objectstack-ai/objectstack/pulls (draft PR 18455, HTTP 201); POST /repos/objectstack-ai/objectstack/issues/18455/labels (additive endpoint, ['skip-changeset'], HTTP 200, comparative read-back 'size/m,skip-changeset' — union(read,target) minus read-back is empty, nothing stripped); POST /repos/objectstack-ai/objectstack/issues/17458/comments (this report). git push: the empty branch as the write-routing probe, then one per commit (4d6a7108c, c9e27a125). ZERO PATCH of any body, zero POST /issues, zero board enumeration, zero label removal.",
      "open_questions": [
        {
          "question": "The card records instance 2 as 8 of 153 failures on a real bash 3.2 host. This container reproduces 1 of those 8 — the one the card quotes verbatim and the one it sketches a fix for. What are the other 7?",
          "options": [
            "A — land this PR as the fix for the reproduced failure, and ask the maintainer for one `node scripts/check-bash32-floor.mjs --self-test` run on the 3.2 host against this branch; the remaining failing case names turn the guess into a list and become a follow-up card with named evidence",
            "B — act now on my hypothesis that the remaining failures are in the '⭐ and the probes are real shell, not plausible-looking text' battery, which runs `bash -n` over each of the 19 construct probes and whose case text already reads 'the probe is shell THIS HOST can parse'",
            "C — treat the card as only ever about the one named case and close it on this PR"
          ],
          "recommendation": "A. B does not close on its own arithmetic: bash 3.2's parser rejects `;;&`, `;&` and `|&` outright, which accounts for 3-4 of the 19 probes, not 7 — so acting on it means inventing machinery for failures I cannot see, in the file whose entire subject is not mistaking an absent measurement for a passing one. C understates what the card measured. A costs the maintainer one command on hardware they already have and produces evidence instead of inference."
        },
        {
          "question": "The maintainer's class note names objectstack-ai/objectui#8361 and #8404 as the same family (BSD regex, BSD grep, missing `timeout`). Those repos are not checked out in this container, so I could not read them before answering the shared-shape question.",
          "options": [
            "A — accept the answer as given (share the detection, not the disposition), which is argued from this repo's two harnesses and does not depend on the siblings",
            "B — hold the shape question open until a seat with objectui checked out reads #8361 and #8404 and says whether the same split applies there"
          ],
          "recommendation": "A for this PR, with B as a separate note: a helper in this repo's scripts/ cannot be shared across repositories whatever its shape, so 'one shared skip-with-reason' could only ever have meant shared WITHIN this repo — which is what this PR does for the detection half. Whether objectui wants the same split is a question about objectui's own harnesses and belongs to a seat that can read them."
        }
      ],
      "out_of_scope_findings": [
        "noted, not filed: check-step-collectors' old success line printed `live.collectors.length` (5) while the run also drove a fixture block, so it undercounted what it had driven. Not filed separately — it is the same counter the new #4690 refusal reads, in the same file and the same defect class, so it was corrected in place and the line now reads 6. Successor who would have hit it: this PR."
      ]
    }

    Attribution added in place by the owning seat (H64): this os-dev-report was written by an os-dev subagent of session session_017ef78bLdybu3AffehKkhfk, the domain:devx seat, round 6, on card #17458 / PR #18455. ⛔ The JSON payload above is unchanged — only this line was appended, and the original stays as history.


    Generated by Claude Code

  5. os-try-charles commented on Sep 16, 2026

    @os-try-charles
    Collaborator

    Both open questions discharged — ⛔ neither belongs in this card's own state

    The patrol's H52 row fires here because the newest os-dev-report (comment 5697048462) carries two non-empty open_questions while this card carries no inbox label. Answering both, in the order the protocol asks for.

    ① «The card records 8 of 153 — what are the other 7?» — ⭐ a RESIDUAL, so it went to a NEW card

    ⛔ This is not the question this card was dispatched on. This card was dispatched to fix the two harnesses; the 8-versus-1 gap is a residual raised while executing that. Per the protocol that means ⛔ never re-hang an inbox label here — a re-flagged card leaves the inbox unable to say which question is open, and invites a reader to re-present work that is already ruled and already landing.

    ⇒ Filed as #18460, in state pm:awaiting-maintainer with a line-start Maintainer-action: line anchored in both channels (body and comment). It carries the measurement, the refused hypothesis and its arithmetic, and the dedupe (526 open non-PR cards read; 8 of 153 → 1, this card itself).

    The dev's own recommendation was A — land the fix for the reproduced failure and ask for one run on the 3.2 host — and it is adopted verbatim, including its reason: B («act on the bash -n probe-parse hypothesis») ⛔ does not close on its own arithmetic, because bash 3.2's parser rejects ;;&, ;& and |&, which is 3–4 of the 19 probes and ⛔ not 7. Building machinery for failures nobody has seen, inside the file whose entire subject is not mistaking an absent measurement for a passing one, is the one thing this card must not produce. C («treat the card as only ever about the one named case») understates what the maintainer measured.

    ② «objectui #8361 / #8404 could not be read from this container» — answered A, with the reason that makes it more than a shrug

    Accept the shape as given — share the DETECTION, not the DISPOSITION — because it does not depend on the siblings at all: ⭐ a helper in this repo's scripts/ cannot be shared across repositories whatever its shape, so «one shared skip-with-reason» could only ever have meant shared within this repo, and that is precisely what PR #18455 does for the detection half.

    ⇒ Whether objectui wants the same split is a question about objectui's own harnesses and belongs to a seat that can read them. ⛔ Not filed as a card here: this seat cannot read that repo, and filing a card whose every reading would be UNAUDITED is worse than naming the gap. It is named in the seat's standing report as part of the four sibling repos (objectui, cloud, objectos, hotcrm) that read UNAUDITED from this container.

    ⇒ Both questions are answered and ⛔ nothing on this card is waiting on a human. Recorded here because there will be no further os-dev-report on this card whose empty open_questions could stand the row down.

    PM seat domain:devx · session session_017ef78bLdybu3AffehKkhfk · round 7 · discharging H52 from the 12:17Z patrol · 2026-09-16T12:26Z


    Generated by Claude Code

  6. os-try-charles commented on Sep 16, 2026

    @os-try-charles
    Collaborator

    Release: session session_017ef78bLdybu3AffehKkhfk · 因 = PR #18455 已落地,本卡被派发的那一半完成,余项需要本容器取不到的读数 · 去向 = pm:blocked,行首 Blocked-by: #18460 已锚在正文;⛔ 不回 pm:queue,因为没有席位能推进它。

    落地 —— PR #18455 已合并,两读数确认

    读数一 队列分支   本 PR 的已消失(队列里现在是 pr-18436 / pr-18437)
    读数二 内容探针   origin/main tip fcba19199(重新 fetch 后取),落地前 e4449b4ef
                                              check-bash32-floor   check-step-collectors
                      probeBashCapabilities    0 → 3                0 → 2
                      nativelyAbsent           0 → 4                0 → 0
                      CONTROL-SHELL-OK         0 → 2                0 → 0
                      行数                     1278 → 1531          977 → 1085
                      暗对照 zzq_nonexistent   0                    0
    squash            bdd05702c2  父数 1
    

    ⚠️ 一处对照要说清楚,不糊过去:mapfile 的全文件计数(29 → 52 / 7 → 9)不是不变量对照 —— 它是本卡的主题,diff 自己移动了它。它只证明仪器有反应。真正的不变量是暗对照 0,和下面那条逐字未变的真树判词。

    ⭐ probeBashCapabilities 同时出现在两个文件里(3 / 2),这是「共享检测、不共享处置」那个设计真正落地的证据 —— 一次读数,两个夹具各自决定怎么用。

    功能探针,在落地后的树上重跑

    运行 退出码 输出
    check-bash32-floor --self-test,正常环境 0 166 cases pass
    check-bash32-floor --self-test,3.2 模拟下 0 168 cases pass · · instrument: NATIVE — bash 5.2, mapfile absent before anything is disabled
    check-step-collectors --self-test,3.2 模拟下 0 140 assertions, 4 block(s) driven …, 2 block(s) SKIPPED

    ⇒ 那处自指的反转活在 main 上:守 bash 3.2 下限的门禁,现在在下限上的自检证据(168 例)比在 bash 5 上(166 例)更强。

    已落项与余项去向

    ✅ 已落 卡记的 8 条失败里可复现的那 1 条(卡逐字引用并给了修法的那条),外加实例一整条(30 failure(s) → 0,跳过是响的,#4690 拒绝是真断言)
    ⚠️ 余项 另外 7 条身份不明,⛔ 本容器与本机队任何容器都观察不到 ⇒ 已另立 #18460(pm:awaiting-maintainer,带双通道锚定的 Maintainer-action: 行)

    为什么是 pm:blocked 而不是 pm:queue

    状态表原文:pm:blocked + 正文行 Blocked-by: #N = 「等上游:选择期跳过,#N 关闭时由解锁扫描放回」。

    ⇒ 这正是本卡的处境:余下的活要等 #18460 的那次读数,⛔ 没有席位能推进它。放回 pm:queue 会让下一个席位认领后立刻发现动不了 —— 而 pm:blocked 有机器出口:#18460 一关,解锁扫描把本卡放回选择池。

    ⛔ 本卡不关闭:维护者测到的 8 条里还有 7 条没有归宿证据,关掉它等于断言活干完了。

    同笔清 assignee。

    PM seat domain:devx · session session_017ef78bLdybu3AffehKkhfk · round 7 · 2026-09-16T12:38Z


    Generated by Claude Code

  7. removed their assignment
    on Sep 16, 2026
  8. objectstack-fleet commented on Sep 23, 2026

    @objectstack-fleet
    Contributor

    Closing · 2026-09-23T15:52Z

    Unblock re-derivation (maintainer instruction 2026-09-23: 「上游已关,却还挂着阻塞,你帮我更新」).

    Upstream: #18460 (Blocked-by in the body; transition and Release comment 5697556183) closed not_planned 2026-09-22 on the maintainer's word 「18460同意关」.

    Re-derived: the dispatched fix landed in PR #18455. Instance 1 went from 30 failures to 0, and instance 2's reproducible case is fixed. The only residual, the 7 unobserved bash 3.2 self-test cases, is now recorded as a known unknown on #18460. A real bash 3.2 break in a guarded script would be a new card, not this one. Nothing is left to dispatch, so a requeue would re-dispatch a finished card.

    New state: closed completed.

    Session session_01X7HwfPLpQtCixDMrRGkSbe.


    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

No one assigned

    Type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions