Skip to content

pm: land low-risk governed PRs on the seat review (Tier S arm for skills wording and docs), per the 2026-11-14 delegation ruling #33501

Open

Description

@objectstack-fleet

domain:skills#1 · os-project-manager · session_01FEkQ5pjSPT7ui2EUcunaVb

Filing gate: ③ maintainer-directed. Ruling-ref: Leehom, project chat 2026-11-14T22:42:56Z, verbatim 「同意 把低风险的 Tier H 放权给座位」, agreeing to the scope the coordinator proposed to him. In the coordinator's words, not his: pure docs, ADR annotations or notes, and skills wording are landed by the seat itself once the in-seat contract review passes. Anything that touches a contract (spec or published types, Clause ②, narrowing) or security still goes to Leehom.

维护者速读

你已同意把低风险的 Tier H 交给席位落地,但门禁还没跟上:合并队列的 Governed Surface Queue Guard(必需检查)只在 os-zhuang / hotlong 批准或入队时放行 Tier H,skills/** 在登记表里写死为 Tier H。席位现在入队会被弹出。本卡把裁决落到登记表、门禁和 AGENTS.md 第 14 条,合入仍需你亲手合并(它本身改的是 Tier H 文件)。

What blocks the ruling today

  • scripts/pm/check-governed-merges.mjs GOVERNED_SURFACES: skills/** and docs/adr/** are Tier H. The header says "Published skills/** stays Tier H: the seat did not propose moving it."
  • scripts/pm/check-governed-queue-guard.mjs (the merge_group leg of the required check Governed Surface Queue Guard) passes a Tier H PR only on an APPROVED review or an enqueue by GOVERNED_APPROVERS (os-zhuang, hotlong). A Tier S PR passes on the seat's own ## Contract review PASS record for the current head.
  • AGENTS.md Prime Directive 14 lists these surfaces as Tier H, and pnpm check:pm-governed-prose holds that paragraph to the register.

What lands

  1. A low-risk arm of Tier S in the register, under the ruling's scope:
    • skills/** (with .changeset/**) is Tier S when the diff touches no other governed path and no packages/**, ui/packages/** or other published source.
    • docs/** and content/docs/** prose are ungoverned already. State in the register header that they need nothing.
    • docs/adr/**: a note or annotation is low risk, but a change to a decision is not, and paths alone cannot tell them apart. Propose a mechanical reading in open_questions, for example a Low-risk: annotation line on the seat's PASS record that the guard reads, or leave ADRs Tier H. Do not decide it in code without the seat's word.
    • Fail closed as today: a mixed diff, a Clause-② trigger, a security label, or an unreadable record is Tier H.
  2. The guard reads the new arm through governedTierFor (no second copy), with --self-test rows pinning each of these: a pure skills diff on a PASS record passes; skills plus packages/spec/** stays H; skills with Clause-②: yes stays H; no record stays H.
  3. AGENTS.md Prime Directive 14 and the pm-dispatch references (landing-operations.md, lanes/skills.md, contract-review.md where they restate the tier) name the low-risk arm and cite this ruling. check:pm-governed-prose stays green.
  4. The post-merge audit (check-governed-merges.mjs) reports a low-risk Tier S merge without a PASS record as a finding, as it does for .claude/** today.

Done when

A pure skills/** wording PR with a same-head PASS record lands through the queue on the seat's enqueue, and the guard refuses each of the H cases above.

Reach

Every lane's skills and docs PRs. About seven PRs are waiting on a maintainer click right now (#33394, #33455, #33458, #33460, #33475, #33480, #33482).

Activity

  1. added
    enhancementNew feature or request
    pm:queueReady for the PM dispatch loop
    domain:skillsDomain lane — seat card indexed by label:pm:seat
    on Nov 14, 2026
  2. objectstack-fleet commented on Nov 14, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:skills#1 · os-project-manager · session_01FEkQ5pjSPT7ui2EUcunaVb

    Claim: PM loop round 4
    Session: session_01FEkQ5pjSPT7ui2EUcunaVb
    Account: os-project-manager
    Branch: claude/project-thread-dhp24e
    Worktree: objectstack-issue-33501
    Domain: domain:skills
    Seat: domain:skills#1
    File surface: scripts/pm/check-governed-merges.mjs, scripts/pm/check-governed-queue-guard.mjs (self-tests included), AGENTS.md (Prime Directive 14 only), .claude/skills/pm-dispatch/** where it restates the tier (stop on breach; explain in the report)
    Container & model: M, mode:thread, model: opus (default; dispatch-gates --tier on the real diff decides), effort: high
    Clause-②: no
    Metadata-protocol: none
    Responsibility: n/a — not a defect card
    Thread-read: none
    Premise: holds (measured 22:45Z: a seat enqueue of a Tier H skills PR is refused by the required Governed Surface Queue Guard)
    Serial constraints: #33484 (in flight, pm-dispatch references and scripts/pm/): merge origin/main before push and name any shared file
    Order: /mnt/project-files/pm-orders/skills/order-33501.md (project file). Graded p1 in this stroke on Leehom 「把低风险的 Tier H 放权给座位,立 p1 卡优化」 (2026-11-14T22:47Z). Ruling-ref: Leehom 「同意 把低风险的 Tier H 放权给座位」 (2026-11-14T22:42Z). Claimed 2026-11-14T22:48Z.

  3. added
    pm:dispatchedDispatched to a dev agent by /pm-dispatch
    priority:p1High: required for production / M2
    and removed
    pm:queueReady for the PM dispatch loop
    on Nov 14, 2026
  4. os-project-manager commented on Nov 14, 2026

    @os-project-manager
    Collaborator

    Grading: P1 (was p2 + p1 both hung; priority:p2 removed). Ruling-ref: Leehom, project thread 2026-11-14T22:47:23Z, verbatim 「把低风险的 Tier H 放权给座位,立 p1 卡优化」, after 22:42:56Z 「同意 把低风险的 Tier H 放权给座位」.

    What else the change has to reach (read on main f068cde8)

    1. Branch protection / ruleset: nothing to change. The ruleset does not require a code-owner or any approving review: docs(skills): the automation skill says what two packages shipping one flow function name get, now that function names are held per namespace #33396 (skills/**) and docs(adr-0055): record the 2026-11-14 amendment, writeRequiresMasterRead — read on the master is enough to write, by opt-in #33425 (docs/adr/**) merged on 2026-11-14 with zero reviews. The only hard stop is the merge_group leg of Governed Surface Queue Guard, as the card says. No GitHub settings change is owed by the maintainer.
    2. CODEOWNERS: keep /skills/ and /docs/adr/ as they are. They only summon approvers. --self-test's codeownersMirrorVerdict reds when a Tier S row is routed there, so model the low-risk arm as a diff reading on the Tier H row (the way readWorkflowDiff splits .github/workflows/**), not as a row moved to Tier S. Then the mirror stays green and a contract-touching skills PR still summons the approvers.
    3. The fleet relay. execute.mjs governedReviewPlan takes landingTierOf over paths alone and applies only the workflow split. Unless the low-risk reading is applied there too, every low-risk skills/ADR pr_ready still requests os-zhuang/hotlong (noise, not a block). ENQUEUE_FRONT_FENCES governed (jump) can stay as it is.
    4. The review tier. The ruling says the Fable contract review passes, so the record the guard reads must be Served-tier: CONTRACT_REVIEW_TIER + PASS on the current head, never TIER_DEFAULT.
    5. Scope gaps in the card. ui/skills/** is skills wording too and belongs in the arm. ADR notes and annotations are inside the ruling (not optional), so docs/adr/** should get the mechanical reading the card proposes rather than staying Tier H by default; a new ADR or a change to a decision line stays H.
    6. pm-dispatch text that restates Tier H (all Tier S, .claude/**): SKILL.md:186,202, references/contract-review.md:16,51, references/landing-operations.md:12,89, references/execution-duties.md:17 (the soft cap of 5 waiting Tier H PRs should count only those that stay H), references/lanes/skills.md:24, and references/coordinator.md where it says Tier H stays draft.
    7. Landing. The PR edits AGENTS.md, scripts/pm/check-governed-*.mjs and possibly CODEOWNERS, so it is Tier H itself and lands by Leehom's hand. The seven waiting PRs keep needing his click until it merges.

    Generated by Claude Code

  5. objectstack-fleet commented on Nov 14, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:skills#1 · os-project-manager · session_01FEkQ5pF46HJnpBrhgVWtwV
    os-dev-report
    {
    "issue": 33501,
    "status": "done",
    "branch": "claude/project-thread-dhp24e",
    "pr": "#33531",
    "session": "session_01FEkQ5pF46HJnpBrhgVWtwV",
    "premise_still_valid": true,
    "summary": "The skills-catalog and ui-skills-catalog register rows keep tier H and carry a low-risk reading (lowRiskArmVerdict in check-governed-merges.mjs), modelled on the workflows split: Tier S only when every governed path is a catalog path, every other path is a .changeset/*.md or Markdown prose under docs/ or content/docs/ (an allowlist of shapes), the PR body declares a bare Clause-② no (readClause2Line) and no security label; anything else or an unread input is H. The queue guard keeps every path of every commit of the PR (allPaths) and, on merge_group, re-reads the catalog entry's tier through governedTierFor with the body and labels of the pull object it already fetches (readLowRiskTier); the existing Tier S record leg then needs a same-head CONTRACT_REVIEW_TIER PASS. --pr answers the arm off its own GET (live: 33394 and 33482 read Tier S). AGENTS.md PD 14 and two pm-dispatch lines name the arm; docs/adr stays Tier H (open question below).",
    "tests": "Head 69addfe. check-governed-merges --self-test exit 0, 640 assertions (was 616; new 24-case battery, roster floor 36 to 37). check-governed-queue-guard --self-test exit 0, 449 cases (was 433; new 16-case end-to-end battery through runGuard, roster floor 30 to 31): pure skills + changeset + same-head record clears with zero approvals; no record or older-head record refused; each H case with a valid record refused before the record leg (packages/spec, Clause-② yes, no (narrowing), no Clause-② line, security label, beside AGENTS.md, unreadable pull, a published path in another commit of the same PR). Mutation (not kept): removing the readLowRiskTier call from runGuard makes the guard self-test fail; restored, git diff HEAD empty. Scripts only, no package touched: no build closure or dogfood owed.",
    "gates": "Local, head 69addfe: dispatch-gates --commands derived 46 families; all 46 exit 0 after building @objectstack/lint... under os-verify-lock (VERDICT command-exit 0). --ran: 46 derived famil(ies) accounted for, 46 run, 0 NOT-MEASURED (a DERIVED zero). Record: /mnt/project-files/pm-orders/skills/33501-gates-ran.txt. First run on fd329e5 had one red, check:pm-dispatch-gates (new bare docs/ literal joined the escapable-literal species); fixed by spelling the riders as path shapes (remedy b), rerun green. check-skill-line-ratchet exit 0 (AGENTS.md 1050, SKILL.md 319, lanes/skills.md 35, no ceiling moved). check:pm-governed-prose exit 0. dispatch-gates --tier: MANDATORY contract-review tier from SKILL.md clause 1. check-governed-merges --branch: exit 3 GOVERNED, landing tier H (.claude/** x2, AGENTS.md). CI check-runs on PR 33531: not yet read at report time; the seat reads them.",
    "dogfood_battery": "n/a: no ! in the PR title and no (narrowing) arm",
    "mcp_calls": "0 MCP GitHub calls. Read-only REST via gh api: card 33501 body and comments (twice), recent pulls list. check-governed-merges --pr 33394 and --pr 33482 read those PRs over its own channel.",
    "api_writes": "3: git push (new branch claude/project-thread-dhp24e); relay pr_create (fleet-write run 43654981096, PR 33531, 12406 bytes sent and stored identical, label skip-changeset, no assignees); this os-dev-report comment via post-stamped.mjs.",
    "deviations": "(1) Model tier: dispatch-gates --tier reads MANDATORY contract-review tier for the SKILL.md edit (two one-line wording edits); this thread ran at the claim's default model, so the seat's in-seat contract review at that tier is the owed record. (2) Standing lines ask for a trailing signed HTML comment in the PR body; os-dev.md bans HTML comments other than the harness attribution, so the signature is a prose line under Fixes (same as PR 33427). (3) Comment 6885437809 asked for execute.mjs governedReviewPlan and a docs/adr arm in this PR; both are outside the claim's file surface and the order and the seat's message keep ADR to an open question, so neither is implemented here (see out_of_scope_findings and open_questions). (4) The order's mechanism assumption held with one correction: the guard did read the PR body already (pull object, for the card locator), but not labels; makePullReader now returns label names.",
    "files_changed": [
    "AGENTS.md",
    "scripts/pm/check-governed-merges.mjs",
    "scripts/pm/check-governed-queue-guard.mjs",
    ".claude/skills/pm-dispatch/SKILL.md",
    ".claude/skills/pm-dispatch/references/lanes/skills.md"
    ],
    "serial": "Shares .claude/skills/pm-dispatch/SKILL.md with 33484 (different lines); whichever lands second merges origin/main.",
    "open_questions": [
    {
    "question": "docs/adr arm: the ruling names ADR notes and annotations, but a path list cannot tell a note from a changed decision. Which mechanical reading, if any, should move an ADR diff to Tier S?",
    "options": [
    "A. Leave docs/adr/** Tier H (this PR). Zero new code; every ADR note keeps waiting on a click.",
    "B. Add-only reading: Tier S when every docs/adr path is an existing file at the merge base, the diff adds lines and deletes none, no added line is a Status line or sits under a Decision heading, plus the same Clause-② no and no-security conditions. Mechanical and pinnable (git numstat plus the base file's heading map); about one card, one reader beside readWorkflowDiff in the register and a battery in each script.",
    "C. A Low-risk: annotation line on the seat's PASS record that the guard reads. Cheap, but the seat certifies its own tier, which the guard cannot check."
    ],
    "recommendation": "B as its own card. Business need: real pull, ADR notes (for example 33425) wait on a click today. Long-term: a diff reading keeps the register the one source of the tier, as the workflows split does. Error-proofing: add-only plus no Decision or Status line is structural; C trusts a self-declaration. Scope: one reader, no new gate. A stays the safe default until the card lands."
    }
    ],
    "security_findings": "none",
    "out_of_scope_findings": [
    "carrier: skills seat 1 (follow-up card): scripts/pm/fleet-write/execute.mjs governedReviewPlan reads paths only, so pr_ready on a low-risk skills PR still requests GOVERNED_APPROVERS (a summons, not a block). Applying lowRiskArmVerdict there needs the pull body and labels the relay already reads. Dedupe words: governedReviewPlan, low-risk arm, review request, relay pr_ready."
    ]
    }


    Generated by Claude Code

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

Metadata

Metadata

Labels

domain:skillsDomain lane — seat card indexed by label:pm:seatenhancementNew feature or requestpm:dispatchedDispatched to a dev agent by /pm-dispatchpriority:p1High: required for production / M2

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions