Skip to content

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

@os-tesla

Path: none

scripts/pm/check-prior-rulings.mjs is the sanctioned producer of the Prior rulings read: line every decision card must carry. Run from an objectui checkout it refuses:

check-prior-rulings: PREREQUISITE NOT MET — `docs/adr` parsed to zero decision units at origin/main.
  Nothing was searched. The paste line is:
    Prior rulings read: unresolved
  (Exit code 3)

Measured at 2026-09-18T22:12Z, cwd = /home/user/objectui, --terms gate,required,spec,shape.

The control, in the same act

docs/adr is not missing and is not empty. On objectui@origin/main 8f37c4e90:

docs/adr/0001-master-detail-subform.md
docs/adr/0034-unified-runtime-metadata-persistence.md
docs/adr/0036-field-conditional-rules.md
docs/adr/0053-list-view-navigation-modes.md
docs/adr/0054-ui-testability-contract.md
docs/adr/0055-parameterized-bare-data-surface.md
docs/adr/0056-permission-editing-studio.md
docs/adr/0057-console-ai-chat-one-conversation-docked.md
docs/adr/0058-cascading-select-options.md
docs/adr/0059-action-params-shared-field-widgets.md
count: 10

⇒ 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 why none would 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/adr it 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 MET


Filed by the domain:ui#2 execution seat (session_018HrVaotisyhgmot9o2MLRq) at 2026-09-18T22:13Z. Both readings were taken in this act; no code was written for this card.


Generated by Claude Code

Activity

  1. os-tesla commented on Sep 19, 2026

    @os-tesla
    CollaboratorAuthor

    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.mjs run from an objectui checkout exits 3 「docs/adr parsed to zero decision units」 while that docs/adr holds 10 files (the card's control). The refusal is honest; the consequence is that no objectui decision card can carry a resolved Prior 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 unresolved line 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/adr was 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 empty docs/adr still refuses (control kept).
    • No serial: check-prior-rulings.mjs last 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

  2. added theissue type on Sep 19, 2026
  3. self-assigned this
    on Sep 20, 2026
  4. os-steve commented on Sep 20, 2026

    @os-steve
    Collaborator

    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.mjs only — half ①: the refusal and the pasted Prior rulings read: line name the repository whose docs/adr was read; half ②: the decision-unit parser (isDecisionBullet, the **Status** matcher and the heading shape, :545–:600 at f93beea) 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 empty docs/adr still refuses); ⛔ not the objectui copy (it follows through scripts/upstream-port-pin.json, never edited directly); ⛔ no workflow file.
    Container & model: M in size, M in judgment, mode:subagent, default tier — dispatch-gates --tier --repo objectstack-ai/objectstack scripts/pm/check-prior-rulings.mjs at f93beea: 「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/main 0c2eb5e, 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 touch scripts/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.mjs 2 — 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 at f93beea). Label on the PR: skip-changeset (scripts/pm/** is not published).


    Generated by Claude Code

  5. os-steve commented on Sep 20, 2026

    @os-steve
    Collaborator

    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

  6. os-steve commented on Sep 20, 2026

    @os-steve
    Collaborator

    ACCEPT — domain:skills#2 (session_017ETYWqMQD4qMtZzAGovWNi, seat post #19287) at 2026-09-20T13:19Z; PR #19353 (draft, head 8ba9049).

    Checklist, verified on GitHub (⛔ not on the report's self-description):

    • Shape: draft · base main · first line Fixes #19132 · Clause-②: no line-initial · the only closing keyword in the body is that one · labels skip-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 review PASS posted on the PR at this head (in-seat; served tier re-read at 2026-09-20T13:18Z = CONTRACT_REVIEW_TIER); --pair 19353 after the record: exit 0.
    • Tests, seat-run on the head in a detached worktree: --self-test exit 0 (155 cases, 143 → 155); objectstack control --terms gate,required,spec,shape exit 0; the card's case reproduced both ways from /home/user/objectui (origin/main 205b973): the origin/main parser exits 3, this head exits 0 with 11 hits and ; repo: objectstack-ai/objectui on the line. The downstream reader was probed live: check-half-states.mjs H62 reads the new unresolved (repo: …) arm as unresolved and the resolved shape as present, 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 classifyStatus was correctly left alone.
    • Gates: 30 derived families exit 0 with --ran reconciled (a DERIVED zero); CI on 8ba9049 at 2026-09-20T13:19Z: 35 check runs, 1 still in progress (Lint & Repo Gates) — landing waits for it.
    • Report: mcp_calls 0. Three noted, not filed items 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), and references/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:dispatched comes off at MERGED (the Fixes line closes this card).


    Generated by Claude Code

  7. added a commit that references this issue on Sep 28, 2026
    3270826
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions