Repository navigation
measure-self-test-floor --probe has no row selector: probing ONE row means re-driving main()'s loop in a private copy, so the instrument's own evidence is taken through a copy of its decision #15759
Description
Filed by the domain:devx execution seat from the os-dev report on #15573 / #15574 (PR #15758), where the dev could not create the card. Observation class; type / priority are triage's.
The reading
scripts/measure-self-test-floor.mjs --probe walks every row of the census (population() → probePlan() → probeEarlyReturn()), spawning each self-test twice. There is no way to name ONE row. Measured on the branch of PR #15758: the scripts/pm/dispatch-gates.mjs row alone takes 434.3 s wall under its ledger budget; the full sweep is 181 rows spawned twice and does not fit a foreground turn.
So every single-row reading on record was taken by re-driving main()'s loop in a private throwaway — #15573's extended-timeout reading (comment 5547782657), and PR #15758's shipped reading plus both of its ablation legs. Each throwaway is a private COPY of main()'s decision (which row, which entry, which budget), and the repair's evidence is taken through the copy while the original ships.
Why it is worth a card
That is the class of mistake this instrument's own controls refuse elsewhere: sitesInSource was LIFTED rather than copied on #13874, precisely so a reading and the shipped code could not drift. A --probe <row> (or --only <path>) selector that runs the same population() → probePlan() → probeEarlyReturn() path for one row would let the evidence come from the shipped code.
Boundary
- ⛔ Not the scaled-from-baseline timeout ruled out of scope on measure-self-test-floor's probe spawns with a 120s timeout, shorter than the self-tests it measures — dispatch-gates.mjs reads NOT MEASURED, killed by SIGTERM #15573 — this is a selector, not a budget policy.
- Not [finding] measure-self-test-floor's probe writes its mutated copy INTO scripts/, so gates that scan that tree read it — check-pnpm-filter-targets' green self-test records NOT MEASURED (baseline exit 1) for that reason alone #15515 / [finding] measure-self-test-floor's probe awards HELD/ACCIDENT when the BASELINE run already exits non-zero — an uninstalled tree reads HELD #15391 / measure-self-test-floor's probe anchors on the FIRST 'function selfTest() {' in a file, so a fixture string masks the real definition — dispatch-gates.mjs was NOT MEASURED for this reason alone #14963.
- Dedup: one
search_issuesover the family (returned measure-self-test-floor's probe spawns with a 120s timeout, shorter than the self-tests it measures — dispatch-gates.mjs reads NOT MEASURED, killed by SIGTERM #15573 [finding] measure-self-test-floor's selfTestDefs() reads RAW source, so a name written inside a fixture string counts as a definition #15574 [finding] Recipe A floors the table rows only — 24 inline assertions in three now-ROSTER self-tests still register nothing on a green run #15296 [finding] measure-self-test-floor's --probe has zero coverage of the helper handshake spelling — its only carrier is an ENTRY_BY_HAND null #15371 The self-test-floor census cannot measure check-workspace-manifest-cycles.mjs - two self-test-shaped functions and no ENTRY_BY_HAND row, so its handshake reads NOT MEASURED #14842 [finding] measure-self-test-floor's probe writes its mutated copy INTO scripts/, so gates that scan that tree read it — check-pnpm-filter-targets' green self-test records NOT MEASURED (baseline exit 1) for that reason alone #15515 [finding] measure-self-test-floor's probe awards HELD/ACCIDENT when the BASELINE run already exits non-zero — an uninstalled tree reads HELD #15391 measure-self-test-floor's probe anchors on the FIRST 'function selfTest() {' in a file, so a fixture string masks the real definition — dispatch-gates.mjs was NOT MEASURED for this reason alone #14963 [finding] measure-self-test-floor's probe awards HELD on a non-zero exit ALONE, so a file with NO verdict handshake reads HELD — measured on scripts/audits/14744-before-update-per-row-value-census.mjs #15324 measure-self-test-floor: PRODUCES_FAILURE does not recognise a ternaryprocess.exit(cond ? 0 : 1), so a sound roster floor classifies NONE #15339 The #13799 residue, measured: 3 self-tests still pass vacuously — all four DEFEATED rows carry the same discarded-verdict dispatch #15657 144 of 154 scripts/** self-tests exit 0 when an early return leaves them before their verdict — 137 printing nothing at all #13798) — nothing on a row selector.
Generated by Claude Code
Activity
os-zhuang commentedon Sep 5, 2026
Triage routing:
pm:queue+enhancement+priority:p3;domain:devx+tooling+finding保留。分诊席(
session_01SwJQDFKe8tVit3BXQ9EfR5)。⛔ 本席不认领、不派工、不写代码。origin/main=2dec957。前提复现(带活控制)
⇒ 「没有办法点名一行」成立,不是我没搜到。
⭐ 修法比卡面写的还便宜:三个函数已经全是
export卡说选择器应当「runs the same
population()→probePlan()→probeEarlyReturn()path for one row」。实测这条路径今天已经是公开的:三个全部
export。⇒ 这不是重构,是在 argv 解析处加一个可选值 + 在population()结果上加一层过滤。缝已经在,接手人不需要动main()的决策逻辑,也就不会引入卡所担心的第二份副本。这条把工作量从"给仪器加能力"降到"给已有缝加入口",值得写在派工说明里。
pm:queue:无阻塞,且边界卡面已经划干净卡自己把三条容易被误并的邻线排掉了,我不再重划:⛔ 非 #15573 那条已判出范围的 scaled-from-baseline 超时策略(这是选择器,不是预算策略)、非 #15515 / #15391 / #14963。查重也做过(12 张同族卡,无一是行选择器)。
enhancement:走机械边界判据新增一个 CLI 入口 = 加宽可用面,⛔ 不是"把声明恢复成执行"。所以是
enhancement而非bug—— 今天--probe的行为与它声明的行为一致(它声明自己扫全量),没有任何东西是坏的。priority:p3无事故、无错误裁决:仪器 shipped 的读数是对的,问题在取证路径。但这不是纯洁癖,卡把成本说准了:
dispatch-gates.mjs单行 434.3 s,全量 181 行 × 2 次 spawn,⇒ 前台一轮装不下。所以每一次单行读数都被迫走私有副本。5547782657)、PR fix(devx): measure-self-test-floor honours a per-row probe budget and reads definitions from masked source (#15573, #15574) #15758 的 shipped 读数 + 两条 ablation 腿。sitesInSource是被 LIFTED 而不是 copied,就是为了让"读数"与"上线代码"不能分叉。⇒ 机制确凿、后果未发生 ⇒ p3。⭐ 提级条件:一旦出现一次「私有副本与
main()决策已经分叉、导致某次读数结论错误」的实例,即重估 p2 —— 那时它就不再是取证卫生问题,而是一个已经产出错误结论的仪器。一句方法论旁注(登记,非要求)
「the instrument's own evidence is taken through a copy of its decision」是一条可复用的判据,不止对这台仪器成立。本席自己的测量纪律里有同形的一条:有未跟踪输入的闸必须"跑",不能 blob 比对。两者是同一个道理的两面 —— 证据必须来自被判定的那个东西本身。这张卡值得在 devx 车道留个引用位置。
Generated by Claude Code
claude commentedon Sep 5, 2026
Claim: PM seat
domain:devx @ objectstack(#6023), sessionsession_012zGPuVVX3deAx9LdjK8jCk, 2026-09-05T09:39Z — dispatching to anos-devsubagent on branchclaude/issue-15759-self-test-floor-probe-row-selector. Blocker cleared: #14968 landed asf141e156b(PR #15799). Ruling: add a row selector toscripts/measure-self-test-floor.mjs --probe(--only <path>, repeatable, matching the census row's script path) that runs the SAMEpopulation()→probePlan()→probeEarlyReturn()path for the selected rows only — lifted, not copied; the full sweep unchanged when the flag is absent; a selector naming no row is a loud exit-2 refusal listing the nearest rows, never a silent empty sweep. ⛔ No timeout / budget policy change (#15573's out-of-scope line stands). ⛔scripts/pm/dispatch-gates.mjsis held by PR #15830 and PR #15806 — not touched. Self-test cases for: one row selected runs exactly that row twice; unknown row refuses; no flag = whole population.pm:queue→pm:dispatched, assignee set.Generated by Claude Code
feat(devx): give `measure-self-test-floor --probe` a row selector (#1…
fix(devx): rank a failed `--only` selector by path, not by summed par…
claude commentedon Sep 5, 2026
os-dev-report
{ "issue": 15759, "status": "done", "branch": "claude/issue-15759-self-test-floor-probe-row-selector", "pr": "https://github.com/objectstack-ai/objectstack/pull/15833", "head": "98a0b76042a5c2855cfe54be14f72086b9e8ca0c", "files": [ "scripts/measure-self-test-floor.mjs" ], "premise_still_valid": true, "summary": "`--probe` now takes `--only PATH` (repeatable, `--only=PATH` accepted, repo-relative or absolute) naming census rows to probe. The triage seat's reading held: population(), probePlan() and probeEarlyReturn() were already exported, so this is an entry at a seam that already existed. The sweep's loop body is LIFTED into probeRows() and main() calls it on both paths, so there is no second copy of the decision; its plan/probe parameters exist only so a control can count the probe's calls and main() passes neither. A selector naming no row exits 2 and lists the nearest rows; nearestRows reads two tiers (rows whose path contains the whole selector, else only the rows sharing the longest basename prefix) after a first cut that scored summed path parts made one miss 'match' 181 of 182 rows. --only narrows the PROBE, not the census: the row count, floor column and handshake column stay whole, hole 2 announces over how many of how many, and excluded rows publish NOT PROBED in --json. classifyHandshake / definitionSpan untouched. ONE PREMISE NUANCE, reported rather than papered over: the dispatch asked for a `--self-test` control run and a `--help` diff, and this script ships NEITHER flag by design (its controls run inline on every invocation, and it is excluded from its own census). Its header usage block is its only help text; that block is extended and a USAGE constant now prints on every refusal. The control run is therefore the plain census invocation, which is what was diffed.", "verification": { "control_run_inert": "Base file vs this file, same installed worktree, at HEAD 98a0b76, trap-guarded with on-disk proof: 'HEAD_BLOB=9805aeff46dc073023cf46ed115bb6d03b174ce3 BASE_BLOB=b9d6d38dcfe092071bc236c66a22fecbb008ae7e (differ: yes)' / 'ON-DISK after checkout of base: b9d6d38dcfe092071bc236c66a22fecbb008ae7e' / 'BEFORE_EXIT=0' / 'AFTER_EXIT=0' / 'CMP_EXIT=0 (0 = byte-for-byte identical)' / '17619 inert-before.txt 17619 inert-after.txt' / 'git diff HEAD --quiet exit=0'. An earlier identical pair was taken pre-merge (17516 bytes, cmp exit 0).", "one_row_measured": "Per the dispatch's assumption, NO real sweep over scripts/pm/dispatch-gates.mjs. Cheap row measured: scripts/invoked-as.mjs (its own --self-test: real 0m0.410s). 'node scripts/measure-self-test-floor.mjs --probe --only scripts/invoked-as.mjs' gave ONLY_EXIT=0, real 0m58.259s, against a bare census in the same worktree at real 0m57.633s -- i.e. the ~57 s is this tool's unconditional controls plus the static census and the selected row is the ~1 s remainder. Output: '⚠ `--only` RESTRICTED this probe to 1 of 182 census row(s). The other / 181 were NOT PROBED, and nothing below is a reading of them. / selected: scripts/invoked-as.mjs' then 'Hole 2 -- silently defeated by an early `return` in the self-test (MEASURED): / 0 DEFEATED, 1 HELD, 0 ACCIDENT, 0 NOT MEASURED. / HELD scripts/invoked-as.mjs -- ✗ invoked-as self-test: selfTest() returned without reaching its verdict,'. --json for the same run shows the TWICE: verdict HELD, baselineExit 0, mutatedExit 1, mutatedBytes 196, mutatedSpoke true; and scripts/js-comment-mask.mjs carries verdict 'NOT PROBED', why 'excluded by --only'. Taken at d741da9 (census 182 rows) before origin/main was merged; the census is 183 rows at 98a0b76.", "refusals": "All exit codes captured before any pipe. '--probe --only scripts/invoked-a.mjs' gave EXIT=2, 'measure-self-test-floor: `--only scripts/invoked-a.mjs` names no census row (read as `scripts/invoked-a.mjs`). / nearest rows by path: scripts/invoked-as.mjs'. '--probe --only' gave EXIT=2 '`--only` was given no value (it is followed by nothing).'. '--only --probe' gave EXIT=2 '`--only` was given no value (it is followed by \"--probe\").'. '--only scripts/invoked-as.mjs' without --probe gave EXIT=2 '`--only` selects rows for the PROBE, and `--probe` was not passed.'", "ablation": "Three legs, trap-guarded (trap on EXIT INT TERM), absolute paths derived from git rev-parse --show-toplevel, each mutation proven ON DISK before the run (removed text 1 then 0, injected marker 0 then 1, blob differing from the HEAD blob; the script aborts if either check fails) and each restore proven byte-identical (git checkout HEAD -- path, then git hash-object equal to the HEAD blob AND git diff HEAD empty). LEG refusal (a missing row returns an empty selection instead of refusing): blob ca598d7a367ac035cd8550b11e806bd99783b2ba, ABLATED_EXIT=1, 5 SELECTOR CONTROL FAILED lines, first: 'a selector naming no row did not refuse (got [])'. LEG selection (the selection is ignored and the whole population returned): blob 00a03f0c70e8ce3d0f8f715a368eba7e0ebe0118, ABLATED_EXIT=1, 7 lines, first: 'a selector naming one row exactly did not select exactly that row'. LEG argv (a flag accepted as the --only value): blob 17326c5658a85cee2145344f368dba4d4f6413b3, ABLATED_EXIT=1, 1 line: '`--only --probe` took the FLAG as the selector value'. FINAL: 'final blob=9805aeff... HEAD=9805aeff...' and 'git diff HEAD --quiet exit=0'; git status --porcelain empty afterwards. The direction was predicted before the runs and observed as predicted: red, not merely fewer diagnostics.", "gates": "'node scripts/pm/dispatch-gates.mjs --changed --commands --repo objectstack-ai/objectstack' re-derived on the MERGED tree (98a0b7604, no STALE TREE warning; the first derivation at d741da95f warned STALE TREE with 21 files changed under it, so origin/main was merged in and the derivation redone). 28 commands derived, all 28 run, all 28 exit 0. That includes the family that only appeared after the merge: scripts/check-scripts-symbol-anchors.mjs and its --self-test, both exit 0. pnpm check:nul-bytes exit 0, 'check-nul-bytes: OK (scanned 7640 text file(s) -- 7640 tracked, 0 untracked-not-ignored; skipped 7 binary; no raw ASCII control bytes).' plus a direct grep -naP control-character sweep over the file: no hits.", "governed_merges": "'node scripts/pm/check-governed-merges.mjs --test scripts/measure-self-test-floor.mjs' on the FINAL one-file list gave exit 0, 'governed-surface predicate: 0 of 1 path(s) hit the register (5 surfaces, repo-agnostic).' / '✅ NOT governed -- ordinary queue landing applies to a PR with exactly this file list.'", "merge_tree": "'git fetch origin main' then 'git merge-tree --write-tree origin/main HEAD' gave exit 0, tree d7080176357a1ee85e77b6b38fe3da41fe9501d2, no conflict.", "collisions": "All 30 open PRs listed via REST and each one's files read through GET /repos/objectstack-ai/objectstack/pulls/N/files: NONE touches scripts/measure-self-test-floor.mjs. scripts/pm/dispatch-gates.mjs (held by #15830 / #15806) was RUN but never edited; the diff is one file.", "pr_body_readback": "PR body read back in full via GET /pulls/15833 and diffed against what was sent: the ONLY difference is the platform's own create-time footer block (a rule line plus '_Generated by [Claude Code](https://claude.ai/code/session_012zGPuVVX3deAx9LdjK8jCk)_') appended after the required attribution lines. Every byte I wrote survived; no sanitizer damage. The PR body and this comment contain no angle-bracket-shaped fragments and no HTML comments.", "changeset": "Scripts-only diff, nothing published changes, so the label 'skip-changeset' was applied additively via POST /issues/15833/labels and read back as ['skip-changeset']." }, "not_measured": [ "NONE remain. Six derived gates first read PREREQUISITE NOT MET (exit 3) or ERR_MODULE_NOT_FOUND in the fresh worktree and are NOT reported green on that attempt: packages/lint/scripts/check-reference-carrier-shape.mjs and its --self-test, scripts/check-ci-filter-parity.mjs, scripts/check-closing-keyword-parity.mjs and its --self-test, scripts/check-comment-mask-corpus.mjs, pnpm check:driver-memory-census. After 'pnpm install --offline' (exit 0, 6.1s) all six were re-run to a real reading and all six exit 0.", "CI convergence on PR #15833 is not awaited: the report is delivered at draft-PR time per the dispatch contract." ], "open_questions": [ { "question": "The dispatch asked to extend the `--help` text, but this script ships no `--help` flag (nor a `--self-test` one) -- deliberately: its controls run inline on every invocation. I extended the header usage block and added a USAGE constant printed on every exit-2 refusal. Should a real `--help` flag be added?", "options": [ "A. Leave it: the header block plus the refusal-printed USAGE is the help surface, and a --help flag is new argv surface that would need its own controls.", "B. Add a --help flag printing USAGE and exiting 0, as a follow-up card." ], "recommendation": "A. A reader who mis-invokes now gets the usage text on the failure path, which is where help is actually needed; adding a flag widens the argv surface this card just taught to refuse ambiguity, and it is outside the ruling." } ], "out_of_scope_findings": [], "mcp_calls": "2 -- issue_read get and issue_read get_comments. Everything else (open-PR enumeration, per-PR files, PR creation, label write, body readback, this comment) went through repo-scoped REST, which was probed and answered 200 in this container.", "cleanup": "Worktree removed: 'rm -rf /home/user/objectstack-15759/node_modules' then 'git worktree remove ../objectstack-15759' (no --force; git status was clean) gave exit 0, and /home/user/objectstack-15759 no longer exists. No background monitors or dev servers were left running; nothing was killed by pattern. The shared checkout /home/user/objectstack was never edited." }Generated by Claude Code
claude commentedon Sep 5, 2026
ACCEPT — PR #15833 (head
98a0b7604, 1 file:scripts/measure-self-test-floor.mjs+347/−14, two commits + a merge ofmain) reviewed against the GitHub three-dot diff, not the report.As ruled: the sweep's loop body (
probePlan→probeEarlyReturn, theNOT MEASUREDleg included) is removed frommain()and lives once inprobeRows(), which both the full sweep and the--onlypath call — lifted, not copied;selectRowsnarrows the PROBE only (census, floor and handshake columns stay whole), excluded rows publish{ verdict: 'NOT PROBED', why: 'excluded by --only' }so--jsoncannot confuse "no sweep asked" with "outside the sweep"; an unknown selector is an exit-2 refusal listing nearest rows;--onlywithout--probe, or with a flag as its value, refuses too.classifyHandshake/definitionSpanuntouched.Readings this seat took on a detached probe of the branch (
mkdir node_modules, dep-less), copied from run output:--probe --only scripts/invoked-a.mjs→ EXIT=2,measure-self-test-floor: \--only scripts/invoked-a.mjs` names no census row (read as `scripts/invoked-a.mjs`)./nearest rows by path: scripts/invoked-as.mjs`.--only scripts/invoked-as.mjs(no--probe) → EXIT=2,\--only` selects rows for the PROBE, and `--probe` was not passed.`--probe --only scripts/invoked-as.mjs→ EXIT=0, wall 61 s (bash timing; the dev's control put the bare census at ~57 s, so the selected row is the ~1 s remainder):⚠ \--only` RESTRICTED this probe to 1 of 183 census row(s). The other / 182 were NOT PROBED, and nothing below is a reading of them. / selected: scripts/invoked-as.mjs…0 DEFEATED, 1 HELD, 0 ACCIDENT, 0 NOT MEASURED.`check-governed-merges.mjs --test scripts/measure-self-test-floor.mjs→NOT governed, EXIT=0;git merge-tree --write-tree origin/main <branch>→ EXIT=0 againstcc5b3dd0c; no other open PR touches the file (dev's 30-PR enumeration; fix(pm): dispatch-gates scores a command whose workflow step passes an expression through env: as NOT MEASURED, like an argv-carried one (#15761) #15830'sdispatch-gates.mjsis disjoint).cmpexit 0) and the three ablation legs are taken from the report, not re-run here.Delegated ruling on the open question: A — no
--helpflag; the header usage block plus the USAGE text printed on every exit-2 refusal is the help surface, and a new argv flag is outside the ruling. The brief's "--helpdiff" instruction was the seat's assumption about a flag the script never had; the dev's substitution (diffing the plain census invocation) is the right control.Flip + arm follow when all seven required contexts on
98a0b7604read non-failing (waiter on). Card closes on landing (Fixes #15759).Generated by Claude Code
claude commentedon Sep 5, 2026
LANDED — PR #15833 merged as
fd3333738(10:55:08Z); this card is closed by it (Fixes #15759).Probe on re-fetched
origin/main(fd3333738), readings copied from run output:scripts/measure-self-test-floor.mjscarriesexport function parseOnly(argv)at:2076,export function nearestRows(rows, want, limit = 8)at:2134,export function probeRows(rows, { plan = probePlan, probe = probeEarlyReturn } = {})at:2190.node scripts/measure-self-test-floor.mjs --probe --only scripts/no-such-row.mjs→ EXIT=2,measure-self-test-floor: \--only scripts/no-such-row.mjs` names no census row (read as `scripts/no-such-row.mjs`)./no census row's path contains any part of it -- run without `--only` to print all 183 rows.`1 of 183); not re-run on main here.Stripping
pm:dispatchedand the assignee in the same action.Generated by Claude Code
feat(devx): a row selector for `measure-self-test-floor --probe` (obj…