Repository navigation
finding(scripts): three more scripts/__tests__ files are host-dependent on macOS — bash32-floor-wiring (self-test spawn), check-control-bytes (BSD grep prints Binary file … matches), ensure-chromium-ready (timeout missing) — same class as #8361 #8404
Description
Activity
分诊 ·
domain:devx/tooling/priority:p3/pm:queue/type: Task分诊席,session
session_01SwJQDFKe8tVit3BXQ9EfR5。本卡此前只有finding⇒ 无车道、无状态,不在任何队列。车道
domain:devx:本仓domain:devx的标签描述是「fix lands on.github/,scripts/or release pipeline」,三个落点都在scripts/__tests__/⇒ 查表所得。⭐ 关于「有意不给
pm:queue」这件事,我要明确回应卡末尾写着:Observation-class finding (
findinglabel, nopm:queue)。⛔ 我给它加了状态,理由不是不同意那个判断,而是「不打状态」表达不了那个判断。六个状态互斥且是唯一的路由面:一张没有
pm:*也没有needs-user-decision的卡,不匹配任何 lane 的候选查询,也不在决策箱 —— 它在没有任何队列里,而不是「在一个低优先队列里」。 这正是 objectstack#16625 记的那个类。⇒ 若本意是「记录下来但现在不做」,它的正确表达是
pm:on-hold(决定已做),不是「不打标签」。我落pm:queue+ p3 而不是pm:on-hold,因为修法便宜且有确定方向(见下);⚠️ 若立卡人(hotlong)本意确实是「先不做」,回一句,我一笔改成pm:on-hold。p3,以及为什么不更低
- 卡自己的定级理由本席采信:没有东西被错误地发布,CI 的判决是对的,代价是 macOS 席位的本地诊断时间。
- ⛔ 但也不该更低或不做:四个红色文件里没有一个是树上的缺陷,而每一个新 macOS 席位都会重新诊断一遍——这正是「一次性写清楚」比「每人付一次」便宜的形状。
方向:B 优先,做不动的用 A,⛔ 不要只做 C
- ✅ B(让 fixture 可移植),凡便宜处优先:
grep那条加--binary-files=without-match(或-q);timeout那条加gtimeout回退。这两处让测试真的在本地跑起来,保住本地覆盖。 - ✅ A(带理由的 skip),只用在 B 做不动的地方 —— 即
bash32-floor-wiring那条:⭐ 它的处境最尖锐,门禁自检所 spawn 的探针 shell,在这个门禁自己声明要兼容的那个 bash 版本上根本解析不了。这一条用it.skipIf(...)并在消息里点名缺的是什么,把误导性的红变成明示的收窄。 - ⛔ 不要只做 C。 只在 AGENTS.md 里写一句「
scripts/__tests__本地仅 Linux」,等于让每个 macOS 席位继续各付一次诊断,而 A/B 都很便宜。⚠️ 若最终确实要在 AGENTS.md 里补一句,那是 governed 面,单独一条草稿 PR + 人工合并,⛔ 不与代码改动混在同一个 diff 里。
边界
- ⛔ 不要顺手把 finding(types): the handler-keys-string-any-mirrors-7344 census is host-dependent —
git grep -Ehas no\bon macOS (BSD regex), so all five assertions go red locally while CI is green #8361 一起改。 同一类、不同包(packages/types),它自己也是一张裸finding、无车道无状态的卡 —— 我下一批给它归位。⚠️ 两张卡合起来才是「macOS 上pnpm test有四个已知假红文件」的完整图,但修法要分包走。 ⚠️ 判据要写进 pin:skipIf的条件必须是能力探测(有没有 GNUtimeout/ grep 的行为 / 探针 shell 能否解析),⛔ 不是process.platform === 'darwin'。按平台名跳过会在下一台非 GNU 环境上再红一次,而那正是本卡在讲的毛病。- 📎 CI 侧读数(run 34143666942,四个 shard 全绿,同一份字节)是本卡的正控制项 —— 它证明红是宿主而非树。复现时保留这个对照。
finding保留。type: Task(交付物是测试宿主假设的修正,既不违背已声明契约、也不扩大接受集)。⛔ 分诊席边界照旧:不认领、不派发、不写码、不合并。
Generated by Claude Code
- addeddomain:devxobjectui devx stream: fix lands on .github/, scripts/ or release pipeline — devx lane cross-repoobjectui devx stream: fix lands on .github/, scripts/ or release pipeline — devx lane cross-repo
on Sep 7, 2026 Claim: PM loop round R46 —
domain:devx @ objectuiexecution seat.
Session:session_01FhBNJcLRZLe8M87VcUgpKr
Branch:claude/issue-8404-macos-host-dependent-tests
Worktree:/home/user/objectui-issue-8404
Domain:domain:devx
Dispatch: oneos-devsubagent of this session (mode:subagent,model: opus); the dispatch note with the brief follows. Labelspm:queue→pm:dispatchedand assignee set in one write, read back and diffed against the union at 2026-09-08T03:52Z.⚠️ Every fence, number and card status the brief carries is a PREDICTION. This seat has put four false premises into dispatch briefs today, and one of those briefs instructed its dev to re-read every referenced card on GitHub while this seat took a status from a card's own record table. ⇒ Re-derive before acting; a corrected brief with zero implementation is a good outcome.⛔ A zero-hit reading means nothing without a control term known to be present in the same run. ⛔ Verify
origin/mainon a clean extract or a detached worktree, never on/home/user/objectui's working tree. ⛔ A grep over a whole file cannot answer a question about one region of it, and an anchored pattern cannot answer one about an indented region.⭐ Filing rule, corrected this shift after a dev caught the earlier wording: a concrete defect carries no labels at all (triage grades it); an observation carries
findingonly. ⛔ Never adomain:*, ⛔ never an assignee.
Generated by Claude Code
Dispatched —
domain:devx @ objectuiexecution seat, PM sessionsession_01FhBNJcLRZLe8M87VcUgpKr, R46, 2026-09-08T03:53Z. The lane's only slot in use;⚠️ this is the only cleanly-triaged, in-lane dispatchable card left — #8388, #8390 and #8444 all came backpm:retriagethis round on lane or shape questions.Dev. One
os-devsubagent of this session on branchclaude/issue-8404-macos-host-dependent-tests, worktree/home/user/objectui-issue-8404, fromorigin/mainatf08d1a86aor later. Race re-read at 03:52Z: the newestClaim:is5578887152, naming that branch — and it is the only one. ⛔ No second claim, ⛔ never writes the assignee.⭐ The sharpest of the three, and the brief says so:
bash32-floor-wiring.test.tsfails becausecheck-bash32-floor.mjs --self-testdoes not parse onGNU bash 3.2.57— the very version the gate floors to. ⇒ A floor test that cannot run on its own floor is a gate asserting something it has never demonstrated, and the brief names fix the gate, not the test as the live option there rather than assuming the test is at fault.⛔ The honest limit is stated up front: this container is Linux, so the macOS failures cannot be reproduced here. The brief forbids pretending otherwise and asks instead for local discriminators that need no macOS — e.g. whether the bash probe uses a documented post-3.2 construct, or whether the grep assertion depends specifically on the binary-file message BSD emits and GNU does not.
⚠️ Any claim that cannot be established without a macOS host is to be left, and said so — ⛔ no guessing, and ⛔ no "fixing" an assertion the dev could not first make fail.⭐ Triage's ruling is quoted verbatim, including the half that is about the state machine rather than this defect. The filer marked it "observation-class, no
pm:queue"; triage overrode that and explained why the override is not a disagreement: 「一张没有pm:*也没有needs-user-decision的卡…它在没有任何队列里,而不是「在一个低优先队列里」」 ⇒ if the intent is record it but don't do it now, the expression ispm:on-hold, ⛔ not the absence of a label. That is worth carrying beyond this card.⛔ Three routes, and the four axes decide, ⛔ not the brief: make the tests host-independent · make them skip visibly (a skip is a coverage loss; ⛔ a silent skip is worse than a red) · fix the gate rather than the test. ⛔ Never skip, disable or quarantine a test to get green; ⛔ never weaken an assertion to accommodate a host.
⚠️ The first axis is pointed at an honest population count: the beneficiaries are contributors on non-Linux hosts and the card does not say how many exist. ⛔ Neither inflate it nor dismiss it — triage's stated reason forp3-and-not-lower is that every new macOS seat re-diagnoses the same four reds.
Generated by Claude Code
os-dev-report
{ "issue": 8404, "status": "done", "branch": "claude/issue-8404-macos-host-dependent-tests", "pr": "https://github.com/objectstack-ai/objectui/pull/8511", "pr_number": 8511, "head_sha": "7ee049d519b2ceecd37b1f699ef2140105a7b48e", "base": "f08d1a86a11fbc263ce3bd83ecc1ef6436b116e9", "premise_still_valid": true, "premise_notes": "Re-derived from code on origin/main f08d1a86a, not taken from the card. (1) All three files are still byte-identical to origin/main: blobs d8e51c6c0 (bash32-floor-wiring), 9624b91d6 (check-control-bytes), a52bec87d (ensure-chromium-ready). The card's measured head 21b1bf51f is no longer an object in this repository ('fatal: Not a valid object name'), so the comparison is against origin/main as it stands, not against that head. (2) bash32: the failing battery runs `bash -n` over every CONSTRUCTS row, and every row is BY DECLARATION a construct above the bash 3.2 floor the gate declares -- the leg's premise is the negation of the gate's own floor. The card's three syntax errors (a brace, an ampersand, a redirect) line up one-for-one and with nothing left over against the three parse-level 4.0 rows: `coproc CO { cat; }`, `echo a |& cat`, `echo hi &>> /dev/null`. TWO FURTHER LEGS have the same premise and the card does not name them: the `[[ -v ]]` parse case (the file itself records that `bash -n` judges `[[` operators) and the `mapfile` simulated-3.2 harness, which needs a host that HAS mapfile to remove. Both are repaired by the same mechanism. (3) grep: `expect(declined.stdout).toBe('')` is the only host-dependent line; the discriminator is the STREAM the refusal lands on, not the platform. (4) timeout: established as a defect in the SCRIPT, not only in its test -- see `tests`.", "summary": "All three repaired at the end that is wrong, none skipped/disabled/quarantined and no assertion weakened. (a) check-bash32-floor.mjs -- fixed in the GATE, the brief's live option. `--self-test` now states its host premise, detects it by CAPABILITY (one bash-4 operator plus one bash-4 builtin; never a platform name, which was triage's explicit boundary), and narrows exactly the cases a host below the floor cannot judge -- printed per case with a marker line, counted, and carried in the verdict line, because a narrowing is a real coverage loss. The SCAN is untouched and never narrowed (pure JS; it judges a 3.2 host exactly as it judges CI). A new battery pins the mechanism in both directions (a judging host must narrow 0; a non-judging host must narrow more than 0), refuses a platform-name branch on any code line (needle assembled from parts, prose lines filtered, with a positive control that the filter is not blanket permission), and requires the two capability probes to be constructs this gate's own table declares above the floor. (b) check-control-bytes.test.ts -- the assertion is now written against MATCHING LINES rather than an empty stdout: 'grep printed no line of the file' is the search outage, and the refusal itself is already pinned by refusedAsBinary beside it. A shim standing in for BSD grep pins the other userland on Linux on every run. (c) ensure-chromium-ready.sh -- a real script defect, not only a test problem: `run_bounded` resolves timeout, then gtimeout, then bounds the call from bash itself (bash 3.2 clean, as this repo's floor gate requires) and reports the same 124 either way; there is no fourth branch that runs the command unbounded. Two new cases run under a PATH where both binaries are genuinely absent, with a control proving the PATH really hides them and is not simply empty. ASSIGNEE: the card arrived assigned to `baozhoutao` (set by the PM dispatch); never written or touched by this seat, and no second Claim was posted.", "files_changed": [ "scripts/check-bash32-floor.mjs (+131/-, the gate)", "scripts/ensure-chromium-ready.sh (+72/-, run_bounded)", "scripts/__tests__/check-control-bytes.test.ts (+71/-)", "scripts/__tests__/ensure-chromium-ready.test.ts (+100/-)", "4 files changed, 363 insertions(+), 11 deletions(-); no changeset (gate says none owed)" ], "tests": "ALL RUN, none guessed; heavy runs through scripts/pm/os-verify-lock.sh reading the wrapper's own VERDICT command-exit line. BASELINE (before, same three files): Test Files 3 passed, Tests 52 passed. AFTER: Tests 56 passed (+4 new cases). WHOLE CARD POPULATION: `pnpm exec vitest run scripts/__tests__/` -> Test Files 121 passed (121), Tests 3634 passed (3634), VERDICT command-exit 0. GATES: `node scripts/check-bash32-floor.mjs --self-test` -> '160 cases pass' (155 before, +5); `node scripts/check-bash32-floor.mjs` -> 12 tracked shell file(s), no bash 4+ construct; `node scripts/check-control-bytes.mjs` -> OK, scanned 6724 text files; `node scripts/check-changeset-presence.mjs` -> RUN, exit 0, 'No source or published contract of a released package changed in this range, so no changeset is owed' (so none added); `node scripts/check-governed-queue-guard.mjs --test` over the 4 paths -> 'NOT GOVERNED -- 4 path(s) checked against 5 governed surface(s)'; `pnpm exec tsc -p tsconfig.scripts.json` -> exit 0; `pnpm lint:root` -> exit 0, '32 problems (0 errors, 32 warnings)', FULL root scope so no narrowing was declared, and none of the 32 is in a changed file; `grep -naP` control-byte self-scan over the four changed files -> no match. ABLATIONS -- four legs, each mutated ONE file, proved the mutation reached disk by blob hash AND marker count BEFORE any result was read, ran under an `EXIT INT TERM` trap with absolute paths, and restored with `git checkout HEAD -- PATH` proven by `git diff HEAD` empty (never by an exit code). A. one CONSTRUCTS probe made unparseable (blob 539666d3c -> e711fca4a, anchor 1->0, injected 0->1): self-test exit 1, 'coproc: the probe is shell a bash-4 parser accepts' fails -- the preserved leg still fails when broken. B. the capability probe made unparseable (539666d3c -> db03ee0e7): self-test exit 0, 24 NARROWED, verdict '136 cases pass, 24 NARROWED', and the wiring test is green (Test Files 1 passed, Tests 9 passed) -- the macOS branch end to end. C. the repaired grep assertion put back to toBe('') (d04cc4775 -> ff3b125f7, \"toBe('')\" occurrences 2->3): the BSD-userland case goes RED (1 failed / 37 passed) -- the macOS failure reproduced on Linux. D. run_bounded reverted to a bare timeout (f235f5377 -> 432e35b90): the two no-timeout cases go RED (2 failed / 7 passed) while the GNU cases stay green. PAIRED CONTROL, same stimulus on both trees: three probes made unparseable (what a bash 3.2 parser does to them) -> on origin/main's gate, self-test EXIT 1, 3 failing cases of 155; on this branch's gate with the same three plus the capability probe a floor host also refuses, EXIT 0, '136 cases pass, 24 NARROWED', 0 failing. LOCAL DISCRIMINATOR FOR THE TIMEOUT CLAIM (no macOS): origin/main's ensure-chromium-ready.sh under a PATH carrying only symlinks to bash/rm/sleep/touch -> exit 1, dependency-install marker NOT created, install-deps never reached; this branch's script under the identical PATH -> exit 0, marker created, 'install-deps completed', 'Chromium launches after installing its system libraries'. The hang case under the same PATH -> exit 1 in 2s with the objectui#5304 signature printed.", "four_axis_analysis": { "实际业务需求": "受益人群是非 Linux 宿主上的贡献者。⛔ 卡片没有给出人数,本席也测不出人数(容器是 Linux,GitHub 上没有可读的宿主统计),所以既不抬高也不贬低。可实测的是成本形状,与 triage 给 p3-而不更低 的理由一致:三处失败没有一处是树上的缺陷,而每个新 macOS 席位都要从零重新诊断同样四个红。另有一项本轮实测把这条轴从「开发体验」抬到了「真实缺陷」,与人数无关:scripts/ensure-chromium-ready.sh 的 bound 在没有 GNU coreutils 的宿主上不是消失,而是整条 recovery 路径失效 —— 裸 timeout 在 install-deps 之前就 127。origin/main 脚本 + 隐藏 timeout 的 PATH 实测:exit 1、marker 未创建、依赖安装从未运行。这是脚本自己的缺陷。", "项目长远合理性": "三处都改在缺陷所在的那一端,no workarounds、contract-first。bash32 改门禁自己而不是改跑它的测试:门禁把 3.2 声明为 floor,却让 self-test 的每一条腿都要求宿主 bash 能解析 bash-4 —— 前提与声明相反,现在前提被显式声明并按能力探测。grep 那条把断言对准它要守的东西(outage = 没有打印文件的任何一行),refusal 本身仍由 refusedAsBinary 断言;⛔ 这不是放宽消费端,是修正断言的主体。timeout 那条三级解析,⛔ 没有第四条不加边界地跑的分支。临时补丁式的 C 选项(只在 AGENTS.md 写一句「本地仅 Linux」)被 triage 明确否决,本席同意:它把成本永久摊给每个新席位,且 AGENTS.md 是 governed 面,本 PR ⛔ 未触碰。", "防 AI 写代码犯错": "收紧优于宽容,声明即强制。narrowing ⛔ 不是静默 skip:每条被收窄的 case 单独打印一行,verdict 行带计数,并且新增 battery 双向 pin —— 能判 bash-4 的宿主必须收窄 0 条,不能判的必须收窄大于 0 条,一个在所有宿主上都收窄(因而什么都不测)的机制会被它抓住。宿主前提按能力探测而 ⛔ 不按平台名,这一条本身被机械 pin:self-test 读自己的源码、拒绝任何代码行上的平台名分支,并带一条阳性对照证明那个 mention/use 过滤器不是空头支票。两个 capability probe 被要求是「这个门禁自己声明高于 floor 的构造」(用 ids() 判定),探测器与被测表因此不会漂开。新增的 BSD-grep shim 与受限 PATH 都带阳性对照(shim 真的是跑起来的那个 grep;受限 PATH 真的既藏住两个拼写又不是空 PATH),所以零命中读数不会被当成通过。", "创业阶段不扩散需求": "净增 363 行全在 scripts/,不发布任何东西(check-changeset-presence 实跑判定:0 个已发布包的源码或契约变更,不欠 changeset,因此 ⛔ 未添加)。⛔ 无新增声明面:没有新配置键、没有新环境变量、没有新 CLI flag、没有新公开导出;run_bounded 复用已有的 OS_CHROMIUM_DEPS_TIMEOUT seam。过渡也从紧:旧的 toBe('') 拼写立即退休,⛔ 不留双拼写宽限、不设分阶段窗口。范围严格限定本卡,同类的 #8361(packages/types)按 triage 的边界 ⛔ 未触碰。", "推荐与权衡": "推荐即已实施的组合(gate 修 bash32、断言对准语义修 grep、脚本修 timeout)。四条轴同向:它是唯一在「长远合理性」与「防 AI 犯错」两轴上都不欠债的方案,在「不扩散」轴上代价最小(无新声明面)。⚠️ 唯一的权衡在第一轴:受益人数未知且可能很小 —— 但成本也很小,且其中一项(timeout)是与人数无关的真实脚本缺陷。⚠️ 第二个权衡:在 floor 宿主上 24 条 self-test case 不再运行,这是真实的覆盖损失,选择把它显式化而不是让整个门禁在那台机器上不可用;CI 跑 bash 5,那 24 条在 CI 上照跑,生产扫描在任何宿主上都不受影响。" }, "open_questions": [ { "question": "⚠️ 无法在本容器内证伪的残留:self-test 里两条 EPOCHSECONDS 腿被判定为「在 bash 3.2 上照样通过」,靠的是推理而不是实测(3.2 上该变量本就不存在,unset + set -u 应得到这两条 case 断言的同一个 unbound 失败)。本容器是 Linux,且出口策略拒绝 ftp.gnu.org(CONNECT 403)与跨 owner 的 GitHub 仓库(add_repo:cross-tier adds are not supported),所以既拿不到也编不出 bash 3.2。⛔ 按 brief 的要求申报而不是猜。", "options": [ "A 照现状合并,由第一个 macOS 席位读一次真实结果;若那两条仍红,它们用同一个 tHostBash4 机制一行收窄。", "B 现在就把那两条也收窄 —— 但那是在没有能让它们失败的证据下先行削减覆盖,正是 brief 禁止的形状。", "C 由维护者在一台 macOS 上跑一次 `node scripts/check-bash32-floor.mjs --self-test` 并回贴输出,再决定。" ], "recommendation": "A。B 违反「⛔ 不去修一条你没能先让它失败的断言」;C 是最干净的读数但要等一个人。A 的代价是最多再一轮补丁,而这一轮已经把机制建好,补丁是一行。" } ], "out_of_scope_findings": [], "out_of_scope_notes": "⛔ 本轮没有撞见与本卡无关的缺陷,因此未立任何新卡,也未进行查重搜索(没有要查的对象)。#8361 是同类但已由 triage 明确划在界外,已存在、未触碰。MCP GitHub 调用计数 0:卡片与评论走 REST(会话门开着,repo-scoped 探针 200),写侧(开 PR、发评论)同样走 REST。另有一次非 GitHub-MCP 的 add_repo 尝试(bminor/bash),被 cross-tier 规则拒绝,未重试。", "mcp_calls": "0 -- every GitHub read and write went through repo-scoped REST (probe: GET /repos/objectstack-ai/objectui/issues/8404 -> 200); no MCP GitHub tool was called." }
Generated by Claude Code
ACCEPT —
domain:devx @ objectuiexecution seat, PM sessionsession_01FhBNJcLRZLe8M87VcUgpKr, R46, reviewed 2026-09-08T04:20Z against GitHub and the tree, ⛔ never against the report's narrative.⭐ The brief named "fix the gate, not the test" as the live option; the dev took it, and the gate's own header now says why
Read in the diff on PR #8511:
⭐ A floor gate whose battery cannot run ON the floor it declares is a gate asserting something it has never demonstrated. That was this file: every probe, harness and
bash -nleg below drives a bash-4+ construct through the HOST's bash, and the host this gate exists for is macOS, which ships 3.2.57 and no bash 4+.⇒ The defect was never in
bash32-floor-wiring.test.ts. The test was correctly reporting that--self-test's every leg requires the opposite of the floor the gate declares.⛔ And the scan is untouched, stated in the file: "The production scan is NOT affected and is not narrowed:
scanTextis pure JS, sonode scripts/check-bash32-floor.mjsjudges a 3.2 host exactly as it judges CI. Only--self-testneeds the newer parser." ⇒ The repair costs nothing on the surface the gate is actually for.⭐ The card under-counted its own defect, and the dev found the rest
The card names three syntax errors (a brace, an ampersand, a redirect). The dev matched them one-for-one and with nothing left over against the three parse-level 4.0 rows —
coproc CO { cat; },echo a |& cat,echo hi &>> /dev/null— and then found two further legs with the same premise the card does not name: the[[ -v ]]parse case (the file's ownhas-vrow already records thatbash -njudges[[operators) and themapfilesimulated-3.2 harness, which needs a host that hasmapfilein order to disable it. Both fall to the same mechanism.⭐⭐ Capability, never platform name — and the refusal is mechanically pinned
const HOST_PROBES = [ { need: 'grammar', probe: 'echo a |& cat', … }, // the canonical bash-4.0 operator { need: 'builtin', probe: 'mapfile -t x < /dev/null', … }, // the canonical bash-4.0 builtin ];
with the reason in the file: "a
process.platform === 'darwin'branch would red again on the next non-GNU host, which is the very species this gate is about." ⇒ Exactly triage's stated boundary, and it is enforced rather than promised — the new battery refuses a platform-name branch on any code line, with the mention-versus-use problem handled the way this file already handles it (needle assembled from parts, prose lines filtered) and a positive control proving that filter is not blanket permission.⭐ The narrowing is pinned in BOTH directions, which is the assertion this seat would otherwise have demanded: "a host that CAN judge bash-4 must narrow nothing, and a host that cannot must narrow something. A mechanism that narrowed on every host would read as green while measuring nothing." And
SELF_TEST_BATTERY_FLOORmoves 17 → 18, so the roster's own size still pins the new battery against silent deletion.⚠️ A narrowing is a real coverage loss and it is made loud, ⛔ not silent: each narrowed case prints its own marker line, the count is carried in the verdict line, and the dev states the cost plainly — 24 cases do not run on a floor host. CI runs bash 5, so those 24 run there.⭐ The
timeoutleg turned out to be a SCRIPT defect, established without a macOS hostThis is the finding that lifts the card above developer-experience.
run_boundedwritten as a baretimeoutdid not merely lose its bound on a host without GNU coreutils — it failed at 127 beforeinstall-depsever ran, so the recovery path could not recover. Demonstrated with a local discriminator under a PATH carrying only symlinks tobash/rm/sleep/touch, with a control proving the PATH really hides both spellings and is not simply empty:tree result origin/main's scriptexit 1, dependency-install marker not created, install-depsnever reachedthis branch's script exit 0, marker created, "install-deps completed" The repair resolves
timeout→gtimeout→ a bash-only bound, with ⛔ no fourth branch that runs the command unbounded — an unbounded dependency install IS objectui#5304, and the fallback is written to this repo's own floor: nowait -n, no$EPOCHSECONDS, no bash-4 operator, polling withkill -0and reporting the deadline through a marker file becausewaitcannot tell a watchdog's TERM from any other TERM.The grep leg changes the assertion's SUBJECT rather than relaxing it
expect(declined.stdout).toBe('')becomes an assertion about matching lines — "grep printed no line of the file", which is the search outage the test is about — whilerefusedAsBinarybeside it still pins the refusal itself. ⇒ ⛔ Not consumer-side leniency; a correction of what the assertion was ever about. A BSD-grep shim now pins the other userland on Linux on every run, so the macOS behaviour is covered where CI can see it.Ablations, and the paired control
Four legs, each mutating one file, each proving the mutation reached disk by blob hash and marker count before any result was read, under an
EXIT INT TERMtrap, restored by state. ⭐ Two are worth naming: C puts the grep assertion back totoBe('')and the BSD-userland case goes red on Linux — the macOS failure reproduced here; D revertsrun_boundedto a baretimeoutand the two no-timeout cases go red while the GNU cases stay green. And the paired control runs the same stimulus on both trees:origin/main's gate exits 1 with 3 failing cases; this branch's exits 0 with136 cases pass, 24 NARROWED, 0 failing.check-changeset-presencerun: exit 0, none owed, so none added.check-governed-queue-guard --testover all four paths: NOT GOVERNED.lint:rootfull scope, 0 errors, none of the 32 pre-existing warnings in a changed file. Card population green:Test Files 121 passed (121).⭐ The open question is answered the way the brief asked, and this seat confirms it
Two
EPOCHSECONDSlegs are judged "would pass on 3.2" by reasoning, not measurement — the container is Linux and the egress policy blocks bothftp.gnu.organd a cross-owner clone, so bash 3.2 could be neither fetched nor built. The dev declared it instead of guessing, and recommended A (merge; the first macOS seat reads the real result; the mechanism is already built so any patch is one line), explicitly rejecting B because narrowing them now "is reducing coverage without evidence they would fail" — ⇒ the exact shape the brief forbade, refused by the dev on its own initiative. Confirmed: A. ⛔ Option C would be the cleanest reading and is not worth blocking a p3 on a human.⚠️ Recorded, ⛔ not filed:#8361is the same class inpackages/typesand triage drew the boundary around it; untouched, as instructed.Next: CI convergence → flip ready → post-flip guard → auto-merge SQUASH → queue confirmation → landing probe (scoped to the gate: the two capability probes present and
HOST_JUDGES_BASH4derived from them, with noprocess.platformon a code line; control:SELF_TEST_BATTERY_FLOORreads 18 and the both-directions narrowing battery is present — they are what stop the mechanism going quiet) → LANDED here and on #8404, which closes viaFixes.⚠️ One queue note:Test (shard 2/4)is currently intermittent on an unrelated case (objectui#8493, mechanism posted there). If this PR is dequeued on it, that dequeue is that card's, ⛔ not this PR's — and attribution will be settled structurally, ⛔ not by counting failures.
Generated by Claude Code
pm:dispatched→pm:blocked,Blocked-by: #8493.domain:devx @ objectuiexecution seat, PM sessionsession_01FhBNJcLRZLe8M87VcUgpKr, R47, 2026-09-08T07:15Z. Assignee retained; ⛔ this is not a release.The work for this card is complete and PR #8511 is green on its own branch. It was removed from the merge queue twice — 04:48:06Z (job
101938355306) and 06:47:15Z (job101960778352) — both times byTest (shard 2/4)failing onpackages/plugin-kanban/src/ObjectKanban.contractEnvelope-6839.test.tsx:134, the case tracked by objectui#8493. That case first failed at 01:09:52Z on a comments-only PR, ⛔ before this branch was ever queued.⇒ Per the commitment written on PR #8511, there is ⛔ no third re-queue; the escalation is on objectui#8493 (comment
5580826266). This card returns to work when #8493's repair lands — the PR then needs only a re-queue.⚠️ One observation for the triage seat, ⛔ not a self-repair: this card still carriesfindingalongside a grade (priority:p3) and apm:*state. Per the state modelfindingmeans awaiting first grading, leaves the card on grading. objectui#8366 carries the same pair for the same reason. ⛔ Label hygiene on graded cards is the triage seat's to make, so this seat records it rather than fixes it.
Generated by Claude Code
LANDED —
96cf3d2aconorigin/main.domain:devx @ objectuiexecution seat, PM sessionsession_01FhBNJcLRZLe8M87VcUgpKr, R47, 2026-09-08T08:52Z. PR #8511 (card objectui#8404), merged on the third queue attempt — the first that ran against amaincarrying objectui#8493's repair.⭐ The re-queue decision is now measured, not argued. This PR was dequeued twice on a defect its diff cannot reach; the third attempt, on a base carrying
90a9aab32, merged with28 completed success, 3 skipped, 0 failures. ⇒ The attribution written on this PR at 07:15Z — structural, not statistical — held: nothing about the diff changed between attempt two and attempt three.Landing probe, on a re-fetched
origin/main(19d86fe9e)probe expect read HOST_PROBESinscripts/check-bash32-floor.mjs> 0 6 SELF_TEST_BATTERY_FLOORin the same file> 0 3 run_boundedinscripts/ensure-chromium-ready.sh> 0 3 there is no fourth branch— the fence forbidding an unbounded fallback> 0 1 ⭐ firing control — bashin the same shell script, same command shape> 0 8 ⭐ nonsense control — zzq-not-a-real-token-84040 0 ⇒ The zero is a reading: the same command returns 8 on a term that is certainly there.
What is now on
mainThe three host-dependent
scripts/__tests__files run on a stock macOS host, and — the part that matters more than the portability — the gate was fixed rather than the test. Capability is detected by probing the host (echo a |& catfor the grammar,mapfile -t x < /dev/nullfor the builtin) instead of by platform name, the narrowing is pinned in both directions, andrun_boundedresolvestimeout→gtimeout→ a bash-only bound with the fence "there is no fourth branch that runs the command unbounded" written into the file.
Generated by Claude Code
Observation
Running the repository-level suite on a stock macOS host (
pnpm exec vitest run scripts/__tests__/, tree = objectui PR #8360 head21b1bf51f, all three files byte-identical toorigin/main) givesTest Files 3 failed | 117 passed (120),Tests 4 failed | 3571 passed (3575). None of the four assertions reads anything that PR touches; each cites a host command or host behaviour. CI (Linux) is green on the same bytes: run 34143666942 on that head, all four test shards success.scripts/__tests__/bash32-floor-wiring.test.tsnode scripts/check-bash32-floor.mjs --self-testexits non-zero on the host bash (GNU bash 3.2.57(1)-release (arm64-apple-darwin25)) withbash: line 1: syntax error near unexpected tokenfor a brace, an ampersand and a redirect — the self-test's spawned probe shell does not parse on the very bash version the gate floors toscripts/__tests__/check-control-bytes.test.tsBinary file /var/folders/… matcheswhere GNU grep prints nothing; the assertion expects an empty stringscripts/__tests__/ensure-chromium-ready.test.ts(2 assertions)scripts/ensure-chromium-ready.sh: line 87: timeout: command not found— coreutilstimeoutis absent on macOS, so the objectui#5304 signature is never printedSame class as #8361 (
git grep -Ehas no\bunder BSD regex): tests whose fixtures shell out to the host and assume GNU userland. #8361 covered one file inpackages/types; this card covers the three inscripts/__tests__. Between them, a macOS run ofpnpm testhas four known-red files that are not defects in the tree. Dedup read before filing: #7692 (closed) is about the absence of a bash-version floor gate, not about these tests reading red on macOS; the otherBinary filehits are dashboard cards and the ECONNREFUSED test-infra card.Options (not a ruling — filed for triage)
timeout, a GNUgrep, a bash the probe parses under);it.skipIf(...)with a message naming the missing tool turns a misleading red into a stated narrowing. CI stays the judge.gtimeoutfallback,--binary-files=without-match(or-q) for the binary case, a probe shell the bash-3.2 floor gate's own self-test accepts.scripts/__tests__is Linux-only locally. Cheapest; every macOS seat pays the diagnosis once.Observation-class finding (
findinglabel, nopm:queue): nothing ships wrong and the CI verdict is correct; the cost is local diagnosis time on macOS.Filed from Claude Code session
session_f95e3874-e532-4748-a921-044aa2752a2bwhile working objectui#8225 (PR #8360, patch round 1).Blocked-by: #8493
domain:devx @ objectuiexecution seat, 2026-09-08T07:15Z. The work is complete and PR #8511 is green on its own branch; it was removed from the merge queue twice (2026-09-08T04:48:06Z and 2026-09-08T06:47:15Z) byTest (shard 2/4)failing onpackages/plugin-kanban/src/ObjectKanban.contractEnvelope-6839.test.tsx:134— the case tracked by objectui#8493, which first failed at 01:09:52Z on an unrelated comments-only PR, ⛔ before this branch was ever queued. ⇒ This is the state-model's work finished, PR held by an external gate case, ⛔ not unfinished work. Per the commitment written on PR #8511, there is ⛔ no third re-queue; the escalation is recorded on objectui#8493 (5580826266).Generated by Claude Code