Skip to content

pm-dispatch SKILL: cloud-card comms is event-driven by ruling — roster limitation on record, notes-21 verify-before-toggle amendment, PR subscription as a hard step #7755

Description

@os-zhuang

Filed by the spec-lane PM seat (session session_01JY2Q5Xto1u8YHADgrZDTnk) on the maintainer's instruction (spec-lane PM session chat, 2026-08-11 ~13:05Z, verbatim: 「立卡」), executing the same-chat rulings: 「当前事件驱动架构即长期方案」/「云卡通信课题就此收档 … 不再追」/ 「没有计划 把 PM 席迁到常驻本地机」.

Three validated deltas to .claude/skills/pm-dispatch/SKILL.md, all proven on the 2026-08-11 spec-lane shift. Scope is exactly these three plus one rider evaluation — not the seat post's broader suggestion list (that stays for 换班复盘).

1. mode:cloud — record the cross-session-messaging conclusion as a known platform limitation

Add a short paragraph to the mode:cloud backend section so no future PM session re-investigates this path:

  • CCR-created cloud sessions do NOT register in the cross-session messaging roster: ListAgents does not list them and SendMessage by session ID returns not-reachable. Measured 2026-08-11 with the gates that the docs name all passing (Claude Code 2.1.227 ≥ 2.1.224; none of the four feature-flag-disabling env vars set; in-process subagents listed and messageable in the same reads). Per the official doc (code.claude.com/docs/en/cross-session-messaging), cloud sessions appear only when the sending session has "cloud access: a claude.ai login on the first-party Anthropic API" — a condition CCR-container credentials do not currently satisfy.
  • The maintainer ruled (2026-08-11): the event-driven architecture IS the standing solution — cloud-card channels are subscribe_pr_activity webhooks + the dual-drop report contract (issue comment + return message) + criteria-only timers. ⛔ Do not re-test the roster path or propose local-machine migration; both were examined and closed 2026-08-11.

2. Operational note 21 amendment — after an empty-field enable, verify queue membership BEFORE any disable

Note 21's current prescription is "disable/enable 翻转一次" on the empty-field signature. The 2026-08-11 shift measured a failure mode inside that prescription: GitHub's "added to merge queue" webhook can arrive OUT OF ORDER, after the first empty-field enable has actually enqueued the PR — and a disable fired into that arming window CANCELS the real enqueue (PR #7655: enable → empty-field → disable → out-of-order "added to queue" notice → queue branch gone; cost one extra toggle lap). The corrected sequence, which landed PR #7657 with zero friction the same day:

  1. enable_pr_auto_merge returns the empty-field form (method: , enabled at ) ⇒ verify by queue branch first (git ls-remote --heads origin 'refs/heads/gh-readonly-queue/*', allow ~20–30s for the entry);
  2. branch present ⇒ done — ⛔ no toggle;
  3. branch absent after the wait AND the queue has visibly churned (newer entries got branches while yours did not — the build-horizon caveat stays) ⇒ ONE disable/enable toggle, then re-verify;
  4. ⛔ never issue a disable between an enable and its queue-branch verification.

Wording should amend note 21 in place (it is the same signature and the same tool), not add a competing note elsewhere.

3. 入队与落地 B — elevate the cloud-card PR subscription from 随行纪律 to a hard dispatch-flow step

The clause 「云卡创建即对其 PR 挂 subscribe_pr_activity」 exists today as one of three 随行纪律 bullets in the sizing section. The 2026-08-11 shift produced a clean A/B measurement of skipping it: #7672 (no subscription — merge discovered by polling, minutes late) vs #7655/#7657 (subscribed — CI failure and merge notices delivered in seconds, the whole relay ran event-driven with zero polling). Move/duplicate the requirement into the mode:cloud delivery-contract flow as a numbered step: "the moment the cloud card's draft PR exists, subscribe_pr_activity it — a cloud-card PR without a subscription is a polling liability", keeping the existing bullet as the pointer.

Rider evaluation (same PR if adopted)

The previous shift left a compressed 6-line replacement for the closed PR #7431 (cloud-card archival paragraph) on branch claude/pm-dispatch-spec-5ls2tr @ bbe056b, not reopened per the closed-PR rule. The dev on this card should read that commit and either fold the 6-line paragraph into this PR (if it still matches the current SKILL text) or record why it no longer applies. #7548 governs either way.

Process constraints (standing rulings — restated, not new)

Refs: #7341 (tiering rulings), #7548 (skills-update governance), #7431 (closed predecessor), seat post #6017 (shift evidence ledger).

Activity

  1. self-assigned this
    on Aug 11, 2026
  2. os-zhuang commented on Aug 11, 2026

    @os-zhuang
    ContributorAuthor

    Claim: PM loop round 2 (spec lane — maintainer-directed skill-update card, filed and dispatched on instruction 「立卡」)
    Session: session_01JY2Q5Xto1u8YHADgrZDTnk
    Branch: claude/issue-7755-pm-skill-event-driven-comms
    Worktree: cloud dev session (own container)
    Domain: (none — .claude/ internal PM tooling; maintainer-directed, provenance in the body)
    File surface: .claude/skills/pm-dispatch/SKILL.md (three scoped edits per the body) + rider evaluation of claude/pm-dispatch-spec-5ls2tr @ bbe056b. Nothing outside .claude/skills/pm-dispatch/. Stop on breach; explain in the report.
    Container & model: skill-update card, mode:cloud, model: claude-fable-5 (Model tiering mandatory clause — no downward discretion)
    Serial constraints cleared: no open PR touches .claude/skills/pm-dispatch/** (checked 13:07Z; #7552 from another seat touches the SKILL but is a different section — the dev must re-verify overlap against that PR's diff at start and declare regions if both are still open).
    Landing: draft PR held for HUMAN merge per #7548 — ⛔ no auto-merge, no queue.


    Generated by Claude Code

  3. removed their assignment
    on Aug 11, 2026
  4. os-zhuang commented on Aug 11, 2026

    @os-zhuang
    ContributorAuthor

    Dispatch withdrawn; card held — on the maintainer's instruction.

    • Whose instruction: the maintainer, spec-lane PM session chat, 2026-08-11 ~13:03Z.
    • Verbatim: 「7755 只要立卡,不要处理」
    • Execution state: the cloud dev session dispatched at 13:02Z was interrupted and archived ~1 minute in — zero push, zero PR, zero code (verified git ls-remote). Claim released (assignee removed, pm:dispatched off).
    • State: pm:on-hold — decision made, deliberately deferred. Restart condition: the maintainer says to process this card (the filing itself was also maintainer-directed, same chat: 「立卡」). Until then: ⛔ no dispatch, no nagging; the card stays as the durable record of the three validated deltas + process constraints (fable model mandatory clause, pm-dispatch SKILL: skills updates are ADR-class — human review/merge required (maintainer ruling 2026-08-11) #7548 human-merge).

    Generated by Claude Code

  5. os-zhuang commented on Aug 11, 2026

    @os-zhuang
    ContributorAuthor

    Restart condition met — card returns to the dispatchable queue, sequenced behind #7754.


    Generated by Claude Code

  6. self-assigned this
    on Aug 11, 2026
  7. os-zhuang commented on Aug 11, 2026

    @os-zhuang
    ContributorAuthor

    Claim: PM loop round 2 (skills seat)
    Session: session_01XoWxhuq3WNNaZUTs6kWdk8
    Branch: claude/issue-7755-pm-skill-event-driven-comms
    Worktree: cloud session — its own container and clone
    Domain: domain:skills
    File surface: .claude/skills/pm-dispatch/SKILL.md (three scoped edits per the body, targets re-located on post-#7766 compressed text) + .claude/skills/pm-dispatch/references/** (offset moves, see ratchet note) + rider evaluation of claude/pm-dispatch-spec-5ls2tr @ bbe056b. Stop on breach; explain in the report.
    Container & model: M skill-update card, mode:cloud, model: claude-fable-5 (mandatory clause — no downward discretion)
    Serial constraints cleared: predecessor #7754/PR #7766 MERGED 14:38Z (hot-file queue position 1 cleared); zero open PRs touch either skills root (searched 14:4xZ, incl. #7552 — no longer open); premise re-verified on post-merge origin/main: SKILL.md = 2568 lines, all three target sections locatable, rider commit bbe056b exists. ⚠️ Ratchet headroom is 0 (ceiling 2568 = current count) — additions must be offset in-PR; carried into the dispatch prompt.
    Restart provenance: hold lifted by maintainer instruction 「7754 处理完继续 7755」 (recorded above, 13:3xZ).


    Generated by Claude Code

  8. os-zhuang commented on Aug 11, 2026

    @os-zhuang
    ContributorAuthor

    Dispatched (PM loop round 2, skills seat): cloud dev session session_01MJrrkG5usF1W3mX6RLyxNA, model: claude-fable-5, created 2026-08-11 14:41Z, outcome branch claude/issue-7755-pm-skill-event-driven-comms. Dispatch prompt carries: post-#7766 semantic relocation (targets confirmed locatable), ratchet headroom 0 offset discipline (⛔ no silent ceiling raise), notes-21 amend-in-place, rider bbe056b fold-or-record, ADR-class terminal (draft PR, human merge). Collection: os-dev-report comment here + draft PR; PM subscribes once the PR exists.


    Generated by Claude Code

  9. os-zhuang commented on Aug 11, 2026

    @os-zhuang
    ContributorAuthor
    {
      "issue": 7755,
      "session": "session_01MJrrkG5usF1W3mX6RLyxNA",
      "branch": "claude/issue-7755-pm-skill-event-driven-comms",
      "pr": 7794,
      "pr_state": "draft (held for human merge per #7548 — no auto-merge, no queue entry)",
      "premise_still_valid": true,
      "premise_verification": "Verified on origin/main @ 2701e95 (post-#7766): SKILL.md exactly 2568 lines = MAX_LINES (headroom 0); all three targets semantically locatable on compressed text (note 21 at former L403, mode:cloud backend section, 入队与落地 B); rider commit bbe056b exists on origin/claude/pm-dispatch-spec-5ls2tr (6 insertions, its content absent from main). Serial constraint re-verified at dispatch time: zero open PRs touching .claude/skills/pm-dispatch/** (#7552 closed).",
      "summary": "Three deltas landed per the card, relocated semantically on post-#7766 text. (1) mode:cloud backend: new 跨会话消息面 paragraph after 监控与转向 — CCR cloud sessions do not register in the cross-session messaging roster; event-driven architecture ruled the standing solution; roster re-tests and local-machine migration closed. (2) Note 21 amended in place, old prescription REPLACED not paralleled: numbered sequence ①-④ — verify queue branch first (~20-30s allowance), branch present means done with no toggle, absent-plus-churn means ONE toggle then re-verify by notes 1 timeline criteria, and the hard rule that no disable is ever issued between an enable and its queue verification (out-of-order webhook trap, #7655 negative / #7657 positive); the settled-membership disable clause (#7446/#7506) retained as step ④. (3) Subscription elevated to numbered hard step: 实测三课 became 实测四课, lesson 4 = subscribe the cloud card's draft PR the moment it exists, with the #7672 vs #7655/#7657 A/B; the 随行纪律 bullet kept as pointer; the B-section report-time boundary bullet rewired to note non-conflict post-#6644 L2.",
      "rider_bbe056b": "adopted_with_adaptation — still applicable (batch sweep, never-archive-before-merge #7265/#7325, unarchive caveat all absent from post-#7766 main). Folded into the EXISTING B-section archival bullet instead of a standalone mode:cloud paragraph: post-#7766 the archival rule's single home is 入队与落地 B and the 随行纪律 bullet already points there, so a second paragraph would have been the competing-entry shape the card forbids. Rider's 6-line original preserved verbatim in references §「云卡归档欠账与 dirty 自救实测」 with provenance.",
      "ratchet": "net 0 — SKILL.md lands at exactly 2568 lines (= MAX_LINES, untouched). Gross additions (~+30) fully offset inside touched paragraphs per the #7766 convention: five append-only sections added to references/incidents.md tail (#7655 撤单实测, roster 限制实测, 订阅 A/B 实测, #6072 感知通道缺口, 归档欠账与 dirty 自救 incl. rider text), each with a 出处 line; plus reflow of the narrow-wrapped paragraphs already under edit (mode:subagent/mode:cloud English paras, 监控与转向, flip paragraph). No ceiling raise needed, so the no-silent-raise clause was never triggered.",
      "file_surface": [".claude/skills/pm-dispatch/SKILL.md", ".claude/skills/pm-dispatch/references/incidents.md"],
      "file_surface_breach": "none",
      "changeset": "none — .claude/-only; expect skip-changeset at acceptance",
      "gates": {
        "check:pm-skill-ratchet": "pass (2568/2568, headroom 0)",
        "check:skill-frame-sync": "pass (4 copies isomorphic)",
        "check:doc-authoring": "pass (375 files clean)",
        "check:nul-bytes": "pass",
        "lint check:doc-formula-expressions": "pass (lint dependency closure built first)",
        "section_pointer_check": "pass — every §「…」 cite in SKILL.md resolves to a real header in references/*.md",
        "pr_ci": "in_progress — just opened; PM owns CI convergence readouts per dispatch"
      },
      "open_questions": [
        "None blocking. Two adaptations on record rather than questions: (a) rider placement in the B-section archival bullet instead of bbe056b's original mode:cloud location — reasoning above, both outcomes governed by #7548 either way; (b) line-budget offsets include pure reflow of paragraphs already under edit, which adds whitespace-only diff hunks in those paragraphs — accepted as the cost of net-0 at headroom 0."
      ]
    }

    Generated by Claude Code

  10. os-zhuang commented on Aug 11, 2026

    @os-zhuang
    ContributorAuthor

    Review: ACCEPT — PR #7794 (ADR-class terminal state: awaiting a human merge)

    Verified against GitHub, not the report's claims:

    Terminal state per #7548: this PR stays draft and visibly hanging — the maintainer reviews and merges by hand (own human account preferred, or say so in seat chat when using the shared one). #7765 (next in the SKILL.md hot-file queue) dispatches only after this lands.


    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