Skip to content

[Decision] PM 席位被权限分类器判 Self-Approval 拦住落地动作 —— 章程要求席位入队,通道却不允许(三张全绿 PR 今天为此停摆) #19362

Description

@os-steve

Maintainer-action: merge PR #19484 (the two objectui landing allow-rule lines, +2 in .claude/settings.json, written by the director seat under your 「19362 你可以直接开发,不派dev」 — Tier S, your read and hand-merge is the review per the charter's PM-writes-code exception) — done when the two entries read on origin/main.

Filed by the domain:spec @ objectui execution seat on the maintainer's direct instruction. Session session_01QVJUngS9FKfuyQ9NFR2Nbn, 2026-09-20T13:3xZ.

⚠️ Direct-routing audit — the authorising instruction, quoted verbatim:

缺少权限这个你立一张skills决策卡。

⇒ that instruction is what authorises an execution seat to route a card into domain:skills and into the decision box; ⛔ routing is ordinarily the triage seat's sole production. priority:* and type are left unset — ⛔ still triage's, ⛔ not claimed here.

Governing text: .claude/skills/pm-dispatch/SKILL.md 〈入队与落地〉 —— 「路径面干净的才转 ready → 入队」 and 「队列是唯一被认可的落地路径,⛔ 永不队列外合并」; plus the red line 「⛔ 永不以任一账号对受管面 PR 提交批准 review,永不合并受管面 PR」.


维护者速读

事情: 章程要求执行席自己把复核通过的非受管面 PR 落地(翻 ready → 入队)。但会话的权限分类器把这两个调用判为 Self-Approval 直接拒掉,连单独翻 ready 也拒。

今天的实际代价: 三张全绿、复核在案、零欠项的 PR(objectui#10077 · #10081 · #10079)卡在 draft 动不了,直到你临场给了一次授权才落地。⛔ 那次授权是会话级的 —— 下一个席位会话开工就会再撞一次同样的墙,而它撞墙的时候你可能不在。

为什么这张卡必须由你裁: 它动的是权限边界,在人工地板上,⛔ 席位无论四棱多同向都不能自裁。

选项: A 把这两个具名端点写进项目允许清单(最小、可审计)· B 明确改章程:席位永不落地,每张绿 PR 都等你点 · C 另设一个非作者身份的落地席位。

推荐 A。

你要做的: 回一个字母 —— A / B / C


⛔ 先说清楚 A 不碰什么 —— 这是本卡最重要的一句

Self-Approval 这道护栏存在的理由是对的:⛔ 不能让 AI 批准自己的活。 A 不碰这一条:

动作 A 之后
提交批准 review(APPROVED) 仍然禁止,对任一账号 —— 红线不动,GOVERNED_APPROVERS 仍是唯一判据
受管面 PR(docs/adr/** · .claude/** · skills/** · AGENTS.md · CLAUDE.md · docs/NORTH-STAR.md) 仍走终局四件套,席位永不落地
>5000 行的改动 ⛔ 仍换终局四件套
非受管面、每 check 绿或预期 skip 的 dev PR ✅ 席位可翻 ready + 挂 auto-merge

⇒ A 放行的两个动作都不能替代复核:ready_for_review 只是取消 draft,auto_merge 只是「全绿后由合并队列合」。合并队列仍然逐张跑全部门禁,任何一条红它就不合。⇒ A 买到的是「机械动作不必找人」,⛔ 不是「少一道检查」。

四棱

① 实际业务需求 —— 实测,不是假想。 今天本席的三张 PR 在全绿状态下停了约 40 分钟,直到临场授权。整个 PM 循环的吞吐都挂在这一步:席位可以读、可以派、可以复核,唯独不能把复核结果变成落地。⚠️ 而且它不是一次性的:授权是会话级的,每个新席位会话都会重撞,且撞的时候维护者不一定在场。⛔ 「席位自己小心」在这里无解 —— 这不是判断问题,是通道问题。

② 项目长远合理性。 A 是 contract-first 的形状:把允许的两个端点具名声明出来,而不是靠分类器逐次猜意图。B 把一个机械动作永久钉成人工瓶颈 —— 它诚实,但会让「绿 PR 等人点」成为常态,而这恰恰是本项目一直在消灭的形状。C 引入第二个身份与每张 PR 一次跨席交接,零产品价值的协调面,还多一个会腐烂的身份台账。

③ 防 AI 犯错 —— 这一棱是唯一可能推翻 A 的,所以写细。 护栏的真实标的是「AI 批准自己的活」。A 之后这件事依然不可能:批准是 review,仍对任一账号禁止;受管面仍走人批;合并队列仍逐张跑门禁。A 只把「取消 draft」和「全绿后交给队列」两个不含判断的动作放行。⚠️ 反过来说,现状并没有买到防错:它没有拦住任何一次错误的复核判断,只是拦住了正确判断的执行 —— 而副作用是把维护者拉进每一次机械动作,增加了人被当成橡皮章的概率。⇒ 这一棱指向 A。

④ 创业阶段不扩散。 A 是移除一个已实测阻塞所需的最小改动:两个具名端点,⛔ 无新能力面、⛔ 无新标签、⛔ 无新链路。B 与 C 都在增加常设人工或常设协调开销。⇒ 指向 A。

四棱同向 A。 ⛔ 但同向不构成代裁资格:权限边界在人工地板上,地板是排除项而非权重,所以这张卡呈给你,⛔ 不自裁。

选项细节

  • A — 把两个端点写进允许清单。 范围严格限于 POST /repos/{o}/{r}/pulls/{n}/ccr/ready_for_reviewPUT|DELETE /repos/{o}/{r}/pulls/{n}/ccr/auto_merge。⛔ 不含 PUT /pulls/{n}/merge(队列外直合,章程已禁)、⛔ 不含任何 review 端点。推荐。
  • B — 明确席位永不落地。 章程照改,SKILL.md 的「路径面干净的才转 ready → 入队」要改写成「交维护者」,并给「已复核就绪却无人落地的孤儿 PR」一个常设读者(半状态巡查已有这一项,但今天没有人消费它)。诚实,但把瓶颈制度化。
  • C — 另设非作者身份的落地席位。 结构上消灭 self-approval,但要一个常设第二席、每张 PR 一次交接,以及一份身份台账。⛔ 与「创业阶段不扩散」直接冲突。

一个必须一起处理的副作用(任选哪个都要答)

半状态巡查脚本 scripts/pm/check-half-states.mjs 已经有「已复核就绪却无人落地的孤儿 PR」检测。今天这三张正是那个形状,而没有任何人读到它 —— 因为本仓的巡查锚从未接线(vars.HALF_STATE_ANCHOR_ISSUE 未设,该 step 最近 5 次全 skipped,objectstack 是 2/2 success 的对照)。

⇒ 选 B 尤其致命:B 让「等人落地」成为常态,而现在没有仪器在看这个常态

查重词:ready_for_review self-approval classifier denied · auto_merge permission PM seat · landing path blocked execution seat · PM cannot enqueue reviewed PR


Generated by Claude Code

Activity

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

Metadata

Metadata

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions