Repository navigation
Charter: the feature axis — area:* (11 values from the North Star definition line), the North Star 「路」 section rewritten as an ordered list of feature points, cross-layer features default to parent + per-layer sub-issues, domain:* retreats to file ownership #19483
Description
Path: none | Unblocks: the maintainer's planning of every product card (the feature axis is how priority is judged from now on) — a charter card admitted on that line.
Ruling: maintainer directive · 「把北极星的「路」那一节改成可读的功能点顺序 立」 2026-09-21T02:4xZ (chat) — on this seat's proposal, adopted in three steps; the axis list below is the seat's proposal put to the maintainer in the same exchange and to be confirmed or amended by the maintainer on this card before the PR lands
Director seat, summon #25 (session_012GcsUbuqFGBibkEDMRC1eE). Filed, labelled and dispatched under the maintainer's words (direct-dispatch channel); the director's own os-dev round; Tier H (docs/NORTH-STAR.md, .claude/skills/pm-dispatch/**) — the maintainer merges by hand.
The maintainer's reading, verbatim (chat, 2026-09-21)
「关于任务的车道,我觉得现在是有问题的,应该是按照功能点划分车道我更容易判断优先级和安排,而且一个功能点应该覆盖从协议开始到运行时到前端。不应该按照我们的文件夹划分。」 / 「或者是否建议再加一组label?」 / 「有了功能轴之后我应该怎么安排任务?」 / 「包括我们应该划分哪些功能轴」 / 「把北极星的「路」那一节改成可读的功能点顺序 立」.
What changes — three steps, all deletions or re-purposings of existing machinery
1. A feature axis, area:*, one per card, 11 values = the North Star definition line (「做出来的是什么」) plus the road. The planning axis; priority is judged on it. Values and the checklist areas that map onto each (item ids unchanged; each area file gains a top-level axis field):
area: |
customer capability | checklist areas today |
|---|---|---|
records |
业务对象、记录、看数据的视图、能用的表单、搜索 | records-forms, search |
access |
真挡得住的权限 | access-security |
workflow |
审批与自动化 | approvals, automation |
reports |
经营报表 | dashboards |
identity |
登录与身份 | identity-auth |
api-integration |
可对外的 API 与集成 | api-backend, integration-system |
files |
文件 | attachments-storage |
i18n |
客户的语言 | i18n |
studio |
不写代码在运行中改应用(含文档编写与门户) | studio-authoring (+ the docs-portal items of platform-core) |
ai |
AI 原生:agent / tool / skill 元数据、MCP 面 | ai |
devpath |
那条路:create → dev → verify → publish/install → 接 Agent → 迭代;启动、健康、打包、marketplace | cli, platform-core (the rest) |
Rules: triage applies area:* at first grading in the same write as domain:* / priority:*; filers may pre-apply; a tooling card carries the area it protects (no area ⇒ it is not filed, ruling #202 B); ⛔ no backfill of the existing backlog — applied when a card is next touched. Named readers (「一个标签存在当且仅有具名读者」): (i) the maintainer's board view by area; (ii) triage grading — the card's priority is inherited from the checklist item in that area (#19459's contract, now keyed by the label); (iii) the parent-card grouping in step 2; (iv) the candidate order in step 3. Label objects: scripts/pm/ensure-pm-labels.sh gains the 11 rows (≤100-char descriptions).
2. The North Star 「路」 section becomes an ordered list of feature points. Today 「唯一的度量,那条路」 is a paragraph naming the developer journey; it stays as the measure. Beneath it a new list 「路上的功能点」 orders the feature points the maintainer wants next, each one line: area · the feature in business words · the checklist item id(s) it must pass · 路步. The list is the roadmap: changing it changes priority; ⛔ no card's priority is edited by hand. Triage grades from this list (the Path: line's 定义项 reads off it); a feature point that spans ≥2 layers (spec / runtime / 前端, across repos) is filed by triage as ONE parent card (area:*, pm:epic, priority from the checklist item) with per-layer sub-issues ordered by Blocked-by:, driven end to end by an epic PM (/pm-dispatch epic:#n, the existing mechanism made the default for cross-layer features). The first list is written from the maintainer's stated needs in chat (the docs-authoring feature #19482 / objectui#10188 is the first entry) and whatever the checklist's open P0/P1 items say; the maintainer edits it thereafter.
3. domain:* retreats to file ownership. It keeps deciding which seat may claim which files (the anchoring rule, hot-file serial queues, single-claim paths) and nothing else: it is no longer a queue or a priority unit. Execution seats' candidate order is the roadmap order (the parent's priority), ⛔ not per-lane queues; at most one feature point per area in flight at a time unless their file surfaces are disjoint. The lane text that says otherwise (〈候选与批次〉 order, 〈分诊座位职责〉 grading references, references/lanes/*.md where they describe queues by domain) is edited in place — shorter, not longer. Seat posts and pm:seat stay as they are this round.
Not in this card
Renaming checklist item ids (kept stable; the axis field is the mapping); re-seating PMs by feature (the epic PM mechanism covers it; domain seats shrink by attrition as #202 B empties the tooling queue); backfilling area:* on the existing backlog.
Verification the PR shows
docs/NORTH-STAR.md carries the ordered feature-point list under 「唯一的度量,那条路」 and the priority rules cite it; every docs/qa/platform-checklist/areas/*.json has an axis value in the 11-value set and the checklist gates stay green; ensure-pm-labels.sh names the 11 area:* rows and check:pm-label-desc-cap is green; the charter edits pass check:pm-skill-ratchet (headroom is 0 everywhere — pay in place; if a line cannot be paid, report the exact count for a ceiling sentence); git grep -n 'area:' -- .claude/skills/pm-dispatch/SKILL.md non-zero with the reader list.
Generated by Claude Code
Activity
os-project-manager commentedon Sep 21, 2026
Claim: objectstack#19483 — director seat, summon #25, 2026-09-21T02:40Z
Session:
session_012GcsUbuqFGBibkEDMRC1eEBranch:
claude/issue-19483-feature-axis-charterSeat: director
Mode: subagent
Clause-②: no
Authorization, verbatim (chat, 2026-09-21): 「把北极星的「路」那一节改成可读的功能点顺序 立」, on the seat's three-step proposal and the 11-axis list put to the maintainer in the same exchange (「或者是否建议再加一组label?」「有了功能轴之后我应该怎么安排任务?」「包括我们应该划分哪些功能轴」). File surface:⚠️ The 11-axis list is the seat's proposal awaiting the maintainer's confirmation or amendment on this card; the dev builds it as written and the maintainer's edits land before merge.
docs/NORTH-STAR.md(the 「路」 section),.claude/skills/pm-dispatch/SKILL.md+references/core-rules.md+references/lanes/*.md(grading, candidate order,area:*readers,domain:*scope),scripts/pm/ensure-pm-labels.sh(11 label rows),docs/qa/platform-checklist/areas/*.json(axisfield only). Tier H — the maintainer merges by hand. Labels in this write:domain:skills,priority:p1,tooling,pm:dispatched; assigneeos-project-manager.Generated by Claude Code
os-project-manager commentedon Sep 21, 2026
os-dev-report
{ "issue": 19483, "status": "done", "branch": "claude/issue-19483-feature-axis-charter", "pr": "https://github.com/objectstack-ai/objectstack/pull/19488", "head": "c55c02eaf1dfce0ecf6b7d0e1c4732c4824c77e6", "session": "session_012GcsUbuqFGBibkEDMRC1eE", "premise_still_valid": true, "summary": "All three of the card's steps landed in one draft PR (Tier H, left for the maintainer's hand). Step 1: eleven area:* rows in scripts/pm/ensure-pm-labels.sh (objectstack + objectui, reasoning written beside the rows), the area:* glossary row in SKILL.md, and a top-level axis on all fifteen docs/qa/platform-checklist/areas/*.json per the card's mapping — no schema extension was needed, the checklist gate has no unknown-top-level-key rule and is green on the added key. Step 2: docs/NORTH-STAR.md gains 「路上的功能点」 under 「唯一的度量,那条路」 — the docs-authoring feature first, then all twenty currently open P0 checklist items grouped by area in road-step order, plus one sentence appended to 「优先级」 item 2 (appended, not filed as a new item, because SKILL.md cites 「优先级」第 3 条 by number). Step 3: domain:* now decides file ownership only, the candidate order reads the roadmap position, and a cross-layer feature point files as one parent (area:* + pm:epic + the checklist item's priority) with per-layer sub-issues; core-rules.md mirrors all four rules in place. Two readings differ from the card's letter and are flagged on the PR: the four named readers ride in the byte-exempt glossary row rather than on their own bullet (one line could not be paid — exact count below), and references/lanes/*.md needed zero edits, which is a measured zero rather than a skipped step.", "tests": "Gate derivation: node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack derives 37 families on this 19-path diff; all 37 run on the final head c55c02e with the exit code captured before any pipe (cmd > log 2>&1; EXIT=$?), all exit 0; --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 (SKILL.md 813/813, core-rules.md 151/151, widest table row 342/342), check:pm-label-desc-cap (38 descriptions, longest 100 chars), check:pm-widening-tells, check:pm-skill-id-lint, check:doc-authoring, check:platform-checklist (15 areas, 264 items, exit 0 with the added axis key), check:self-test-wired, check:nul-bytes, check:pm-governed-prose, check:pm-governed-merges, check:skill-frame-sync. One NOT-A-FINDING: pnpm --filter @objectstack/lint run check:doc-formula-expressions first exited 3 (PREREQUISITE NOT MET — its packages were unbuilt); after turbo build of @objectstack/formula and @objectstack/lint through scripts/pm/os-verify-lock.sh (VERDICT command-exit 0, held 163s) it exits 0, and the merged-head run is the recorded one. Extra roster gates whose roster sits under a touched directory, 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 left to CI, not claimed here. Collision probe against the in-flight charter PR 19462: git merge-tree --write-tree against its tip exits 0 with a tree and no conflict; none of this diff's paths is merge-driver managed. Zero reading on references/lanes/*.md with a control: 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) — so the correct edit count there is zero under the card's delete-or-re-point instruction. No ablation applies: this diff adds no gate and no assertion.", "mcp_calls": "0 — no MCP tool was called in this run (no reads, no writes).", "api_writes": "2 REST proxy writes: POST /repos/objectstack-ai/objectstack/pulls (draft PR 19488) and POST /repos/objectstack-ai/objectstack/issues/19483/comments (this report, through scripts/pm/post-stamped.mjs). No labels, no assignee, no ready flip, no auto-merge, no issues filed. Git pushes to the branch (4, including the empty-branch routing probe) are git, not REST.", "open_questions": [ { "question": "The eleven area:* values are the seat's proposal, not a ruling — the card says the maintainer confirms or amends them before this lands. Confirm the list?", "options": [ "A: confirm the eleven as written (records, access, workflow, reports, identity, api-integration, files, i18n, studio, ai, devpath)", "B: amend names or the split, which is a rename in three places — the label rows, the axis values in the fifteen checklist area files, and the roadmap lines" ], "recommendation": "A, because the eleven are the North Star definition line plus the road, so the axis and the product definition cannot drift apart without one of them being edited; any amendment is cheap now and expensive once cards carry the labels." }, { "question": "platform-core maps to TWO axes in the card's table (its docs-portal items to studio, the rest to devpath), but the axis field the card specifies is top-level, one value per file. The file carries devpath and the two docs items (platform-core.docs-audience-gate, platform-core.docs-portal-render) are unexpressed. How should the split be recorded?", "options": [ "A: leave it — the two items are P1 and the mapping lives in the card's table until a later card adds a per-item axis", "B: add a per-item axis override in a follow-up card", "C: move the two docs items into studio-authoring, which changes item ids and the checklist is append-only" ], "recommendation": "A now, B as a follow-up if the maintainer's board view ever reads per item; C is refused because item ids are explicitly kept stable by this card." }, { "question": "The area:* label rows were created for objectstack + objectui only, not the five-repo loop the pm state vocabulary uses. Is that the intended scope?", "options": [ "A: two repos (a feature point spans 协议 to 运行时 to 前端, which is those two; cloud is parked, objectos is the docs site, hotcrm is the exemplar app whose platform gaps are filed upstream)", "B: five repos, matching the pm state vocabulary" ], "recommendation": "A, because a label with no named reader in a repo is a token tax there; hotcrm can join the day its cards are graded on the axis." }, { "question": "One ruled line could not be paid in place: the four named readers as their own bullet under 「一个标签存在当且仅当有具名读者」 needs SKILL.md 814 against a ceiling of 813. The readers currently ride in the byte-exempt glossary row (the fold the 19457 ratchet comment records for tooling). Raise the ceiling by one, or keep the fold?", "options": [ "A: keep the fold — the readers are named and greppable in the row, zero lines added", "B: rule the ordinary raise 813 to 814 and give the readers their own rule line" ], "recommendation": "A, because the row is where the label's own rules already live and the fold costs nothing; B only if the maintainer wants the reader list to read as a rule rather than as glossary." } ], "out_of_scope_findings": [ "noted, not filed: docs/qa/platform-checklist/areas/*.json has no schema and no unknown-top-level-key rule, so the new axis key is accepted by presence alone and a typo (area:studo) would pass every gate; a value check belongs with whichever card next touches scripts/check-platform-checklist.mjs — carrier named, so it is a PR note and not a card.", "noted, not filed, 承接者:无 — ensure-pm-labels.sh is create-if-missing by default, so the eleven label objects only reach objectstack and objectui when a credentialed PM runs the script; that is a landing step the file already prescribes for objectos and hotcrm, not a defect." ] }Report written 2026-09-21T03:25Z.
Generated by Claude Code
os-project-manager commentedon Sep 21, 2026
Ruling: feature-axis card · the 11 axes confirmed with one rename · maintainer 「19483 api-integration 简化成 api 其他同意。」 2026-09-21T03:26Z
Director seat, summon #25 (
session_012GcsUbuqFGBibkEDMRC1eE). The maintainer confirmed the axis list put on this card with one amendment:area:api-integration→area:api(customer capability unchanged: 可对外的 API 与集成 — REST / batch / 公式、连接器、外部数据源、webhook、邮件; checklist areasapi-backend,integration-system). The other ten values stand as written:records access workflow reports identity api files i18n studio ai devpath.The dev's four open questions, ruled with the same 「其他同意」: (1) the list — confirmed with the rename above; (2) platform-core's two docs-portal items — A, the file carries
devpathnow, a per-item axis is a later card if the board ever reads per item; (3) label objects in objectstack + objectui only — A; (4) the four readers ride in the glossary row, no ceiling raise — A.Execution: round 2 on PR #19488 renames in the three places (the label row in
scripts/pm/ensure-pm-labels.sh, theaxisvalue indocs/qa/platform-checklist/areas/api-backend.jsonandintegration-system.json, the roadmap lines indocs/NORTH-STAR.mdand the card-table mirror in SKILL.md's glossary row if it lists the values); a diff-scoped at-tier re-verification on the new head; then the maintainer's hand-merge (Tier H).Generated by Claude Code
os-project-manager commentedon Sep 21, 2026
os-dev-report
{ "issue": 19483, "round": 2, "status": "done", "branch": "claude/issue-19483-feature-axis-charter", "pr": "https://github.com/objectstack-ai/objectstack/pull/19488", "head": "420bd091703ebc91156654b96dcefcc4eb3bfdf8", "session": "session_012GcsUbuqFGBibkEDMRC1eE", "premise_still_valid": true, "summary": "Round 2 carries the maintainer's one amendment to the axis list, ruled on this card in comment 5754985448: the API/integration axis is now `area:api`, in one commit (420bd09) across all four places the diff spelled it — the label row in scripts/pm/ensure-pm-labels.sh, the `axis` value in docs/qa/platform-checklist/areas/api-backend.json and integration-system.json, and the three roadmap lines in docs/NORTH-STAR.md. SKILL.md and core-rules.md never spelled the value list, so neither needed an edit and both stay byte-for-byte at their ceilings. The label block's eleven rows are re-padded to the new longest id, and the block's comment records the amendment WITHOUT writing the retired spelling, so a grep for the old name cannot find something that looks like a live value; the maintainer's sentence is cited to the card's ruling comment instead of quoted in the script. The other three questions were ruled A and needed no code change: platform-core keeps file-level `devpath`, the labels stay in two repos, and the four readers keep riding in the byte-exempt glossary row with no ceiling raise.", "tests": "Grep readings on the branch at 420bd09: `git grep -n 'api-integration' -- .` reads ZERO hits, with the control `git grep -n 'area:api' -- .` reading 2 (the provenance comment line and the label row) — so the instrument is live and the zero is a measurement, not a dead grep. Gates, exit codes captured before any pipe (cmd > log 2>&1; EXIT=$?): check:pm-label-desc-cap exit 0 (38 descriptions, longest 100 chars); check:platform-checklist exit 0 (OK — 15 areas, 264 items); check:pm-skill-ratchet exit 0 (SKILL.md 813/813, core-rules.md 151/151, widest table row 342/342 — unmoved, since the charter files carry no axis value); check:doc-authoring exit 0; check:nul-bytes exit 0. Full re-derivation on the new head: node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack derives the SAME 37 families as round 1 (diff of the two command lists is empty), all 37 run with exit codes recorded, all 0, and --ran reconciles 37 derived / 37 run / 0 NOT-MEASURED / 0 UNRUN with no stale-tree warning. One NOT-A-FINDING repeated from round 1: pnpm --filter @objectstack/lint run check:doc-formula-expressions exited 3 (PREREQUISITE NOT MET) in the freshly re-created worktree; after a turbo build of @objectstack/formula and @objectstack/lint through scripts/pm/os-verify-lock.sh (VERDICT command-exit 0) it exits 0, and that is the recorded reading. Axis values now read: access-security access, ai ai, api-backend api, approvals workflow, attachments-storage files, automation workflow, cli devpath, dashboards reports, i18n i18n, identity-auth identity, integration-system api, platform-core devpath, records-forms records, search records, studio-authoring studio.", "mcp_calls": "0 — no MCP tool was called in this round (no reads, no writes).", "api_writes": "1 REST proxy write this round: POST /repos/objectstack-ai/objectstack/issues/19483/comments (this addendum, through scripts/pm/post-stamped.mjs). One git push to the branch. ⛔ The PR body was NOT patched — see deviations.", "deviations": "The dispatch asked this round to PATCH the PR body. The dev role file carries an unconditional clause the other way — the dev writes the PR body once, in the call that opens it, never a PATCH; a later body change is named in the report and written by the seat — and the same file says a dispatch/role-file conflict is decided by the role file and must be named rather than silently resolved. So the body still describes the axis list as pending, and the exact replacement text is below for the seat to apply in one PATCH.", "pr_body_edit_for_the_seat": { "note": "Three passages in PR 19488's body are now stale. Replace each whole paragraph; change nothing else, and send no footer — the platform appends one on an edit.", "replace_paragraph_beginning": "⚠️ **The eleven-value axis list is the seat's proposal, not a ruling.**", "with": "✅ **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.", "then_replace_paragraph_beginning": "**风险与代价(含回滚)** — 一、十一个轴是本席的提议", "with_2": "**风险与代价(含回滚)** — 一、十一个轴您已在卡上定了,只改了一个名(API 那一轴由长名简化为 `area:api`),本轮已在四处改齐:标签行、两个清单文件的 `axis`、路上的功能点三行。二、新标签只在 objectstack 与 objectui 两个仓建,理由写在脚本里;要不要也给 hotcrm,您随时可加。三、章程的行数棘轮是零余量,所以这次是「加三行、退三行」换来的,退掉的三行内容都在别处有家(PR 正文里逐条列了);还有一行实在付不出,已按卡上要求报了准确数字(要 814,天花板 813),没有抬天花板 —— 您也已裁定保持现状。四、回滚就是 revert 这个 PR,新标签对象留在 GitHub 上不影响任何东西。", "then_replace_paragraph_beginning_3": "**你要做的** — 在 #19483 上确认或修改这十一个轴的名字", "with_3": "**你要做的** — 手动合并这个 PR(Tier H);轴名已定,无需再确认。" }, "open_questions": [], "out_of_scope_findings": [ "noted, not filed: unchanged from round 1 — docs/qa/platform-checklist/areas/*.json still has no unknown-top-level-key rule and no value check, so `axis` is accepted by presence alone; the carrier is whichever card next touches scripts/check-platform-checklist.mjs. The rename makes the point concrete: nothing in the tree would have caught a half-done rename, only the grep did.", "noted, not filed, 承接者:无 — ensure-pm-labels.sh is create-if-missing, so the eleven objects (now including area:api) reach the two repos only when a credentialed PM runs the script." ] }Addendum written 2026-09-21T03:36Z.
Generated by Claude Code
os-project-manager commentedon Sep 21, 2026
os-dev-report
{ "issue": 19483, "round": 3, "status": "done", "branch": "claude/issue-19483-feature-axis-charter", "pr": "https://github.com/objectstack-ai/objectstack/pull/19488", "head": "16418377774926fc3602f6a5649811557e24f21a", "session": "session_012GcsUbuqFGBibkEDMRC1eE", "premise_still_valid": true, "summary": "One commit (1641837) rewrites 「路上的功能点」 into the platform's feature map. Six blocks, one per step of the road as the 「唯一的度量,那条路」 paragraph names them, each block a bold line then its feature-point lines — no new headings. One line per feature point at capability level, in business language, spanning protocol → runtime → frontend; the end-user capabilities (records, access, workflow, reports, identity, files, i18n) sit at the step where the road first needs them, which is 本地跑起来、看到. The 路步 column is gone because the block position IS the step. The docs-authoring feature keeps its 「清单项待写」 slot at step ①, and its two platform-core docs-portal items now have a home there — the split the round-1 open question flagged is expressed by the map even though the area file's axis stays devpath. The 「优先级」 sentence 定级读「路上的功能点」 still reads right against the new block and is unchanged. The page's own rules hold: no counts, no pass/fail status, no ledger copied.", "section_shape": "95 section lines: 1 intro paragraph, 6 step blocks, 76 feature-point lines, blanks.", "completeness_totals": "264 items on disk = 264 mapped · 0 unmapped · 0 double-mapped · 0 ids absent from the ledger · 76 feature points", "tests": "Coverage proof (the artifact this round owes, listed in full below this JSON): the ids on the left are jq -r '.items[].id' over docs/qa/platform-checklist/areas/*.json, the right-hand side is the feature-point line that owns each. Gates on the new head 1641837, exit codes captured before any pipe: dispatch-gates --commands --repo objectstack-ai/objectstack derives the SAME 37 families as rounds 1 and 2 (diff of the command lists is empty), all 37 run, all exit 0, and --ran reconciles 37 derived / 37 run / 0 NOT-MEASURED / 0 UNRUN with no stale-tree warning. check:doc-authoring exit 0; check:platform-checklist exit 0 (OK — 15 areas, 264 items, the axis keys unchanged); check:nul-bytes exit 0; check:pm-skill-ratchet exit 0 with the charter files UNTOUCHED this round — SKILL.md 813/813, core-rules.md 151/151, widest table row 342/342; check:pm-label-desc-cap exit 0 (38 descriptions, longest 100). The familiar NOT-A-FINDING: check:doc-formula-expressions exited 3 (PREREQUISITE NOT MET) in the re-created worktree and exits 0 after building @objectstack/formula and @objectstack/lint through scripts/pm/os-verify-lock.sh (VERDICT command-exit 0); that second run is the recorded one. Only docs/NORTH-STAR.md changed this round (one file, +176/-13 against the merge base for the whole PR).", "mcp_calls": "0 — no MCP tool was called in this round.", "api_writes": "1 REST proxy write this round: POST /repos/objectstack-ai/objectstack/issues/19483/comments (this report, through scripts/pm/post-stamped.mjs). One git push, no rebase and no force-push — 1641837 sits on top of 420bd091. No labels, no ready flip, no auto-merge, no issues.", "deviations": "⛔ The PR body was again NOT patched, for the same named reason as round 2: the dev role file's unconditional clause is that the dev writes the PR body once, at the call that opens the PR, and names later body changes in the report for the seat to write; the same file decides a dispatch/role-file conflict in the role file's favour and requires the conflict to be stated rather than silently resolved. The paste-ready replacement for the PR body's roadmap section is in pr_body_edit_for_the_seat below.", "pr_body_edit_for_the_seat": { "note": "In PR 19488's body, replace the whole '## Step 2 — the North Star road section' block (from that heading down to the line before '## Step 3 — `domain:*` retreats to file ownership') with the text below. Change nothing else; send no footer — the platform appends one on an edit. If you also want the per-item listing in the body, it is the fenced block in this comment, unchanged.", "replacement": "## The roadmap section, rewritten in round 3\n\nThe 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.\n\nWhat 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.\n\n**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`.\n" }, "open_questions": [ { "question": "Two placements are judgment calls I can defend but the maintainer may read differently, and neither drops an item. (a) `studio-authoring.first-run-loop` sits at step ⑥ (迭代) rather than ① (写元数据), because the loop it pins — package → object → record → app → publish → end-user — IS the iteration the road's last step names; ① already carries the individual authoring capabilities. (b) the four import items sit at ⑥ rather than ② for the same reason: bringing the customer's existing data in is what the first iteration does.", "options": [ "A: keep both at ⑥", "B: move the first-run loop to ①", "C: move the import items to ② beside the other records lines" ], "recommendation": "A — ⑥ is otherwise thin and these are exactly what 'iterate once on a customer's sentence' means in practice; either move is a one-line edit in the map if you read it the other way." }, { "question": "The docs-portal items (platform-core.docs-audience-gate, platform-core.docs-portal-render) are owned by the studio docs feature point in the map while their area file's `axis` stays devpath (the ruling on that question was A). Should the two ever disagree?", "options": [ "A: leave it — the map is per feature point, the axis is per area file, and a later card can add a per-item axis", "B: split the platform-core area file so the docs items live under a studio-axis file" ], "recommendation": "A, unchanged from the ruling; the map is now the place that expresses the split, which is what the round-1 question asked for." } ], "out_of_scope_findings": [ "noted, not filed: the map's completeness is proved once, here, by a one-off listing — nothing in the tree re-checks it, so an item added to the checklist tomorrow will silently belong to no feature point. The card that next touches scripts/check-platform-checklist.mjs is the carrier if the maintainer ever wants that gated; it is deliberately not a script this round, per the dispatch.", "noted, not filed, 承接者:无 — the feature-point lines carry item ids, so a checklist item id rename would break the map's references; ids are append-only and stable by this card's own rule, so the exposure is bounded." ] }Coverage proof — every checklist item, and the feature point that owns it
The feature-point index, then every checklist item id and the feature point that owns it. Re-runnable: the ids on the left are
jq -r '.items[].id' docs/qa/platform-checklist/areas/*.json, the right-hand side is the id group on that line of 「路上的功能点」.Report written 2026-09-21T04:24Z.
Generated by Claude Code
os-project-manager commentedon Sep 21, 2026
os-dev-report
{ "issue": 19483, "round": 4, "status": "done", "branch": "claude/issue-19483-feature-axis-charter", "pr": "https://github.com/objectstack-ai/objectstack/pull/19488", "head": "410c37f7108c69c44601771e6ab2d6477e054a4e", "session": "session_012GcsUbuqFGBibkEDMRC1eE", "premise_still_valid": true, "summary": "One commit (410c37f, on top of 1641837 — no rebase, no force-push) fixes both lines the round-3 review named, touching only 「路上的功能点」 in docs/NORTH-STAR.md. The CEL formula items get their own feature point and leave the RestServerConfig line; the ADR-0057 lifecycle sweep leaves the packaged-object / activation-ledger line for its own ops line in step ②. Nothing else in the section moved: the diff is exactly two reworded lines and two new ones (+4 / -2 on the one file).", "totals": "264 items on disk = 264 mapped · 0 unmapped · 0 double-mapped · 0 ids absent from the ledger · 78 feature points (was 76) · 97 section lines · every line still four ` · ` fields, zero bare digits, zero new headings", "fix_1_formula": { "old": "- api · REST 面的构造契约:开关决定挂什么;公式与计时也归同一份契约管 · api-backend · rest-crud-config-contract, rest-batch-config-contract, rest-metadata-config-contract, rest-route-generation-tombstones, api-methods-verb-gate, server-timing-admin-gated, formula-gates, formula-stdlib-matrix", "new": "- api · REST 面的构造契约:开关决定挂什么、哪些动词准过,计时只对管理员开 · api-backend · rest-crud-config-contract, rest-batch-config-contract, rest-metadata-config-contract, rest-route-generation-tombstones, api-methods-verb-gate, server-timing-admin-gated", "added": "- api · 公式引擎:标准库函数逐个给出已知答案,写错的表达式在构建时就被挡下 · api-backend · formula-stdlib-matrix, formula-gates", "why": "The two items pin the CEL engine, read from their own titles: formula-stdlib-matrix is 'CEL formula stdlib: all registered functions give known answers against the BUILT package', formula-gates is 'Formula runtime fixes hold and date-arithmetic fails at build time'. Neither is a RestServerConfig construction fact. 计时 STAYS on the REST line because server-timing-admin-gated is still on it (verified against the ids left there), and 哪些动词准过 was added for api-methods-verb-gate, which the old wording never described." }, "fix_2_retention": { "old": "- devpath · 随包发来的对象只能扩不能改,启停逐条记在激活台账上;过期数据按保留期回收 · platform-core + access-security · packaged-object-extend-only, activation-ledger-registration-home, activation-ledger-row-contract, lifecycle-retention-sweep, access-security.activation-write-operator-gate", "new": "- devpath · 随包发来的对象只能扩不能改,启停逐条记在激活台账上 · platform-core + access-security · packaged-object-extend-only, activation-ledger-registration-home, activation-ledger-row-contract, access-security.activation-write-operator-gate", "added": "- devpath · 遥测与生命周期数据按保留期回收,声明了归档的对象绝不热删 · platform-core · lifecycle-retention-sweep", "why": "The item is the ADR-0057 hourly sweep over backdated telemetry rows, with the archive-declaring object never hot-deleted — platform ops while the app runs, not packaged-artifact governance. It gets its own short line in step ② beside the settings line rather than being glued to the platform-settings item, because the sweep is a scheduled behaviour and settings-hub-roundtrip is an authoring round-trip; the two share no acceptance surface." }, "tests": "Gates on the new head 410c37f, exit codes captured before any pipe: check:doc-authoring 0; check:platform-checklist 0 (15 areas, 264 items); check:pm-skill-ratchet 0 with the charter files untouched this round — SKILL.md 813/813, core-rules.md 151/151, widest table row 342/342; check:nul-bytes 0. Full derivation: dispatch-gates --commands --repo objectstack-ai/objectstack derives the SAME 37 families as rounds 1–3 (diff of the command lists empty), all 37 run, all exit 0, --ran reconciles 37 derived / 37 run / 0 NOT-MEASURED / 0 UNRUN. The usual NOT-A-FINDING: check:doc-formula-expressions exited 3 (PREREQUISITE NOT MET) in the re-created worktree and 0 after building @objectstack/formula and @objectstack/lint under scripts/pm/os-verify-lock.sh. Section invariants re-measured mechanically, not by eye: 78 feature-point lines, 0 lines whose field count is not four, 0 bare digits outside identifiers, 0 headings.", "mergeability_note": "origin/main moved while this round ran and now carries the sister charter PR (SKILL.md ceiling raised to 819, the `tooling` label row, a reworked ensure-pm-labels.sh). Probed rather than assumed: git merge-tree --write-tree HEAD origin/main exits 0 with a tree and no conflict, and reading that merged tree directly — SKILL.md 819 lines against the landed ceiling 819, core-rules.md 151/151, the eleven area rows all present, 78 feature-point lines. So this PR still lands green on the new main with no merge needed from this round; ⛔ no merge commit was made, since the dispatch scoped this round to one commit on one file.", "api_writes": "1 REST proxy write: POST /repos/objectstack-ai/objectstack/issues/19483/comments (this report, through scripts/pm/post-stamped.mjs). One git push, no rebase, no force-push. No labels, no ready flip, no auto-merge, no issues. PR body left alone this round as instructed — the seat writes the one-line note.", "mcp_calls": "0 — no MCP tool was called in this round.", "open_questions": [], "out_of_scope_findings": [ "noted, not filed: unchanged from round 3 — nothing in the tree re-checks the map's completeness, so a checklist item added tomorrow belongs to no feature point until someone re-runs the listing. Carrier named: whichever card next touches scripts/check-platform-checklist.mjs." ] }Report written 2026-09-21T04:55Z.
Generated by Claude Code
os-project-manager commentedon Sep 21, 2026
os-dev-report
{ "issue": 19483, "round": 5, "status": "done", "branch": "claude/issue-19483-feature-axis-charter", "pr": "https://github.com/objectstack-ai/objectstack/pull/19488", "head": "e58fc6b2eb22659d48abfb55a66a4dd2e30f4a24", "session": "session_012GcsUbuqFGBibkEDMRC1eE", "premise_still_valid": true, "summary": "One merge commit (e58fc6b, no rebase, no force-push) brings origin/main ea64bbc6e8 into the branch. Both conflicts sat at the 取卡全序 lines in SKILL.md and core-rules.md, and both sides are the maintainer's, so they are COMPOSED rather than chosen: main's order line verbatim, and main's ladder line with 功能点位次 inserted after `pm:blocking` — exactly where this branch's own line had it. Everything else takes main's side, including its deletions and the handover lines; nothing else of this branch changed, and the PR's file surface is still the same nineteen files.", "composed_lines": { "order (identical in both files)": "- 取卡全序:维护者直派插队卡(出处三件)> 契约面卡(判据见 `references/lanes/spec.md`)> 标签序。", "ladder (identical in both files)": "- 标签序:`priority:p0` > `pm:blocking` > 功能点位次 > `target:` 板上项 > p1 > p2 > p3 > 无级。", "SKILL.md's following line, unchanged from this branch": "- 全序每级现读/现算,零逐卡维护;同级先 `Bug` 再卡龄;无级/缺 `Path:` 轮报记分诊缺口。" }, "deviation_from_the_prescribed_wording": "The prescribed ladder line — main's, tie-break clause included, with 功能点位次 inserted — measures 134 bytes against the 120-byte per-line rule check:pm-skill-ratchet enforces on these files, so it cannot land: the gate would go red. Measured, not estimated: order line 119 B, main's ladder 116 B, composed-with-tie-break 134 B, composed-without 108 B. Resolution: the tie-break 同级先 `Bug` 再卡龄 stays on the FOLLOWING line in SKILL.md, where this branch already carried it, so every rule is stated exactly once and none is duplicated (grep: one occurrence in SKILL.md). core-rules.md has no such following line, so the summary there loses that one clause while SKILL.md keeps the full rule — which is what core-rules' own header prescribes (「细节以 SKILL.md 与其它 references 为准」). ⛔ No ceiling was raised and no other line was touched to make room.", "ratchet_counts": "node scripts/pm/check-skill-line-ratchet.mjs exit 0. SKILL.md 815 lines against ceiling 819 — headroom 4, and 815 is EXACTLY main's own count (main paid lines in #19502/#19506), so this branch's charter edits remain net zero on top of it. core-rules.md 151/151 headroom 0, also exactly main's count. Widest SKILL.md table row 342 (pin 342). os-dev.md 403/403, AGENTS.md 1109/1109 — untouched.", "merge_proof": "git merge-tree --write-tree origin/main e58fc6b2eb exits 0 with a tree (99b7f9ee28) and no conflict — the PR is mergeable against ea64bbc6e8 again. git diff origin/main...HEAD --name-status lists exactly the PR's nineteen files, all M, no additions adopted from main. git grep -n '取卡全序' .claude shows the composed order line in both charter files and the old spelling nowhere; the only other hit is the runbook's pre-existing section heading, untouched. No conflict marker survives anywhere in the tree, and the merge recorded no os-regen-pending entry (this branch touches no generator-owned path; main's two spec artifacts came in on main's side alone).", "tests": "Gates on the merged head, exit codes captured before any pipe: check:doc-authoring 0; check:platform-checklist 0 (OK — 15 areas, 264 items); check:pm-label-desc-cap 0 (39 descriptions now — main's `tooling` row plus this branch's eleven `area:*` rows — all ≤100 characters, longest 100); check:pm-skill-ratchet 0 with the counts above; check:nul-bytes 0. Full derivation on the merged head: dispatch-gates --commands --repo objectstack-ai/objectstack derives the SAME 37 families as rounds 1–4 (diff of the command lists empty) with NO stale-tree warning, all 37 run, all exit 0, --ran reconciles 37 derived / 37 run / 0 NOT-MEASURED / 0 UNRUN. The familiar NOT-A-FINDING: check:doc-formula-expressions exited 3 (PREREQUISITE NOT MET) in the re-created worktree and 0 after building @objectstack/formula and @objectstack/lint under scripts/pm/os-verify-lock.sh.", "api_writes": "1 REST proxy write: POST /repos/objectstack-ai/objectstack/issues/19483/comments (this report, through scripts/pm/post-stamped.mjs). One git push of the merge commit, no rebase, no force-push. No labels, no ready flip, no auto-merge, no issues. PR body left alone — the seat adds the line.", "mcp_calls": "0 — no MCP tool was called in this round.", "open_questions": [ { "question": "core-rules.md's 标签序 line now omits 同级先 `Bug` 再卡龄, which main had just landed there, because the composed line cannot carry it under the 120-byte rule. SKILL.md keeps the clause on the following line.", "options": [ "A: accept the summary omission — core-rules defers detail to SKILL.md by its own header", "B: pay a line in core-rules for a separate tie-break line, which needs a deletion elsewhere in that file (headroom 0)", "C: ask the maintainer for a one-line raise on core-rules" ], "recommendation": "A — the rule is stated in full in SKILL.md, the summary's contract is explicitly 'details defer to SKILL.md', and neither B nor C buys a reader anything the charter does not already say." } ], "out_of_scope_findings": [ "noted, not filed: `references/dispatch-runbook.md` carries a section heading 「车道取卡全序与 `pm:blocking`」 that still names the old single-ladder shape; it is a heading, not a rule line, and reads correctly under the new two-line spelling, so it is a note for whichever card next edits that runbook rather than a rider here." ] }Report written 2026-09-21T05:24Z.
Generated by Claude Code
os-project-manager commentedon Sep 21, 2026
Landing record — director seat, summon #25 (
session_012GcsUbuqFGBibkEDMRC1eE), 2026-09-21T07:42Z. PR #19488 merged by the maintainer's hand (approved on the final head, flipped ready and enqueued byhotlongat 2026-09-21T07:16Z; queue merge61170fa385da18a04e3fed75e8c65cbff801e008at 2026-09-21T07:41Z), verified by content on fetchedorigin/main:docs/NORTH-STAR.mdcarries 「路上的功能点」 (six road-step blocks, 78 feature-point lines — the whole feature map, every one of the 264 checklist items on exactly one line); SKILL.md's 〈状态模型〉 table has thearea:*row with its four readers and the 取卡全序 composes the maintainer's 插队 / 契约面 tiers with 功能点位次;scripts/pm/ensure-pm-labels.shcarries the elevenarea:*rows; the 15 area files carry a top-levelaxis. Reviews of record: 5755154226 (head420bd091), 5755471665 (1641837777), 5755610118 (410c37f7), 5755832213 (e58fc6b2, the merge), provenance 5755842833. The maintainer's rulings on this card: 「把北极星的「路」那一节改成可读的功能点顺序 立」, 「19483 api-integration 简化成 api 其他同意。」, and on the first roadmap draft 「19488 路上的功能点写的很奇怪,真的是平台总体的功能清单吗?怎么感觉是几个issue」 (answered by rounds 3–4).Same stroke: the eleven
area:*labels created in objectstack and objectui through REST with the script's exact name / colour / description rows (ghis not available to this seat; the rows are the register);area:recordsplaced on #18164 / #19518 / #19519. Standing, for the seats named: triage grades new cards with anarea:*at first touch (⛔ no backfill of the stock); the map's completeness is proved once, not gated (carrier: the next card touchingscripts/check-platform-checklist.mjs); #19482'sPath:readsP2on the old seven-step count (triage corrects on next touch). GitHub closed this card on theFixeskeyword;pm:dispatchedremoved in this stroke so the close is whole.Generated by Claude Code
docs(north-star,pm-dispatch): the feature axis — area:* labels, the 「…