Skip to content

pm-dispatch: merge domain:engine, domain:services and domain:cli into domain:server (maintainer 乙, 2026-10-22), with a no-interrupt alias transition, and move packages/qa (dogfood) to domain:devx #24907

Open

Description

@objectstack-fleet

Filing gate ③: a task the maintainer set. In the triage seat's chat, triage proposed 「甲:只合并 engine 和 services」, with the packages/qa → devx move alongside it. The maintainer answered 「甲」, asked 「现在处理合适吗,各个车道都在开发」, and named the lane: 「就叫 server 吧」. Filed by the triage seat (#6015, session_01AavokzJ5DndAwitDXvKy4U). ⛔ Not a claim.

Reader (who acts): the domain:skills seat, in one PR on the governed surface. It lands by its tier: Tier H, the maintainer's approval.

Why (measured over the last 14 days, objectstack)

Name

domain:server: the maintainer's word, 「就叫 server 吧」. Both domain:engine and domain:services fold into it. The table row reads 「服务端运行时:引擎 + 服务插件」, and its scope is the union of the two current rows. If domain:cli later merges too (to be re-measured in two weeks), the name already fits.

The transition (no freeze, no interruption of in-flight work)

  1. The PR:
    • The lane table (.claude/skills/pm-dispatch/SKILL.md, about :161–162) replaces the engine and services rows with one domain:server row, and moves packages/qa from cli's row to devx's.
    • references/lanes/engine.md and references/lanes/services.md merge into references/lanes/server.md.
    • scripts/pm/ensure-pm-labels.sh creates domain:server.
    • scripts/pm/check-half-states.mjs and scripts/pm/check-skill-line-ratchet.mjs treat domain:engine and domain:services as aliases of domain:server, so a seat's sweep and the half-state checks still see every card.
    • ADR text is history and stays untouched.
  2. From the merge on, triage labels new cards domain:server, and labels packages/qa cards domain:devx.
  3. One batch relabel, by triage, of the domain:engine and domain:services cards that are not in flight: pm:queue, pm:blocked, pm:on-hold, the decision cards and the unlabelled ones (about 32 cards today).
    • ⛔ Cards in pm:dispatched (5 engine and 2 services today) keep their label until they land.
  4. Seats: at each seat's next shift handover, the engine seats ([PM seat] domain:engine — ⏳ vacant #6367, and [PM seat] domain:engine · seat 2 — 🟢 os-bill #20966, which is vacant) and the services seats ([PM seat] domain:services — 🟢 os-sales #6021, [PM seat] domain:services · seat 2 — ⏳ vacant #21118) become domain:server seats 1–4. ⛔ No seat is renamed mid-shift, and in-flight claims finish under their own label.
  5. Cleanup: once domain:engine and domain:services have zero open cards, remove the aliases and the two labels (a small follow-up PR, the same lane).

Done when

Dedupe

The open domain:skills cards were checked: none touches the lane table. New.


Generated by Claude Code

Activity

  1. changed the title [-]pm-dispatch: fold `domain:services` into `domain:engine` (maintainer 「甲」), with a no-interrupt transition — and move `packages/qa` (dogfood) from `domain:cli` to `domain:devx`[/-] [+]pm-dispatch: merge `domain:engine` and `domain:services` into `domain:server` (maintainer 「甲」, 「就叫 server 吧」), with a no-interrupt transition — and move `packages/qa` (dogfood) to `domain:devx`[/+] on Oct 20, 2026
  2. objectstack-fleet commented on Oct 20, 2026

    @objectstack-fleet
    ContributorAuthor

    Parked for the maintainer: 「这个合并不着急,设置成维护者处理,等我有空的时候再说」 (the triage seat's chat). Triage seat · session_01AavokzJ5DndAwitDXvKy4U · 2026-10-20T13:53Z

    • State: pm:queue → pm:awaiting-maintainer. No seat dispatches this card. It restarts on the maintainer's word, here or in chat.
    • Open question for that restart (the maintainer asked 「是否建议 cli 一起合并」): measured over 14 days of objectstack PR title scopes:
      • 364 name a domain:cli package, and 55 of them (15%) also name a domain:server package. Examples: the 18.x ceremony and walled steps (feat(cli,driver-sql)!, feat(objectql,cli,plugin-webhooks)!, feat(cli,plugin-sharing)!) and fix(objectql,runtime).
      • That is more cross-boundary PRs than engine↔services itself (30).
      • Triage's lean: fold domain:cli into domain:server in the same transition. One alias step, one relabel batch and one seat rename at handover cost less than two migrations. packages/qa still goes to domain:devx.

    Generated by Claude Code

  3. objectstack-fleet commented on Oct 22, 2026

    @objectstack-fleet
    ContributorAuthor

    Maintainer ruling: 乙. engine, services and cli fold into domain:server, and packages/qa moves to domain:devx. Triage seat · session_01AavokzJ5DndAwitDXvKy4U · 2026-10-22T13:01Z

    Provenance: in the triage seat's chat, 2026-10-22, the maintainer reopened this card (「有一个车道合并的管理者维护issue,现在拿出来讨论」). Triage put three letters, with refreshed measurements, and leaned 乙. The maintainer answered 「同意」.

    • This amends the 10-20 ruling 「甲」 (engine + services only) by adding domain:cli.
    • It settles the open question in 6292501466 (「是否建议 cli 一起合并」).

    Why (measured 2026-10-22, objectstack, 14 days):

    • Load: engine has 16 open / about 221 closed, services 22 / about 267, cli 14 / about 244.
    • Merged PRs whose title scope names two of the three: engine ∩ services 11, cli ∩ (engine or services) 19, on a strict scope regex. The 10-20 broad count was 30 and 55.
    • Seats: at the measurement there were six seat posts across the three lanes and one active seat (engine seat 2). It could draw only from engine's 16 cards while 36 waited in services and cli. The same account has staffed services, cli, engine and spec seats over two days, so the lane partition, not the people, kept the pool split.

    Scope of the PR (the domain:skills seat; Tier S plus scripts/pm/**. No Tier H file names these lanes: AGENTS.md, CLAUDE.md, NORTH-STAR, skills/**, .github/workflows/** and CODEOWNERS have zero hits on origin/main 15764cd723):

    1. .claude/skills/pm-dispatch/SKILL.md, the lane table:

      • replace the engine, services and cli rows with one domain:server row, 「服务端:引擎 + 服务插件 + CLI/运行时」, scoped to the union of the three rows;
      • move packages/qa to devx's row.

      ⛔ pnpm check:pm-skill-ratchet: a line added is paid for by a line deleted.

    2. references/lanes/engine.md, services.md and cli.md → references/lanes/server.md, keeping three sections (engine / services / cli surfaces). A seat reads the section its claim's file surface names, not the whole file. Update spec.md where it names these lanes.

    3. scripts/pm/ensure-pm-labels.sh: create domain:server, and give domain:engine, domain:services and domain:cli a "retired, alias of domain:server" description.

    4. Aliases, so the transition interrupts nothing:

      • scripts/pm/check-half-states.mjs, scripts/pm/check-skill-line-ratchet.mjs and scripts/pm/clause2-line.mjs read domain:engine, domain:services and domain:cli as domain:server.
      • In-flight claims, branches and Seat: domain:X#N lines stay valid.
      • Open cards are relabeled in batches after the PR lands, through the relay, by triage. They are not relabeled before it lands.
    5. Seat posts: the six posts (engine [PM seat] domain:engine — ⏳ vacant #6367, [PM seat] domain:engine · seat 2 — 🟢 os-bill #20966; services [PM seat] domain:services — 🟢 os-sales #6021, [PM seat] domain:services · seat 2 — ⏳ vacant #21118; cli [PM seat] domain:cli — 🟢 os-sales · 由Sales账户的项目负责 #6024, [PM seat] domain:cli · seat 2 — ⏳ vacant #22648) become domain:server · seat N. Each seat-holder retitles its own post at its next round. Vacant posts beyond what is staffed may close not_planned, citing this card.

    6. Serial constraints inside one lane are carried by each claim's File surface: line, as today between seats of one lane. No new gate.

    State: pm:awaiting-maintainer → pm:queue, at p1 (the maintainer brought it forward today). The title is updated to include domain:cli.


    Generated by Claude Code

  4. changed the title [-]pm-dispatch: merge `domain:engine` and `domain:services` into `domain:server` (maintainer 「甲」, 「就叫 server 吧」), with a no-interrupt transition — and move `packages/qa` (dogfood) to `domain:devx`[/-] [+]pm-dispatch: merge domain:engine, domain:services and domain:cli into domain:server (maintainer 乙, 2026-10-22), with a no-interrupt alias transition, and move packages/qa (dogfood) to domain:devx[/+] on Oct 22, 2026
  5. objectstack-fleet commented on Oct 22, 2026

    @objectstack-fleet
    ContributorAuthor

    Claim: PM loop round 1 (card thread) · 2026-10-22T14:46Z · p1, tooling, domain:skills. Implements the maintainer ruling 乙 (6341410910): domain:engine, domain:services and domain:cli fold into domain:server with a no-interrupt alias transition, and packages/qa moves to domain:devx.
    Session: session_01VCLHrrmPbwQHZcc2yqdFHD (card thread of domain:skills seat 2, seat session session_01REMuzhz6MWRjg8uohedMnM)
    Account: os-elon-musk (the seat's linked user; always the card's assignee)
    Branch: claude/project-thread-wjmmlj (the card thread's designated push branch; the claude/issue-<n>-<slug> convention cannot be used by a project thread, a measured platform exception)
    Worktree: the card thread's own checkout
    Domain: domain:skills
    Seat: domain:skills#2 (seat post #19287)
    File surface: .claude/skills/pm-dispatch/SKILL.md (the 〈域车道〉 lane table only); .claude/skills/pm-dispatch/references/lanes/{engine,services,cli}.md → references/lanes/server.md, plus lanes/spec.md and lanes/devx.md where they name these lanes or packages/qa; scripts/pm/ensure-pm-labels.sh; scripts/pm/check-half-states.mjs, scripts/pm/check-skill-line-ratchet.mjs, scripts/pm/clause2-line.mjs and their self-tests (aliases, ratchet rows); other readers of the three labels only as the dev's re-grep classifies them, reported. (stop on breach; explain in the report)
    ⛔ Not in scope: the claim-template block of SKILL.md and .claude/agents/os-dev.md (#25115); the 〈升级与决策〉 ruler line and 红线 delegated-channel line (#25216); references/lanes/director.md; any Tier H file (AGENTS.md, CLAUDE.md, docs/NORTH-STAR.md, skills/**, .github/workflows/**, CODEOWNERS); relabelling issues or retitling seat posts.
    Container & model: M, mode:thread (the maintainer's word: one project thread per M-or-larger or p1 card), model: CONTRACT_REVIEW_TIER (dispatch-gates.mjs --tier --repo objectstack-ai/objectstack .claude/skills/pm-dispatch/SKILL.md at f2ade4a: "MANDATORY: … clause ① of the model-tiering ruling (narrowed to protocol semantics, 2026-08-20)"), effort: xhigh (p1). Governed surface .claude/** is Tier S plus scripts/pm/**: a CONTRACT_REVIEW_TIER PASS record on the PR's head plus all-green checks, then this seat lands it.
    Clause-②: no
    Metadata-protocol: none
    Responsibility: n/a — not a defect card (a maintainer ruling not yet written into the skill)
    Thread-read: 6341410910
    Serial constraints cleared: #25115 (PR #25240, claim-template block + os-dev.md) and #25216 (〈升级与决策〉 / 红线 lines + director.md) are in flight on seat 1 and disjoint by region from the lane table; whichever lands second merges main and re-measures check:pm-skill-ratchet. Seat 1 was told on #7623 (6343427378) and had not objected at this write. Re-check the open-PR list for .claude/skills/pm-dispatch/** before your first edit and name what you found.


    Generated by Claude Code

  6. objectstack-fleet commented on Oct 22, 2026

    @objectstack-fleet
    ContributorAuthor

    os-dev-report

    {
      "issue": 24907,
      "status": "done",
      "branch": "claude/project-thread-wjmmlj",
      "pr": "https://github.com/objectstack-ai/objectstack/pull/25247",
      "session": "session_01VCLHrrmPbwQHZcc2yqdFHD — card thread of domain:skills seat 2 (seat session session_01REMuzhz6MWRjg8uohedMnM)",
      "premise_still_valid": true,
      "summary": "Maintainer ruling 乙 (6341410910) written into the skill: the SKILL.md 域车道 table carries one `domain:server` row scoped to the union of the engine/services/cli rows with `packages/qa` moved to devx (319→318 lines, widest row 342→341, both lowered); `lanes/{engine,services,cli}.md` merged into `lanes/server.md` (87 lines, three sections read by file surface; spec.md's `/meta` pointer renamed); `ensure-pm-labels.sh` creates `domain:server` and gives the three retired labels a 'Retired 2026-10-22, alias of domain:server' description for --reconcile; `check-half-states.mjs` reads the three labels as `domain:server` in seatLane / newestLaneClaim / the H32 inventory / the census (new battery `domain:server lane aliases`, roster floor 9→10); the ratchet ledger follows the merge (ceilings down 488). Point 4 premise partly false: check-skill-line-ratchet.mjs and clause2-line.mjs have no label reader, so no alias lives there. No relabel, no retitle, no new gate.",
      "tests": "head c5c17359be (merged main at 80ec71dc26). `node scripts/pm/check-skill-line-ratchet.mjs` → exit 0: SKILL.md 317/317 (ceiling 319→318 by this card, 318→317 after merging main with #25240, which had paid one line down), widest row 341/341 (pin 342→341), lanes/server.md 87/87, both cross-file moves paid down, 'declared cross-file moves: 2, total ceilings down 488 lines'; `--self-test` 164 cases pass. `node scripts/pm/check-half-states.mjs --self-test` → exit 0, '4941 cases pass', battery `domain:server lane aliases` 24 cases / pin 22, roster 10/10 — the first run on the staged tree failed 11 cases (the harness compares with ===, so array readings and three H38 cases keyed to the old spelling were wrong); fixed in the second commit, nothing outside the self-test changed. `pnpm check:pm-label-desc-cap` → '41 label descriptions in scripts/pm/ensure-pm-labels.sh, all ≤100 characters (longest: 100)'. `pnpm check:pm-skill-id-lint` → '85 file(s) clean'. `bash -n scripts/pm/ensure-pm-labels.sh` ok. No ablation: no tested behaviour of a product package changed.",
      "gates": "`node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack` → 54 commands from the 9 changed paths (identical set before and after merging main). Run twice, each command byte-for-byte with its exit code captured before any pipe into ran.list, then `--ran`: run 1 on the pre-merge tree (e208c89/56b333e) → 'Run reconciliation — 54 derived, 54 run, 0 NOT-MEASURED, 0 UNRUN' (exit 0; `pnpm --filter @objectstack/lint run check:doc-formula-expressions` exited 3 first — formula/lint unbuilt — and 0 after `pnpm exec turbo run build --filter=@objectstack/formula --filter=@objectstack/lint`); run 2 on the merged head c5c17359be → all 54 exit 0 on first pass, 'Run reconciliation — 54 derived, 54 run, 0 NOT-MEASURED, 0 UNRUN' (exit 0). CI on c5c17359be at report time: every Type Check lane and the `TypeScript Type Check` aggregator success; Lint lanes ESLint / repo & tooling / CI-release-engine / docs & code / scoped tooling success, three scoped lanes still in progress; `Snapshot the board to the archive branch` failure — red on main's own code (exit 2 count check, reproduced locally on origin/main 80ec71dc26; scheduled main runs exit 2 since 2026-10-21; tracked on #24351), standing-down comment 6344588150 on the PR. The red `TypeScript Type Check` / `Lint & Repo Gates` on 56b333e are the aggregators of run 39804119528, cancelled when c5c1735 superseded it.",
      "dogfood_battery": "n/a — no `!` in the PR title and no (narrowing) arm",
      "mcp_calls": "16 — reads only: mcp__github__issue_read (#24907 body + comments; #25115/#25216 lookups), mcp__github__pull_request_read (#24467 files, #25240 files, #25247 verification), mcp__github__search_pull_requests (open PRs on .claude/skills/pm-dispatch/** and scripts/pm/**), mcp__github__get_job_logs ×4 and mcp__github__actions_list ×3 (the Board Snapshot and Type Check failures), mcp__github__search_issues ×1 (#24351). No write tool.",
      "api_writes": "4 strokes through the fleet-write relay (route dispatch, fleet identity), plus 3 `git push` to claude/project-thread-wjmmlj: ① pr_create → POST /repos/objectstack-ai/objectstack/pulls + POST …/issues/25247/assignees + POST …/issues/25247/labels (run 39804017178, read-back 8049/8049 bytes); ② PR comment 6344588150 → POST /repos/objectstack-ai/objectstack/issues/25247/comments (standing down on the `Snapshot the board to the archive branch` check: red on main's own code, tracked on #24351); ③ issue_patch → PATCH /repos/objectstack-ai/objectstack/issues/25247 (body: readings after merging main); ④ this report → POST /repos/objectstack-ai/objectstack/issues/24907/comments via post-stamped.mjs. No MCP writes; no label or assignee touched on the card.",
      "open_questions": [],
      "out_of_scope_findings": [
        "class: c · reach: named producer · the SKILL.md engine/services rows named the long-retired labels `domain:engine-core` / `domain:metadata` / `domain:drivers` / `domain:identity` by name; the merged row keeps only the generic 只退流通,对象保留 rule (ensure-pm-labels.sh's header still lists them) · dedupe: retired lane names SKILL.md · carrier: PR · noted, not filed",
        "class: c · reach: named producer · test fixtures in scripts/pm/check-merge-queue-triage-outcome.mjs (L915/919) and scripts/pm/osv-base-relative.mjs (L461) spell `domain:engine`/`domain:cli` as data; they keep passing and read fine, candidates for the cleanup PR that retires the three label objects · dedupe: fixture old lane labels · carrier: PR · noted, not filed"
      ]
    }
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions