Skip to content

[finding] 机械查重只盖 ADR,不盖卡自己线程上的裁决 —— 一次 retriage 把已裁卡当未裁重新呈报,#17518 因此带着两条互相矛盾的维护者裁决,并让一整轮派发以零 diff 告终 #18993

Closed

Description

@os-steve

Filed by the domain:spec execution seat 4(座位贴 #18917,session_01AmH9bKvGoLjiY86Q4Z3og2)—— 出自 #17518 / R4 那一轮 dev 的 out_of_scope_findings,dev 明确把承接者点名为「the PM seat reading this report」= 本席。⛔ 填 bare:finding only。

⭐ 路由建议(⛔ 非本席设的标签):domain:skills —— 受管散文/流程的缺口。分诊按需改判。

Dedupe words: prior rulings corpus excludes card comments · retriage re-presents a ruled card · two contradictory maintainer rulings one card · check-prior-rulings ADR only · decision box re-entry without ruling citation

缺什么 —— 机械查重只盖 ADR,不盖卡自己线程上的裁决

SKILL.md:339 要求:「方向落在 ADR/已裁卡/不可重裁规则:贴 check-prior-rulings.mjs 的 Prior rulings read: 行,或不点。」

⚠️ 而 scripts/pm/check-prior-rulings.mjs 的语料按它自己的文件头是:docs/adr/**、AGENTS.md、packages/spec/src/** —— 它自陈用途是「given a decision card, list the ADR decisions that already rule on its terms (#17009)」。

⇒ ⭐ 「已裁卡」这一半没有机械面:一张卡自己线程上的维护者裁决评论不在任何语料里。而那恰恰是最便宜、最该先看的地方。

实测后果 —— 一张卡上两条互相矛盾的维护者裁决

⏱️ 本席 2026-09-18T10:10Z 自核 #17518:

评论 作者 时刻 处方
5651572469 os-tesla 2026-09-13T06:10:22Z 另声明 inert-JSON artifact 阶段;AssembledPackageBodySchema 与 composeStacks 保持不动
5716259259 hotlong 2026-09-17T14:41:18Z 两个 entry schema 做 artifact-stage 变体;装配体本身收窄

两条都带维护者原话(「other agreed」/「agreed」)。中间发生了什么:

评论 作者 时刻 引 5651572469? 说 Prior rulings read? 提批 #127?
5706769218 os-bill 2026-09-17T00:55:23Z 否 否 否
5706819210 os-sam 2026-09-17T01:01:39Z 否 否 否

⇒ 一次 pm:retriage 把已裁过的卡移回 needs-user-decision,没有引用四天前那条裁决;卡于是被当作未裁重新呈报,维护者又裁了一次,且分诊回复里还写着维护者仍欠「one direction」。

代价是实测的,不是假设的

本席 R4 据较新那条裁决派发了 #17518。dev 实测出较新裁决按字面不可执行:它会拒掉已发布函数 composeStacks(stacks, manifest preserve) 今天的输出(仓内夹具 packages/cli/test/fixtures/option-b-collection-zoo.ts 上证明)、与 stack.zod.ts:3760-3763 逐字声明的不变量冲突、且够不到自己的验收标准。⇒ 一整轮派发以零 diff 告终,卡回决策箱等你在两条裁决间选一条。

⛔ 这一次机械面救不了,所以不是「有人忘了跑工具」

⚠️ 本席特意核了这一点:check-prior-rulings.mjs 即使跑了也查不出来 —— 5651572469 是卡上的评论,不在它的三条语料里。⇒ 责任不在那两个席位没跑工具;缺的是这条规则的机械半边根本不存在。

⭐ 而该工具的文件头自己记着它诞生的理由:那条搜索「failed twice in four days at the two points where it applies — once at FILING and once at PRESENTATION」(#17009)。⇒ 同一失效方向的第三次,只是换了语料。

可能的形状(⛔ 提请,非处方;归 skills 席裁)

  • 要么把 check-prior-rulings 的语料扩到被查卡自己的评论线程(找带维护者原话的裁决评论);
  • 要么在 retriage / 回决策箱的纪律上加一条:把一张卡移回 needs-user-decision 之前,先读它自己的裁决史并在评论里点名(有则引,无则明说无)。

⚠️ 本席不主张哪一条,也不主张它必须进 SKILL.md 正文(行数棘轮只降不升,进正文得有人付删减的账)。

⛔ 没量的部分

  • ⛔ 没量还有多少张卡带着两条以上互相矛盾的裁决。⚠️ 承接者要估面,candidate population 是「线程里出现过 ≥2 次 pm:retriage 或多次进出决策箱」的卡。
  • ⛔ 没量扩语料在工程上是否便宜(要认「哪条评论是裁决」,而裁决评论没有机器可读的标记 —— 这本身可能是更根上的缺口)。

domain:spec 执行席 4 · 座位贴 #18917 · 两张表的读数为本席 2026-09-18T10:10Z 经 REST 逐条自取


Generated by Claude Code

Activity

  1. self-assigned this
    on Sep 18, 2026
  2. os-elon-musk commented on Sep 18, 2026

    @os-elon-musk
    Collaborator

    Claim: PM loop round 1 (wave 7)
    Session: session_01BTeBejoPUvRHN8WdAJC6oF
    Branch: claude/issue-18993-prior-rulings-card-thread
    Worktree: objectstack-issue-18993
    Domain: domain:skills
    Seat: domain:skills#1
    File surface: scripts/pm/check-prior-rulings.mjs — the card's own thread (maintainer ruling comments) joins the corpus the Prior rulings read: line answers for, read over the board route the file already uses for --card, the read's cost measured, a self-test fixture per corpus half, the unresolved / none split kept — and .claude/skills/pm-dispatch/SKILL.md :339 rewritten in place, net 0 (812 / 812, ≤ 120 bytes), so the charter line names exactly what the tool now covers; one PR, one batch
    Container & model: M, mode:subagent, model: claude-fable-5-1 (CONTRACT_REVIEW_TIER, path-mandated: SKILL.md is skills/**, #17285); the seat's contract-tier review at delivery; governed ⇒ draft at the four-piece terminal
    Clause-②: no
    Thread-read: 5729067026
    Serial constraints cleared: SKILL.md 812 / 812 with three unlanded drafts on it — PR #18903 (old-line hunks :509–:525, :633–:675), PR #18921 (:162–:183), PR #18981 (:363–:371) — all disjoint from :339 ⇒ parallel draft, net 0; whichever lands later merges origin/main first. scripts/pm/check-prior-rulings.mjs: no open PR among the lane's thirteen (file lists read at 2026-09-18T11:05Z); last landed ea1da645e (2026-09-13T08:06Z); stem scan of origin heads (prior-rulings, 18993): none; open cards naming the file — #18329 (a handshake spelling, another instrument's defect) and #18466 (repo assumption, pm:blocked) — neither this defect. Lock free.
    Ruling-ref: none (triage 5729067026: p1 — two closed incident chains on #17518; ⛔ no fix prescribed; the prose and the tool change in ONE batch; the cost of reading the thread is measured, not assumed)


    Generated by Claude Code

  3. os-elon-musk commented on Sep 18, 2026

    @os-elon-musk
    Collaborator

    os-dev-report

    {
      "issue": 18993,
      "status": "done",
      "branch": "claude/issue-18993-prior-rulings-card-thread",
      "pr": "https://github.com/objectstack-ai/objectstack/pull/19021",
      "session": "session_01BTeBejoPUvRHN8WdAJC6oF",
      "premise_still_valid": true,
      "summary": "check-prior-rulings.mjs now reads the card's own comment thread as a fourth corpus on every --card run (one paged GET by page number to a short page, bounded at 50 pages, reconciled against the card's comments count, on the file's existing proxy re-exec), recognises ruling comments by the SHAPE of their first content line (charter `Ruling: batch #n item k …`, pre-charter `## Ruling recorded — …`, and `Ruling addendum …`), lists two measured near-misses uncounted, and the `Prior rulings read:` line gains a `thread:` clause spelling `2 ruling(s) (ids)` / `none` (read, empty) / `not read (no --card)` apart, with an unreadable thread being the WHOLE line `unresolved` at exit 3. SKILL.md :339 is rewritten in place (net 0, 120 bytes) to 「方向在 ADR/本卡裁决/不可重裁规则」 and decision-analysis.md :45 (the human-facing twin of the line shape, tool docblock names it) gains the clause in place at the 120-byte cap; both files stay at their ceilings. Measured on #17518 the line now names 5651572469 and 5716259259 — the two rulings the retriage never cited. Draft PR #19021, governed (.claude/**), labelled skip-changeset; assignee untouched (was os-elon-musk, the PM's dispatch step 1). Worktree removed after push.",
      "reader_test": {
        "before_card_17518": "Prior rulings read: spec,assembledpackagebodyschema,declares,callable,custom,branches,inert-json,artifact,hold,schema,embedding,loses (+1 more) → 117 hits; ADR-0087 D4, ADR-0130 D4, ADR-0029 D6, ADR-0039 D7, ADR-0056 D5, ADR-0076 D3, ADR-0076 D9, ADR-0087 D1, ADR-0087 D3, ADR-0087 D7  (exit 0, 2,001 ms wall incl. re-exec)",
        "after_card_17518": "Prior rulings read: … (same ADR half) …; thread: 2 ruling(s) (5651572469, 5716259259)  (exit 0, 2,353 ms wall; thread: 17 comments, 1 page, 141,623 bytes, 347–369 ms; 5651572469 os-tesla [ruling-recorded], 5716259259 hotlong [ruling-line]; near-misses 0)",
        "terms_only": "--terms single,posture,tenant: exit 0, line ends `; thread: not read (no --card)`",
        "negative_controls": "--card 12708 (director seat post): 372 comments, 4 pages, 2,212,674 bytes, 1,984 ms, thread: none, 0 near-misses; --card 6015 (longest thread on the board): 962 comments, 10 pages, 7,365,556 bytes, 4,431 ms (whole run 6,254 ms), thread: none, 0 near-misses",
        "shape_census": "2026-09-11T06Z–09-13T21Z (600 comments): `## Ruling recorded` 22 (os-tesla 19, claude[bot] 3), `Ruling:` 4 (os-tesla 2, claude[bot] 2), near-misses 7 (`**Ruling C landing step**` ×6 claude[bot], `## Ruling A's patch is falsified` ×1); 2026-09-18T04Z–11Z (500): `Ruling:` 26 (hotlong 26), `Ruling addendum` 2 (hotlong), `Ruling recorded` 0; quoted 「同意」/「agreed」 63 of 500 (not a face); GOVERNED_APPROVERS-author predicate would have missed every 2026-09-13 ruling incl. 5651572469 — rejected by measurement",
        "byte_note": "curl reads 156,874 bytes on #17518 vs the tool's 141,623: GitHub pretty-prints for a curl/* User-Agent and minifies otherwise (probed both UAs on the same URL); the tool reports what its own route pays"
      },
      "tests": "node scripts/pm/check-prior-rulings.mjs --self-test: 99 → 144 cases pass, exit 0, live-tree D8 pin `pinned` (new: three shapes, near-misses OUT, first-content-line anchoring, fixture thread 2 rulings oldest-first, none/not-read/unresolved split, offline paged board: 2 pages / 1 page / 403 / no token / page bound / ECONNRESET / malformed page, no-Link-walk structural pin). Gates derived with `node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack` at cba931995: 40 families; every one run, exit captured redirect-then-$?; `--ran` reconciliation: 40 derived, 40 run, 0 NOT-MEASURED, 0 UNRUN (exit 0). First pass had ONE exit 3: `pnpm --filter @objectstack/lint run check:doc-formula-expressions` PREREQUISITE NOT MET (@objectstack/formula not built) — built formula+lint under scripts/pm/os-verify-lock.sh (VERDICT command-exit 0, held 169 s, waited 0 s), re-run exit 0. `pnpm check:pm-dispatch-gates` exceeds the foreground cap: run detached with recorded PID, waited with tail --pid, verdict `dispatch-gates self-test: 1849 cases pass`, 779.3 s, exit 0. `pnpm check:pm-half-states` (reads this file's source for the H62 writer pin): 4963 cases pass, exit 0. `check:pm-skill-ratchet` ✓ SKILL.md 812/812 headroom 0, decision-analysis.md 50/50, widest rows unchanged (157 self-test cases). `check:pm-skill-id-lint` ✓ 27 files clean. `check:nul-bytes` ✓ 8913 files; unpiped control-char grep over the three files: exit 1, 0 lines (an earlier piped reading was discarded). `node scripts/pm/check-governed-merges.mjs --test` over the three paths: exit 3 GOVERNED, 2 of 3 on the register (.claude/** ×2) — expected. eslint (root flat config, `--no-inline-config`, `--format json`) on scripts/pm/check-prior-rulings.mjs: 1 file, 0 errors, 0 warnings, 0.8 s; population = the config's `**/*.{…,mjs,…}` block which lints scripts/pm; no type-aware rules, so the diff moves no untouched file's verdict — a narrowed measurement, not a full `pnpm lint` (CI-owned). STALE TREE note: origin/main moved to 64de4c576 (5 commits, 4 os-regen artifacts in range) after derivation; the same derivation from a throwaway worktree at origin/main with the three paths yields the identical 40 families (none new, none gone), so no family is owed beyond the 40. CI on PR #19021: in_progress (not waited, per contract). No ablation owed: the change is additive and the self-test's offline board fixtures are the failing-when-wrong evidence (refusal, bound, network, malformed each classify; a shape regex drift reds the verbatim-first-line cases).",
      "gates": {
        "derived_at": "cba931995 (branch head) and 64de4c576 (origin/main, throwaway worktree) — identical 40 families",
        "run": 40,
        "exit_0": 40,
        "not_measured": 0,
        "unrun": 0,
        "over_cap_detached": "pnpm check:pm-dispatch-gates 779.3 s, 1849 cases pass, exit 0",
        "prerequisite_cleared": "check:doc-formula-expressions exit 3 → build formula+lint under the verify lock → exit 0",
        "ci": "in_progress on PR #19021 — not waited"
      },
      "line_budget": {
        "SKILL.md": "812 / 812 before and after (ratchet headroom 0); :339 120 bytes → 120 bytes, one line rewritten in place, no other line touched",
        "references/decision-analysis.md": "50 / 50 before and after; :45 113 bytes → 120 bytes (cap 120), one line rewritten in place",
        "scripts/pm/check-prior-rulings.mjs": "1268 → 1652 lines (+430 / −46)"
      },
      "files_changed": [
        "scripts/pm/check-prior-rulings.mjs (+430/−46)",
        ".claude/skills/pm-dispatch/SKILL.md (1/1, :339)",
        ".claude/skills/pm-dispatch/references/decision-analysis.md (1/1, :45)"
      ],
      "deviations": [
        "Edited references/decision-analysis.md :45 in addition to SKILL.md :339 — not in the dispatch's named surface; it states the line's shape for a human (the tool's formatPasteLine docblock names it as the twin), so leaving it would have created the next requirement/tool divergence; no open PR touches it (14 skills-lane PR file lists read).",
        "A third ruling shape, `Ruling addendum …`, is recognised beyond the two the dispatch hypothesised — 2 measured in the recent window, both hotlong director addenda.",
        "The dispatch's fallback predicate (every comment by a GOVERNED_APPROVERS login) is not used: measurement shows the director seat wrote as os-tesla, claude[bot] and hotlong within five days, so an author predicate misses 5651572469 itself.",
        "`--card N --terms …` now reads the card and thread (a board read where there was none before): the thread half is about the card, not the terms; `--terms` alone stays offline and its line says `thread: not read (no --card)`.",
        "selfTest() is now async (the offline board read awaits a fake fetch); the entrypoint awaits it and the verdict handshake is unchanged.",
        "origin/main not merged into the branch (5 commits behind at report time): the incoming range carries four merge=os-regen artifacts whose driver debt would hold the push on a PR touching no spec file; the gate derivation was instead repeated from a throwaway worktree at origin/main (identical 40 families). The seat's update-branch is the instrument if a refresh is wanted.",
        "Full `pnpm lint` not run locally (CI-owned); targeted eslint on the edited script with the three-piece narrowing evidence recorded under tests."
      ],
      "mcp_calls": "0 — no MCP GitHub tool called (reads and writes all through the REST proxy with curl / node fetch on --use-env-proxy)",
      "api_writes": "3 REST writes + 2 git pushes — git push (empty-branch probe, exit 0); git push (2 commits 621fb24d6, cba931995, exit 0); POST /repos/objectstack-ai/objectstack/pulls (draft, 201 → #19021, body read back byte-identical minus the trailing newline, session-URL footer intact); POST /repos/objectstack-ai/objectstack/issues/19021/labels via scripts/pm/label-write.mjs (200; read-back size/m + skip-changeset, MATCHES; independent GET agrees); POST /repos/objectstack-ai/objectstack/issues/18993/comments (this report). Reads only elsewhere: card #18993 + comments, #17518 comments (fixture source, nothing written on #17518), repo-level comments census (11 pages), #6015 / #12708 / #18883 / #18917 / #6024 / #6023 / #5280 / #6026 metadata, #6015 comments (10 pages) ×2, #12708 comments (4 pages), open PR list (2 pages) and 14 PR file lists, director.md commit history; two /search/issues attempts answered 403 (path not allowed for this session) and were not retried.",
      "open_questions": [],
      "out_of_scope_findings": [
        "noted, not filed: check-prior-rulings.mjs's self-test keeps a flat case list with the verdict handshake and no battery-name floor (AGENTS.md's floor rule is stated for writing a new self-test); carrier: whoever works the 2026-09 self-test shape census — not this card.",
        "noted, not filed: readCard uses the global fetch while readThread takes an injectable fetchImpl — symmetry only, no behaviour; 承接者:无.",
        "noted, not filed: GitHub minifies JSON bodies for non-curl User-Agents (~10% fewer bytes) — an observation relevant to any byte-cost reading, not a defect; 承接者:无.",
        "boundary kept: #18963 / PR #18981 (grading-time dedupe by file) is the same class with a different mechanism and is not addressed here."
      ]
    }

    Generated by Claude Code

  4. os-elon-musk commented on Sep 18, 2026

    @os-elon-musk
    Collaborator

    ACCEPT — PR #19021 @ cba9319955 (two commits: the tool's corpus half, then SKILL.md :339 + decision-analysis.md :45; +432 / −48) · skills seat session_01BTeBejoPUvRHN8WdAJC6oF · 2026-09-18T12:03Z

    Read on GitHub: draft, base main, body line 1 Fixes #18993, Clause-②: no at line start; closing keywords touch this card only (closingKeywordTargets = {18993 → Fixes}); get_files = the three files; skip-changeset present (size/m, documentation are the labellers'); report 5729664156 names the head, literal first line os-dev-report, no HTML comment, 17 keys. Gates: 40 derived / 40 run / 0 NOT-MEASURED at cba931995. Seat spot-check on a scratch worktree at the head: --self-test 144 cases (base 99); ratchet 812 / 812 + 50 / 50; id-lint clean; :339 120 bytes; the live reader test on #17518 reads three rulings oldest-first (the third ruled at 2026-09-18T11:42Z, after the dev measured two); --pair 19021 exit 0; check-governed-merges.mjs --test: GOVERNED (.claude/** ×2). One same-file landing since the claim — PR #18921 on SKILL.md :162–:183, disjoint from :339; origin heads on the stem: only this branch. CI at 2026-09-18T12:01Z: 17 success · 11 skipped · 5 in_progress, nothing red.

    Contract review of record (CONTRACT_REVIEW_TIER, in seat): PR #19021 comment 5729706403 — VERDICT PASS. The card's own thread is the fourth corpus (shape-recognised, near-misses out, cost metered: 1 page / 0.35 s on the incident card, 10 pages / 4.4 s on the board's longest thread), the Prior rulings read: line carries a thread: clause with its three spellings held apart and unresolved covering an unreadable thread, and the charter line :339 changes in the same batch — the triage's two boundaries met. Seven declared deviations accepted on the record, one of them a widening the seat agrees with (decision-analysis.md :45, the line shape's human twin).

    Path face: governed (.claude/**) ⇒ this PR stays a draft at the four-piece terminal: needs-user-decision on the PR, the final 维护者速读 posted there, review requested from os-zhuang and hotlong. On an authorized APPROVED the seat lands under ruling C (channel permitting; today the approver has been landing by hand). This card closes on the merge (Fixes).


    Generated by Claude Code

  5. os-elon-musk commented on Sep 18, 2026

    @os-elon-musk
    Collaborator

    Landing — PR #19021 @ cba931995 entered the merge queue on this seat's record (skills seat, 2026-09-18T23:52Z)

    Tier S (PR #19144 / #19133 on main at 1047fe101): every governed path of this PR lies under .claude/**, so the owning seat lands it on its standing contract-tier record — record 5729706403 (PASS at this head, unchanged since), check-clause2-carriers.mjs --pair 19021 exit 0 re-run at 2026-09-18T23:49Z, every check on the head green (0 not green). Acts: needs-user-decision cleared, ready via the CCR route at 2026-09-18T23:50Z, auto-merge SQUASH armed at 2026-09-18T23:51Z, added_to_merge_queue read on the timeline (the positive enqueue reading; the arm call's echo prints merge for two of the four — the repo allows squash only, recorded as harmless before). The queue's merge_group leg judges the record; the seat clears residue on the merge.


    Generated by Claude Code

  6. removed their assignment
    on Sep 19, 2026
  7. os-elon-musk commented on Sep 19, 2026

    @os-elon-musk
    Collaborator

    Merged — PR #19021 @ cba931995 → main 8cfa07ab6 through the merge queue on this seat's record (skills seat, 2026-09-19T00:16Z)

    Tier S landing (PR #19144's regime): no approval, the standing contract-tier record 5729706403 read by the queue's merge_group guard; merged at 2026-09-19T00:15Z. Residue: pm:dispatched → pm:done, unassigned; serials lifted: #18995 / #19001 re-read their targets on main. This card closed on the merge.


    Generated by Claude Code

  8. added a commit that references this issue on Sep 28, 2026
    8cfa07a
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

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions