Repository navigation
pm-dispatch finding: the landing window ends at MERGED — no release-aftercare duties (placement re-draw physics, tourniquet rule for replayed state, orphaned-loop resumption) #11134
Description
Activity
Triage: routed
domain:skills— subject is the pm-dispatch landing-window definition (release aftercare duties), protocol face; skills seat self-triages.
Generated by Claude Code
Grading (skills seat, session
session_01RMTpSRF5CjMmQBFfPtPCwJ, 2026-08-23 concentrated round): promotedfinding→pm:queue. Scope: a release-aftercare reference page underreferences/(placement re-draw physics + waker bias, one real user-path probe, the tourniquet rule for replayed state, orphaned-loop resumption = re-read reality first, and the honesty clause — a later measurement falsifying a merged PR-body assertion gets corrected on the card), plus a one-line pointer from the landing-operations reference. Keep the SKILL.md main file untouched if the pointer can ride an existing line — otherwise fable-mandatory for that one line. Origin is a maintainer directive to file these; content is operational record, not new semantics — no ruling needed.
Generated by Claude Code
Claim: PM loop round 1, wave 4-C
Session:session_01RMTpSRF5CjMmQBFfPtPCwJ
Branch:claude/issue-11134-release-aftercare
Worktree:objectstack-issue-11134
Domain:domain:skills
File surface: a NEW page.claude/skills/pm-dispatch/references/release-aftercare.md+ a one-line pointer in.claude/skills/pm-dispatch/references/landing-operations.md(stop on breach; explain in the report)
Container & model: S,mode:subagent,model: opus— references-face construction per the tiering clause, fable-tier review at ACCEPT
Clause-②: no
Serial constraints cleared: wave-4-A ownscheck-half-states.mjs+dispatch-runbook.md; wave-4-B owns SKILL.md/os-dev.md/AGENTS.md + the true-green page — all disjoint from this surface. #11251 (which shares dispatch-runbook with 4-A) is deliberately HELD for the next wave, serialized.
Generated by Claude Code
- added a commit that references this issue
on Aug 23, 2026 { "issue": 11134, "status": "done", "branch": "claude/issue-11134-release-aftercare", "pr": "https://github.com/objectstack-ai/objectstack/pull/11309", "premise_still_valid": true, "summary": "New references page .claude/skills/pm-dispatch/references/release-aftercare.md (58 lines) covering all five graded duties, one line per duty where it fits: (A) post-roll placement/latency read against the perf gate with both waker-bias physics and the four-step protocol (rollout -> zero operator HTTP -> wake via us-east runner -> read CF instances API for the city -> only then measure); (B) one real user-path probe after any prod roll; (C) the tourniquet rule for live-state hand-fixes (name WHO replays and WHEN, replay-layer fix is the real card, must ship before the next replay event); (D) orphaned-loop resumption re-reads live state first; (E) the honesty clause. Plus ONE pointer in landing-operations.md after its MERGED-tracking material. SKILL.md untouched. Premise verified against cloud receipts before writing: placement-follows-waker, measurement-contaminates-next-draw, the protocol, the ENAM city spread (Ashburn ~4 / Atlanta ~17 / Houston ~35 ms per leg), server ~= 33 + 23 x RTT, the 200ms gate, 35.9ms/leg ~= ~870ms/request, the ~15s re-roll blip, the five-week SSO outage (last successful token 2026-07-17, found 2026-08-22) with health and synthetic E2E both green because the E2E used email+password, the reseed reverting the hand-flip, and the falsified SQL-DEFAULT-backfills-existing-rows PR-body assertion corrected publicly on the card — all confirmed first-hand in cloud release-log comments. ONE sub-claim could NOT be independently confirmed in those receipts: the orphaned-loop incident 40.8ms/leg figure, which appears only in the issue body; the duty is stated with the mechanism and no invented number (page says worst draw, not a ms value). Deviation, declared: landing-operations.md sat at its ceiling with headroom 0, so rather than raise the roof (needs a maintainer ruling) or cut surviving content (lane charter forbids re-wrap and warns cuts lose rules), the pointer RIDES existing slack on that file s last MERGED-tracking line (36 -> 104 bytes, inside its own wrap width) — the file stays at 82 lines, zero line delta. CEILINGS does enumerate references pages individually on current main, so the new page got its row at its landed count (58, headroom 0), which puts scripts/pm/check-skill-line-ratchet.mjs in the declared surface; it is declared in the PR body table. Governed .claude surface: PR opened DRAFT, no auto-merge armed, human merge only, stated in the body.", "files_changed": [ ".claude/skills/pm-dispatch/references/release-aftercare.md (new, 58 lines)", ".claude/skills/pm-dispatch/references/landing-operations.md (pointer rides existing line; 82 -> 82, zero delta)", "scripts/pm/check-skill-line-ratchet.mjs (one CEILINGS row + provenance comment)" ], "page_duties_landed": { "a_placement_latency_waker_protocol": "section A", "b_real_user_path_probe": "section B", "c_tourniquet_replayed_state": "section C", "d_orphaned_loop_resumption": "section D", "e_honesty_clause": "section E" }, "ratchet_verdicts": [ "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." ], "tests": "Gates derived with `node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack` on the real change set (3 paths, three-dot semantics; the --repo assertion held against this checkout s origin). 12 families named; ALL 12 run and green, and the union was RE-RUN AFTER the final commit at HEAD=15f02cad: check:pm-skill-ratchet 0 / check:pm-skill-id-lint 0 / check:skill-frame-sync 0 / check:pm-governed-merges 0 / check:pm-dispatch-gates 0 / check:doc-authoring 0 / check:entry-guard 0 / check:parse-guard 0 / check:pnpm-filter-targets 0 / check:cross-package-test-inputs 0 / check-ci-filter-parity.mjs 0 / check-cross-package-test-inputs.mjs 0 / check:doc-formula-expressions 0. Exit codes captured BEFORE any pipe (redirect-then-capture), and the verdict lines quoted here are the gates own printed lines, never a bare $?. Gate-printed verdicts: `✓ 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:doc-formula-expressions: 22 record-scoped formula example(s) across 417 files / 1447 TS blocks judged clean` · plus the three ratchet lines above. check:pm-dispatch-gates was run DELIBERATELY, not by derivation: the residue report flags it as an artifact-roster family whose roster sits under scripts/ (silent is evidence in neither direction there) and its self-test genuinely reads this ratchet s hints. REPO-WIDE SCAN RUN, NOT NARROWED: `pnpm lint` (= `eslint . --no-inline-config`) exit 0 in 93s at 15f02cad — so no narrowing claim is needed. Two heavy runs went through `scripts/pm/os-verify-lock.sh` (VERDICT command-exit 0 · held 206s for the @objectstack/lint dependency-closure build, which was required — the gate first failed on an unbuilt @objectstack/formula/dist; and VERDICT command-exit 0 · held 93s · waited 168s for pnpm lint). Authoring self-checks beyond the gates: `grep -naP` for control bytes over both .md files and the PR body — clean; closing-keyword scan over the PR body — exactly one hit, `Fixes #11134`. No ablation applies to this card (no executable behaviour changed; the CEILINGS row is enforced by the ratchet run above, which reads the real landed counts).", "open_questions": [], "out_of_scope_findings": [] }
Generated by Claude Code
ACCEPT (skills seat, session
session_01RMTpSRF5CjMmQBFfPtPCwJ, reviewer of record, fable tier per the references-face compensation) — PR #11309.Checklist conclusions, verified against GitHub: draft ✓ · base
main✓ ·Fixes #11134first line and exactly one closing-keyword hit ✓ · changed files = the two declared plus the ratchet CEILINGS row, whose surface expansion was pre-authorized conditionally in the brief and is declared in the PR body table ✓ ·skip-changeset✓ · ratchet verdicts quoted per file, both at headroom 0 with no ceiling raised ✓. The five duties all land with their physics stated in executable order; premise verification was done against the cloud receipts first-hand, and the one figure that could not be independently confirmed (the 40.8ms/leg orphaned-loop reading) was correctly stated as mechanism-without-number rather than invented — that is the honesty clause applied to the page that carries it. The landing-operations pointer riding existing byte-slack at zero line delta is the right payment under a zero-headroom ceiling (no re-wrap, no cut, no raise).Governed surface (
.claude/**): PR stays draft, human merge only; review requested fromos-zhuang(authorclaude[bot]).
Generated by Claude Code
- added a commit that references this issue
on Aug 23, 2026
Gap
pm-dispatch's landing window ends at MERGED (入队跟到 MERGED、两读). Nothing in SKILL.md or the references covers what a PM owes AFTER a production release rolls — grep for 部署后/发版后/placement across the skill returns nothing. Two days of cloud release operations (v1.24.0 → v1.28.0, epic cloud#1521) hit the same three post-release traps repeatedly, each currently living only in one operator's memory.
Evidence (all from cloud, 2026-08-21/23)
gh workflow run keep-warm) → read the CF instances API for the city → only then measure.sys_oauth_application.token_endpoint_auth_methodrows; a pre-fix deploy's reseed reverted them TWICE before the fix landed in the seed itself (cloud#1597). Rule worth stating: a DB hand-fix is a tourniquet — before applying one, name WHO replays that state and WHEN (seed, reseed, migration, boot binder), and treat the replay-layer fix as the real card. Corollary: the fixed code must ship before the next event that replays the state, or the outage re-opens.Suggested shape (for the skills seat to judge)
A short "release aftercare" section or reference page: after any prod roll — (a) placement/latency reading against the perf gate, with the waker-bias re-draw protocol; (b) one real user-path probe (the SSO outage hid for 5 weeks behind health-only monitoring); (c) the tourniquet rule for live-state hand-fixes; (d) orphaned-loop resumption = re-read reality first. Also a candidate honesty clause: when a later measurement falsifies an assertion made in a merged PR body (the cloud#1589 "SQL DEFAULT backfills existing rows" claim), the correction gets posted to the card, not just known privately.
Origin: maintainer directive 2026-08-23 「评估哪些需要更新cloud项目经理skills的,提交issue」. Details/receipts: cloud#1521 comments (release logs), cloud#1591/#1597, cloud#1586.