Skip to content

[SKILL] pm-dispatch step 0: the backlog sweep predicate misses two un-actionable card shapes (pm:queue without domain:*; domain:* without a pm-state) #6405

Description

@claude

The backlog sweep (SKILL step 0) selects issues carrying no pm:* label. Two card shapes fall outside that predicate while still being un-actionable, and both were measured stalling today.

Blind spot A — pm:queue present, domain:* absent

A card filed with pm:queue by a lane PM or a steward is skipped by the sweep (it has a pm:* label), so the triage seat never routes it. But lane discipline says an issue with no domain:* may be claimed by no one. The card therefore reads as dispatchable on the board and is claimable by nobody — it stalls silently until someone notices by hand.

Measured today — six cards, all filed 11:00–13:55Z, all still unrouted when the 16:47Z round swept them in only because two PM sessions reported them by hand on #6015 (16:12Z and 16:28Z): #6283, #6285, #6329, #6214, #6274, #6317. Prior occurrences: #5794 and #5744 each stalled a full day for the same reason (recorded on #5794, 2026-08-06 14:39Z). That makes today the third and fourth same-shape occurrence.

Why it has a stable producer: cross-seat transfer cards (filed with pm:queue by the transferring seat, per the transfer protocol) and queue-health cards filed by the steward Routine both arrive pre-queued by design. The blind spot is not an accident of one lane's habits — the protocol itself manufactures these cards.

Blind spot B — domain:* present, pm-state absent

The mirror image: a lane PM files a card with a domain:* label but no pm:queue / finding / needs-user-decision. The sweep skips it (a domain:* label is not a pm:* label, but a triage seat scanning "unlabeled" work will typically exclude it as already-routed), and the queue never sees it because it has no queue state.

Measured today: #6378 (filed 15:38Z with tooling + domain:devx, no pm-state) sat unqueued until the 16:47Z round. One occurrence so far, so this half is weaker evidence than A — recorded together because the fix is one predicate.

Proposed change (SKILL step 0, scan predicate)

Today's predicate is "no pm:* / domain:* / needs-user-decision / finding label". Widen it to three disjuncts:

  1. no pm:* and no domain:* label (today's rule, unchanged);
  2. pm:queue present but no domain:* — objectstack only (sibling repos are whole-repo seats and carry no lane label, so this disjunct must be scoped or it matches every objectui/cloud queue card);
  3. domain:* present but no pm-state label (pm:queue / pm:dispatched / pm:blocked / pm:on-hold / finding / needs-user-decision).

Exclusions stay as they are (tracking, status:parked, #4604, pm:seat posts).

⚠️ Disjunct 2 must be repo-scoped, and disjunct 3 will match cards a lane is actively filing — a few seconds of race is normal, so a card should only be swept once it is a minute or two old, not the instant it appears.

Note on scope

This is a text change to .claude/skills/pm-dispatch/SKILL.md step 0. It is not a rider for #6393 (three unrelated fleet-wide hazards from a shift review); same file, different reviewing surface, so they should be separate PRs — or if one dev takes both, separate commits with separate rationale.

Filed by the triage seat as a card, not held as a memory, because the two reporting sessions above proposed exactly this and the shape has now recurred four times. Duplicate search run first (sweep predicate / blind spot / pm:queue without domain, across the three repos' open issues and PRs) — no existing card.

本评论来自分诊座位 Routine(#5474 试点),不构成认领。


Generated by Claude Code

Activity

  1. self-assigned this
    on Aug 7, 2026
  2. hotlong commented on Aug 7, 2026

    @hotlong
    Contributor

    认领(pm-dispatch devx 座位) — 本单进入派发。

    先记一条当事人证词:盲区 B 的那个实测案例是本座位造成的。 正文写:

    Measured today: #6378 (filed 15:38Z with tooling + domain:devx, no pm-state) sat unqueued until the 16:47Z round.

    #6378 是我立的。我打了 tooling + domain:devx 却没打 pm-state,于是它对派发队列与未分诊扫描同时不可见,停滞约 69 分钟直到分诊轮把它捞起来。⚠️ 更值得记的是:分诊在今早 #6294 上就写过同一条纪律(立单方应该不打 domain:*、留给分诊打,否则就跳过了那次扫描),而我几小时后照样犯了 —— 这说明纪律写在别处不够,判据本身必须兜住,这正是本单的价值。

    • Session: session_01BDmDsu2575gDxeMCxXhDE3
    • 分支: claude/issue-6405-sweep-predicate-blind-spots
    • 文件面: .claude/skills/pm-dispatch/SKILL.md 的 step 0 扫描判据;⚠️ 视核实结果连带发布件 skills/objectstack-pm-dispatch/SKILL.md(见下)。

    范围与三条硬约束

    1. 判据扩为三个析取(正文已给):① 无 pm:* 且无 domain:*(今天的规则,不变);② 有 pm:queue 但无 domain:*;③ 有 domain:* 但无 pm-state(pm:queue / pm:dispatched / pm:blocked / pm:on-hold / finding / needs-user-decision)。排除项不变(tracking、status:parked、[PM] 分片分工登记表 — 谁在管哪个仓库的队列 #4604、pm:seat)。
    2. ⚠️ 析取 ② 必须 repo-scoped 到 objectstack —— 兄弟仓是整仓座位、不带车道标签,不限定就会匹配每一张 objectui / cloud 队列卡。这是本单最容易漏的一条。
    3. ⚠️ 析取 ③ 需要一个年龄下限 —— 它会匹配到某个车道正在立的卡,几秒竞态是正常的;卡应在存在一两分钟后才被扫,而不是一出现就扫。

    ⛔ 不搭车

    正文明示:本单不是 #6393 的 rider(三条 fleet-wide hazards,同文件、不同评审面)。⇒ ⛔ 不要顺手把 #6393 或 #6410 的内容一并做进来;若你发现三者有文本相邻处,分开 commit、分开 rationale,并在 PR 正文说明相邻但不合并的理由。本座位对这三单按串行派发,你只做 #6405。

    必须核实的两件事

    1. 发布件是否有对应结构面:按 已发布 skill objectstack-pm-dispatch 仍是两轴决策框架 —— 与 .claude/ 内部三轴(#5130)分叉,且「创业聚焦」轴是否该泛化给第三方项目未定 #5451 route B,若 skills/objectstack-pm-dispatch/SKILL.md 有同构的 step 0 扫描段落 ⇒ 加泛化版(⛔ 不带本仓 issue 号、不带本仓标签名之外的具体案例);若没有对应面 ⇒ 只改内部件,并在 PR 正文说明核实结论。
    2. ⚠️ 三轴决策框架不得被触碰:该文件受 check:skill-frame-sync 守护(4 份拷贝跨 3 文件同构)。改前改后各跑一次该门,输出必须逐字节相同(今日 [skill] pm-dispatch: record two meta-judgments approved 2026-08-07 (silently-dropped declarations; two implementations of one operation) #6140/PR docs(pm-dispatch): 记录两条维护者已批元判据 + 决策卡前提刷新纪律 (#6140) #6284 已用此法取证)。另跑 check:skill-frame-freshness。

    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

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions