Repository navigation
feat(pm): a ruled decision card still in the box is a patrol row, and the director's ruling lands with its knock - #29515
Conversation
… director's ruling lands with its knock The director records a ruling as a `Ruling:` comment and a `Ruled:` body line and writes no label; the exit out of `needs-user-decision` is the lane seat's, and the lane learns of the ruling from the `Notify: ruling` bell. When that bell is skipped nothing moves the card. - lanes/director.md: the ruling, the `Ruled:` line and the `Notify: ruling` knock to the card's lane seat land in one act; a ruling recorded without its knock is a half state the recorder owes. Paid in place: two 职责一 lines that said one thing are merged, so the file stays at its 86-line ceiling. - check-half-states H73 (band `stall`, report-only): an open issue carrying `needs-user-decision` whose body has a line-leading `Ruled: <comment id>` (fences stripped) older than one patrol cycle (6h), reported with the ruling id, its age and the `domain:*` seat that owes the exit. Read free on the unscoped open listing beside H62. A card that re-entered the box naming the ruling on its `Prior rulings on this card:` line is clean. - Self-test battery `H73 ruled card in the decision box` (28 cases, pin 25), with a positive twin beside each negative control, a `Ruled:` inside a code fence among them. Claude-Session: https://claude.ai/code/session_01J8VVAm7suYn3TrFHkbu4N3 Co-authored-by: Claude <noreply@anthropic.com>
|
domain:skills#1 · huangyiirene · session_01J8VVAnMUWA9rufXzFaEh4J Contract-review-claim: session_01J8VVAnMUWA9rufXzFaEh4J · head 4bf6e86 · 2026-11-02T17:21Z The seat review runs at CONTRACT_REVIEW_TIER in an isolated subagent (the seat session is not at that tier). |
|
domain:skills#1 · huangyiirene · session_01J8VVAnMUWA9rufXzFaEh4J Contract reviewServed-tier: Reviewer: an isolated contract reviewer at CONTRACT_REVIEW_TIER, read-only on GitHub (REST reads only; nothing written, pushed or commented), fed the card body and comments, the PR body, the net diff against the merge-base, the head's check-runs, contract-review.md and review-checklist.md. The dev report was read as input, not as conclusions; every count below is this review's own measurement. No environment variable value is printed anywhere in this record; the live sweep's token was passed by substitution and never echoed. ① Derived judgmentsThe card's letter A, its two deliverables and the PR's claims, one at a time:
② Semver levelNone. No published package, no ③ Boundary flags
④ Design judgmentPer hits file, against the card's scenario (a director records a ruling on a card in the decision box; the lane seat must learn of it and make the exit; nothing else may write the label):
Must-fix: none. Should-fix:
Check-runs at record time (2026-11-02T17:45Z): 51 check-runs on 4bf6e86, all completed, 31 success, 20 skipped, 0 failure, 0 in progress. Success: Lint & Repo Gates, TypeScript Type Check, Test Core (and shards 1/8, 2/8), Governed Surface Queue Guard, Test UI, Lint · ESLint, Lint · docs & code guards, Lint · repo & tooling gates, Lint · scoped · tooling self-tests, Lint · scoped · slot lookup & corpus, Lint · scoped · query-options erasure, Lint · PM dispatch-gates, Lint · CI, release & engine gates, Type Check · workspace / source gates / debt ledger / consumer gates, PR-body guards, Check Changeset, Check PR Size, Dogfood Regression Gate, Plan Test Core shards, Auto Label, filter, Live half-state sweep, Live required-set sweep, Platform checklist gate sweep, Release section-coverage sweep, Snapshot the board to the archive branch. Skipped by path filter: Build Core, Build Docs, Build UI Deps, Lint UI, Type Check UI, Build & E2E UI, Live E2E UI, UI Published Artifacts, Temporal Conformance, Dogfood Verify CLI and the opt-in lanes. Combined status Implemented-by: VERDICT: PASS with should-fixes (S1 runbook line and the Generated by Claude Code |
|
domain:skills#1 · huangyiirene · session_01J8VVAnMUWA9rufXzFaEh4J 维护者速读
席位核对 — ACCEPT · domain:skills#1 · head
|
⛔ merge queue 构建失败 — 先分诊,再决定要不要重排队列构建 41495019103 红了。队列跑的是全量套件(PR 侧 CI 只跑 affected 子集), 分类: 失败的 job(日志抽取,best effort):
跨 PR 相同签名(24h,按失败测试文件聚合):
历史信号:
分诊清单:
Generated by Claude Code · merge-queue-triage workflow (#4859) |
⛔ merge queue 构建失败 — 先分诊,再决定要不要重排队列构建 41498313013 红了。队列跑的是全量套件(PR 侧 CI 只跑 affected 子集), 分类: 失败的 job(日志抽取,best effort):
跨 PR 相同签名(24h,按失败测试文件聚合):
历史信号:
分诊清单:
Generated by Claude Code · merge-queue-triage workflow (#4859) |
domain:skills#1 · huangyiirene · session_01J8VVAnMUWA9rufXzFaEh4J
Requested by Irene · project thread
os-dev · domain:skills#1 dispatch · session_01J8VVAm7suYn3TrFHkbu4N3
Fixes #29386
Clause-②: no
Metadata-protocol: none
维护者速读
Ruled:行和给车道席的Notify: ruling敲门是同一笔,漏敲是录裁者欠的半状态;半状态巡查新增 H73 行,列出正文已有Ruled:却仍挂needs-user-decision超过 6 小时的卡,附裁决 id、已过时长和欠退箱的domain:*车道席。scripts/pm/check-half-states.mjs的h73RuledCardStillInBox(围栏剥离、取最新时间戳、Prior rulings on this card:重入例外),再看lanes/director.md第 13 行与第 39 行。node scripts/pm/check-half-states.mjs --self-test,预期结尾的 battery 列表里有H73 ruled card in the decision box 28/25,且全部通过。.claude/**(Tier S),由 skills 席复核落地,你无需动作。What changes
.claude/skills/pm-dispatch/references/lanes/director.md(86 → 86 lines, ceiling unchanged)Ruled:recording line: theNotify: rulingknock to the card's lane seat lands in the same act, its shape is the one../project-forms.mdspells, and a ruling recorded without its knock is a half state the recorder owes. The existing⛔ 不新增标签与状态stays, so the director still writes no label on the card.scripts/pm/check-half-states.mjs: new report-only row H73, the body-record half of the runbook's declared 「旗一」.needs-user-decision, read on the unscoped open listing beside H62.needs-user-decisionis not a label page, so this is where those cards are first visible. It is one label read and one body read on rows the sweep already holds, so no new request.Ruled:(the shared directive reader, so bullet/bold/backtick decoration reads) whose value opens with a numeric comment id. Fenced blocks are stripped first (stripMarkdownCode, inline spans kept). A mid-sentence mention and a line-leadingRuled:followed by prose are not records.Ruled:lines. A record with no readable stamp reports with its age unreadable, never as fresh. ThresholdRULED_IN_BOX_STALE_HOURS= 6, one standing patrol cycle (PATROL_CADENCE_HOURS).Prior rulings on this card:line (or the list under it) has lawfully re-entered the box with a new question and is clean.domain:*lane seat (or "no lane yet, the triage seat routes it"), the one-act rule and the bell shape's printout. No angle brackets, no tracker number.stall, registered inHALF_STATE_FAMILY_BANDwith its reasons.H73 ruled card in the decision boxon the frozen roster (28 cases, pin 25).Why
Card #29386, letter A. The director records a ruling as a
Ruling:comment plus aRuled:body line and writes no label; the exit out ofneeds-user-decisionis the lane seat's, and the lane learns of the ruling from aNotify: rulingbell. Measured on 2026-11-02, twelve cards ruled 01:14Z–10:06Z drew zero bells and all twelve still carried the label at 12:08Z, the oldest 10 h 54 min after its ruling. No patrol row read aRuled:line against the label.Verification
At 4bf6e86 in objectstack-ai/objectstack:
Self-test and ablations
node scripts/pm/check-half-states.mjs --self-test: exit 0, 5213 cases pass; batteryH73 ruled card in the decision box 28/25, every other battery at or above its pin.Ruled:line inside a backtick fence and inside a tilde fence is clean, and the identical line unfenced fires; a mid-sentence mention and a table cell are clean; a line-leadingRuled:followed by prose (the H55 fixture's body) is clean; 5h59m is silent and 6h01m fires; a missing stamp reports; a fresh re-ruling silences an old one, and two old ones report the newer id; thePrior rulings on this card:line naming this id (inline or as a list) is clean, naming another id fires, and an id after a blank line is not that line's; closed card, PR row, unreadable labels, missing row and null body are silent.scripts/pm/zz-ablate-h73.mjs, deleted afterwards;git statusclean): fence stripping removed → 3 cases red; label gate removed → 2 red; id requirement removed → 2 red; re-entry exception removed → 2 red; threshold removed → 3 red; the sweep push removed → 21 red, the band/coverage case among them.Live sweep
node scripts/pm/check-half-states.mjsagainst the live board (objectstack-ai/objectstack, main 86d36e9 plus this commit), exit 0: two H73 rows, [Decision] spec: the relatedList describe still names the retired "Related" and "Details" tabs of the old record page — fix now, after record page v2 settles, or leave it #28888 (domain:spec, ruling 6568787922, ~13h) and objectql: a plainlookupwrite accepts a target the writer cannot read — the reference check probes it elevated, and onlymaster_detailasks the caller's read door #29029 (domain:server, ruling 6573561091, ~8h). [Decision] flows and records: may a flow start input declare a record reference (A), and does a non-system create stop choosing the new record's id (C)? #29425 (ruled 14:56Z, ~2h) is under the threshold and silent. That matches the premise re-measured at 16:52Z: three openneeds-user-decisioncards with a line-leadingRuled:.Gates
node scripts/pm/dispatch-gates.mjs --commands(no paths, from the merge base) derives 54 commands for the two paths. All 54 exited 0, each exit captured before any pipe.pnpm --filter @objectstack/lint run check:doc-formula-expressionsfirst answered exit 3 (prerequisite: no built@objectstack/formula/@objectstack/lint); afterturbo run build --filter=@objectstack/formula --filter=@objectstack/lintit exited 0 on the same head.dispatch-gates --ran: 54 derived, 54 run, 0 NOT-MEASURED, 0 UNRUN.pnpm check:pm-half-states0,pnpm check:pm-skill-ratchet0 (lanes/director.md86 against ceiling 86),pnpm check:pm-skill-id-lint0,pnpm check:skill-frame-sync0,pnpm check:doc-authoring0,pnpm check:commit-card-trailers0,pnpm check:nul-bytes0.pnpm exec eslint --no-inline-config scripts/pm/check-half-states.mjs: exit 0..claude/**andscripts/pm/**change, which publish nothing, so the PR carriesskip-changeset.Acceptance notes
dispatch-runbook.md「机械两旗 report-only,归半状态巡查;接线是另一张卡的事」 is now half-true for 旗一: its body-record half is H73. The runbook is outside this card's surface and at its own ceiling (245), so it is left for the seat.[Decision]title is read from the queue side by H54; this row reads only the body record, as the card scopes it.Ruled (plugin-ai): ID · letter A · UTC(one open card carries one, outside the box) is not a line-leadingRuled:and is not read. The card specifiesRuled:; widening the key is a seat call.Human Minimum
packages/specholds no runtime logic. (Not touched.)main, one pull request.packages/specnot touched.content/docs/references/,packages/*/CHANGELOG.mdorcontent/docs/releases/.pnpm lintandpnpm testwere not run; the changed script has no package tests, and eslint over it was run.)🤖 Generated with Claude Code
https://claude.ai/code/session_01J8VVAm7suYn3TrFHkbu4N3
Generated by Claude Code