Skip to content

skills(pm): PM-supplied dedup reading rides the dispatch prompt; dev search-before-file goes REST - #11870

Merged
hotlong merged 1 commit into
mainfrom
claude/issue-11365-osdev-quota-shaping
Aug 25, 2026
Merged

skills(pm): PM-supplied dedup reading rides the dispatch prompt; dev search-before-file goes REST#11870
hotlong merged 1 commit into
mainfrom
claude/issue-11365-osdev-quota-shaping

Conversation

@claude

@claudeclaudeBot commented Aug 24, 2026

Copy link
Copy Markdown
Contributor

Fixes#11365

Option ② of the maintainer's 2026-08-23 quota ruling (verbatim, untranslated: 「1+2+3」) — dev usage shaping. The GraphQL pool is the scarce bucket and the dispatched dev, not PM patrol, is the fleet's biggest consumer of it: one dev measured ~5,658 GraphQL points in ~15 minutes, dominated by dedup/search reads that every dev in a batch re-runs independently.

Two shaping rules land, one per side, in the two files the claim comment declared.

PM side — .claude/skills/pm-dispatch/references/dispatch-runbook.md

The runbook already told the PM to take the gate list at the dispatch moment and hand it down (dev never enumerates the whole farm). The dedup/board reading is the same shape, so it landed as the second half of one row rather than a second row: a single judgement — a reading the PM already holds is handed down once; N devs never re-run it — then ① the gate list (unchanged content) and ② the dedup/board reading (query + timestamp, shared by the whole batch, dispatch word says "treat as given, re-verify only the increment, never re-run the scan"). The dev-side counterpart of both stays pointed at the os-dev definition, stated once instead of twice.

Dev side — .claude/agents/os-dev.md (rule 3, 立单纪律)

search-before-file and list reads now go through the REST channel — list endpoint + local grep — composed by pointer with references/rest-channel.md, whose 「语义搜索」 row already spells that fallback. The channel table is not copied; one clause names the rule, the reason (GraphQL is the fleet's tightest bucket) and the pointer. The same clause carries the dev half of the PM rule: the dedup reading arriving in the dispatch prompt is treated as given, only its increment is re-verified.

Line ratchet — both files land exactly at ceiling, paid in place

filebeforeafterceiling
.claude/agents/os-dev.md403405405 (headroom 0)
.claude/skills/pm-dispatch/references/dispatch-runbook.md242242242 (headroom 0)

No ceiling was raised, and scripts/pm/check-skill-line-ratchet.mjs is untouched. os-dev.md spends the 2 lines of headroom the ratchet header calls "the budget for ordinary rule edits". The runbook had none, so its addition was paid twice over, in place:

  • the two dispatch-time reading rows merged into one (the shared judgement is stated once, and 条款住 os-dev 定义 collapsed from two occurrences to one);
  • the 文件面两句原文 bullet reflowed from 3 lines to 2 — byte-identical text, only the line breaks move. Verified mechanically, not by eye: whitespace-normalized old lines 219–221 vs new lines 220–221 compare equal, 121 characters each side.

No edit to rest-channel.md (46/46) or platform-readings.md (130/130) — the two files the dispatch named as hard constraints. Composition with the first is by pointer only, so no ceiling arithmetic is owed for either. state-machine.md and the patrol scripts (owned by the sibling dispatch this wave) are likewise untouched — the file surface is exactly the two files above.

Gates

Derived with node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack (no path args; the script took the change set from git itself). Nine families matched; all nine run and green at the final commit 7b246a30, exit codes captured before any pipe:

gateverdict line it printed
check:agent-model-declared✓ check-agent-model-declared: 1 agent definition(s) under .claude/agents/ all declare a model
check:agent-test-spelling✓ check-agent-test-spelling: 0 violations — 357 file(s) · 1108 launcher-rooted run(s) · 8 separator(s) JUDGED
check:doc-authoring✓ doc authoring guard: 389 files clean — no bare metadata literals.
check:doc-formula-expressions✓ check:doc-formula-expressions: 22 record-scoped formula example(s) across 421 files / 1448 TS blocks judged clean by @objectstack/formula.
check:nul-bytescheck-nul-bytes: OK (scanned 6601 text file(s) … no raw ASCII control bytes).
check:pm-governed-merges✓ check-governed-merges --self-test: 129 assertions …
check:pm-skill-id-lint✓ check-skill-id-lint: 22 file(s) clean (pattern /#[0-9]{3,}/g).
check:pm-skill-ratchet✓ check-skill-line-ratchet: .claude/agents/os-dev.md is 405 lines (ceiling 405; headroom 0). and … dispatch-runbook.md is 242 lines (ceiling 242; headroom 0).
check:skill-frame-sync✓ check-skill-frame-sync: 4 copies of the decision frame are structurally isomorphic across 3 files

check:doc-formula-expressions first exited 1 twice with PREREQUISITE NOT MET (@objectstack/formula, then @objectstack/lint not built) — nothing was measured on those runs; both packages were built and the gate then judged green. Reported because a reader of the first log would otherwise see a red that says nothing about this diff.

Repo-wide pnpm lint was narrowed to the changed files, and the narrowing is measured, not assumed: (1) the population comes from eslint's own config, which supplies no configuration for .md — both changed files come back File ignored because no matching configuration was supplied; (2) --format json reports 2 files judged, 0 errors; (3) the diff contains no TS/JS and no eslint config change, so no untouched file's verdict can move. No changeset: the diff is .claude/**-only and publishes nothing — declared with the skip-changeset label.

Governed surface (.claude/**) ⇒ draft PR, human merge. Not flipped ready, auto-merge not enabled.


Generated by Claude Code

…'s own search goes REST
Dev usage shaping (option 2 of the 1+2+3 quota ruling): the GraphQL pool is the
scarce bucket, and the dispatched dev — not PM patrol — is the fleet's biggest
consumer of it.
- dispatch-runbook.md: the two dispatch-time readings are now ONE row with one
shared judgement — a reading the PM already holds is handed down once, never
re-run by N devs. The gate list was already there; the dedup/board reading is
the new half (query + timestamp, whole batch shares it, dispatch word says
"treat as given, re-verify only the increment").
- os-dev.md rule 3: search-before-file and list reads go through the REST
channel (list endpoint + local grep), composed BY POINTER with
references/rest-channel.md — stated once, no second copy of the channel table.
Both files land exactly at their line ceilings (405 / 242), paid for in place:
the runbook's two reading rows merged into one, and the file-surface bullet
reflowed from 3 lines to 2 with byte-identical text. No edit to rest-channel.md
or platform-readings.md (both at ceiling, headroom 0).
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RMTpSRF5CjMmQBFfPtPCwJ
@claudeclaudeBot added the skip-changeset PR has no user-facing published change; bypasses the changeset gate label Aug 24, 2026
@github-actionsgithub-actionsBot added size/s documentation Improvements or additions to documentation labels Aug 24, 2026
@hotlong
hotlong marked this pull request as ready for review August 25, 2026 00:35
@hotlong
hotlong added this pull request to the merge queueAug 25, 2026
Merged via the queue into main with commit 311e207Aug 25, 2026
27 checks passed
@hotlong
hotlong deleted the claude/issue-11365-osdev-quota-shaping branch August 25, 2026 00:52
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentationImprovements or additions to documentationsize/sskip-changesetPR has no user-facing published change; bypasses the changeset gate

Projects

None yet

2 participants

@hotlong@claude