Repository navigation
pm-dispatch: a governed PR at ACCEPT gets needs-user-decision and a Chinese 「维护者速读」 brief (what / why / risk / recommendation / the one act asked), so the maintainer can tell from the list what awaits him and confirm quickly #15894
Description
Activity
- addeddocumentationImprovements or additions to documentationImprovements or additions to documentationpriority:p2Medium: important, M3Medium: important, M3and removed
on Sep 5, 2026 Claim: PM loop round 7 — filed and taken at first touch by the seat on the maintainer's 2026-09-05 instruction (p2, governed): a governed PR at ACCEPT gets
needs-user-decisionand a Chinese 「维护者速读」 brief; the rule written once in SKILL.md, the label description gains its PR meaning
Session:session_019RfFHiRCSs3JXLK4cwcfox
Branch:claude/issue-15894-maintainer-brief-on-governed-prs
Worktree:objectstack-issue-15894
Domain:domain:skills
File surface:.claude/skills/pm-dispatch/SKILL.md(811/811, table pin 342, headroom 0 — the governed endgame section 入队与落地, the decision-box rule, and the language rule; line-neutral by folding) andscripts/pm/ensure-pm-labels.sh(theneeds-user-decisiondescription, within the 100-character cap). The patrol row is #15895, blocked behind #15884.
Container & model: S,mode:subagent,model: fable(dispatch-gates.mjs --tier: MANDATORY — SKILL.md is clause-① mandatory)
Clause-②: no (PM protocol text)
Serial constraints cleared: both files free (PR #15848 and #15795 landed; #15884 and #15846's flights touch neither); no open PR touches them (scan 13:2xZ). GOVERNED ⇒ draft PR, in-seat contract-tier review,os-zhuang+hotlong, human merge,skip-changeset— and, per the rule itself,needs-user-decision+ a 速读 on the PR. The PR carriesFixes #15894.Decision re-read (13:2xZ): the maintainer's instruction is verbatim on the card; the three PRs and two cards awaiting him already carry the label and the brief since 13:2xZ, so the rule records a practice already in force. No ruling owed.
Generated by Claude Code
os-dev-report
{ "issue": 15894, "status": "done", "branch": "claude/issue-15894-maintainer-brief-on-governed-prs", "pr": "https://github.com/objectstack-ai/objectstack/pull/15908", "premise_still_valid": true, "summary": "Wrote the rule once in .claude/skills/pm-dispatch/SKILL.md, line-neutral (811/811, table pin 342, headroom 0 before and after; widest line I wrote 119 bytes): in the governed endgame under ②, five folded lines — at ACCEPT the seat in one stroke adds needs-user-decision to the PR and posts the final 「维护者速读」 comment (① stays the review record); the fixed five-part shape; the seat addendum's draft/final split (dev's PR body carries `## 维护者速读(草稿)` with 席位意见 blank; the seat corrects it against its own diff read, fills 席位意见, posts the comment, which is what the maintainer reads); and the label's PR meaning (awaiting the maintainer's review, outside the six states, leaves with the merge or a withdrawn verdict). Decision box: the card carries the same brief above its four-facet block, business terms first, ending in the one-word answer; box duty checks both. Language rule: the brief named as the fourth Chinese channel (`## 维护者速读`, governed PRs and decision cards), the three existing channels spelled unchanged. scripts/pm/ensure-pm-labels.sh: needs-user-decision description gains the PR meaning at 93 code points (cap 100) plus one comment line. The brief's candidate one-line folds measured 174/165 bytes (over the 120-byte cap), so I took the allowed route of retiring lines already stated elsewhere: six added, six retired, each retirement mapped to where it is already stated (table in the PR body; none pinned by any script). Governed (.claude/** hit, check-governed-merges --test exit 3) ⇒ draft PR #15908 with Fixes first line, skip-changeset added via the REST additive labels endpoint and read back present; not flipped ready, not enqueued, no review requested — the seat owes contract-tier review, os-zhuang + hotlong, and per the rule itself the label + 速读 on the PR. The PR body carries the `## 维护者速读(草稿)` section per the rule I wrote (席位意见 left blank). One deviation to note: the PR body was PATCHed once after creation to correct a mis-quoted gate verdict line I had grepped wrong; read back after the PATCH, the body is identical to what I sent through the 草稿 section; the platform kept the session-URL footer and appended a bare footer block beneath it (two footers, not looped on). CI on head 3b86d07a7b: all 37 check runs completed at 14:08:45Z — 25 success, 12 skipped, 0 non-green (Lint & Repo Gates, TypeScript Type Check, Test Core, Dogfood Regression Gate, Governed Surface Queue Guard all success). Seat addendum (draft/final split) is fully incorporated; the dev-side line for .claude/agents/os-dev.md is NOT in this diff (member 4's file) — see out_of_scope_findings.", "tests": "All on committed head 3b86d07a7b (git rev-parse --short HEAD), exit codes captured by redirect before any pipe. dispatch-gates --tier --repo objectstack-ai/objectstack: MANDATORY (clause ①). dispatch-gates --commands (no paths; change set from git = 2 paths vs merge base 4f379125e) derived 34 families; all 34 run; --ran verdict: '✓ dispatch-gates --ran: 34 derived famil(ies) accounted for — 34 run, 0 NOT-MEASURED.' First pass 33 green + 1 exit 3 (pnpm --filter @objectstack/lint run check:doc-formula-expressions: 'PREREQUISITE NOT MET — @objectstack/formula not built', then '@objectstack/lint not built') — read as NOT MEASURED, not red; built via os-verify-lock.sh -c 'pnpm exec turbo run build --filter=@objectstack/lint --concurrency=2' (VERDICT command-exit 0, held 13s; formula build before it held 179s), re-run exit 0: self-test 58 ✓ cases, live run printed its 6 deliberate *When skips. check-skill-line-ratchet --self-test: '155 cases pass'; live: '.claude/skills/pm-dispatch/SKILL.md is 811 lines (ceiling 811; headroom 0)' and 'widest table row is 342 bytes (pin 342; headroom 0)' — same readings on origin/main 4f379125e3 before the edit; the only over-120 non-table line is the pre-existing 172-byte line 810 (unbreakable code span, present on BASE). check-skill-id-lint: '24 file(s) clean'. check-skill-frame-sync: '2 copies of the decision frame are structurally isomorphic across 2 files', 4 axes. check-half-states --self-test: '2267 cases pass' (no H-row pins a sentence I touched — grepped every retired/rewritten sentence across scripts/, .claude/hooks, .github: zero hits). check-label-desc-cap --self-test: all cases passed; pnpm check:pm-label-desc-cap: '23 label descriptions in scripts/pm/ensure-pm-labels.sh, all ≤100 characters (longest: 100, repo:objectui)'; the new needs-user-decision description measures 93 code points (node [...s].length) and LC_ALL=C awk length would over-count the em dash. bash -n scripts/pm/ensure-pm-labels.sh: exit 0. pnpm check:nul-bytes: 'no raw ASCII control bytes'. Whole-repo pnpm lint (eslint . --no-inline-config) through os-verify-lock.sh, slot issue-15894: 'VERDICT command-exit 0 · held the lock 84s · waited 0s'. check-governed-merges --test on the two files: exit 3, '.claude/** ×1' — governed. PR #15908 check runs on 3b86d07a7b polled in the foreground (30s cadence, two capped segments): 37 total, 25 success, 12 skipped, 0 failure, all completed 14:08:45Z.", "mcp_calls": "0 — every GitHub read and write went through REST (read probe 200 at the start; PR create 201, additive label POST 200 with read-back, PATCH 200 with read-back) or the public issue-page payload; no MCP GitHub tool was called", "open_questions": [ { "question": "skills/objectstack-pm-dispatch/SKILL.md line 153 (published catalog) still carries the card-only needs-user-decision description in its label-setup snippet. Should the published copy learn the PR meaning?", "options": [ "A: leave it — the published protocol has no seat, no ACCEPT endgame and no 速读 mechanism, so a PR meaning there would declare a state nothing in that protocol produces (declared ≠ enforced); no gate compares the two snippets, and skills/** was out of scope by ruling", "B: a follow-up skills/** PR (governed, published catalog, token ratchet applies) that mirrors the description and adds a one-line PR meaning to the published protocol" ], "recommendation": "A — business need: zero measured pull from an installer for a PR-side label meaning; long-term: the published copy is deliberately generalized (frame-sync ruling) and should not carry seat-internal mechanics; AI-error axis: advertising a label state the published loop never sets is the exact declared≠enforced shape; startup focus: no expansion without pull. Revisit only if a third-party installer asks." } ], "out_of_scope_findings": [ "not filed (per seat addendum): .claude/agents/os-dev.md PR-body rules need one line for the dev-side half — every governed-surface PR body carries `## 维护者速读(草稿)` (five parts, 席位意见 blank, Chinese, business angle); the file belongs to member 4 and #15857 is queued on it — the seat folds the line into #15857. Note the PR body of #15908 already carries the section, so the practice is exercised once before the dev-side rule lands.", "not filed (already exists): the patrol row for the half-state (governed PR with ACCEPT and no label, or a label with no 速读) is #15895, blocked behind #15884 — untouched here as ruled." ] }
Generated by Claude Code
Filed by the
domain:skillsseat (sessionsession_019RfFHiRCSs3JXLK4cwcfox, os-steve) on the maintainer's instruction, 2026-09-05T13:1xZ, verbatim: 「我看到有很多5小时之前积压的pr,单我从列表看不出来哪些是需要我审核的,对于需要我审核的任务,比如adr,应该由契约复审先帮我审核,用中文从业务角度写上分析和意见,然后我就可以快速确认。」 Self-triagedpriority:p2,pm:queue, governed (.claude/skills/pm-dispatch/SKILL.md+scripts/pm/ensure-pm-labels.sh).The gap
A governed PR (ADR, agent constitution, PM protocol, hooks) reaches its terminal when the seat posts ACCEPT and requests the human approvers; from the PR list nothing distinguishes it from any other open PR, and the ACCEPT is an English engineering record, not a decision brief. Today five such PRs sat between 5 and 10 hours at that terminal. Decision cards (
needs-user-decision) have the list-view signal but their four-facet analysis is written for the seat, not for a quick confirmation.What was done at once (2026-09-05T13:2xZ, no protocol text yet)
needs-user-decisionapplied to PR #15856, PR #15641 and objectui PR #7686; a Chinese 「维护者速读」 comment posted on each (改了什么 / 为什么改 / 风险与代价 / 席位意见 / 你要做的), and on the two decision cards #15453 and #15647.What this card writes (the rule, once, in the file that governs the seat)
SKILL.md入队与落地 (the governed endgame): at ACCEPT on a governed PR the seat, in the same stroke, (a) addsneeds-user-decisionto the PR and (b) posts a Chinese 「维护者速读」 comment in the fixed five-part shape — what changed in business terms, why, risk and cost (with the rollback), the seat's recommendation, and the one act asked of the maintainer. The English verdict stays the review record; the 速读 is the maintainer's brief. The label leaves with the merge (a closed PR needs no cleanup) or when the seat withdraws the verdict.SKILL.mddecision-box rule: aneeds-user-decisioncard carries the same 速读 shape above its four-facet analysis, so the maintainer reads the options in business terms first.scripts/pm/ensure-pm-labels.sh: theneeds-user-decisiondescription gains its PR meaning ("on a PR: awaiting the maintainer's review; a 维护者速读 comment carries the brief") — within the 100-character cap.Line-neutral on
SKILL.md(811/811, headroom 0 — fold, never raise); the patrol row for the half-state (a governed PR with ACCEPT and no label, or a label with no 速读) is a separate card blocked behind check-half-states: read the landed release rule — H1/H24 prose says the definitional readings, and a new report-only row catches aRelease:newer than the lastClaim:with the assignee still set (and the exit that left no record) #15884, which holdscheck-half-states.mjs.Serial
SKILL.mdandensure-pm-labels.share in no flight (PR #15848 and #15795 landed). Governed ⇒ draft PR, in-seat review at contract tier,os-zhuang+hotlong, human merge — and, per this very rule,needs-user-decision+ a 速读 on it.Dedup
REST enumeration 2026-09-05T13:20Z,
state=allsorted by update (1,200 items, 800 issues; positive control #15846 hit): no card proposes a maintainer-facing brief or a list-view label on governed PRs; theneeds-user-decisionhits are the label's existing card meaning.Generated by Claude Code