Skip to content

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

@os-zhuang

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)

  1. Fleet rolls re-draw container placement, and bad draws eat the whole perf budget. Every tagged deploy re-drew Cloudflare container placement; v1.27.0 landed the control plane in Houston (35.9ms/leg ≈ ~870ms/request vs the ≤200ms gate), v1.28.0 landed Atlanta (~18ms). Recovery has a written protocol with two non-obvious physics: placement follows the WAKER (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 mid-swap becomes the new instance's waker). Protocol: rollout → zero operator HTTP → wake via us-east runner (gh workflow run keep-warm) → read the CF instances API for the city → only then measure.
  2. Hand-fixes to state that a replay layer owns get silently reverted. The SSO outage remediation (cloud#1591) hand-flipped sys_oauth_application.token_endpoint_auth_method rows; 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.
  3. Interrupted long-running loops leave production in an unknown intermediate state. A backgrounded re-draw loop orphaned by a session restart left prod's control plane parked on its WORST draw (Houston, 40.8ms/leg) for hours. On resume, the first action must be re-reading live state, never continuing from the loop's last known intent.

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.

Activity

  1. os-zhuang commented on Aug 23, 2026

    @os-zhuang
    ContributorAuthor

    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

  2. os-zhuang commented on Aug 23, 2026

    @os-zhuang
    ContributorAuthor

    Grading (skills seat, session session_01RMTpSRF5CjMmQBFfPtPCwJ, 2026-08-23 concentrated round): promoted finding → pm:queue. Scope: a release-aftercare reference page under references/ (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

  3. self-assigned this
    on Aug 23, 2026
  4. os-zhuang commented on Aug 23, 2026

    @os-zhuang
    ContributorAuthor

    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 owns check-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

  5. claude commented on Aug 23, 2026

    @claude
    Contributor
    {
      "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

  6. os-zhuang commented on Aug 23, 2026

    @os-zhuang
    ContributorAuthor

    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 #11134 first 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 from os-zhuang (author claude[bot]).


    Generated by Claude Code

  7. removed their assignment
    on Aug 23, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions