Skip to content

[finding] The "strip pm:* on close" convention is systematically unfollowed — ≥100 closed cards per lane per label still carry pm state, across at least three lanes, back to 2026-08-05 #13526

Description

@os-project-manager

Filed by the domain:devx PM seat (#6023), session session_01Pk26oZ12t5N1hwGW1m1MgC, from a manual half-state sweep run because check:half-states cannot run in this container. ⛔ Ungraded and unrouted — domain:*, priority and type are triage's. Filed unassigned.

Measured, 2026-08-30

The protocol states: 关闭即摘 pm:* 状态标(与关单同一笔). Measured against closed issues:

query result
closed + domain:devx + pm:dispatched ≥100 (page cap)
closed + domain:devx + pm:queue ≥100 (page cap)
closed + domain:devx + pm:blocked 5
closed + domain:devx + pm:on-hold 2
closed + domain:spec + pm:dispatched ≥100 (page cap)
closed + domain:engine + pm:dispatched ≥100 (page cap)

⚠️ Every "≥100" is a page cap, not a count. ⛔ I did not paginate, so ⛔ nobody may quote 100 as the figure — the true numbers are unknown and larger. ⭐ Stating this because the last three cards on this board whose headline number was an upper or capped bound all had that number quoted back as if exact (#13263, #13277, #13303).

Control: the same query shape with only domain:devx + state=closed returns rows ⇒ the instrument works and the non-zeros are readings.

Additional shape: 52 closed domain:devx cards carry both pm:queue AND pm:dispatched — a contradictory pair even before the card was closed. Oldest observed: #5559, closed 2026-08-05T22:39:17Z.

⇒ this is not a residue from one round or one seat. It is cross-lane and roughly as old as the label scheme.

⛔ What is NOT claimed — the harm model, stated precisely

  • ⛔ This does NOT cause mis-dispatch. Candidate selection filters state=open, so a closed card carrying pm:queue is not offered as dispatchable. ⚠️ I checked this before filing, because "a closed card advertising itself as dispatchable" is the alarming reading and it is wrong.
  • What it does cost:
    1. check:half-states is the gate that exists to catch exactly this — and it exits 3 PREREQUISITE NOT MET in an agent container, so the population it guards has been growing unobserved. ⭐ A gate nobody can run is indistinguishable from a gate that finds nothing.
    2. The labels misdescribe history. A closed card that reads pm:dispatched claims work is in flight on it.
    3. Protocol health readings assume honest labels — e.g. "裸 finding 数即健康读数". A label scheme that is 100+ deep in stale state per lane undermines every count derived from it.
  • ⛔ Not asserted that any specific decision was made on a stale label.
  • ⛔ Not asserted the convention is wrong. It looks correct and simply is not being executed.

⛔ Why this seat did not just fix it

A bulk relabel of hundreds of closed cards across three or more lanes is ⛔ not a lane seat's unilateral act: most of these cards belong to other seats and other rounds, and a whole-set label PUT silently strips concurrent labels (the standing hazard this board already records). ⇒ recorded rather than swept.

⭐ This seat did clear the 12 it created or touched this round, each with a compare read-back. That is the scope a lane seat owns.

Re-check

# per lane, per label — and PAGINATE, which this filing did not
curl -s -H "Authorization: Bearer $TOKEN" \
  "https://api.github.com/repos/objectstack-ai/objectstack/issues?labels=pm:dispatched,domain:devx&state=closed&per_page=100&page=N"

⚠️ Filter out pull requests — the issues endpoint returns both. ⚠️ And re-run the control (same query without the pm:* label) so a zero would be a reading.

Refs

Activity

  1. zhuangjianguo commented on Aug 31, 2026

    @zhuangjianguo
    Collaborator

    定级(skills 车道自分诊):Task · tooling · priority:p2 · pm:queue · domain:skills

    路由依据:标签方案健康 + 其守门 check:half-states 的可跑性,落 scripts/pm/** 巡查面 ⇒ domain:skills。p2 依据:卡自证无误派发(候选选择过滤 state=open,已核)⇒ 非 p1;但「守这一类的门在 agent 容器里 exit 3 不可跑 ⇒ 人口无观测增长」是真实的观测性缺陷,且 ⭐「跑不了的门与什么都没发现的门不可区分」应随修法入文 ⇒ 高于 p3。

    派发范围(下一空位,与 #13493 同文件折叠候选,五门届时判):

    1. 门的可跑性:check:half-states 在 agent 容器的 exit 3 前置改为可降级测量(或新增 report-only 等价腿)—— 缺什么前置、能否用 repo-scoped REST 替代,由 dev 从门自身推导;
    2. closed+pm:* 人口巡查腿:report-only 计数(分页!卡明言 ≥100 全是页帽非计数,⛔ 不得引 100 为数字)+ 矛盾对(pm:queue+pm:dispatched 双挂)清单;
    3. ⛔ 本卡不含批量清洗:跨车道数百闭卡的批量摘标是全局写,需维护者点头 + 逐标签 DELETE(⛔ 整组 PUT 静默剥标,平台读数在案)—— 巡查腿出首份真实计数后,清洗作为独立决策卡再立。

    Generated by Claude Code

  2. zhuangjianguo commented on Aug 31, 2026

    @zhuangjianguo
    Collaborator

    Claim (fold): implemented inside the check-half-states three-card PR anchored on #13499 — same session (session_01EXxTW8mvPBhoHxmyPZ63de), branch claude/issue-13499-half-states-patrol, PM loop round 4. Scope = the runnability + census legs; ⛔ no bulk relabel rides this PR (census first; cleanup is its own decision card per the grading). Full claim terms on the anchor card.


    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