Repository navigation
docs(pm-dispatch): fold the engine, services and cli lanes into domain:server - #25247
objectstack-fleet[bot] wants to merge 5 commits into
Conversation
…n:server Maintainer ruling 乙 on card #24907 (comment 6341410910, verbatim: 「Maintainer ruling: 乙. engine, services and cli fold into `domain:server`, and `packages/qa` moves to `domain:devx`.」). - SKILL.md 域车道 table: the three rows become one `domain:server` row scoped to their union; `packages/qa` moves to the devx row; the retired-label rule takes one bullet reading the three old spellings as `domain:server`. 319 -> 318 lines, widest row 342 -> 341 bytes, both ceilings lowered. - references/lanes/{engine,services,cli}.md -> references/lanes/server.md, three sections (one per former surface); a seat reads only the section its claim's file surface names. The three per-lane spec red lines fold into one and the two intra-lane pointers leave: 88 summed -> 87. lanes/spec.md's `/meta` pointer now names `domain:server`. - check-skill-line-ratchet.mjs: ceilings, widest-row pins and the platform-readings cross-file-move sources follow the merge (`lanes/server.md` enters at `was` 97 = 35 + 30 + 32, so the decrease the two merged sources had paid stays counted). Ceilings down 488. - check-half-states.mjs: LANE_LABEL_ALIASES + canonicalLane; seatLane, newestLaneClaim, the H32 inventory and the census compare lanes through it, so in-flight claims, branches and `Seat:` lines stay valid. New self-test battery `domain:server lane aliases` (24 cases, pinned 22); roster floor 9 -> 10. - ensure-pm-labels.sh: creates `domain:server`; the three retired labels keep alias rows carrying a "Retired 2026-10-22, alias of domain:server" description for --reconcile. check-skill-line-ratchet.mjs and clause2-line.mjs have no label reader, so the alias lives in check-half-states.mjs alone. Seat posts are retitled by their holders and open cards relabelled by triage after landing. No new gate. Claude-Session: https://claude.ai/code/session_01VCLHrrmPbwQHZcc2yqdFHD Co-authored-by: Claude <noreply@anthropic.com>
…as strings The self-test harness judges `actual === expected`, so the cases of the new `domain:server lane aliases` battery that read an array or a pair now join them to one string before the comparison. Three H38 cases whose fixture lane is the retired `domain:services` spelling expect the merged spelling the readers now return, and the "lane with no dispatched cards" control moves from `domain:engine` (the same lane since the merge) to `domain:skills`. 4941 cases pass; nothing outside the self-test changes. Claude-Session: https://claude.ai/code/session_01VCLHrrmPbwQHZcc2yqdFHD Co-authored-by: Claude <noreply@anthropic.com>
Merging `main` brought #25240 (the claim template's `Metadata-protocol:` line), which landed one line under SKILL.md's ceiling and left the ceiling alone. With this card's row already in the ledger, the ceiling takes the landed count: 318 -> 317, headroom 0. Nothing else changes. Claude-Session: https://claude.ai/code/session_01VCLHrrmPbwQHZcc2yqdFHD Co-authored-by: Claude <noreply@anthropic.com>
|
CI:
Also seen: |
Contract reviewServed-tier: Inputs: card #24907 body and all four comments (binding ruling 6341410910, letter 乙; dev report 6344765480), PR #25247 body, file list (9 paths) and the net diff ① Derived judgments
② Semver levelNo changeset, ③ Boundary flags
Implemented-by: VERDICT: PASS |
The Board Snapshot check went red on this PR (and on every scheduled run since 2026-10-21, #24351) with a count-check SHORTFALL of the whole board: the open walk's first listing page answered `200 []`, the tool read it as the short page, declared the open set complete at zero records, and compared zero with the board's own count. Measured 2026-10-22: the issues listing answers blank to more than half of the requests made to it (39 of 68 probes), each with its own request id and its own count against the rate limit, so no cache is involved; cache directives, a cache-busting query, sort, direction, page size, state and since make no difference, and objectui and hotcrm answer the same way. `/repos/{repo}`, the pulls listing and the per-number comment pages never blanked. So a blank listing page is asked again, same URL and page size, up to `BLANK_PAGE_ASKS` (6) times, each ask a budgeted request and never a sleep. A blank that survives the bound is acted on by where the walk is (`blankPageStep`): past an anchor it is believed, because the cursor does not advance and the next run re-reads from it; from the beginning it is believed only if 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, which the freshness row turns red if it becomes a streak. The manifest counts the re-asks in `run.blank_pages_reasked`; the summary prints the count and the stop. A new header section records the measurement. Self-test: a new battery of 13 cases (the pure verdicts, the measured failure healed on a fake board that blanks once, the bounded stop, the anchored blank believed with its cursor unmoved), 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 of them a blank-listing stop and two after re-asks. Claude-Session: https://claude.ai/code/session_01VCLHrrmPbwQHZcc2yqdFHD Co-authored-by: Claude <noreply@anthropic.com>
Contract reviewServed-tier: Inputs: card #24907 body and all four comments (ruling 6341410910; dev report 6344765480); card #24351 body and its three comments; PR #25247 body as rewritten (the CI-fix paragraph), its file list (10 paths), the net diff ① Derived judgments
② Semver levelNo changeset, ③ Boundary flags
Implemented-by: VERDICT: PASS |
Requested by Elon · project thread
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, andpackages/qamoves todomain:devx.」), on the six-point scope the card states.domain:engine,domain:servicesanddomain:clirows become onedomain:serverrow (「服务端:引擎 + 服务插件 + CLI/运行时」) scoped to the union of the three;packages/qamoves to thedomain:devxrow — 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 todomain: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 asdomain:server. The file goes 319 → 318 lines and its widest row 342 → 341 bytes; both ceilings are lowered, nothing is raised. (After mergingmainwith docs(pm-dispatch, os-dev): the claim template and the dev definition carry theMetadata-protocol:line besideClause-②:#25240, which had paid one line down without moving the ceiling, the ceiling follows the landed count: 317/317.)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'sFile 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/metapointer now namesdomain:server.scripts/pm/ensure-pm-labels.sh— createsdomain:server; the three retired labels keep an alias row each so--reconcilewrites aRetired 2026-10-22, alias of domain:server (… surface); in-flight cards keep it until they landdescription onto the live objects (≤100 chars each; the header's retired-lanes rule records them as the one transitional exception).scripts/pm/check-half-states.mjsgainsLANE_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 fordomain: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 andSeat:lines stay valid; nothing is relabelled or retitled here.check-skill-line-ratchet.mjsonly follows the merge in its ledger (ceilings, widest-row pins, the platform-readings cross-file-move sources, wherelanes/server.mdatwas97 = 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.mjsandclause2-line.mjshave no label reader (clause2-line mentionsdomain:clionce, in a comment); the only code that compares the three labels ischeck-half-states.mjs, so the alias lives there alone. Fixtures naming the old labels incheck-merge-queue-triage-outcome.mjsandosv-base-relative.mjsare test data, not readers, and stay.Self-tests:
check-half-states.mjsregisters a new batterydomain: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 andpm:queuecontrols, 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 retireddomain:servicesspelling now expect the merged spelling (the specimen post stays as measured); the "lane with no dispatched cards" control moved fromdomain:engine(now the same lane) todomain:skills.CI fix, pushed after the contract review (Elon, 2026-10-22: 「Fix CI」) — commit
d062675,scripts/pm/board-snapshot.mjsonly. TheSnapshot the board to the archive branchcheck 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 answers200 []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 ownopen_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 stayspendingand the run exits 0 as a planned stop, which the freshness row turns red if it becomes a streak. 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 asmain's own: the cause is upstream, the handling of it is this PR's. The workflow is untouched (Tier H).维护者速读(草稿)
改了什么
domain:server,范围是三者的并集;packages/qa挪到 devx 行(为守住最宽行 pin,该行路径拼写改为表内惯用的裸前缀,如content/docs/**→content/docs,「例外归」→「归」,语义不变);加一条「三旧标签读作domain:server」。SKILL.md 319→318 行(合入 main 上 docs(pm-dispatch, os-dev): the claim template and the dev definition carry theMetadata-protocol:line besideClause-②:#25240 后随落地行数再降到 317),最宽行 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。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, andpackages/qamoves todomain:devx」。三条车道共用一批席位账户,分三贴意味着同一个人读三份岗位说明、认领走三个标签;合并后一席一贴一说明。风险与代价(含回滚)
ensure-pm-labels.sh --reconcile恢复;别名表、新电池、地板一起退回。席位意见
(留空)
你要做的
.claude/**的 diff(Tier S):车道表那一行、lanes/server.md的三节标题与共用红线、别名条目。scripts/pm/board-snapshot.mjs的 diff(受治理的scripts/pm/**):表头新节、blankPageStep、walk 内的再问/停下、新电池;席位需对新头重做契约复核。domain:server,各席在下一轮改席位贴标题,再在仓库跑一次scripts/pm/ensure-pm-labels.sh --reconcile把三旧标签的描述写上去。Acceptance notes
pnpm check:pm-skill-ratchet— green; SKILL.md 317/317 (ceiling lowered 319 → 318 by this card, then 318 → 317 after mergingmainwith docs(pm-dispatch, os-dev): the claim template and the dev definition carry theMetadata-protocol:line besideClause-②:#25240), widest row 341/341 (pin lowered 342 → 341),lanes/server.md87/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; batterydomain:server lane aliases24/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; batterythe blank page: asked again, then believed or stopped by where the walk is13/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/objectstackderives 54 commands from the nine changed paths, identical before and after mergingmain, and 55 oncescripts/pm/board-snapshot.mjsjoins the set (it addspnpm check:pm-board-snapshot). Run three 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 headc5c1735(both 54 derived, 54 run, 0 NOT-MEASURED, 0 UNRUN) and on the CI-fix headd062675(55 derived, 55 run, 0 NOT-MEASURED, 0 UNRUN), every exit 0. In the first runpnpm --filter @objectstack/lint run check:doc-formula-expressionsfirst exited 3 (prerequisite:@objectstack/formulaand@objectstack/lintnot built) and exited 0 afterpnpm 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 branchwas red on this PR and onmain's own code (count check exit 2, tracked on tooling(board-snapshot): the scheduled Board Snapshot failed its count check twice running (exit 2 at 08:25Z and 14:18Z on 2026-10-18): the archive and the live board disagree on the open-issue count #24351); commitd062675handles 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..claude/**andscripts/pm/**publish nothing (skip-changeset, declared at creation)..claude/skills/pm-dispatch/**is Tier S andscripts/pm/board-snapshot.mjsis governedscripts/pm/**; AGENTS.md, CLAUDE.md, NORTH-STAR,skills/**, workflows (.github/workflows/board-snapshot.ymlincluded) and CODEOWNERS are untouched. The SKILL.md claim-template block (pm-dispatch / os-dev: the claim template and the dev definition carry only theClause-②:line, so a dispatched PR never writes theMetadata-protocol:line ruling A (#25105) adds #25115), the 〈升级与决策〉 ruler line and the 红线 delegated-channel line (pm-dispatch: inside a Claude Code project, a card thread'sneeds_decisionfork goes to a separate ruling thread at the contract-review tier, which rules when confident and sends the maintainer a decision card otherwise (maintainer's word 2026-10-22) #25216) andlanes/director.mdare untouched.docs/qa/**notes, audits, ADRs and CHANGELOG entries that name the three old lanes are history, not readers.Generated by Claude Code