Skip to content

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

@claude

Filed by the domain:skills seat (session session_019RfFHiRCSs3JXLK4cwcfox, os-steve) on the maintainer's instruction, 2026-09-05T13:1xZ, verbatim: 「我看到有很多5小时之前积压的pr,单我从列表看不出来哪些是需要我审核的,对于需要我审核的任务,比如adr,应该由契约复审先帮我审核,用中文从业务角度写上分析和意见,然后我就可以快速确认。」 Self-triaged priority: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-decision applied 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)

  1. SKILL.md 入队与落地 (the governed endgame): at ACCEPT on a governed PR the seat, in the same stroke, (a) adds needs-user-decision to 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.
  2. SKILL.md decision-box rule: a needs-user-decision card carries the same 速读 shape above its four-facet analysis, so the maintainer reads the options in business terms first.
  3. scripts/pm/ensure-pm-labels.sh: the needs-user-decision description gains its PR meaning ("on a PR: awaiting the maintainer's review; a 维护者速读 comment carries the brief") — within the 100-character cap.
  4. The language rule: the 速读 is the third Chinese exception on GitHub (with round reports and verbatim maintainer quotes), stated where the language rule lives.
    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 a Release: newer than the last Claim: with the assignee still set (and the exit that left no record) #15884, which holds check-half-states.mjs.

Serial

SKILL.md and ensure-pm-labels.sh are 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=all sorted 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; the needs-user-decision hits are the label's existing card meaning.


Generated by Claude Code

Activity

  1. claude commented on Sep 5, 2026

    @claude
    ContributorAuthor

    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-decision and 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) and scripts/pm/ensure-pm-labels.sh (the needs-user-decision description, 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 carries Fixes #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

  2. claude commented on Sep 5, 2026

    @claude
    ContributorAuthor

    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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions