docs(pm-dispatch): cloud publish-fallback protocol, probe-control validity, type-check-debt dispatch clause (#8007) - #8014
Conversation
…idity, type-check-debt dispatch clause — one shift's measured failures A full shift of measured dispatch failures, distilled in place per the principles-only standard (no issue-ID citations in operative text): - dispatch-runbook: new '云 dev 的 GitHub API 不可达 — 发布回落协议' section. Push credential and API reachability fail independently (org without the Claude GitHub App connected: 5 of 5 cloud devs pushed branches, 0 opened PRs, one idled ~2h in need_input). Four hard rules: full brief travels in the prompt (comment stays as public record), every cloud dispatch carries a publish-failure fallback clause, PM opens the PR reading the changeset from the branch diff (never ls-tree | head -1), get_session status is not completion. Names the org-admin App connection as the real fix that retires the whole section. - dispatch-runbook: conditional dispatch clause for tests entering type-check DEBT/EXEMPT packages — name check:type-check-debt with a built closure (pnpm typecheck is structurally green there); two anti-patterns: no ledger raise to admit the PR's own file, no --lower of other packages' info lines. Three PRs hit this gate in one shift; the errors it caught included real API misuses vitest cannot see. - platform-readings: merged branches are auto-deleted and therefore invalid as positive controls for branch probes; MCP traps grow a third — union totalCount reads like queue depth, and freshly-filed cards can land unlabeled (write-then-read-back applies to filing). - SKILL.md (line-ratchet-neutral at 686): cloud lesson ① now carries push-auth ≠ API-reach with a pointer to the fallback protocol; the same-file-serial exemption gains the per-hot-file editor cap and the reading that it guards concurrent editors, not queued PRs (next card is dispatchable when the prior dev session ends); lane candidates are re-read from GitHub every round, never dispatched off a carried list; conditional-clause summary lists the debt gate. Paid for by compressing passages whose detail already lives verbatim in references/. Gates: check:pm-skill-ratchet, check:pm-skill-id-lint, check:skill-frame-sync, check:skill-compatibility, check:nul-bytes, check:empty-changeset, check:doc-anchors all green. check:skill-frame-freshness fails its own self-test identically on clean main (pre-existing, reported separately). Co-Authored-By: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_012Wtgqp5ufgBmFDakHEMegd
|
The latest updates on your projects. Learn more about Vercel for GitHub. 1 Skipped Deployment
|
⛔ HUMAN MERGE REQUIRED — this PR will not be armed, and must not beThe implementing dev surfaced a constraint my dispatch brief did not carry:
⇒ Auto-merge is deliberately NOT enabled and this stays a draft. It is waiting on a human, not on CI. Flagging explicitly so it does not read as a stalled PR — and so a later round of mine does not "helpfully" arm it. CI status
Everything else concluded green. ⭐ The dev's judgement — the part worth reviewingIts full report is on #8007 ( ⭐⭐ And it refused to reframe the region exemption as a standing authorization — because I asserted the maintainer "has since authorised it" without supplying a dated verbatim quote, and this file's own convention requires date + 原话. That is a correct evidentiary pushback on its PM, and I am recording it as such rather than overriding it. If the maintainer wants the exemption recorded as standing, a dated verbatim ruling on an issue makes it a one-line follow-up.
|
…dispatch-cloud-publish
… reachability flipped mid-shift, and stale sessions don't inherit a new App install
Two corrections to the publish-fallback section, both measured:
- The count was overstated as 5/5. The earliest dispatch (~05:25Z) opened
its PR and filed its card unaided; every dispatch from ~08:00Z on got
403. Honest figure: five of six — and the sixth is load-bearing: it
proves the API was reachable earlier the same day and STOPPED, so the
diagnosis is 'changed mid-shift', not 'never configured'. The section
now says to ask 'when did it change', not 'was it ever set up'.
- Measured from this very session after the maintainer connected the App:
long-lived containers still 403 on API reads/writes ('not enabled for
this session') while git push works — existing sessions do not inherit
a new installation; only freshly created sessions pick it up. Recorded
as boundary ① so nobody reads an old container's 403 as 'the connection
didn't take'.
Retirement call: the section stays, dormant while the App is connected
(boundary ②) — reachability flipped once within a single shift, the
section lives in references/ (zero ratchet cost), and the diagnostic
shape is exactly what a future 403 reader needs first. The closing line
no longer implies deletion on connection.
Gates re-run: check:pm-skill-ratchet (686/686), check:pm-skill-id-lint,
check:skill-frame-sync, check:skill-compatibility, check:nul-bytes,
check:empty-changeset all green. origin/main merged in (no skill-file
conflicts). check:skill-frame-freshness stays pre-existing red on main,
tracked separately.
Co-Authored-By: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012Wtgqp5ufgBmFDakHEMegd
Closing — maintainer decision, 2026-08-12The root cause this PR documents has been fixed at source: the Claude GitHub App is now connected to the I argued for narrowing instead — keeping the probe-control and TEST_DEBT clauses, which are independent of GitHub connectivity — and the maintainer reaffirmed. Recording that plainly so the disagreement is on the record rather than implied, and proceeding. What is being discarded, stated honestlyOf the four change groups, one was caused by the outage (the cloud publish-fallback protocol) and three were not:
Credit where it is dueThe implementing dev (on It also refused to reframe the region exemption as a standing authorization because I asserted it without a dated verbatim ruling, which the file's own convention requires. That pushback was correct and remains correct. Its report stands on #8007 ( Not affected by this closure
Branch Generated by Claude Code |
Fixes #8007
domain:metadataPM seat on the implementing dev's behalf — and the reason is the subject of this very PR: theobjectstack-aiorg does not have the Claude GitHub App connected, so cloud dev containers cangit pushbut cannot reach the GitHub API to open a PR, comment, or file an issue. Measured 5 of 5 dispatches this shift.Authored on
claude-fable-5, per this lane's standing rule that any card touching.claude/skills/pm-dispatch/**is filed and dispatched, never PM-edited. That rule was kept even under an explicit instruction to update the skill — the instruction is satisfied through the card, not around it.What this records
One shift's measured failures, distilled into the skill:
Cloud publish-fallback protocol. Dev sessions that finish work and cannot publish it park silently in
need_input— one sat idle 1h48m before the PM noticed. The skill now carries: the brief goes in full inside the dispatch prompt (a brief that lives only as a GitHub comment is unreachable — one dev reported literally "issue Product question: an uninstall with no organizationId deletes EVERY organization's rows for that package (measured 5 of 5, including a foreign org's) #7780 comment text unreadable; need GitHub access or paste §1–§6"); every prompt carries a publish-failure clause; and the PM opens the PR from the dev's own changeset, read withgit diff origin/main...FETCH_HEAD -- .changeset/— ⛔ nevergit ls-tree .changeset/ | head -1, which returns the alphabetically-first pre-existing changeset and produced identical unrelated text for two different branches before it was caught.Probe-control validity. The existing "pair every zero-hit with a positive control" rule needed a sharper clause: a merged branch is auto-deleted, so it is not a valid control. This seat used one, got empty output, and nearly read it as "probe works, nothing there".
check:type-check-debtas a dispatch-time gate clause. Three PRs hit this gate in one shift. Packages in the ledger exclude their own tests fromtsconfig, and some (@objectstack/metadata-protocol) have notypecheckscript at all, sopnpm typecheckstays green while the test layer drifts. It needs a built closure or exit 1 is a missing-module cascade rather than the ledger. ⛔ Never raise an entry to admit a file added in the same PR; ⛔ never--lowerother packages' informational lines.Also carried: the mutually-exclusive-region exemption protocol (declare regions at claim · merge
mainbefore the PR · merge again after each sibling lands · queue arbitrates), and the reading that makes it safe — it guards against concurrent editors, not against a finished PR sitting in a merge queue.Shape
Written as principles distilled in place, without issue-ID citations, matching the direction
maintook today in #7938 (os-dev) and #7948 (AGENTS.md). Edits are largely in-place rewrites rather than appended sections — 75 insertions against 36 deletions acrossSKILL.md,references/dispatch-runbook.md, andreferences/platform-readings.md.mainand check for overlap rather than re-litigate or duplicate their changes.Generated by Claude Code