Repository navigation
docs(pm-skill): release-aftercare duties — the PM window past MERGED (#11134) - #11309
Merged
Merged
Conversation
…1134) The landing window ends at MERGED, which is not the moment a user gets anything. Two days of cloud release operations (2026-08-21/23) hit the same post-release traps repeatedly, each living only in one operator's memory. New references page `release-aftercare.md`, one line per duty: A. every fleet roll re-draws container placement — read placement, then latency, against the perf gate; placement follows the WAKER (not locationHint) and measuring mid-swap contaminates the next draw, so the protocol order is rollout -> zero operator HTTP -> wake via a us-east runner -> read the CF instances API for the city -> only then measure. B. one real user-path probe after any prod roll — health-only monitoring and a synthetic E2E both stayed green through a five-week SSO outage. C. hand-fixes to live state are a tourniquet — name WHO replays that state and WHEN before applying one; the replay-layer fix is the real card and must ship before the next replay event. D. orphaned-loop resumption: first action re-reads live state, never continues from the loop's last known intent. E. honesty clause: a later measurement falsifying a merged PR-body assertion gets corrected on the card, publicly. Ratchet accounting, paid per remedy: - CEILINGS enumerates references pages individually, so the new page gets its row at its landed count (58, headroom 0, same convention). - landing-operations.md is at its ceiling with headroom 0, so its pointer rides existing slack on the last MERGED-tracking line rather than adding one: that file stays at 82 lines. No re-wrap, no cut, no raised roof. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01RMTpSRF5CjMmQBFfPtPCwJ
os-zhuang
self-requested a review
August 23, 2026 10:01
This was referenced Aug 23, 2026
hotlong
marked this pull request as ready for review
August 23, 2026 11:36
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Fixes #11134
The pm-dispatch landing window ends at MERGED — which is not the moment a user gets
anything. Nothing in the skill covered what a lane PM still owes after a tagged release
rolls to production. Two days of cloud release operations (2026-08-21/23) hit the same
post-release traps repeatedly, each living only in one operator's memory.
What lands
A new references page,
.claude/skills/pm-dispatch/references/release-aftercare.md(58 lines), one line per duty where the duty fits on one:
latency, against the lane's perf gate — a region constraint bounds the draw but does
not pick the city (measured, same ENAM: Ashburn ~4ms / Atlanta ~17ms / Houston ~35ms
per leg, a 9x spread), and at the measured
server ≈ 33 + 23 × RTTshape a 35ms legis ~870ms per request against a ≤200ms gate. Two counter-intuitive physics, with the
protocol whose order cannot be swapped: placement follows the WAKER, not
locationHint(re-rolls woken from a California operator machine drew Houstonrepeatedly; waking via a us-east CI runner drew Ashburn first try), and measuring
contaminates the next draw (a probe issued mid-swap becomes the new instance's
waker) — so: rollout → zero operator HTTP → wake via the us-east runner → read the CF
instances API for the city → only then measure.
/health200, not a greendeploy job, not a synthetic E2E: the platform SSO hop failed for every real user for
five weeks (last successful token exchange 2026-07-17, found 2026-08-22) while health
checks and the E2E both stayed green — the E2E logged in with email+password and never
ran the exchange.
replays that state and WHEN (seed / reseed / migration / boot binder) and write both
on the card; the replay-layer fix is the real card, and the fixed code must ship
before the next replay event or the incident re-opens.
is not the current live state — the first action on resume is always to re-read live
state, never to continue from that intent.
merged PR body, the correction is posted to the card publicly — not merely known.
Merged is not verified.
Plus one pointer from
references/landing-operations.md, after its MERGED-trackingmaterial.
Declared file surface
.claude/skills/pm-dispatch/references/release-aftercare.md.claude/skills/pm-dispatch/references/landing-operations.mdscripts/pm/check-skill-line-ratchet.mjsSKILL.mdis deliberately untouched. The third file is in the surface because of theratchet accounting below, and is declared here for that reason.
Ratchet accounting — paid per remedy, no raise
CEILINGSenumerates references pages individually, so a new page needs its own row.Two separate bills, both paid without a maintainer ruling:
release-aftercare.md, 58,headroom 0, the same convention as every entry around it.
landing-operations.mdwas at its ceiling with headroom 0, so a physically newpointer line would have crossed it. Instead the pointer rides existing slack on
that file's last MERGED-tracking line (36 → 104 bytes, inside the file's own wrap
width): the file stays at 82 lines, its ceiling is untouched. No re-wrap, no cut
of surviving content, no raised roof — the lane charter bans the first two as payment
and the ratchet header requires a maintainer ruling for the third.
The ratchet's own verdict lines at the pushed commit:
Gates
Derived with
node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstackagainst the real change set (3 paths, three-dot semantics) — 12 families named, all run
and green. The union below was re-run after the final commit, at
15f02cad:Gate-printed verdict lines for the two that judge this page's content:
check:pm-dispatch-gateswas run deliberately rather than by derivation: the residuereport flags it as an artifact-roster family whose roster sits under
scripts, where asilentverdict is evidence in neither direction — and its self-test does read thisratchet's hints, so it is a real dependency of the CEILINGS edit.
Repo-wide scan run, not narrowed:
pnpm lint(
eslint . --no-inline-config) green in 93s at this commit, so no narrowing claim isneeded for the
.mjsedit.No changeset:
.claude/**andscripts/pm/**publish nothing to consumers, so thiscarries
skip-changesetper convention.Governance
.claude/**is a governed surface: this PR stays draft, is merged by a human,and no auto-merge is armed.
Generated by Claude Code