Skip to content

docs(pm-skill): release-aftercare duties — the PM window past MERGED (#11134) - #11309

Merged
hotlong merged 1 commit into
mainfrom
claude/issue-11134-release-aftercare
Aug 23, 2026
Merged

hotlong merged 1 commit into
mainfrom
claude/issue-11134-release-aftercare

Conversation

@claude

@claude claude Bot commented Aug 23, 2026

Copy link
Copy Markdown
Contributor

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:

  • A. Every fleet roll re-draws container placement. Read placement first, then
    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 × RTT shape a 35ms leg
    is ~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 Houston
    repeatedly; 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.
  • B. One real user-path probe after any prod roll. Not /health 200, not a green
    deploy 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.
  • C. Hand-fixes to live state are a tourniquet. Before applying one, name WHO
    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.
  • D. Orphaned-loop resumption. A long-running background loop's last recorded intent
    is not the current live state — the first action on resume is always to re-read live
    state, never to continue from that intent.
  • E. Honesty clause. When a later measurement falsifies a factual assertion in a
    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-tracking
material.

Declared file surface

file change
.claude/skills/pm-dispatch/references/release-aftercare.md new page, 58 lines
.claude/skills/pm-dispatch/references/landing-operations.md the one pointer, zero line delta
scripts/pm/check-skill-line-ratchet.mjs one CEILINGS row + its provenance comment

SKILL.md is deliberately untouched. The third file is in the surface because of the
ratchet accounting below, and is declared here for that reason.

Ratchet accounting — paid per remedy, no raise

CEILINGS enumerates references pages individually, so a new page needs its own row.
Two separate bills, both paid without a maintainer ruling:

  1. The new page gets its row at its landed line count — release-aftercare.md, 58,
    headroom 0, the same convention as every entry around it.
  2. landing-operations.md was at its ceiling with headroom 0, so a physically new
    pointer 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:

✓ check-skill-line-ratchet: .claude/skills/pm-dispatch/references/landing-operations.md is 82 lines (ceiling 82; headroom 0).
✓ check-skill-line-ratchet: .claude/skills/pm-dispatch/references/release-aftercare.md is 58 lines (ceiling 58; headroom 0).
✓ check-skill-line-ratchet self-test: 20 cases pass.

Gates

Derived with node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack
against 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:

EXIT 0 :: check:pm-skill-ratchet          EXIT 0 :: check:parse-guard
EXIT 0 :: check:pm-skill-id-lint          EXIT 0 :: check:pnpm-filter-targets
EXIT 0 :: check:skill-frame-sync          EXIT 0 :: check:cross-package-test-inputs
EXIT 0 :: check:pm-governed-merges        EXIT 0 :: check-ci-filter-parity.mjs
EXIT 0 :: check:pm-dispatch-gates         EXIT 0 :: check-cross-package-test-inputs.mjs
EXIT 0 :: check:doc-authoring             EXIT 0 :: check:doc-formula-expressions
EXIT 0 :: check:entry-guard

Gate-printed verdict lines for the two that judge this page's content:

✓ check-skill-id-lint: 18 file(s) clean (pattern /#[0-9]{3,}/g).
✓ doc authoring guard: 389 files clean — no bare metadata literals.
✓ dispatch-gates self-test: 557 cases pass.

check:pm-dispatch-gates was run deliberately rather than by derivation: the residue
report flags it as an artifact-roster family whose roster sits under scripts, where a
silent verdict is evidence in neither direction — and its self-test does read this
ratchet'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 is
needed for the .mjs edit.

No changeset: .claude/** and scripts/pm/** publish nothing to consumers, so this
carries skip-changeset per 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

…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
@claude claude Bot added the skip-changeset PR has no user-facing published change; bypasses the changeset gate label Aug 23, 2026
@github-actions github-actions Bot added size/s documentation Improvements or additions to documentation labels Aug 23, 2026
@os-zhuang
os-zhuang self-requested a review August 23, 2026 10:01
@hotlong
hotlong marked this pull request as ready for review August 23, 2026 11:36
@hotlong
hotlong added this pull request to the merge queue Aug 23, 2026
Merged via the queue into main with commit c6bc45f Aug 23, 2026
32 checks passed
@hotlong
hotlong deleted the claude/issue-11134-release-aftercare branch August 23, 2026 11:50
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/s skip-changeset PR has no user-facing published change; bypasses the changeset gate

Projects

None yet

2 participants