Repository navigation
Commit b62ca78
docs(pm-dispatch): fold the engine, services and cli lanes into domain:server (#25247)
<!-- claude-projects-attribution: {"github_login":"os-elon-musk"} -->
_Requested by **Elon** · [project
thread](https://claude.ai/code/project/chan_01WedDzV26nniwxv7jC88B9D?thread=cmsg_01WedDzV26nniwxv7jC88B9DUJcFhrG7m5mhGeMo1Bhfby)_
Fixes #24907
Clause-②: no
Metadata-protocol: none
## Summary
Implements the maintainer ruling on #24907 (comment 6341410910,
verbatim: 「**Maintainer ruling: 乙**. engine, services **and cli** fold
into `domain:server`, and `packages/qa` moves to `domain:devx`.」), on
the six-point scope the card states.
1. **SKILL.md 域车道 table** — the `domain:engine`, `domain:services` and
`domain:cli` rows become one `domain:server` row (「服务端:引擎 + 服务插件 +
CLI/运行时」) scoped to the union of the three; `packages/qa` moves to the
`domain:devx` row — and to keep that row under the width pin after the
insertion, its path spellings were shortened to the table's own
bare-prefix convention (`content/docs/**` → `content/docs`, `docs/qa/**`
→ `docs/qa`, `.githooks/` → `.githooks`, `scripts/` → `scripts`,
`.github/workflows/` → `.github/workflows`) and 「按锚定规则例外归」 → 「按锚定规则归」;
meaning unchanged, the three still route to `domain:spec`, and no script
parses the row (disclosed on the contract review's note 1); the
retired-label rule takes one bullet that reads the three old spellings
as `domain:server`. The file goes 319 → 318 lines and its widest row 342
→ 341 bytes; both ceilings are lowered, nothing is raised. (After
merging `main` with #25240, which had paid one line down without moving
the ceiling, the ceiling followed the landed count: 317/317. After
merging `main` again behind #25348 — whose pointer line spent the last
line of the 319 ceiling — the merged tree lands at 319 − 1 = 318 and the
ceiling follows it once more: 318/318, commit `535703354b`; still a
lowering from the 319 `main` carries. Widest row still 341/341.)
2. **Lane charters** — `references/lanes/{engine,services,cli}.md` →
`references/lanes/server.md`, three sections (one per former surface),
with the rule that a seat reads only the section its claim's `File
surface:` names. The three per-lane spec red lines became one lane-wide
line and the two pointers between the former lanes left, so the merged
file lands at 87 lines against the 88 the three rows summed to.
`lanes/spec.md`'s `/meta` pointer now names `domain:server`.
3. **`scripts/pm/ensure-pm-labels.sh`** — creates `domain:server`; the
three retired labels keep an alias row each so `--reconcile` writes a
`Retired 2026-10-22, alias of domain:server (… surface); in-flight cards
keep it until they land` description onto the live objects (≤100 chars
each; the header's retired-lanes rule records them as the one
transitional exception).
4. **Aliases in the readers** — `scripts/pm/check-half-states.mjs` gains
`LANE_LABEL_ALIASES` + `canonicalLane()`, and every place the sweep
compares a card's lane with a seat's goes through it: `seatLane` (a post
not yet retitled speaks for `domain:server`), `newestLaneClaim` (both
directions), the H32 lane inventory and the census (deduplicated, so a
card carrying an old and the new spelling is one lane). In-flight
claims, branches and `Seat:` lines stay valid; nothing is relabelled or
retitled here.
5. **Seat posts** — not touched; each seat-holder retitles at their next
round.
6. **No new gate.** `check-skill-line-ratchet.mjs` only follows the
merge in its ledger (ceilings, widest-row pins, the platform-readings
cross-file-move sources, where `lanes/server.md` at `was` 97 = 35 + 30 +
32 carries the two merged sources' place so the 9-line decrease they had
paid stays counted). Total ceilings down 488 lines.
**Point 4 premise, measured:** `check-skill-line-ratchet.mjs` and
`clause2-line.mjs` have no label reader (clause2-line mentions
`domain:cli` once, in a comment); the only code that compares the three
labels is `check-half-states.mjs`, so the alias lives there alone.
Fixtures naming the old labels in `check-merge-queue-triage-outcome.mjs`
and `osv-base-relative.mjs` are test data, not readers, and stay.
**Self-tests:** `check-half-states.mjs` registers a new battery
`domain:server lane aliases` (pinned at 22, 24 cases: the three aliases,
pass-through controls for a live lane / a non-lane label / a non-string,
the frozen map, the seat title in both spellings, the claim index in
both directions with OR-not-AND and `pm:queue` controls, the census with
its one-lane-not-two case) and the roster floor rises 9 → 10 with it.
Three H38 cases whose fixture lane is the retired `domain:services`
spelling now expect the merged spelling (the specimen post stays as
measured); the "lane with no dispatched cards" control moved from
`domain:engine` (now the same lane) to `domain:skills`.
**CI fix, pushed after the contract review (Elon, 2026-10-22: 「Fix CI」)
— commit `d062675`, `scripts/pm/board-snapshot.mjs` only.** The
`Snapshot the board to the archive branch` check was red on this PR, and
on every scheduled run since 2026-10-21 (#24351), with a count-check
SHORTFALL of the whole board. Measured 2026-10-22: GitHub's issues
listing answers `200 []` to more than half of the requests made to it
(39 of 68 probes; each with its own request id and counted against the
rate limit, so not a cache; cache directives, a cache-busting query,
sort, direction, page size, state and since make no difference; objectui
and hotcrm blank the same way), while `/repos/{repo}`, the pulls listing
and the per-number comment pages never did. The tool read a blank first
page as the short page and declared the open set complete at zero
records.
The fix: a blank listing page is asked again (same URL and page size, up
to `BLANK_PAGE_ASKS` = 6 budgeted asks, no sleep); a blank that survives
the bound is believed past an anchor (the cursor does not advance, so
the next run re-reads from it) and, from the beginning, only when the
board's own `open_issues_count` — read once as the witness — is zero.
Otherwise the walk stops with its cursor (`stopped_by: blank-listing`),
nothing is marked complete, the count check stays `pending` and the run
exits 0 as a planned stop. Once the open set is complete, a streak of
such runs is what the freshness row turns red; an archive still in its
open phase reads `building` and never ages (pre-existing semantics) —
that is the PR leg's fresh dry-run archive, not `main`'s, whose
`board-archive` manifest has been in the incremental phase since
2026-09-10 (open set and history complete; its latest scheduled run
reached a verdict). The manifest counts the re-asks
(`run.blank_pages_reasked`), the summary prints the count and the stop,
a new header section records the measurement, and a new self-test
battery drives the measured failure healed, the bounded stop and the
anchored blank (13 cases, floor 12 → 13, 169 cases). The PR leg's own
arguments (`--dry-run --limit=5 --max-requests=25`) ran six times
against the live board: six exits 0 — one a blank-listing stop, two
after re-asks. This supersedes the standing-down comment on this PR
(6344588150), which read the failure as `main`'s own: the cause is
upstream, the handling of it is this PR's. The workflow is untouched
(Tier H).
## 维护者速读(草稿)
### 改了什么
- 车道表三行(engine / services / cli)合为一行
`domain:server`,范围是三者的并集;`packages/qa` 挪到 devx 行(为守住最宽行
pin,该行路径拼写改为表内惯用的裸前缀,如
`content/docs/**`→`content/docs`,「例外归」→「归」,语义不变);加一条「三旧标签读作
`domain:server`」。SKILL.md 319→318 行(合入 main 上 #25240 后随落地行数降到 317;再合入
#25348 后主干 SKILL.md 为 319,本分支净 −1 落在 318,ceiling 跟着对到 318——相对主干的 319
仍是降),最宽行 342→341,只降不升。
- 三份车道岗位说明合并为 `references/lanes/server.md`(87 行,三节按文件面分读);spec.md 里
`/meta` 的指向改为 `domain:server`。
- `ensure-pm-labels.sh` 建 `domain:server`;三旧标签改「retired, alias of
domain:server」描述,对象保留。
- `check-half-states.mjs` 加别名表:席位贴标题、认领索引、H32 库存、普查都把三旧标签读作
`domain:server`;自检新增一个电池,地板 9→10。
- 棘轮台账跟着改(ceilings、最宽行 pin、跨文件搬迁来源),ceilings 总量再降 488 行。
- 审查后追加(Elon「Fix CI」,提交 `d062675`):`scripts/pm/board-snapshot.mjs`
的空页规则。GitHub 的 issues 列表接口自 10-21 起间歇回 `200 []`(68 次探针 39 次空,请求 id
各异、计入配额,不是缓存;objectui、hotcrm 同样),工具把空页当「走完」、开放集记 0 条、count check 误报
SHORTFALL。现在同一页最多再问 6 次;从头开始仍空、而 `/repos` 见证板上有开放项,就带游标停下(退出 0,count
check 保持 pending);带 since 或偏移页问满才信(游标不前进,下轮重读)。manifest 记
`run.blank_pages_reasked`,表头新增一节记录测量,自检新电池 13 例。工作流未动。
### 为什么改
裁决乙(#24907 评论 6341410910)原话:「engine, services **and cli** fold into
`domain:server`, and `packages/qa` moves to
`domain:devx`」。三条车道共用一批席位账户,分三贴意味着同一个人读三份岗位说明、认领走三个标签;合并后一席一贴一说明。
### 风险与代价(含回滚)
- 过渡期四种拼写并存:在途卡保留旧标签、席位贴由各席自行改标题、开着的卡由分诊事后批量改签。别名表让巡逻不会把它们当四条车道报假警;⛔
它不替任何人改签。
- 合并说明把三条 spec 红线合成一条、去掉两条车道间互指,规则本身没有删;读者只读自己那一节。
- 回滚:整 PR revert 即可——标签对象没有删,三旧标签的描述由下一次 `ensure-pm-labels.sh
--reconcile` 恢复;别名表、新电池、地板一起退回。
- 没有新门禁;棘轮只降不升,不需要维护者裁决。
- 空页规则的代价:每个空页最多多花 6 个请求(主干每轮 800 预算内);停下即下一轮重读,不标记完成。若 GitHub
持续回空,主干轮次以 pending 退出 0,由 freshness
行在超窗后转红——这是设计内的告警路径,不是静默(计龄的前提是开放集已完整:主干归档自 9-10 起处于 incremental
阶段,满足;只有开放集未完成的新归档——即 PR 腿的干跑——读 building 不计龄,属既有语义)。
### 席位意见
(留空)
### 你要做的
- 读 `.claude/**` 的 diff(Tier S):车道表那一行、`lanes/server.md`
的三节标题与共用红线、别名条目。
- 也读 `scripts/pm/board-snapshot.mjs` 的 diff(受治理的
`scripts/pm/**`):表头新节、`blankPageStep`、walk 内的再问/停下、新电池;席位需对新头重做契约复核。
- 过契约复核后由席位落地;落地后分诊把开着的 engine/services/cli 卡批量改签为
`domain:server`,各席在下一轮改席位贴标题,再在仓库跑一次 `scripts/pm/ensure-pm-labels.sh
--reconcile` 把三旧标签的描述写上去。
## Acceptance notes
- `pnpm check:pm-skill-ratchet` — green; SKILL.md 318/318 (ceiling
lowered 319 → 318 by this card, 318 → 317 after merging `main` with
#25240, then 317 → 318 after merging `main` behind #25348, whose pointer
line landed at the 319 ceiling — every step the landed count, never
above `main`'s 319), widest row 341/341 (pin lowered 342 → 341),
`lanes/server.md` 87/87 (new row at its landed count), both cross-file
moves still paid down, total ceilings down 488.
- `pnpm check:pm-half-states` — 4941 cases pass; battery `domain:server
lane aliases` 24/22, roster 10/10.
- `pnpm check:pm-label-desc-cap` — green; the three alias descriptions
are 100 / 99 / 97 characters.
- `pnpm check:pm-skill-id-lint` — green.
- `pnpm check:pm-board-snapshot` — 169 cases pass across 13 batteries;
battery `the blank page: asked again, then believed or stopped by where
the walk is` 13/13, floor 13/13. Live, with the PR leg's arguments: six
runs, six exits 0.
- `node scripts/pm/dispatch-gates.mjs --commands --repo
objectstack-ai/objectstack` derives 54 commands from the nine changed
paths, identical before and after merging `main`, and 55 once
`scripts/pm/board-snapshot.mjs` joins the set (it adds `pnpm
check:pm-board-snapshot`). Run four times, every command byte-for-byte
with its exit code captured before any pipe and reconciled with `--ran`:
on the pre-merge tree (`e208c89`/`56b333e`), on the merged head
`c5c1735` (both **54 derived, 54 run, 0 NOT-MEASURED, 0 UNRUN**), on the
CI-fix head `d062675` (**55 derived, 55 run, 0 NOT-MEASURED, 0 UNRUN**)
and on the head merged behind #25348, `535703354b` (**55 derived, 55
run, 0 NOT-MEASURED, 0 UNRUN**), every exit 0. In the first run `pnpm
--filter @objectstack/lint run check:doc-formula-expressions` first
exited 3 (prerequisite: `@objectstack/formula` and `@objectstack/lint`
not built) and exited 0 after `pnpm exec turbo run build
--filter=@objectstack/formula --filter=@objectstack/lint`; the rerun
passed it outright. The 43 artifact-roster, 11 wide-population and 16
pending-changeset families, the path-scheduled CI job and the type-check
lanes are CI's to run on this PR, not claimed here. `Snapshot the board
to the archive branch` was red on this PR and on `main`'s own code
(count check exit 2, tracked on #24351); commit `d062675` handles the
upstream blank listing it was tripping on — see the CI-fix paragraph in
the summary; the standing-down comment on this PR is superseded.
- Changeset: none — `.claude/**` and `scripts/pm/**` publish nothing
(`skip-changeset`, declared at creation).
- Governed surface: `.claude/skills/pm-dispatch/**` is Tier S and
`scripts/pm/board-snapshot.mjs` is governed `scripts/pm/**`; AGENTS.md,
CLAUDE.md, NORTH-STAR, `skills/**`, workflows
(`.github/workflows/board-snapshot.yml` included) and CODEOWNERS are
untouched. The SKILL.md claim-template block (#25115), the 〈升级与决策〉 ruler
line and the 红线 delegated-channel line (#25216) and `lanes/director.md`
are untouched.
- Out of scope, left as-is: product-package comments, `docs/qa/**`
notes, audits, ADRs and CHANGELOG entries that name the three old lanes
are history, not readers.
---
_Generated by [Claude
Code](https://claude.ai/code/session_01VCLHrrmPbwQHZcc2yqdFHD)_
---------
Co-authored-by: os-elon-musk <elon@objectstack.ai>
Co-authored-by: Claude <noreply@anthropic.com>1 parent 25f88e8 commit b62ca78
10 files changed
Lines changed: 418 additions & 142 deletions
File tree
- .claude/skills/pm-dispatch
- references/lanes
- scripts/pm
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
158 | 158 | | |
159 | 159 | | |
160 | 160 | | |
161 | | - | |
162 | | - | |
163 | | - | |
| 161 | + | |
| 162 | + | |
164 | 163 | | |
165 | 164 | | |
166 | | - | |
167 | 165 | | |
168 | 166 | | |
169 | 167 | | |
170 | 168 | | |
| 169 | + | |
171 | 170 | | |
172 | 171 | | |
173 | 172 | | |
| |||
This file was deleted.
This file was deleted.
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 1 | + | |
| 2 | + | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
| 14 | + | |
| 15 | + | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
| 19 | + | |
| 20 | + | |
| 21 | + | |
| 22 | + | |
| 23 | + | |
| 24 | + | |
| 25 | + | |
| 26 | + | |
| 27 | + | |
| 28 | + | |
| 29 | + | |
| 30 | + | |
| 31 | + | |
| 32 | + | |
| 33 | + | |
| 34 | + | |
| 35 | + | |
| 36 | + | |
| 37 | + | |
| 38 | + | |
| 39 | + | |
| 40 | + | |
| 41 | + | |
| 42 | + | |
| 43 | + | |
| 44 | + | |
| 45 | + | |
| 46 | + | |
| 47 | + | |
| 48 | + | |
| 49 | + | |
| 50 | + | |
| 51 | + | |
| 52 | + | |
| 53 | + | |
| 54 | + | |
| 55 | + | |
| 56 | + | |
| 57 | + | |
| 58 | + | |
| 59 | + | |
| 60 | + | |
| 61 | + | |
| 62 | + | |
| 63 | + | |
| 64 | + | |
| 65 | + | |
| 66 | + | |
| 67 | + | |
| 68 | + | |
| 69 | + | |
| 70 | + | |
| 71 | + | |
| 72 | + | |
| 73 | + | |
| 74 | + | |
| 75 | + | |
| 76 | + | |
| 77 | + | |
| 78 | + | |
| 79 | + | |
| 80 | + | |
| 81 | + | |
| 82 | + | |
| 83 | + | |
| 84 | + | |
| 85 | + | |
| 86 | + | |
| 87 | + | |
This file was deleted.
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
21 | 21 | | |
22 | 22 | | |
23 | 23 | | |
24 | | - | |
| 24 | + | |
25 | 25 | | |
26 | 26 | | |
27 | 27 | | |
| |||
0 commit comments