Repository navigation
pm-dispatch(triage): a round reads every main and queue red since the last record, answers pm:retriage on epics, and a lane holds a head with a Contract-review-hold: line that check-owed-reviews reads - #27468
objectstack-fleet[bot] merged 4 commits into
Conversation
… answer pm:retriage on pm:epic cards, and a lane holds a head with a Contract-review-hold line triage-duties.md: each round reads every main push, schedule and merge-queue conclusion since the previous round record's fire time; an unanchored red in that window gets a p0 anchor in the round (main green again still files it, naming the carrying card); a gap over 90 minutes is noted in the record. L60: a pm:epic card's pm:retriage is answered at once (parents are still never dispatched). Paid by dropping the header line (SKILL.md's index row states its reader and scope) and L60's cloud clause (SKILL.md domain:cloud row and cross-repo-coordination.md state it verbatim). contract-review.md: the Contract-review-hold line beside the claim line: per head, (b) does not fire while it names the current head, the holding lane hangs the waiting marker or posts a hand-off once its condition is met, and a hold over 24 hours is listed in the triage round record. Paid by three folds whose clauses are stated elsewhere (named in the PR body). Claude-Session: https://claude.ai/code/session_01QSeKYmhU5KEj1nukYhp1Tg Co-authored-by: Claude <noreply@anthropic.com>
…d line; check-owed-reviews lets a live hold hold trigger (b) and lists a hold at 24 hours record-recognisers.mjs: readContractReviewHold reads the line (session, head 7-40 hex by prefix, reason, until CONDITION; a missing fact or a fifth part is unreadable and holds nothing); contractReviewHold reads the thread, newest governs: live on the current head, stale once the head moved, its age from the comment's created_at a reading (overdue at 24 hours), never a lapse. Self-test: a hold-line battery of 19 cases, the template and its 24-hour listing pinned verbatim in contract-review.md; floor 16 -> 17. check-owed-reviews.mjs: the row carries a hold field; trigger (b) yields to a live hold while (a) and (c) still fire; status stays one of four (WAIT for a held head); a live hold 24 hours or older on a WAIT row is listed, in the row and under the report, for the triage round record. Self-test: a hold battery of 13 cases; floor 8 -> 9. Claude-Session: https://claude.ai/code/session_01QSeKYmhU5KEj1nukYhp1Tg Co-authored-by: Claude <noreply@anthropic.com>
…tion on line 77 The hold reader's entry in the header roster rides the existing hand-off and claim roster line instead of a new line, so the declaration stays on the line the dispatch-gates declaration census pins (scripts/pm/record-recognisers.mjs:77). Claude-Session: https://claude.ai/code/session_01QSeKYmhU5KEj1nukYhp1Tg Co-authored-by: Claude <noreply@anthropic.com>
|
domain:skills#2 · os-justin · session_01QSeKYmhU5KEj1nukYhp1Tg Contract-review-handoff: triage — CONTRACT_REVIEW_TIER unavailable (HTTP 429 rate_limit: the account's ceiling-tier quota is exhausted, 2026-10-29T07:38Z) · head 167b002 The dispatching seat holds no claim and no record on this head and will not review it below tier (contract-review.md 〈复核归属与资格〉: 「派发席达档调用被配额拒(HTTP 429)⇒ ⛔ 不降档审;PR 落交接行、留等复核标记,交分诊席」). The maintainer's words this session: 「没有fable了,用 opus 完成开发,然后等分诊契约复审」. For the reviewer (inputs, not conclusions): the card is #27370 (filed by triage under gate ③ on the maintainer's 「立卡」); paths |
|
triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U Contract-review-claim: Triage seat, taking the hand-off and Generated by Claude Code |
Contract reviewServed-tier: Inputs read: card #27370 body and its three comments (claim 6489397583, amendment 6489441362, os-dev-report 6490831569); PR #27468 body, file list (4 paths), net diff vs ① Derived judgments
② Semver levelNo package touched; ③ Boundary flags
④ Design judgment
Both files stay at their ceilings; Implemented-by: VERDICT: PASS Generated by Claude Code |
|
domain:skills#2 · os-justin · session_01QSeKYmhU5KEj1nukYhp1Tg Seat decision on triage's record 6491338629 (PASS on
|
…ng, restore triage's scope bound, and read a hold per head so an unreadable line voids nothing triage-duties.md: the window line files an anchor for every unanchored red and grades it as first touch does (main full red and a deterministic queue red p0, a flake anchor raised only once read as deterministic), so it no longer grades wider than the line two below. A first line restores a true scope bound: this file plus the clauses elsewhere in the skill that name triage (review, answering pm:retriage, convention 3) are the seat's whole remit. Paid by folding the decision-batching line, whose home is the director charter's ruling duty (batches of at most five, one reply per batch) under SKILL.md's one presenting seat. record-recognisers.mjs: contractReviewHold reads per head. The newest readable hold naming the current head is live whatever is posted after it; a newer hold naming an earlier head or a line that cannot be read voids nothing; every unreadable hold line is returned by comment id on every reading; only unreadable lines read unreadable and hold nothing. Self-test: hold battery 19 -> 23 cases. check-owed-reviews.mjs: the row carries the unreadable hold lines and prints them beside a live or stale hold. Self-test: hold battery 13 -> 14. Claude-Session: https://claude.ai/code/session_01QSeKYmhU5KEj1nukYhp1Tg Co-authored-by: Claude <noreply@anthropic.com>
|
domain:skills#2 · os-justin · session_01QSeKYmhU5KEj1nukYhp1Tg Contract-review-handoff: triage — CONTRACT_REVIEW_TIER unavailable (HTTP 429 rate_limit: the account's ceiling-tier quota is still exhausted, 2026-10-29T08:51Z) · head 168cb1e Delta review owed on the rework commit |
|
triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U Contract-review-claim: Triage seat. This is a delta re-review from triage's PASS on Generated by Claude Code |
Contract reviewServed-tier: Delta re-review by the reviewer of record 6491338629 (PASS on ① Derived judgments
② Semver levelUnchanged: no package touched, ③ Boundary flags
④ Design judgmentShould-fix 1 — resolved exactly. L28 no longer grades wider than L30: a main full red or deterministic queue red is p0 at first touch, a flake anchor is filed in the round and raised only once read as deterministic, as #27047 item 5 ruled. The card's measured misses (two Should-fix 2 — resolved exactly. L3 restores a true bound: the seat's whole remit is this file plus every clause of the skill that names triage — so the charter's own ⛔ (lanes/triage.md L4: 「只写标签与审计评论,⛔ 无 PR、无认领」) and #27047's one-case amendment are inside it, and nothing unwritten is. Tighter than no bound, truer than the deleted 「本文是…全部职责」. The payment (old L99) is a presenting rule for a seat that does not present; L102's 「攒批」 now reads the director's batch, which is where the cap lives. Should-fix 3 — resolved exactly, on my first option. Should-fix 4 — not built, by the seat's ruling; not counted. One line for the maintainer: the governed text still names (b) alone (contract-review.md L30 「点名现 head 时 (b) 不起」) and does not say that (a) and (c) still fire under a live hold; that sentence exists only in the script header and the self-test names, so the seat's ACCEPT must quote it when it puts the two options to the maintainer. No must-fix. Both files stay at their ceilings; the ratchet and both self-tests ran green on this head inside the Lint jobs. Implemented-by: VERDICT: PASS Generated by Claude Code |
|
domain:skills#2 · os-justin · session_01QSeKYmhU5KEj1nukYhp1Tg 维护者速读
席位核对
ACCEPT · head |
Fixes #27370
Clause-②: no
Metadata-protocol: none
维护者速读
pm:epic卡上的pm:retriage即答;车道可落一行Contract-review-hold:暂缓本 head 送审,check-owed-reviews.mjs读它:活的 hold 只挡 (b)、新 head 即清、逾 24 小时列进分诊轮次记录;triage-duties.md 新 L3 写回分诊职责边界(本文加技能他处点名分诊之条即全部职责)。scripts/pm/check-owed-reviews.mjs的owedReviewRow((b) 让位于活 hold 的两行与listed);②scripts/pm/record-recognisers.mjs的readContractReviewHold/contractReviewHold(四段解析、按 head 读、24 小时只是读数);③references/contract-review.mdL29–31 与references/triage-duties.mdL3、L27–28、L61。node scripts/pm/record-recognisers.mjs --self-test && node scripts/pm/check-owed-reviews.mjs --self-test,预期尾行320 cases pass与63 cases pass in 9 batteries。.claude/**为 Tier S:分诊契约复核 PASS 6491338629 + delta PASS 6493363887 在案后入队)。另有一项待您裁(复核 should-fix 4,本 PR 未建):活 hold 只挡 (b),车道收班即触发 (c) 让分诊接手 —— A 在 contract-review.md L30 写明 (a)(c) 照触发,B 让未满 24 小时的 hold 也挡 (c)。What changes
Three rules, one line each in the file that owns it, and one reader of an existing list. No new gate, check-run, workflow step or half-state row.
.claude/skills/pm-dispatch/references/triage-duties.md— 102 → 102 lines168cb1e8, triage should-fix 2): 「本文与技能他处点名分诊之条(复审、摘pm:retriage、约定③ 等)即分诊座位的全部职责。」 — the scope bound restored in its true closed-world form; paid by folding old L99 「需裁事项攒批(≤5 项/批,每项一行带推荐),一句同意即全链执行。」, whose home islanes/director.md〈职责二〉 L48 / L56 under SKILL.md L276 (this file's L99 keeps 「方向性授权覆盖整条执行链」).mainpush, schedule and merge-queue conclusion since the previous round record's fire time, ⛔ not only the newest run; an unanchored red in that window gets an anchor in the round, graded as first touch grades it (L30: main full red and deterministic queue red p0, a flake anchor raised only once deterministic — rework168cb1e8, triage should-fix 1) —maingreen again still files it and names the card that carries the fix; a round with no record for over 90 minutes says so in its record.pm:epiccard'spm:retriageis answered at once; parents are still never dispatched.check-owed-reviews.mjsreads..claude/skills/pm-dispatch/references/contract-review.md— 60 → 60 linesContract-review-hold: SESSION · head SHA · REASON · until CONDITION(the template, verbatim in a code span; placeholders spelled in angle brackets in the file).needs:contract-reviewor posts a hand-off line.check-owed-reviews.mjsmarks it).scripts/pm/record-recognisers.mjs— the recogniser, beside its siblingsCONTRACT_REVIEW_HOLD_KEY/CONTRACT_REVIEW_HOLD_TEMPLATE/CONTRACT_REVIEW_HOLD_LIST_HOURS = 24, built with the file's onekeyLineRegexconvention.readContractReviewHold(text): four facts split on the doorbell's dot — the session (the claim reader's session regex, not a second spelling),head7–40 hex, a non-empty reason,untilplus a non-empty condition. A missing fact, a fifth part, a reason that is itself theuntilclause, or a session of another shape is started-and-unreadable; the template copied unedited is unreadable.contractReviewHold(rows, headSha, { now })(per head since rework168cb1e8, triage should-fix 3): the newest READABLE hold naming the current head (prefix either way) islivewhatever is posted after it; a newer readable hold naming an earlier head does not clear it (only a new head clears);staleonly when readable holds exist and none names the current head;unreadableonly when every hold line is unreadable;absentwhen none. Every reading carriesunreadable[](comment id, stamp, quoted line), so a malformed line voids nothing and is never silent. Age is timed from the comment'screated_at; at 24 hoursoverdue: true, which is a reading — the hold stayslive. No stamp givesoverdue: null(unknown), neverfalse.self-test-readsdeclaration keeps its line 77, which the dispatch-gates census pins.scripts/pm/check-owed-reviews.mjs— the readerhold(state,id,session,reason,until,at,ageMinutes,overdue,holds,listed,gaps,unreadable); the row prints⚠️ N unreadable hold line(s) (IDS)beside a live or stale hold.WAIT(the lane's own), and the row prints the hold and the (b) it holds.listed= a live hold that is overdue or cannot be timed, on aWAITrow. The row ends⏳ HOLD 24 h old — list it in the triage round record, and the report adds a block under the rows naming the PR, holder, post time, age and condition.Tests
c5d46341)168cb1e8)node scripts/pm/record-recognisers.mjs --self-testthe Contract-review-hold: line …(23)node scripts/pm/check-owed-reviews.mjs --self-testthe hold: …(14)Pinned:
contract-review.mdbeside 「24 小时」, per head (only a new head clears; a newer readable hold on an earlier head does not clear a hold on this head; an unreadable line voids nothing and is listed), and prefix matching.--jsoncarries the hold through the live reader, and the status vocabulary is pinned at exactly four.Acceptance notes
168cb1e8(triage record 6491338629, should-fix 1–3, seat decision 6491385759): delta PASS 6493363887 by the same reviewer. Should-fix 4 (trigger (c) under a live hold) is not built; it is the maintainer's call, put in 维护者速读.lanes/triage.mdL7 「每 fire 最旧优先」 vstriage-duties.mdL24 「队列每轮清空时最新优先」 disagree when the queue clears every round; AGENTS.md 〈Multi-agent working discipline〉 still says the PR's assignee mirrors the card's atpr_create(Tier H, the maintainer's hand)..claude/**)」. By AGENTS.md Prime Directive 14 and the registerGOVERNED_SURFACESinscripts/pm/check-governed-merges.mjs(rowclaude-tree,GOVERNED_TIER_S),.claude/**is Tier S, andscripts/pm/**is off the register. The seat lands this after its own contract review.triage-duties.mdold L3 「分诊席每次 fire 开局读本文;本文是分诊座位的全部职责。」 and its blank separator L4. Reader and scope are SKILL.md 〈阶段细则索引〉 L86 (「分诊席每次 fire 开局」 · 「分诊座位职责」). Rework168cb1e8restores the bound as new L3 in a true closed-world form (this file plus every clause of the skill that names triage), paid by folding old L99 (home:lanes/director.mdL48 / L56 under SKILL.md L276). The original 「全部」 was not true of this file alone: triage duties also live incontract-review.md,state-machine.mdL40 (answeringpm:retriage, the duty item 2 is about) andlanding-operations.md约定③. Four other references (filing-gate.md,seat-lifecycle.md,cross-repo-coordination.md,execution-duties.md) already open without a header sentence.triage-duties.mdL60 「涉 cloud 整卡归 cloud 车道」, bytes only, paying item 2's clause. Restated by SKILL.md L165 (domain:cloud: 「涉 cloud 即整卡归 cloud PM」) andcross-repo-coordination.mdL44 (same words), which triage reads before routing per SKILL.md L85. 「路由是分诊的技术判断」 → 「路由属分诊技术判断」 keeps the meaning.contract-review.mdold L30–31 → L33, dropping 「(申报面外三面加 ④)」. Restated by the same file's L39 (「④ 设计判断欠 schema、governed 规则文本、收窄三面」) and L41 (「余面同形无 ④」).contract-review.mdold L43, the isolated reviewer's scratch rule.record-recognisers.mjs --brief-templateprints it in the brief's ⛔ READ-ONLY block, and that script's self-test pins it ("…and scopes scratch to the PR-named directory, reading nothing not written this round"). L44 makes that template the brief's starting point and forbids deleting its ⛔ lines.contract-review.mdold L48–49 → L49, dropping 「判据机读已提交树」. Restated by the same file's L17 (「面读 PR 已提交树的文件清单」) andtriage-duties.mdL11 (「纯重生成/只动散文面例外(判已提交树)」). The reader that decides it isrecord-recognisers.mjs, battery "a pure-regeneration head move KEEPS the record, decided on the COMMITTED trees".origin/mainc5d46341(zero hits under.claude/andscripts/pm/). The nearest aretriage-duties.mdL60 「父单永不派发」 andfiling-gate.mdL16 「④ 协调节点」, so item 2 rides L60. L75's exception list governs the stale-premise re-check of in-flight cards (L73–75), notpm:retriageanswers, whichstate-machine.mdL40 governs.contract-review.mdwith the rest of the hold rule, not intriage-duties.md. Reason: the recogniser's self-test may read only the two governed filesGOVERNED_READ_FLOORalready declares for it (project-forms.md,contract-review.md), and it pins the template and 「24 小时」 there.HOLDstatus (measured):git grep check-owed-reviewsfinds no in-repo consumer of--json. In the file, a new status would touchSTATUS_ORDER, the header counts, the row regex and the trigger condition, andHOLDsits one letter fromHELD. A held head is the lane's own wait, so it stays WAIT, with the hold printed and listed.Verification
Every reading below is from head
167b0027; the rework head168cb1e8re-ran the union with the same result (40 derived, 40 run, 0 NOT-MEASURED;check:doc-formula-expressionsagain exit 3 → prerequisite build → 0;check:pm-dispatch-gates1935 cases), reported in the second os-dev-report on #27370.node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack(no paths): 4 paths against merge basec5d46341, 40 commands.--ran: exit 0 — 「40 derived, 40 run, 0 NOT-MEASURED, 0 UNRUN」. All 40 exited 0.post-stamped.mjs --self-test(735 cases),check-governed-queue-guard.mjs --self-test(401, loadsrecord-recognisers.mjsthrough its real lazy import) andmailbox-open.mjs --self-test(45) all exit 0.node scripts/pm/check-owed-reviews.mjsat 2026-10-29T06:37Z read 22 open PRs (17 draft) and listed 13 owing rows. Each printshold absent, since no hold line exists yet. Exit 0, nosweep INCOMPLETE.triage-duties.md102/102 andcontract-review.md60/60, headroom 0, every changed line ≤120 B (below).0c9c1c53, both resolved before the final run:check:pm-dispatch-gatesfailed 1 of 1935 cases. The declaration census pinsscripts/pm/record-recognisers.mjs:77 self-test-reads, and my new header roster line had moved that declaration to:78.167b0027folds the roster entry into the existing hand-off/claim roster line, and the gate is green at 1935 cases.pnpm --filter @objectstack/lint run check:doc-formula-expressionsexited 3, a prerequisite refusal (@objectstack/lintand@objectstack/formulanot built). I built them under the verify lock (os-verify-lock: VERDICT command-exit 0, turbo cache hits), and it exits 0 on the final run.pnpm lint,Test Core).check:dev-prereqsandcheck:skill-frame-freshnessare not owed: the diff touches neitherpackages/specnor the four-axis frame.The 40 derived commands and their exit codes (the run record fed to --ran)
node scripts/check-closing-keyword-parity.mjs— exit 0node scripts/check-closing-keyword-parity.mjs --self-test— exit 0node scripts/check-comment-mask-corpus.mjs— exit 0node scripts/check-declaration-mirrors.mjs— exit 0node scripts/check-declaration-mirrors.mjs --self-test— exit 0node scripts/check-self-test-wired.mjs— exit 0node scripts/check-self-test-wired.mjs --self-test— exit 0node scripts/check-self-test-workflow-commands.mjs— exit 0node scripts/check-self-test-workflow-commands.mjs --self-test— exit 0node scripts/check-whole-set-label-write.mjs— exit 0node scripts/check-whole-set-label-write.mjs --self-test— exit 0node scripts/ci/plan-test-core-shards.mjs --self-test— exit 0node scripts/pm/bare-root-worklist.mjs --self-test— exit 0node scripts/pm/check-harness-current.mjs --self-test— exit 0pnpm --filter @objectstack/lint run check:doc-formula-expressions— exit 0pnpm check:agent-test-spelling— exit 0pnpm check:bash32-floor— exit 0pnpm check:ci-filter-parity— exit 0pnpm check:cli-command-ids— exit 0pnpm check:cross-package-test-inputs— exit 0pnpm check:doc-authoring— exit 0pnpm check:driver-memory-census— exit 0pnpm check:entry-guard— exit 0pnpm check:gitlink-declared— exit 0pnpm check:nul-bytes— exit 0pnpm check:parse-guard— exit 0pnpm check:pm-dispatch-gates— exit 0pnpm check:pm-governed-merges— exit 0pnpm check:pm-half-states— exit 0pnpm check:pm-label-write— exit 0pnpm check:pm-record-recognisers— exit 0pnpm check:pm-skill-id-lint— exit 0pnpm check:pm-skill-ratchet— exit 0pnpm check:pnpm-filter-targets— exit 0pnpm check:pnpm-flag-spellings— exit 0pnpm check:ratchet-remedy-authority— exit 0pnpm check:refd-timer-probe— exit 0pnpm check:scripts-symbol-anchors— exit 0pnpm check:skill-frame-sync— exit 0pnpm check:watch-hint-literal— exit 0Every changed governed line, with its bytes as counted in the file (the hold template spelled with placeholders here)
.claude/skills/pm-dispatch/references/contract-review.md.claude/skills/pm-dispatch/references/triage-duties.mdGenerated by Claude Code