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

Closed

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. added
    pm:queueReady for the PM dispatch loop
    domain:devxDomain lane — seat card indexed by label:pm:seat
    on Aug 7, 2026
  2. added
    pm:dispatchedDispatched to a dev agent by /pm-dispatch
    and removed
    pm:queueReady for the PM dispatch loop
    on Aug 7, 2026
  3. self-assigned this
    on Aug 7, 2026
  4. 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

Labels

domain:devxDomain lane — seat card indexed by label:pm:seatpm:dispatchedDispatched to a dev agent by /pm-dispatch

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions