Repository navigation
Commit 61170fa
Fixes #19483
Clause-②: no
The feature axis lands in the three steps the card names: `area:*` as
the planning axis, the North Star's road section as an ordered list of
feature points, and `domain:*` retreating to file ownership.
## The maintainer's words this implements (verbatim, chat 2026-09-21)
「关于任务的车道,我觉得现在是有问题的,应该是按照功能点划分车道我更容易判断优先级和安排,而且一个功能点应该覆盖从协议开始到运行时到前端。不应该按照我们的文件夹划分。」
/ 「或者是否建议再加一组label?」 / 「有了功能轴之后我应该怎么安排任务?」 / 「包括我们应该划分哪些功能轴」 /
「把北极星的「路」那一节改成可读的功能点顺序 立」.
## Tier and landing
Tier H (`docs/NORTH-STAR.md` and `.claude/**` in one diff, one path hit
makes the whole PR Tier H). The maintainer merges this by hand. Draft,
no ready flip, no auto-merge, no labels.
✅ **The eleven-value axis list is ruled.** The maintainer confirmed it
on the card with ONE amendment, verbatim (chat, 2026-09-21): 「19483
api-integration 简化成 api 其他同意。」 — recorded as the card's ruling comment
5754985448. Round 2 of this PR carries the rename: the value is
`area:api` in all four places it is spelled (the label row, the `axis`
in api-backend.json and integration-system.json, and the three roadmap
lines), its customer capability unchanged. The other three open
questions were ruled A in the same comment: platform-core stays
file-level `devpath`, the label objects stay in objectstack + objectui,
and the four readers keep riding in the glossary row with no ceiling
raise.
## Step 1 — `area:*`
- `scripts/pm/ensure-pm-labels.sh` gains eleven rows, in **two** repos
(objectstack + objectui), not the five-repo loop: a feature point spans
协议 → 运行时 → 前端, which is those two. cloud is parked (北极星「现在不做」), objectos
is the docs/site repo, hotcrm is the exemplar app whose platform gaps
are filed upstream. The reasoning is written into the file beside the
rows; widening the loop is a vocabulary decision, not a maintenance
edit. `check:pm-label-desc-cap` reads 38 descriptions (was 27), longest
100 characters.
- SKILL.md 〈状态模型〉 gains the `area:*` glossary row with the card's text.
- The four named readers ride **in that row** rather than on their own
line under 「一个标签存在当且仅当有具名读者」. That is the one deviation from the card's
letter, and it is a ratchet consequence, measured below — the same fold
the #19457 ratchet comment records for `tooling`. The row is exempt from
the 120-byte line rule and the readers are still named and greppable:
`git grep -n 'area:' -- .claude/skills/pm-dispatch/SKILL.md` returns the
row with all four.
- All fifteen `docs/qa/platform-checklist/areas/*.json` carry a
top-level `axis`, item ids untouched. **No schema extension was
needed**: the gate has no unknown-top-level-key rule, and `pnpm
check:platform-checklist` is green on the added key (15 areas, 264
items, exit 0).
- One mapping cannot be expressed with a top-level field: the card sends
platform-core's **docs-portal items**
(`platform-core.docs-audience-gate`, `platform-core.docs-portal-render`,
both P1) to `studio` while the rest of that area is `devpath`. The file
carries `devpath`; a per-item axis is out of this card's scope. Flagged
for the maintainer under Open questions on the card.
## The roadmap section, rewritten in round 3
The maintainer read the first version and said, verbatim (chat,
2026-09-21): 「19488 路上的功能点写的很奇怪,真的是平台总体的功能清单吗?怎么感觉是几个issue」. He was
right: it was one card plus the checklist's currently-failing P0 items —
a to-do list, not the platform's feature map. Round 3 replaces that one
section; everything else in this PR is as reviewed.
What it is now: six blocks, one per step of the road the North Star
already measures, and inside each block one line per feature point at
capability level — a customer-visible capability that runs from the
protocol through the runtime to the frontend. The end-user capabilities
(records, access, workflow, reports, identity, files, i18n) sit at the
step where the road first needs them, which is where the app is first
run and seen. The 路步 column is gone because the block position is the
step, the docs-authoring feature keeps its 「清单项待写」 slot at step ①, and
the page's own rules hold: no counts, no pass/fail status, no new
headings, and the ledger is not copied here.
**The completeness claim is mechanical, not editorial.** The feature
points are derived by grouping every item in
`docs/qa/platform-checklist/areas/*.json` so that each item belongs to
exactly one line. The two totals: **264 items on disk, 264 mapped** —
zero unmapped, zero double-mapped, zero ids the ledger does not have —
across **76 feature points** in a **95-line** section. The per-item
listing is on the card, in the round-3 `os-dev-report`.
**Round 4** (one commit, `docs/NORTH-STAR.md` only, +4/−2): the round-3
at-tier review (5755471665, PASS) named one line as misdescribing its
items and one placement as debatable; both fixed — the CEL formula pair
(`formula-stdlib-matrix`, `formula-gates`) now has its own feature-point
line and the REST construction line no longer claims it;
`lifecycle-retention-sweep` (ADR-0057 retention) moved off the
packaged-object line onto its own. Totals unchanged: 264 items, 264
mapped, 0 unmapped, 0 double-mapped; 78 feature points.
**Round 5** (merge commit, no rebase): `origin/main` moved (#19506
entered the maintainer's 插队 / 契约面卡 tiers into the 取卡全序; #19502 the
handover protocol) and conflicted with this PR's 取卡全序 edit in SKILL.md
and core-rules.md. Both sides are the maintainer's rulings, so the merge
composes them: 「取卡全序:维护者直派插队卡(出处三件)> 契约面卡(判据见 references/lanes/spec.md)>
标签序」 and 「标签序:priority:p0 > pm:blocking > 功能点位次 > target: 板上项 > p1 > p2
> p3 > 无级」, identical in both files; the tie-break 「同级先 Bug 再卡龄」 stays
on SKILL.md's following line (the composed line would exceed the
120-byte cap) and core-rules.md's summary defers to it. Everything else
takes main's side. Ratchet: SKILL.md 815/819 (main's own count; this PR
net zero), core-rules 151/151.
## Step 3 — `domain:*` retreats to file ownership
- 〈域车道〉 now says in one line that `domain:*` decides file ownership
(anchoring, hot-file serial, single-claim paths) and is **not** a queue
or a priority unit.
- 〈候选与批次〉: the candidate order reads 「功能点位次」 — the parent's position in
「路上的功能点」 — ahead of the board and the priority ladder, and at most one
feature point per axis is in flight unless the file surfaces are
disjoint.
- 〈分诊座位职责〉: a cross-layer feature point (two or more of spec / 运行时 / 前端)
is filed as ONE parent carrying `area:*` + `pm:epic` + the checklist
item's priority, plus per-layer sub-issues ordered by `Blocked-by:`.
〈Epic 子树车道〉 now names cross-layer feature points in its delegation line,
which is what makes the existing epic mechanism the default for that
case, and 多仓协调 规则 2 is aligned from 每仓一子单 to 逐层子单.
- `references/core-rules.md` mirrors all four rules in place.
- `references/lanes/*.md`: **zero edits, as a measured reading, not a
skipped step.** No lane charter describes a per-domain queue as the
order of work. Instrument reachability is shown by the control word:
「车道」 hits 31 times across those ten files, while the order vocabulary
(队列/全序/取卡/候选顺序/排序/优先序/按域/逐域) produces exactly two hits, both about the
**merge** queue (`lanes/cli.md` line 17, `lanes/ui.md` line 26). Since
the card's instruction there is "delete or re-point, never add", the
correct edit count is zero.
## The ratchet — paid in place, no ceiling raised
`check:pm-skill-ratchet` is green with both files exactly at their
ceilings: SKILL.md **813/813**, core-rules.md **151/151**, widest
SKILL.md table row **342/342**.
Three lines were added and three retired. Each retirement was checked
for a surviving home rather than assumed:
| retired from SKILL.md | where the content still lives |
|---|---|
| 「唯一例外 `packages/lint` 等与 spec 相交的 devx 面…」 (域车道) | the 域车道 table's own
`domain:devx` row, plus `references/lanes/spec.md` 范围 (「同含围着 spec
契约转的工具链…」 / 「一般开发工具面留 devx」) |
| 「座位在编以 `label:pm:seat` 索引为准,每车道…每席恰一张。」 (域车道) | 全体座位的不变量 (「一 PM
恰管一车道,一车道由一组座位管,一席一贴」) and 座位贴协议's first line; the label object's own
description carries the fleet-board half |
| 「sweep 与首触定级只对多车道仓,单车道仓机械三务自理。」 (分诊座位职责) | 多仓协调 carries both halves —
「多车道仓…中央分诊是 `domain:*`/type/定级的唯一生产者」 and 「机械三务 = 自扫 sweep、自打 `type`、自做
`finding` 首触定级」 |
Two clauses moved rather than died: 「同级先 `Bug` 再卡龄」 moved from the order
line to the line below it, and 「优先非豁免」 was dropped there because the
状态模型 `priority:p0` row states it (「⛔ 不豁免同文件串行、深度等待与认领协议」).
**The exact count the card asks for.** One ruled line could not be paid:
the reader list as its own bullet under 「一个标签存在当且仅当有具名读者」 needs
**SKILL.md 814 against a ceiling of 813 — one line**. Everything payable
was paid (three retirements), the length rule blocks folding it into
that bullet (the bullet is 117 bytes and the shortest self-contained
reader line is 114), and every other ceilinged file in the map stands at
headroom 0, so no reference file can absorb it. ⛔ No ceiling was raised.
The readers therefore ride in the byte-exempt glossary row; if the
maintainer wants them as a separate rule line, the raise is 813 → 814.
## Verification
- `node scripts/pm/dispatch-gates.mjs --commands --repo
objectstack-ai/objectstack` derives **37 families** on this diff; all 37
were run on the final head `c55c02e` with exit codes captured before any
pipe, all exit 0, and `--ran` reconciles **37 derived / 37 run / 0
NOT-MEASURED / 0 UNRUN** with no stale-tree warning.
- Named in the dispatch and green: `check:pm-skill-ratchet`,
`check:pm-label-desc-cap`, `check:pm-widening-tells`,
`check:pm-skill-id-lint`, `check:doc-authoring`,
`check:platform-checklist`, `check:self-test-wired`, `check:nul-bytes`,
`check:pm-governed-prose`, `check:pm-governed-merges`,
`check:skill-frame-sync`.
- `pnpm --filter @objectstack/lint run check:doc-formula-expressions`
first exited **3 — PREREQUISITE NOT MET** (its two packages were
unbuilt). That is not a finding; after `turbo run build
--filter=@objectstack/formula --filter=@objectstack/lint` it exits 0,
and the merged-head run above is the one recorded.
- Beyond the derivation, the roster gates whose roster sits under a
directory this diff touches were read rather than assumed:
`check:pm-settings-deny-roster`, `check-published-list-mirrors.mjs`,
`check-skills-token-ratchet.mjs` — all exit 0.
- Repo-wide `pnpm lint` is not derived for these paths and is CI's run,
not this PR's claim.
- **Collision probe against the in-flight charter PR #19462** (branch
`claude/issue-19457-charter-product-only-queue`): `git merge-tree
--write-tree` against its tip exits 0 with a tree and no conflict. That
PR's SKILL.md lines were deliberately left untouched — its `tooling` row
goes after `finding` while the `area:*` row goes after `priority:p0`,
four rows away; its grading edits sit two lines above the cross-layer
insert; its candidate-line edit is the 候选 line while this one rewrites
取卡全序. None of this repo's paths here is merge-driver managed.
- `Check Changeset`: this diff publishes nothing — `.claude/**`,
`docs/**` and `scripts/pm/**` are outside every package's `files[]`. It
needs the **`skip-changeset`** label, which the seat applies (this
dispatch writes no labels).
## Acceptance notes
- Noted, not filed: `docs/qa/platform-checklist/areas/*.json` has no
schema and no unknown-top-level-key rule, so `axis` is accepted by
presence alone and a typo (`area:studo`) would pass every gate. A value
check belongs with whichever card next touches the checklist gate; the
carrier is named, so it is a note rather than a card.
- Noted, not filed, 承接者:无 — `scripts/pm/ensure-pm-labels.sh` is
create-if-missing by default, so the eleven new label objects only reach
the two repos when someone with label-write credentials runs the script
(a PM landing step, exactly as the file says for objectos and hotcrm).
## 维护者速读(草稿)
**改了什么** — 加了一组新标签 `area:*`(十一个功能轴),给测试清单的十五个 area 文件各加了一个 `axis`
字段,在北极星的「那条路」下面加了一张「路上的功能点」表(第一条是文档编写那个功能,后面是清单上现在还开着的全部 P0 项,按路步排),并把
PM 章程里「按车道排队」的地方改成「按这张表排队」:`domain:*` 从此只管哪个席位能动哪些文件。
**为什么改** —
您的原话:按功能点划分更容易判断优先级和安排,一个功能点应该从协议一直覆盖到前端,不应该按文件夹划分。以前排队顺序是按文件夹(车道)来的,所以一个功能的三层会被拆到三个队列里各自排;现在顺序只有一份,就是北极星上的那张表,改表即改优先级,不用逐张卡改档位。
**风险与代价(含回滚)** — 一、十一个轴您已在卡上定了,只改了一个名(API 那一轴由长名简化为
`area:api`),本轮已在四处改齐:标签行、两个清单文件的 `axis`、路上的功能点三行。二、新标签只在 objectstack 与
objectui 两个仓建,理由写在脚本里;要不要也给
hotcrm,您随时可加。三、章程的行数棘轮是零余量,所以这次是「加三行、退三行」换来的,退掉的三行内容都在别处有家(PR
正文里逐条列了);还有一行实在付不出,已按卡上要求报了准确数字(要 814,天花板 813),没有抬天花板 ——
您也已裁定保持现状。四、回滚就是 revert 这个 PR,新标签对象留在 GitHub 上不影响任何东西。
**席位意见** — (留空,复核席填)
**你要做的** — 手动合并这个 PR(Tier H);轴名已定,无需再确认。
---
_Generated by [Claude Code](https://claude.ai/code)_
---------
Co-authored-by: Claude <noreply@anthropic.com>
1 parent eec56c3 commit 61170fa
19 files changed
Lines changed: 178 additions & 13 deletions
File tree
- .claude/skills/pm-dispatch
- references
- docs
- qa/platform-checklist/areas
- scripts/pm
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
119 | 119 | | |
120 | 120 | | |
121 | 121 | | |
| 122 | + | |
122 | 123 | | |
123 | 124 | | |
124 | 125 | | |
| |||
133 | 134 | | |
134 | 135 | | |
135 | 136 | | |
136 | | - | |
| 137 | + | |
137 | 138 | | |
138 | 139 | | |
139 | 140 | | |
| |||
214 | 215 | | |
215 | 216 | | |
216 | 217 | | |
217 | | - | |
| 218 | + | |
218 | 219 | | |
219 | 220 | | |
220 | 221 | | |
| |||
242 | 243 | | |
243 | 244 | | |
244 | 245 | | |
245 | | - | |
| 246 | + | |
246 | 247 | | |
247 | 248 | | |
248 | 249 | | |
| |||
258 | 259 | | |
259 | 260 | | |
260 | 261 | | |
261 | | - | |
262 | 262 | | |
263 | 263 | | |
264 | 264 | | |
| |||
294 | 294 | | |
295 | 295 | | |
296 | 296 | | |
297 | | - | |
| 297 | + | |
298 | 298 | | |
299 | 299 | | |
300 | 300 | | |
| |||
310 | 310 | | |
311 | 311 | | |
312 | 312 | | |
313 | | - | |
314 | 313 | | |
315 | 314 | | |
316 | 315 | | |
| |||
372 | 371 | | |
373 | 372 | | |
374 | 373 | | |
| 374 | + | |
375 | 375 | | |
376 | 376 | | |
377 | 377 | | |
| |||
470 | 470 | | |
471 | 471 | | |
472 | 472 | | |
473 | | - | |
| 473 | + | |
474 | 474 | | |
475 | | - | |
| 475 | + | |
476 | 476 | | |
477 | 477 | | |
478 | 478 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
55 | 55 | | |
56 | 56 | | |
57 | 57 | | |
58 | | - | |
| 58 | + | |
59 | 59 | | |
60 | 60 | | |
61 | 61 | | |
62 | 62 | | |
63 | 63 | | |
64 | | - | |
| 64 | + | |
65 | 65 | | |
66 | | - | |
| 66 | + | |
67 | 67 | | |
68 | 68 | | |
69 | 69 | | |
| |||
106 | 106 | | |
107 | 107 | | |
108 | 108 | | |
109 | | - | |
| 109 | + | |
110 | 110 | | |
111 | 111 | | |
112 | 112 | | |
| |||
0 commit comments