Skip to content

docs(pm-dispatch): ADR merge prohibition in Guardrails + ACCEPT path fork; probe-and-revive as the standing backstop; replay-wake identity check (#6741, #6747) - #6799

Open
os-project-manager wants to merge 2 commits into
mainfrom
claude/skill-sweep-round6
Open

docs(pm-dispatch): ADR merge prohibition in Guardrails + ACCEPT path fork; probe-and-revive as the standing backstop; replay-wake identity check (#6741, #6747)#6799
os-project-manager wants to merge 2 commits into
mainfrom
claude/skill-sweep-round6

Conversation

@os-project-manager

Copy link
Copy Markdown
Collaborator

Fixes #6747
Part of #6741
Part of #5925
Part of #6644

Sweep of four cards, all landing in .claude/skills/pm-dispatch/SKILL.md — this repo's hottest serialisation surface, so one claim, one PR, a per-item checklist (per the packaged-promotion rules and the shape PR #6720 used). Every anchor was re-derived against the post-#6720 file by content; no line numbers or counts were inherited from the card bodies.

Per-item checklist

#6741 (p1) — ADR merge prohibition — Part of, and why

#6747 — PM half of the dev-termination contract — Fixes

  • (a) Probe-and-revive as the standing backstop. New passage in step 6 after the five probe rules. The old trigger face ("dispatched and no remote branch/PR yet") is falsified by the 2026-08-08 measurement — 7 of 7 dispatches failed to hand back cleanly after opening a correct PR, and 3 of the 4 dispatches carrying the termination clause verbatim died anyway — so the trigger bullet itself was re-worded to "dispatched and report not yet arrived" (producer of the contradiction fixed, not patched around), and the passage carries the consequence that makes the backstop cheap: every death so far was fully recoverable from transcript with zero work lost, so the cost is latency, not correctness — which is why the response is a probe and never a redispatch into a possibly-live worktree.
  • (b) A stale wake is recognisable without re-reading the deliverable. New passage after the stall-correction block: identity before content. publish/lint 面对字面量空组合子响亮拒收 —— #5322 拍板单位元后的可选编写期信号(PD #12 形状) #5330 emitted six notifications for one card, five of them byte-identical replays of the same full JSON — each indistinguishable at arrival from a real completion, so each was re-adjudicated. The PM-side procedure: compute the identity tuple (issue, branch, PR head sha) plus the monitor's self-declared subject (the dev-side half PR docs(agents): make the os-dev termination contract explicit and honest about its measured failure rate (#6586) #6740 landed); on a match with an already-reviewed report, log one replay line and stop — no re-review, no re-read of the diff, no duplicate ACCEPT comment. Neither the arrival (a monitor fires on its own deadline) nor the non-arrival of notifications is evidence of liveness; the dev-side self-identification makes this cheaper but is explicitly not a precondition (3-of-4 clause-carrying deaths — the same cause defeats both clauses).

#5925 — seven items — Part of (verification only, zero new text)

All seven items were checked against the current file; every one is declined, each with a reason:

  • Items 1–6 are already in the file, landed by PR docs(pm-dispatch): 座位贴协议(一座位一贴)+ 两班次沉淀的 16 条 SKILL 更新 #6029 (2026-08-06), verified by content grep at the merged ref: handover checklist (交接收尾清单), whole-body-replace trap (structurally obsoleted by the one-sticker-per-seat architecture, 座位贴协议), the three API traps (Operational notes 13 for list_issues OR-filter and labels whole-set replace; the REST hourly-reset quota note), priority:p0 (step 3), standby posture (待命姿态 under Stop conditions), and the PM-tooling-PR exception (Guardrails, tagged #5925-6). Writing them again would be the redundant-second-statement defect the dispatch names. This matches the card's own re-scoping comment of 2026-08-08 ("items 1–6 are historical record, not work").
  • Item 7 (extract long narratives into references/incidents.md) is excluded by the card itself (「⛔ 不与前 6 条同 PR」, maintainer-approved as a separate pure-move PR) and stays open — which is why this line is Part of.

#6644 — remainder — Part of (nothing left that is writable)

Determined from PR #6720's merged diff: L1 (Fixes/Part-of), L3 (hot-file serial queue section), L4 (PM narrowing judgment as falsifiable assumption), L5 (sweep products grouped in ACCEPT) are all in the file — no restatement written. L2 (report-at-draft-PR-time vs wait-for-CI) is ⛔ excluded from this sweep: it is escalated to the maintainer with four live options and a dev-side inversion argument (PR #6740), and this PR leaves every passage it touches on that question untouched. The card stays open on L2, hence Part of.

Scope

One file: .claude/skills/pm-dispatch/SKILL.md (+100/−4 before the routine merge of origin/main). No docs/adr/**, no content/docs/releases/**, no code.

Verification

No package code changed; pnpm test / pnpm typecheck are not meaningful for this diff (saying so beats manufacturing template-shaped evidence). What was run, serialized under the shared verification lock with the capped heap, is the full check:* gate list enumerated from .github/workflows/lint.yml41 gates, all green, including the two that read this file family (check:skill-compatibility: OK; check:skill-frame-sync: OK), check:nul-bytes (OK, 6269 files), and a manual control-byte scan of the edited file beyond the gate's surface (no matches). Honest sequence: 37/41 green on the first pass; the 4 reds (check:app-nav-i18n, check:i18n, check:i18n-coverage, check:type-check-debt) were the fresh-worktree missing-build-artifact class — each gate's own classifier named its prerequisite (built CLI / built packages closure), and after turbo run build --filter=@objectstack/cli plus the packages closure build, all four re-ran green with echo EXIT=$? discipline. None of the four reads .claude/.

Labels

skip-changeset: this PR touches only .claude/ internal agent tooling — releases nothing, writes no changeset. Applied as a union with the labels already present, not as a bare set.


Generated by Claude Code

claude added 2 commits August 8, 2026 17:27
…fork; probe-and-revive as standing backstop; replay-notification identity check

- #6741: maintainer ruling (2026-08-08) quoted verbatim in Guardrails, with
  the ACCEPT-path fork on the diff's paths before ready/auto-merge/queue,
  the mixed-diff rule, and the draft-conversion eviction mechanism (#6732).
- #6747: probe-and-revive written as the standing backstop (7/7 failed
  hand-backs on 2026-08-08, 3 of 4 clause-carrying dispatches died anyway;
  zero work lost so the response is a probe, never a redispatch), and a
  stale-wake identity check so a replayed report is recognisable without
  re-adjudicating the deliverable (#5330's six notifications).
- #5925 / #6644: verified already covered by PR #6029 / #6720 respectively;
  no restatement written. L2 of #6644 left untouched (escalated).

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01F8q5J1MQyocgtNspb15fSn
@vercel

vercel Bot commented Aug 8, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

1 Skipped Deployment
Project Deployment Actions Updated (UTC)
objectstack Ignored Ignored Aug 8, 2026 6:04pm

Request Review

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentation Improvements or additions to documentation size/m skip-changeset PR has no user-facing published change; bypasses the changeset gate

Projects

None yet

2 participants