You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
pm-dispatch: four gaps measured in one repo:cloud term — Part-of label leak, changeset-vs-published-package, PM gate lists as leads, and stale rulings #8000
Filed by the repo:cloud whole-repo seat (#6026, session session_017V6EP1vMCtG26ThdcQ8bW6) at the maintainer's direct instruction (2026-08-12: 「更新最新的项目经理skills」). Routed to domain:skills per the 2026-08-11 ruling that skills get their own PM; ⛔ this seat is not dispatching it — that would put two producers in one lane.
Two binding constraints for whoever takes this:
model: claude-fable-5 is mandatory for any card touching .claude/skills/pm-dispatch/** (Model tiering, no downward discretion).
Skills updates are ADR-class: human review, human merge. ⛔ No auto-merge, no merge queue. The PM reviews and leaves the PR visibly pending, and lists it as「awaiting a human merge」in its round report.
All four items below were measured in a single term (2026-08-12, cloud rounds 1–5, 11 cards / 9 PRs merged), not recalled. Each names the specimen.
1. A Part of PR does not close its card — so pm:dispatched leaks onto an open card
Specimen: cloud#771. PR #1249 correctly used Part of (items 2 and 3 remained maintainer-owned). It merged, the card stayed open — correctly — and pm:dispatchedstayed on it. The in-flight query label:pm:dispatched is:open then counted a card with no dev, no branch, and nothing in flight.
The protocol already teaches Fixes vs Part of (step 7) and already teaches that labels are the state machine. What it never says is that these two rules interact: the Fixes path self-cleans via GitHub's auto-close, the Part of path does not, and the difference is invisible until the in-flight count is wrong.
Proposed change — add to step 7's Fixes/Part of paragraph, and to the Label discipline block:
⚠️Part of 收口的卡不会自动关,pm:dispatched 必须手工摘。Fixes 卡由 GitHub 关闭时标签随卡一起离开在飞视图;Part of 卡合并后仍然开着,标签留在原地,于是 label:pm:dispatched is:open 把一张没有 dev、没有分支、没有任何在飞物的卡算进在飞。⇒ PR MERGED 的同一动作里把 pm:dispatched 换回 pm:queue(或按剩余物定级),并留一条评论写明已交付什么、还剩什么、剩下的归谁。
2. The changeset requirement needs the private: false test, in the dispatch template and the ACCEPT checklist
Specimens: cloud#1243 (PR #1247) and cloud#670 (PR #1246) — both missing a changeset, in the same round. Both packages are published (@objectstack/service-cloud v4.0.5, @objectstack/service-tenant v4.1.0, both private: false), and every comparable PR in recent history carries one — including #1242, the直接前身. Without it the fix merges and is never released.
The skill mentions changesets twice, both times as prose ("a .changeset/*.md is present for anything user-visible"). "User-visible" is a judgment call a dev under time pressure resolves optimistically. The mechanical test is not in the text.
Proposed change — two places:
step 5 dispatch template, as a card-specific clause with an explicit判据: 「本单改动的包若 package.json 的 private 不为 true(即已发布包),用户可见行为改动必须带 .changeset/*.md。判据是包的发布状态,不是改动大小。」
step 7 ACCEPT checklist, as its own line: 「改动触及的每个包,private: false 即已发布 ⇒ 核 changeset 在不在。⛔ 缺了不入队 —— 合进 main 却永不发布,是比不合更糟的终局:它看起来像修好了。」
Both were caught at review here, but only because the reviewer happened to check package.json. That should not be a happenstance.
3. A PM-supplied gate list is a lead, not a spec — the dev must re-derive it
Specimen: cloud#1248 (PR #1250). The dispatch named check:dts-gating, check:ee-plugin-wiring, check:ee-feature-consumers. It omitted check:route-envelope, and the change genuinely broke that gate. The dev found it only because the same dispatch also said 「Take the gate list from the tree yourself — ⛔ do not trust mine」.
The skill currently states the opposite allocation outright: 「⛔ 取数的是 PM,不是 dev」, with the reasoning that a dev must not enumerate the whole farm locally. That reasoning is sound and should stay — but it produced a single point of failure, and the skill's own text acknowledges the risk two paragraphs later (「点名的准确性从此是 PM 独担的,凭记忆点名等于把那一族漏进 CI」). This term it was not memory that failed; it was a fresh, careful read that was simply incomplete.
Proposed change — keep PM naming the families, add a cheap dev-side check:
4. The stale-premise check must cover rulings, not just issue bodies
Specimen: cloud#987. A maintainer ruling of 2026-08-10 moved the card to pm:queue on the grounds that 「the disable-with-tombstone is the dispatchable piece」. That piece had already shipped on 2026-08-04 via cloud#1119 / PR #1120 — six days before the ruling. Dispatching as written would have returned premise_still_valid: false and no PR.
The skill's stale-premise machinery is aimed squarely at issue bodies ("Issues describe the repo as of their filing date"). Rulings feel authoritative and recent, so they are read as current. They are not: a ruling is a judgment made against a repo state, and main moves ~18 merges a day underneath it too.
Proposed change — extend the step-1 stale-premise paragraph:
Positive controls as a first-class ACCEPT line. Best specimen this term is a negative result: cloud#1243's sys_environment comparison came back 405 — and its positive control failed too, so the dev recorded it as INCONCLUSIVE instead of banking a green as a tenant wall. That is the case that justifies the rule, and it is a better teaching example than the passing ones.
Source: repo:cloud seat post #6026. Happy to supply the full round-by-round evidence for any item.
Filed by the
repo:cloudwhole-repo seat (#6026, sessionsession_017V6EP1vMCtG26ThdcQ8bW6) at the maintainer's direct instruction (2026-08-12: 「更新最新的项目经理skills」). Routed todomain:skillsper the 2026-08-11 ruling that skills get their own PM; ⛔ this seat is not dispatching it — that would put two producers in one lane.Two binding constraints for whoever takes this:
model: claude-fable-5is mandatory for any card touching.claude/skills/pm-dispatch/**(Model tiering, no downward discretion).All four items below were measured in a single term (2026-08-12, cloud rounds 1–5, 11 cards / 9 PRs merged), not recalled. Each names the specimen.
1. A
Part ofPR does not close its card — sopm:dispatchedleaks onto an open cardSpecimen: cloud#771. PR #1249 correctly used
Part of(items 2 and 3 remained maintainer-owned). It merged, the card stayed open — correctly — andpm:dispatchedstayed on it. The in-flight querylabel:pm:dispatched is:openthen counted a card with no dev, no branch, and nothing in flight.The protocol already teaches
FixesvsPart of(step 7) and already teaches that labels are the state machine. What it never says is that these two rules interact: theFixespath self-cleans via GitHub's auto-close, thePart ofpath does not, and the difference is invisible until the in-flight count is wrong.Proposed change — add to step 7's
Fixes/Part ofparagraph, and to the Label discipline block:2. The changeset requirement needs the
private: falsetest, in the dispatch template and the ACCEPT checklistSpecimens: cloud#1243 (PR #1247) and cloud#670 (PR #1246) — both missing a changeset, in the same round. Both packages are published (
@objectstack/service-cloudv4.0.5,@objectstack/service-tenantv4.1.0, bothprivate: false), and every comparable PR in recent history carries one — including #1242, the直接前身. Without it the fix merges and is never released.The skill mentions changesets twice, both times as prose ("a
.changeset/*.mdis present for anything user-visible"). "User-visible" is a judgment call a dev under time pressure resolves optimistically. The mechanical test is not in the text.Proposed change — two places:
package.json的private不为 true(即已发布包),用户可见行为改动必须带.changeset/*.md。判据是包的发布状态,不是改动大小。」private: false即已发布 ⇒ 核 changeset 在不在。⛔ 缺了不入队 —— 合进 main 却永不发布,是比不合更糟的终局:它看起来像修好了。」Both were caught at review here, but only because the reviewer happened to check
package.json. That should not be a happenstance.3. A PM-supplied gate list is a lead, not a spec — the dev must re-derive it
Specimen: cloud#1248 (PR #1250). The dispatch named
check:dts-gating,check:ee-plugin-wiring,check:ee-feature-consumers. It omittedcheck:route-envelope, and the change genuinely broke that gate. The dev found it only because the same dispatch also said 「Take the gate list from the tree yourself — ⛔ do not trust mine」.The skill currently states the opposite allocation outright: 「⛔ 取数的是 PM,不是 dev」, with the reasoning that a dev must not enumerate the whole farm locally. That reasoning is sound and should stay — but it produced a single point of failure, and the skill's own text acknowledges the risk two paragraphs later (「点名的准确性从此是 PM 独担的,凭记忆点名等于把那一族漏进 CI」). This term it was not memory that failed; it was a fresh, careful read that was simply incomplete.
Proposed change — keep PM naming the families, add a cheap dev-side check:
4. The stale-premise check must cover rulings, not just issue bodies
Specimen: cloud#987. A maintainer ruling of 2026-08-10 moved the card to
pm:queueon the grounds that 「the disable-with-tombstone is the dispatchable piece」. That piece had already shipped on 2026-08-04 via cloud#1119 / PR #1120 — six days before the ruling. Dispatching as written would have returnedpremise_still_valid: falseand no PR.The skill's stale-premise machinery is aimed squarely at issue bodies ("Issues describe the repo as of their filing date"). Rulings feel authoritative and recent, so they are read as current. They are not: a ruling is a judgment made against a repo state, and
mainmoves ~18 merges a day underneath it too.Proposed change — extend the step-1 stale-premise paragraph:
Also worth considering (lower confidence, listed for the skills seat to judge)
CREATE, which needs no row id) precisely because the dev was measuring rather than implementing. This may deserve a named pattern in step 5.sys_environmentcomparison came back 405 — and its positive control failed too, so the dev recorded it as INCONCLUSIVE instead of banking a green as a tenant wall. That is the case that justifies the rule, and it is a better teaching example than the passing ones.Source:
repo:cloudseat post #6026. Happy to supply the full round-by-round evidence for any item.