docs(north-star,pm-dispatch): the feature axis — area:* labels, the 「路」 section as an ordered list of feature points, cross-layer features as parent + per-layer sub-issues, domain:* retreats to file ownership (#19483) - #19488
Conversation
…路」 section as an ordered list of feature points Step 1 and step 2 of the charter: eleven `area:*` label rows in the PM label vocabulary (objectstack + objectui), a top-level `axis` field on all fifteen platform-checklist area files, and a 「路上的功能点」 list under the North Star's 「唯一的度量,那条路」 seeded with the docs-authoring feature and the checklist's currently open P0 items, ordered by the road's steps. Claude-Session: https://claude.ai/code/session_012GcsUbuqFGBibkEDMRC1eE Co-authored-by: Claude <noreply@anthropic.com>
…e order is the roadmap order, cross-layer feature points file as one parent plus per-layer sub-issues Step 3 of the charter, paid in place on a ratchet with headroom 0 on every file: SKILL.md stays at 813 lines and core-rules.md at 151. Added: the `area:*` glossary row (its four named readers, the roadmap position that the candidate order reads, and the one-feature-point-per-axis in-flight cap ride in the row, which the length rule exempts); a line in 域车道 saying `domain:*` decides file ownership and nothing else; and the cross-layer filing shape in 分诊座位职责. Paid by retiring three lines whose content has a home elsewhere: the `packages/lint` exception (the 域车道 table's own devx row and references/lanes/spec.md 范围), the seat-roster line (全体座位的不变量 plus 座位贴协议), and the multi-lane-only sweep line (多仓协调 carries both halves). Claude-Session: https://claude.ai/code/session_012GcsUbuqFGBibkEDMRC1eE Co-authored-by: Claude <noreply@anthropic.com>
…ature-axis-charter
…intainer's one amendment to the eleven The charter card's axis list was confirmed with a single rename, so the value is `area:api` in all four places it is spelled: the label row in scripts/pm/ensure-pm-labels.sh, the `axis` value in the api-backend and integration-system checklist area files, and the three roadmap lines in docs/NORTH-STAR.md. The customer capability behind it is unchanged. The label block's rows are re-padded to the new longest id, and its comment records the amendment WITHOUT writing the retired spelling: a grep for the old name must not find a live-looking value, so the maintainer's sentence is cited on the card's ruling comment rather than quoted here. Claude-Session: https://claude.ai/code/session_012GcsUbuqFGBibkEDMRC1eE Co-authored-by: Claude <noreply@anthropic.com>
Contract reviewServed-tier: Isolated at-tier reviewer; reviewed 2026-09-21T03:53Z. (merge-base Premises read in order and nothing else: card #19483 (body, ① Derived judgments
② Semver levelNone: nothing publishes. All 19 paths are ③ Boundary flags
Implemented-by: VERDICT: PASS — Tier H ( Generated by Claude Code |
|
Provenance — director seat, summon #25 (
Generated by Claude Code |
… list — every checklist item belongs to exactly one feature point The maintainer read the first version and said it looked like a handful of issues rather than the platform's feature list. It was: one card plus the checklist's currently-failing P0 items. This rewrites the section as the whole feature map. 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 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 — 264 items on disk, 264 mapped, zero unmapped, zero double-mapped, zero ids the ledger does not have. The per-item listing is on the card. The 路步 column is gone (the block position is the step), the docs-authoring feature keeps its 「清单项待写」 slot, and the page's own rules hold: no counts, no pass/fail status, no new headings, and the ledger is still not copied here. Claude-Session: https://claude.ai/code/session_012GcsUbuqFGBibkEDMRC1eE Co-authored-by: Claude <noreply@anthropic.com>
Contract reviewServed-tier: Isolated at-tier reviewer, round 3; reviewed 2026-09-21T04:37Z. Head Premises: the maintainer's words on the card, verbatim, 「19488 路上的功能点写的很奇怪,真的是平台总体的功能清单吗?怎么感觉是几个issue」; the dev's round-3 ① Derived judgments
② Semver levelNone: the round-3 delta is one file under ③ Boundary flags
Implemented-by: VERDICT: PASS — Tier H ( Generated by Claude Code |
…tention leaves the packaged-object line Two lines the round-3 review judged wrong about what they describe, fixed in the map rather than in the prose alone. The CEL formula items pin the formula engine — the stdlib's registered functions answering known values against the built package, and date-arithmetic failing at build time — not RestServerConfig's construction contract, so they get their own line and the REST line drops 公式. 计时 stays there because the Server-Timing item really does sit on it, beside the verb gate. The ADR-0057 lifecycle sweep is telemetry retention, not packaged-artifact governance; it moves to its own ops line in the step where the app is running and off the packaged-object / activation-ledger line, whose wording loses the clause with it. Nothing else in the section moved: every one of the checklist's items is still on exactly one line, four fields per line, no digits, no new headings. Claude-Session: https://claude.ai/code/session_012GcsUbuqFGBibkEDMRC1eE Co-authored-by: Claude <noreply@anthropic.com>
Contract reviewServed-tier: Isolated at-tier reviewer, round 4; reviewed 2026-09-21T04:58Z. Head Premises: the round-3 record 5755471665 and the two lines it flagged (FP-50 formula pair under the REST construction-contract line; FP-64 retention sweep glued to the packaged-object line); the dev's round-4 ① Derived judgments
② Semver levelNone: the round-4 delta is one file under ③ Boundary flags
Implemented-by: VERDICT: PASS — Tier H ( Generated by Claude Code |
|
Provenance — director seat, summon #25 (
Generated by Claude Code |
Two conflicts, both at the 取卡全序 lines in the pm-dispatch charter, and both sides are the maintainer's: main's newly ruled tiers (直派插队卡 and 契约面卡 ahead of the label ladder) and this branch's roadmap position inside the ladder. Resolved by composing them rather than choosing — main's order line verbatim, and main's ladder line with 功能点位次 inserted after `pm:blocking`, which is exactly where this branch's own line had it.⚠️ One deviation from the prescribed wording, because the prescribed line cannot land: composing into main's ladder line, tie-break clause included, measures 134 bytes against the 120-byte per-line rule that check:pm-skill-ratchet enforces on these files, so the gate would go red. The tie-break stays on the following line instead, where this branch already carried it — every rule is stated exactly once, nothing is duplicated, and the ladder line lands at 108 bytes. In core-rules.md, which has no such following line, the summary loses that tie-break clause; the full rule stays in SKILL.md, which is what that file's own header prescribes. Everything else takes main's side, and nothing else of this branch changes. Claude-Session: https://claude.ai/code/session_012GcsUbuqFGBibkEDMRC1eE Co-Authored-By: Claude <noreply@anthropic.com>
Contract reviewServed-tier: Isolated at-tier reviewer, round 5; reviewed 2026-09-21T05:29Z. Head Premises: the round-4 record 5755610118; the dev's round-5 ① Derived judgments
② Semver levelNone: the round-5 delta is a merge of ③ Boundary flags
Implemented-by: VERDICT: PASS — Tier H ( Generated by Claude Code |
|
Provenance — director seat, summon #25 (
Generated by Claude Code |
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, anddomain:*retreating to file ownership.The maintainer's words this implements (verbatim, chat 2026-09-21)
「关于任务的车道,我觉得现在是有问题的,应该是按照功能点划分车道我更容易判断优先级和安排,而且一个功能点应该覆盖从协议开始到运行时到前端。不应该按照我们的文件夹划分。」 / 「或者是否建议再加一组label?」 / 「有了功能轴之后我应该怎么安排任务?」 / 「包括我们应该划分哪些功能轴」 / 「把北极星的「路」那一节改成可读的功能点顺序 立」.
Tier and landing
Tier H (
docs/NORTH-STAR.mdand.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:apiin all four places it is spelled (the label row, theaxisin 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-leveldevpath, 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.shgains 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-capreads 38 descriptions (was 27), longest 100 characters.area:*glossary row with the card's text.toolingis a first-touch label with named readers #19457 ratchet comment records fortooling. 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.mdreturns the row with all four.docs/qa/platform-checklist/areas/*.jsoncarry a top-levelaxis, item ids untouched. No schema extension was needed: the gate has no unknown-top-level-key rule, andpnpm check:platform-checklistis green on the added key (15 areas, 264 items, exit 0).platform-core.docs-audience-gate,platform-core.docs-portal-render, both P1) tostudiowhile the rest of that area isdevpath. The file carriesdevpath; 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/*.jsonso 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-3os-dev-report.Round 4 (one commit,
docs/NORTH-STAR.mdonly, +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/mainmoved (#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 ownershipdomain:*decides file ownership (anchoring, hot-file serial, single-claim paths) and is not a queue or a priority unit.area:*+pm:epic+ the checklist item's priority, plus per-layer sub-issues ordered byBlocked-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.mdmirrors 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.mdline 17,lanes/ui.mdline 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-ratchetis 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:
packages/lint等与 spec 相交的 devx 面…」 (域车道)domain:devxrow, plusreferences/lanes/spec.md范围 (「同含围着 spec 契约转的工具链…」 / 「一般开发工具面留 devx」)label:pm:seat索引为准,每车道…每席恰一张。」 (域车道)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:p0row 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/objectstackderives 37 families on this diff; all 37 were run on the final headc55c02ewith exit codes captured before any pipe, all exit 0, and--ranreconciles 37 derived / 37 run / 0 NOT-MEASURED / 0 UNRUN with no stale-tree warning.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-expressionsfirst exited 3 — PREREQUISITE NOT MET (its two packages were unbuilt). That is not a finding; afterturbo run build --filter=@objectstack/formula --filter=@objectstack/lintit exits 0, and the merged-head run above is the one recorded.check:pm-settings-deny-roster,check-published-list-mirrors.mjs,check-skills-token-ratchet.mjs— all exit 0.pnpm lintis not derived for these paths and is CI's run, not this PR's claim.claude/issue-19457-charter-product-only-queue):git merge-tree --write-treeagainst its tip exits 0 with a tree and no conflict. That PR's SKILL.md lines were deliberately left untouched — itstoolingrow goes afterfindingwhile thearea:*row goes afterpriority: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/**andscripts/pm/**are outside every package'sfiles[]. It needs theskip-changesetlabel, which the seat applies (this dispatch writes no labels).Acceptance notes
docs/qa/platform-checklist/areas/*.jsonhas no schema and no unknown-top-level-key rule, soaxisis 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.scripts/pm/ensure-pm-labels.shis 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