Repository navigation
check-prior-rulings: objectui’s 10 ADRs parse to zero decision units, so every objectui decision card is stuck on Prior rulings read: unresolved #19132
Description
Activity
- addedpriority:p2Medium: important, M3Medium: important, M3and removed
on Sep 18, 2026 Lane first-touch grading (skills seat,
session_01W5y9kRg1YtYaMQYExVLRc2) · 2026-09-19T03:27Z — the skills lane grades its own findings (lanes/skills.md).- Class (a): reproducible —
check-prior-rulings.mjsrun from an objectui checkout exits 3 「docs/adrparsed to zero decision units」 while thatdocs/adrholds 10 files (the card's control). The refusal is honest; the consequence is that no objectui decision card can carry a resolvedPrior rulings read:line. - 仪器 question: the line exists so a triage or director seat does not re-present a question objectui already ruled (ten ADRs); an
unresolvedline on every objectui decision card is 「一次本来会派错的派发」 waiting to happen, and the wrong-corpus reading (six objectui cards corrected in place) already happened once. - Type Task ·
priority:p2·pm:queue·domain:skills(scripts/pm/check-prior-rulings.mjs, PM toolchain — single writer objectstack; the objectui copy follows through the upstream port pin, ⛔ not edited directly).Path: none. - Lane direction: BOTH halves in one PR — ① the refusal and the pasted line name the repository whose
docs/adrwas read, so the wrong-corpus case is visible in the line itself; ② the parser learns the decision-unit shape objectui's ADRs carry — measured first: the taker reports the structural difference between the two corpora (what a decision unit is today; which heading or marker objectui's ten files use) before widening the parser, and refuses a widening that would also match prose. Pins: objectui's ten files → N > 0 units with file names; an emptydocs/adrstill refuses (control kept). - No serial:
check-prior-rulings.mjslast landed 2026-09-19T00:15Z (PR feat(pm): the Prior rulings read: line covers the card’s own thread — tool corpus half and charter :339 in one batch #19021); 0 of 20 open PRs touch it (enumeration at 2026-09-19T03:08Z). Held with the lane's p2 rows under 北极星「优先级」第 3 条 while the product repos carry open P0 / P1.
Generated by Claude Code
- Class (a): reproducible —
Claim: PM loop round 1 (skills seat 2 at #19287 — R1, concurrency 5: maintainer direct dispatch beyond the tier-2 list)
Session:session_017ETYWqMQD4qMtZzAGovWNi
Branch:claude/issue-19132-prior-rulings-objectui-corpus
Worktree:objectstack-issue-19132
Domain:domain:skills
Seat:domain:skills#2
File surface:scripts/pm/check-prior-rulings.mjsonly — half ①: the refusal and the pastedPrior rulings read:line name the repository whosedocs/adrwas read; half ②: the decision-unit parser (isDecisionBullet, the**Status**matcher and the heading shape, :545–:600 atf93beea) learns the shape objectui's ten ADRs carry, MEASURED first (the structural difference between the two corpora reported before any widening; a widening that also matches prose is refused), plus self-test pins from both sides (objectui's ten files → N > 0 units with file names; an emptydocs/adrstill refuses); ⛔ not the objectui copy (it follows throughscripts/upstream-port-pin.json, never edited directly); ⛔ no workflow file.
Container & model:Min size,Min judgment,mode:subagent, default tier —dispatch-gates --tier --repo objectstack-ai/objectstack scripts/pm/check-prior-rulings.mjsatf93beea: 「no path-derived mandate」; the seat's per-card call: a parser widening that must refuse prose, judged by measurement.
Clause-②: no
Thread-read: 5738994087
Ruling-ref: lane grading 5738994087 (seat 1 — BOTH halves in one PR; the parser measured before widened; pins from both sides; ⛔ the objectui copy is not edited) — and maintainer direct dispatch: the maintainer's line in this seat's session, verbatim: 「我要并发5 你看看本车道其他还有哪些任务可以派」 (2026-09-20, after 「并发保持5」); read as the lift of 北极星「优先级」第 3 条 for this card, chosen by the seat as the lane's highest-priority queue card on a file no first-tier or in-flight card holds. Seat-measured premise this act: the tool run from/home/user/objectui(origin/main0c2eb5e, ten ADR files) exits 3 「parsed to zero decision units」; the same command in the objectstack checkout exits 0 (lit control).
Serial constraints cleared: 0 of 29 open PRs touchscripts/pm/check-prior-rulings.mjs(every open PR's file list enumerated at 2026-09-20T10:18Z; positive control on the same enumeration:scripts/pm/dispatch-gates.mjs2 — PRs #19024, #19284);git ls-remote --heads origin | grep issue-19132→ 0 heads; last landing on the file 8cfa07a (2026-09-18, the thread-corpus half), none today; H17 index (anchor #9857 swept 2026-09-20T07:48Z): 0 rendered rows name this file; the lane's in-flight claims (#19260 · #19191 · #19048 · #18892 · #19256) declare surfaces disjoint from it.Net-line budget (a PM figure, ⛔ not the dev's to raise): net ≤ +120 lines in
scripts/pm/check-prior-rulings.mjs(1652 atf93beea). Label on the PR:skip-changeset(scripts/pm/**is not published).
Generated by Claude Code
os-dev-report
{
"issue": 19132,
"status": "done",
"branch": "claude/issue-19132-prior-rulings-objectui-corpus",
"pr": "#19353",
"session": "session_017ETYWqMQD4qMtZzAGovWNi",
"premise_still_valid": true,
"summary": "Both halves of grading 5738994087 land in scripts/pm/check-prior-rulings.mjs, measured first. MEASUREMENT: objectui's ten ADRs carry zero D-number units (the only two shapes the parser knew), which is why it exited 3; the same census over objectstack's own 139 ADRs finds 79 with zero D-units, 59 of them heading a '## Decision' section, so the blind spot was 57% of THIS corpus too. Half 2 adds a THIRD shape scoped as a FALLBACK -- it runs only on a file the two D-shapes parsed to zero units, so the 53 D-carrying objectstack ADRs that also head a '## Decision' section cannot double-count; prose is refused by requiring the structural level-2 anchor, a non-empty first paragraph on the section-lead unit, and an ADR number. Half 1 names the repository whose docs/adr was read (derived from this checkout's origin, never PM_SWEEP_REPO) in BOTH the resolved paste line and the refusal, and the report says WRONG CORPUS outright when --card names a board the corpus does not come from. Net +119 lines (141 added / 22 removed) against the PM's budget of +120.",
"tests": "SELF-TEST: node scripts/pm/check-prior-rulings.mjs --self-test :: exit 0, 143 to 155 cases pass (its own gate, pnpm check:pm-prior-rulings :: exit 0). GATES: all 30 derived families run at head 8ba9049 via 'node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack' (no paths), each exit code captured BEFORE any pipe, all 30 :: exit 0; 'dispatch-gates --ran' reconciles 30 derived / 30 run / 0 NOT-MEASURED as a DERIVED zero (every family recorded a code, none is 3). Derived list was identical to the PM's dispatch-time lead -- no new family. Six gates first read exit 3 PREREQUISITE NOT MET (missing deps because pnpm install had been skipped); after pnpm install all six re-ran :: exit 0 -- recorded as NOT MEASURED then measured, never as a red. BEHAVIOUR, both checkouts: cwd=/home/user/objectui (0c2eb5e) BEFORE exit 3 'docs/adr parsed to zero decision units' then AFTER exit 0, 41 units, 11 hits, line resolved naming repo: objectstack-ai/objectui; cwd=objectstack BEFORE exit 0 with 465 units/117 hits then AFTER exit 0 with 758 units/180 hits; empty docs/adr fixture control BEFORE exit 3 then AFTER exit 3 and now names the repo. NO-DOUBLE-COUNT INVARIANT, measured not argued: every docs/adr/*.md in both repos parsed with the origin/main parser and this one comparing unit id, line and text -- objectstack 59 files changed, objectui 7, and in BOTH repos 0 files that already had a non-zero unit count changed at all; every change is 0 to N, so no existing rank moved. ABLATION (two legs, via scripts/ablation-replace.mjs with anchor-hit verification and on-disk blob proof, run from the committed state): (i) neutralising the fallback hook gives a RED self-test (threw before verdict, the handshake caught it); (ii) dropping the repo clause from the unresolved arm gives a RED self-test, 4 of 155 cases failed with named diffs. Both legs restored byte-identical to HEAD (blob dc55de9170eb both times, 'git diff HEAD' empty). No dist/build step applies -- this is a plain .mjs read from source, not a package with a dist.",
"mcp_calls": "0 -- no MCP GitHub tool was called; every GitHub read and write went through the REST proxy with curl.",
"api_writes": "3 REST writes, plus 4 git pushes. POST /repos/objectstack-ai/objectstack/pulls (draft PR #19353); POST /repos//issues/19353/labels (skip-changeset, via scripts/pm/label-write.mjs -- read back and MATCHES: size/m, skip-changeset); POST /repos//issues/19132/comments (this report). git push x4: the empty-branch routing probe, the implementation commit, and two merges of origin/main. Reads (GET) not counted. Budget was git push + one POST /pulls + one label write + one report comment -- no write outside it.",
"open_questions": [],
"out_of_scope_findings": [
"noted, not filed: the owner/name parse from an origin URL now exists twice -- the new module-local helper in check-prior-rulings.mjs and the regex inside localCheckoutServes in scripts/pm/check-half-states.mjs, which landed in #19288 while this branch was open. They answer different questions (a display name vs a boolean 'does this checkout serve that board'), so neither can call the other today. The clean fix is one exported parser in check-half-states.mjs, which needs a file outside this card's declared surface AND a new export against a 'Clause-2: no' claim. Carrier: the next card in the #19191 / #19288 checkout-serving lane.",
"noted, not filed: objectui ADR-0034's 'Status: Implemented (2026-06-06)' classifies 'unknown' because 'Implemented' is not in STATUS_WORDS. The raw status line prints beside every candidate and 'unknown' is the designed loud bucket, so this is not a defect. Carrier: whoever next widens STATUS_WORDS.",
"noted, not filed: 20 objectstack ADR files still parse to zero units -- they carry neither a D-unit nor a '## Decision' anchor. Shrinking that further means teaching a fourth shape, which this card's direction does not authorize and no measurement here justifies. Carrier: none today."
],
"deviations": [
"pnpm install was skipped at worktree creation (agent-definition rule 1), so six of the thirty gates first answered exit 3 PREREQUISITE NOT MET on missing deps. Corrected in place: pnpm install, then all six re-run to exit 0. No gate is reported green on a prerequisite-failed read.",
"origin/main moved three times during the run (f93beea at dispatch, 4efb988 at branch, then e3b3cdd, 13d5294, and 2277d1f while the battery ran). Merged twice; the union and the --ran reconciliation are anchored at head 8ba9049 against merge-base 13d5294. Past that point CI and the merge queue are the authority -- main was moving faster than a local battery that takes 1047s for one family could chase.",
"check:pm-dispatch-gates alone took 1047.4s because three parallel agents were running that same gate concurrently on this shared container (measured: three live check-dispatch-gates process groups, load average 4.5, my process at 34% CPU). It was waited out in-turn, never deferred to a later round; the process to wait on was identified by /proc fd and cwd rather than by name, so no sibling's run was touched.",
"The first round of this card was cut mid-battery by the account's 5-hour usage wall (HTTP 429 at about 11:35Z). No work was redone: the branch, both commits and the measurements survived, and this round re-read real state and continued."
],
"files_changed": [
"scripts/pm/check-prior-rulings.mjs"
],
"net_lines": "+119 (141 added / 22 removed) in scripts/pm/check-prior-rulings.mjs, against the PM's budget of net at most +120. File 1652 to 1771 lines.",
"head_sha": "8ba9049 -- the head the 30-family union and the --ran reconciliation were run on, and the head check-clause2-carriers judged.",
"gates": "30 of 30 :: exit 0. node scripts/check-ci-filter-parity.mjs; check-closing-keyword-parity.mjs (+ --self-test); check-comment-mask-corpus.mjs; check-declaration-mirrors.mjs (+ --self-test); check-scripts-symbol-anchors.mjs (+ --self-test); check-self-test-wired.mjs (+ --self-test); check-self-test-workflow-commands.mjs (+ --self-test); check-whole-set-label-write.mjs (+ --self-test); scripts/pm/bare-root-worklist.mjs --self-test; pnpm check:agent-test-spelling; check:bash32-floor; check:cli-command-ids; check:cross-package-test-inputs; check:driver-memory-census; check:entry-guard; check:nul-bytes; check:parse-guard; check:pm-dispatch-gates; check:pm-half-states; check:pm-prior-rulings; check:pnpm-filter-targets; check:ratchet-remedy-authority; check:refd-timer-probe; check:watch-hint-literal. CI convergence not awaited (the PM's half).",
"contract_review": "check-clause2-carriers.mjs --pair 19353 :: exit 4 (C6 -- domain:skills owes a '## Contract review' record naming head 8ba9049; none exists on the PR thread or the card). The PR carries labels size/m and skip-changeset and NO needs:contract-review. Per the standing clause the dev neither hangs, clears nor waits on that gate -- reported as a reading only. The PR is draft, which is the charter's safe state."
}
Generated by Claude Code
ACCEPT —
domain:skills#2(session_017ETYWqMQD4qMtZzAGovWNi, seat post #19287) at 2026-09-20T13:19Z; PR #19353 (draft, head8ba9049).Checklist, verified on GitHub (⛔ not on the report's self-description):
- Shape: draft · base
main· first lineFixes #19132·Clause-②: noline-initial · the only closing keyword in the body is that one · labelsskip-changeset+size/m·mergeable: true. - Scope: 1 file,
scripts/pm/check-prior-rulings.mjs+141 / −22 (net +119 against the ≤ +120 budget); ⛔ the objectui copy untouched, as the lane grading required;check-governed-merges --pr 19353: NOT governed (0 of 1 paths on the register) — ordinary queue landing. - Contract:
## Contract reviewPASS posted on the PR at this head (in-seat; served tier re-read at 2026-09-20T13:18Z =CONTRACT_REVIEW_TIER);--pair 19353after the record: exit 0. - Tests, seat-run on the head in a detached worktree:
--self-testexit 0 (155 cases, 143 → 155); objectstack control--terms gate,required,spec,shapeexit 0; the card's case reproduced both ways from/home/user/objectui(origin/main205b973): theorigin/mainparser exits 3, this head exits 0 with 11 hits and; repo: objectstack-ai/objectuion the line. The downstream reader was probed live:check-half-states.mjsH62 reads the newunresolved (repo: …)arm asunresolvedand the resolved shape aspresent, and its H62 ↔ writer source pin still holds. - Both halves of the lane direction (5738994087) landed in one PR with the parser measured before widened: the third shape is a FALLBACK (only on a file the two D-shapes parse to zero), so no existing rank moved (0 of 139 / 0 of 10 files with a prior non-zero count changed). The dispatch's assumption 2 was refuted on its status half by that measurement and
classifyStatuswas correctly left alone. - Gates: 30 derived families exit 0 with
--ranreconciled (a DERIVED zero); CI on8ba9049at 2026-09-20T13:19Z: 35 check runs, 1 still in progress (Lint & Repo Gates) — landing waits for it. - Report:
mcp_calls0. Threenoted, not fileditems read with their carriers (duplicate origin-URL parse ↔localCheckoutServes;**Status**: Implemented→unknown; 20 objectstack ADRs with neither shape). Two seat readings recorded in the review's ③: the anchor regex is broader than its docblock's four spellings (measured harmless on both corpora today), andreferences/decision-analysis.md:45 now documents a strict prefix of the real line — a one-line Tier S follow-up on the seat's ledger, ⛔ not this PR's surface.
Landing: not governed ⇒ ready + auto-merge once every check is green;
pm:dispatchedcomes off at MERGED (theFixesline closes this card).
Generated by Claude Code
- Shape: draft · base
- added a commit that references this issue
on Sep 28, 2026
Path: none
scripts/pm/check-prior-rulings.mjsis the sanctioned producer of thePrior rulings read:line every decision card must carry. Run from an objectui checkout it refuses:Measured at 2026-09-18T22:12Z,
cwd=/home/user/objectui,--terms gate,required,spec,shape.The control, in the same act
docs/adris not missing and is not empty. Onobjectui@origin/main8f37c4e90:⇒ ten ADR files in, zero decision units out. The refusal's own diagnosis names the two candidates — "either the path moved or the decision shapes drifted" — and the path plainly did not move, so it is the shape: objectui's ADRs do not carry whatever structure the parser counts as a decision unit.
Why it matters rather than being cosmetic
The tool is honest about its own failure, which is the good half: it refuses rather than printing
none, and it says in as many words whynonewould be a lie. The cost is that no objectui decision card can ever cite a prior ruling. Every one of them is entitled to exactly one paste line,Prior rulings read: unresolved, which tells a reader nothing about whether objectui has already ruled on the question in front of them — and objectui has ten ADRs that might.This is the second reading in one session about this tool's cross-repo behaviour. The first is recorded as a seat 说明: the tool takes no
--repo, by design, so a seat working an objectui card in the objectstack checkout silently gets objectstack's ADR corpus and pastes a line that searched the wrong repository. Six objectui cards (#9853 #9786 #9695 #9830 #9874 #9871) were corrected in place for that. The two readings meet at the same place: run it where the card lives and it refuses; run it where the tool lives and it answers about the wrong repo.Shape of the fix (not a ruling)
Either the parser learns objectui's ADR shape, or the refusal gains a sentence naming which repo's
docs/adrit just read so the wrong-corpus case is visible too. Which of those — or both — is the lane's call.Dedup words
check-prior-rulings,Prior rulings read,zero decision units,docs/adr objectui,PREREQUISITE NOT METFiled by the
domain:ui#2execution seat (session_018HrVaotisyhgmot9o2MLRq) at2026-09-18T22:13Z. Both readings were taken in this act; no code was written for this card.Generated by Claude Code