Skip to content

pm-dispatch references: fix the hotcrm lane's changeset falsehood; add liveness-ledger-first, sibling-estimate zoning, and GitHub API quota readings #11499

Closed

Description

@os-zhuang

pm-dispatch references: four measured lessons from two days of seat operation — one factual error and three missing readings

Authorization

Maintainer, verbatim (未译, in-session 2026-08-24): 「经验是不是应该写入项目 skills」 → 「写入」. references/** face only (opus build, fable-tier review per the standing compensation rule). The SKILL.md main-file lesson is the sibling card #11498 — do not touch SKILL.md here.

1. references/lanes/hotcrm.md states a falsehood: "该仓无 changeset 流"

hotcrm has .changeset/, a changeset-check.yml that gates every PR (with a skip-changeset label escape), and a changeset version-driven release flow that consumed 292 pending changesets into a 3.0.0 release on 2026-08-23. A dispatch that inherits the lane doc's sentence produces a dev whose PR is red on arrival. The seat corrected it by hand in every dispatch for two days; fix the source. While in the file: hotcrm consumes published @objectstack/* packages, not a git pin — worth one sentence, since it is the fact that triggers the sibling card's unlock rule.

2. references/dispatch-runbook.md: liveness-ledger-first (new clause)

Lesson, self-contained (no issue ids, 中文 house style, adapt wording):

凡派发前提含「spec 有这个槽位」,派发前先读安装包内的 liveness 账本(node_modules/@objectstack/spec/liveness/<域>.json 对应行)。status: 'planned' = 有 carrier、零消费者,authorHint 就是证词。失效模式:不读账本的派发让 dev 写出解析通过、校验通过、加载成功、渲染为零的元数据——绿收据假修复,比诚实的缺陷更贵。一次文件读的成本对一次整 agent 运行。

3. references/dispatch-runbook.md: sibling estimates live in zone 2 (new clause)

兄弟 dev 报告里的成本/形状估计进派发词必须落「机制假设」区并要求复测,⛔ 不得穿裁决的衣服转述。实测教训:一句被当作事实转述的「两行改动」,字面照做会把一个双字面量的方向循环改成 desc → desc → null —— 度量列永远无法升序,且「首点是降序」的天真测试还照绿。估计的作者没错——错在把它当事实搬运的派发词。

4. references/platform-readings.md: GitHub API quota facts (new entries for the facts table)

Measured 2026-08-23/24, worth table entries in the file's own format:

  • gh GraphQL quota (5000/hr) is a shared pool across every parallel subagent on the host — a batch of devs exhausts it and the PM's merge verbs starve.
  • Verbs by transport: pr ready, pr merge, issue transfer are GraphQL; claims (assignee), labels, comments, issue create/patch, check-runs reads are REST (gh api). A quota-dead hour still allows the full claim/label/review cycle; only merge-family verbs need a until remaining>threshold watcher.
  • issue transfer unavailable (quota or permission) ⇒ the rebuild-at-destination fallback already documented for cross-repo moves is quota-immune (REST only).

Process

Draft PR only; governed face ⇒ maintainer merges manually. Keep each lesson self-contained with failure mode + boundary; no issue numbers in the shipped text (dates + verbatim rulings allowed).

Activity

  1. self-assigned this
    on Aug 24, 2026
  2. os-zhuang commented on Aug 24, 2026

    @os-zhuang
    ContributorAuthor

    Claim: direct-dispatch (skill-experience write-back, maintainer-authorized)
    Session: session_61f28fb9-8e31-4a6f-b4d8-10f749a092d2
    Branch: claude/issue-11499-references-lessons
    Worktree: objectstack-issue-11499
    File surface: .claude/skills/pm-dispatch/references/{lanes/hotcrm.md,dispatch-runbook.md,platform-readings.md} ONLY (stop on breach; explain in the report)
    Container & model: M, mode:subagent, model: opus — references/** face — opus build, fable-tier review as compensation (standing rule)
    Clause-②: no — internal skill/agent tooling; no contract accept/reject change.
    Serial constraints cleared: sibling card #11498 edits SKILL.md only — disjoint files, parallel by construction. No open PR touches .claude/skills/pm-dispatch/ (REST pulls listing checked at claim time).

    Authorization — maintainer, verbatim (未译): 「经验是不是应该写入项目 skills」 → 「写入」 (in-session, 2026-08-24). Per the PM-writes exception this PR carries the authorization in its body and is reviewed by a second tier, ⛔ 不得自审自合 — the maintainer merges manually (governed face).

  3. os-zhuang commented on Aug 24, 2026

    @os-zhuang
    ContributorAuthor
    {
      "issue": 11499,
      "status": "done",
      "branch": "claude/issue-11499-references-lessons",
      "pr": "https://github.com/objectstack-ai/objectstack/pull/11523",
      "premise_still_valid": true,
      "summary": "All four lessons landed on the three declared files; SKILL.md untouched. (1) The hotcrm lane's changeset sentence was verified false against the repo and corrected: changeset-check.yml gates every PR to main/develop on a changeset THIS PR adds (diff against base, so the never-empty directory cannot go red on a count), with two sanctioned escapes -- the skip-changeset label or an empty-frontmatter changeset -- and the criterion is NOT publish status, since hotcrm is private:true and still gated. The 'no release board' half was checked and is still TRUE (the label manifest declares no target:* family), so only the false half moved. Card's figure corrected: the 3.0.0 release of 2026-08-23 consumed 291 changesets, not 292 -- the 292nd file in .changeset/ is README.md. Added the published-package premise (all eleven runtime deps pinned to exact published versions, not a git pin), so a cross-repo card's unlock condition is 'published', not 'merged'. (2)+(3) Two zone-discipline clauses sit adjacent in the runbook's dispatch-construction section, right after the three-zone clause. (4) Three entries in the readings table, split by evidence class: the gh transport split is MEASURED here, while the REST-surface claims are marked as checked against the docs and not called. The card's claim that gh pr merge is simply GraphQL-only did NOT survive that check -- the merge itself has a REST route (PUT /repos/o/r/pulls/n/merge); what has no REST equivalent is the draft flip, the issue transfer and auto-merge arming, which is what makes a merge-queue repo the one with no fallback in a red window. The pool-sharing half of lesson 4 was deliberately NOT added: the table already carries a measured entry on quota accounting, and restating it would have created a second, weaker opinion beside it. Constraint that shaped the whole delivery: check:pm-skill-ratchet holds all three files at 242/134/45 lines with headroom 0, and raising a ceiling needs its own maintainer ruling, so every added line is paid for in place by lossless re-wrapping. Ceilings untouched, and the ratchet script was not edited (outside the declared file surface).",
      "tests": "Gate family derived, not recalled: node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack (3 paths, 6 families). Union re-run AFTER the final commit, at c3d115d7a, exit codes captured before any pipe -- all six EXIT=0. Verdict lines: 'check-nul-bytes: OK (scanned 6455 text file(s) ... no raw ASCII control bytes).'; 'doc authoring guard: 389 files clean -- no bare metadata literals.'; 'check-skill-frame-sync: 4 copies of the decision frame are structurally isomorphic across 3 files'; 'check-skill-line-ratchet: dispatch-runbook.md is 242 lines (ceiling 242; headroom 0)', 'platform-readings.md is 134 lines (ceiling 134; headroom 0)', 'lanes/hotcrm.md is 45 lines (ceiling 45; headroom 0)'; 'check-skill-id-lint: 21 file(s) clean'; 'check-governed-merges --self-test: 129 assertions'. ONE derived gate narrowed and declared, not silently skipped: check:doc-formula-expressions needs a full workspace install plus a built objectstack formula package, and its population in this diff is empty by construction -- it reads TS/TSX fenced blocks only (its own docblock) and all three files contain zero fenced blocks (measured: grep -c of a fence opener = 0,0,0); the diff touches neither the gate nor the formula package, so no untouched file's verdict can move. CI runs it regardless. Re-wrap losslessness PROVED mechanically rather than asserted: stripping all whitespace and taking the longest common prefix/suffix, the entire delta is -- dispatch-runbook.md removed NOTHING, added the two clauses; platform-readings.md removed NOTHING, added the entries; lanes/hotcrm.md removed exactly the false sentence. hotcrm facts read from the repo itself (changeset-check.yml, labels.yml, the release commit's deleted-file count, package.json dependency pins). CI at report time: 21 check runs completed success/skipped, 4 in_progress, zero failures -- reported honestly, not waited on.",
      "open_questions": [
        {
          "question": "All three edited files are back at ratchet ceiling with headroom 0, and this round consumed the last of the cheap in-place re-wrap slack in the runbook's final section. The next experience write-back to this surface cannot be paid for the same way. Which lever should the next card use?",
          "options": [
            "A. Keep paying in place, widening the re-wrap to more sections of dispatch-runbook.md (buys roughly 3 lines per 40 re-wrapped, and the diff grows noisier each time)",
            "B. Compress by editing -- retire clauses whose provenance has expired, which is what the ratchet header prescribes, but that is a content decision no dev should take alone",
            "C. Raise the ceiling with a maintainer ruling quoted in the raising PR (the header's own escape hatch) -- needs scripts/pm/check-skill-line-ratchet.mjs inside the dispatch's file surface, which this card deliberately excluded"
          ],
          "recommendation": "B for the next card, scoped as its own review pass rather than as a rider on a lesson card: the ratchet exists to force exactly that pass. C is legitimate but should be the maintainer's explicit choice, and the dispatch must then put the ratchet script in the declared file surface, since a raise cannot be applied from outside it."
        }
      ],
      "out_of_scope_findings": []
    }
  4. os-zhuang commented on Aug 24, 2026

    @os-zhuang
    ContributorAuthor

    PM review (fable tier) — ACCEPT. PR #11523, draft, awaiting the maintainer's manual merge alongside #11515.

    Reviewed against the diff; two of my own card's details were falsified by the dev's verification, and the enshrined text is correct where my card was not.

    My card was wrong twice, and the file ships the truth

    1. "292 changesets" → 291. The 292nd file in .changeset/ is README.md. The lane doc now carries the measured figure with its date.
    2. "gh pr merge is GraphQL" → falsified against the docs. The merge itself has a REST route (PUT /repos/{o}/{r}/pulls/{n}/merge). What has no REST equivalent is the draft flip, issue transfer, and auto-merge arming — which yields the sharper, correct operational fact: a merge-queue repo has no fallback in a red window; a direct-merge repo does. My version would have taught seats to wait for reset on an action that never needed it.

    The readings entries are split by evidence class — same-minute measurements (GraphQL remaining 0 / REST core 4987, gh pr create rejected while gh api -X POST .../pulls succeeded) versus docs-checked-not-called — and say which is which. That distinction is what keeps a facts table from decaying into folklore.

    Only the false half of the lane sentence moved

    「无 changeset 流」corrected with the mechanism (gate diffs this PR's added changesets against base, so the never-empty directory can't false-positive; two sanctioned escapes; ⛔ criterion is not publish status — the repo is private: true and gated regardless). 「无发版板」 verified still true against the label manifest and kept. The published-package premise (eleven exact-version runtime deps, no git pin) is now one sentence in the lane doc — the fact that arms #11515's unlock clause.

    Discipline notes

    • The pool-sharing half of my lesson 4 was deliberately not added — the table already carries a measured quota-accounting entry, and a second, weaker restatement beside it is exactly the drift this file exists to prevent. Correct refusal.
    • All three files sit at ratchet ceiling (242/134/45, headroom 0); re-wrap losslessness was proved mechanically (whitespace-stripped longest-common-prefix/suffix shows the delta is exactly the additions plus exactly the one false sentence) rather than asserted.
    • Gate family derived via dispatch-gates.mjs, six families re-run green at the final commit; the one narrowed gate (doc-formula) narrowed with a measured empty population (0 fenced blocks in all three files), not skipped silently.

    The open question, forwarded to the maintainer with my endorsement

    The cheap re-wrap slack on this surface is now exhausted. The dev's recommendation is B — a dedicated retirement pass (retire clauses whose provenance has expired), scoped as its own card rather than a rider: the ratchet exists precisely to force that pass, and it is a content decision no dev should take alone. C (ceiling raise) remains the header's escape hatch but requires the maintainer's explicit ruling quoted in the raising PR, with the ratchet script inside that dispatch's file surface. Endorsed: B when the next lesson arrives, not before.

  5. os-zhuang commented on Aug 24, 2026

    @os-zhuang
    ContributorAuthor

    Landed — PR #11523 merged (squash, b040ed34) by the skills seat under the maintainer's live authorization (2026-08-24, verbatim: 「这几张你都帮我审核并合并吧」; content reviewed by the maintainer: 「11523 我看过了,你解决一下冲突」). The conflict against main was #11393's per-lane patrol-anchor deletion racing this branch's hotcrm.md rewrite; resolved at merge commit bdfa29d9 keeping both intents (this PR's changeset-flow correction + published-package unlock bullet, main's anchor-sentence deletion — the sentence lives once in SKILL.md:327). Line ratchets re-verified green at the resolved tree (hotcrm 44/44, dispatch-runbook 242/242, platform-readings 133/133); CI 23/23 green at bdfa29d9 before merging.


    Generated by Claude Code

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

Metadata

Metadata

Assignees

Labels

No labels
No labels

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions