You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
pm-dispatch references: fix the hotcrm lane's changeset falsehood; add liveness-ledger-first, sibling-estimate zoning, and GitHub API quota readings #11499
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):
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).
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).
{
"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": []
}
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
"292 changesets" → 291. The 292nd file in .changeset/ is README.md. The lane doc now carries the measured figure with its date.
"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.
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.
Activity
os-zhuang commentedon Aug 24, 2026
Claim: direct-dispatch (skill-experience write-back, maintainer-authorized)
Session:
session_61f28fb9-8e31-4a6f-b4d8-10f749a092d2Branch:
claude/issue-11499-references-lessonsWorktree:
objectstack-issue-11499File 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).
os-zhuang commentedon Aug 24, 2026
{ "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": [] }os-zhuang commentedon Aug 24, 2026
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
.changeset/isREADME.md. The lane doc now carries the measured figure with its date.gh pr mergeis 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 createrejected whilegh api -X POST .../pullssucceeded) 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: trueand 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
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.
os-zhuang commentedon Aug 24, 2026
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 commitbdfa29d9keeping 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 atbdfa29d9before merging.Generated by Claude Code