Skip to content

pm-dispatch: a metadata project's cards, decisions included, live in its own repo; only platform problems are filed on objectstack/objectui - #17315

Merged
os-zhuang merged 1 commit into
mainfrom
claude/issue-17288-card-home
Sep 10, 2026
Merged

pm-dispatch: a metadata project's cards, decisions included, live in its own repo; only platform problems are filed on objectstack/objectui#17315
os-zhuang merged 1 commit into
mainfrom
claude/issue-17288-card-home

Conversation

@os-justin

Copy link
Copy Markdown
Collaborator

Fixes #17288

裁决 — the maintainer's words, verbatim and untranslated (PM chat session, 2026-09-10T03:2xZ)

「hotcrm 所有的卡本来就应该在 hotcrm,包括其他元数据项目。除非元数据项目发现平台由问题,给平台立卡片。现在就是这么 操作的」

Reading (binding, as the card carries it): a metadata project's cards — work cards AND decision cards — live in that project's own repo (hotcrm and every other metadata project); the only cards a metadata project files on the platform are the platform problems it finds, filed as ordinary platform cards on objectstack / objectui. That is already the practice (hotcrm carries the full state-label set including needs-user-decision and holds open decision cards today); the rule text was what disagreed, in three 〈多仓协调〉 rows, their core-rules digest twin, and the hotcrm charter.

Every rewritten line, before / after, beside the ruling clause it implements

Net-zero lines in all three files; every rewritten line sits under the ratchet's 120-byte width rule (measured widths in brackets).

1. SKILL.md 〈多仓协调〉, the 单车道仓 row — implements 「hotcrm 所有的卡本来就应该在 hotcrm,包括其他元数据项目」 (a single-lane repo's decision cards live in that repo's own inbox; nothing defaults to objectstack).

  • before [111 B]: 「单车道仓 repo:* 席自理机械三务,⛔ 不产 domain:*;决策卡默认入 objectstack 收件箱。」
  • after [117 B]: 「单车道仓 repo:* 席自理机械三务,⛔ 不产 domain:*;决策卡入本仓收件箱,不落 objectstack。」
  • The first two clauses are byte-identical; only the third changed.

2. SKILL.md 〈多仓协调〉, the 收件箱 row under 规则 1 — implements the same clause read from the inbox side (the maintainer's inbox is per repo: objectstack and objectui for platform decisions, each metadata project for its own).

  • before [71 B]: 「维护者收件箱恒为 objectstack;在飞卡 ⛔ 不中途转仓。」
  • after [114 B]: 「决策收件箱按仓:平台在 objectstack / objectui,元数据项目在本仓;在飞卡 ⛔ 不中途转仓。」
  • 「在飞卡 ⛔ 不中途转仓」 kept verbatim. The row now uses the same term as the director charter's cross-repo duty (「决策收件箱 needs-user-decision 跨仓勤务」), which was checked and left unchanged — it already reads every repo's inbox.

3. SKILL.md 〈多仓协调〉, the 目标仓不可达 row under 规则 5 — implements 「现在就是这么 操作的」 together with 「除非元数据项目发现平台由问题,给平台立卡片」: an unreachable target repo is a reading gap, not a home; a card that belongs in another repo is filed there by a seat that can reach it, and the seam rule (规则 1 的缝卡三行, untouched) stays for genuine coordination cards only.

  • before [84 B]: 「目标仓不可达时按缝卡规则落 objectstack 带 repo:* + 具名读者。」
  • after [119 B]: 「目标仓不可达是读数缺口,不是落点:由可达席在目标仓立卡,此前请求记座位贴或协调卡。」

4. references/core-rules.md 〈多仓协调〉 digest, the line carrying 「在飞卡 ⛔ 不中途转仓」 — the twin (SKILL.md 优先级 rule: 「一条规则在本文与核心条款一处改动,另一处同 PR 同改」) of rows 1 and 2.

  • before [90 B]: 「跨仓查重与 shadow 检查恒归中央 ⛔ 不下放,在飞卡 ⛔ 不中途转仓。」
  • after [118 B]: 「跨仓查重与 shadow 检查恒归中央 ⛔ 不下放;决策卡入本仓收件箱,在飞卡 ⛔ 不中途转仓。」
  • Why this line and not the two the dispatch named (the 单车道 line and the 缝卡 line): those sit at 119 B and 116 B of the 120-byte width rule with the file at its 151-line ceiling, so neither can take a clause without deleting text of a rule that did NOT change (their SKILL.md twins — the first two clauses of row 1, and the seam-card rows — are byte-identical in this PR). The digest line that already holds row 2's other clause is the true twin slot and had 30 B of headroom. Row 3 has no digest twin today (the digest never mentioned unreachability) and none is added: under the width rule it would cost a clause of an unchanged rule. Measured, declared here and in the report.

5. references/lanes/hotcrm.md 〈范围〉, the last row — the mirror sentence: hotcrm's own cards, decisions included, live in hotcrm. Folded into the row that already said the work-card half (「纯 hotcrm 修复住 hotcrm 仓」), so the platform-gap exception row (「建设 hotcrm 时发现的平台能力缺口,立普通平台卡到 objectstack 或 objectui」 — the ruling's 「除非…给平台立卡片」, already the practice) and the seam-label row (「repo:hotcrm 缝标签只给真协调卡」) stay byte-identical, as the card asks.

  • before [67 B]: 「纯 hotcrm 修复住 hotcrm 仓:issue 住在修复落地的仓。」
  • after [111 B]: 「hotcrm 自己的卡(含决策卡)都住 hotcrm 仓:issue 住在修复落地的仓,决策入本仓收件箱。」

Untouched by construction (md5 measured before and after): the decision frame block (22f2339f0acb64cdb50c7adc9db681c3), the lane table, every tier row, the state table's needs-user-decision row (「维护者的收件箱」 is generic and stays). No issue numbers, no model names, no ruling dates in any skill file — the date lives here.

维护者速读(草稿)

改了什么

把 PM 技能里三条「卡片住哪个仓」的规则改成你说的做法:元数据项目(hotcrm 等)自己的卡,包括要你拍板的决策卡,住它自己的仓;平台的决策卡住 objectstack / objectui;元数据项目只有发现平台问题时才在平台仓立普通卡。顺带把核心条款摘要和 hotcrm 车道说明改成同一句话。三个文件行数不变,只改了五行文字。

为什么改

规则原文写的是「决策卡默认入 objectstack 收件箱」「维护者收件箱恒为 objectstack」「目标仓不可达就落 objectstack」——和你 9 月 10 日说的「hotcrm 所有的卡本来就应该在 hotcrm」正好相反,也和实际做法相反(hotcrm 仓今天就挂着 needs-user-decision 的卡)。规则和做法打架,下一个按规则行事的席位就会把 hotcrm 的决策卡立错仓。

风险与代价(含回滚)

  • 只改规则文本,不动任何代码、不发布任何包,没有 changeset。
  • 已经放错仓的存量卡(objectstack 里带 repo:hotcrm 的六张、决策箱里问同一件事的 objectui 那张)不在本 PR 里动,归分诊或各仓席位另行搬迁。
  • 回滚就是 revert 这一个提交;五行改回原文,行数与门禁都不变。

席位意见

(留空)

你要做的

一个动作:人工合并本 PR(.claude/** 是受管面,只能你来合)。

Acceptance notes

  • Governed terminal. node scripts/pm/check-governed-merges.mjs --test SKILL.md core-rules.md lanes/hotcrm.md → exit 3, verdict line: 「governed-surface predicate: 3 of 3 path(s) hit the register (5 surfaces, repo-agnostic). ⛔ GOVERNED — a human merge is the review record for this PR」. Draft PR; never ready / enqueue / auto-merge / approve by any seat.
  • Changeset: none owed. Nothing in .claude/** ships in any package's files[]; the PM applies skip-changeset.
  • Gates, verdict lines quoted (all run on commit 28dd458 in the worktree, exit captured before any pipe):
    • pnpm check:pm-skill-ratchet → exit 0 — 「.claude/skills/pm-dispatch/SKILL.md is 812 lines (ceiling 812; headroom 0)」「references/core-rules.md is 151 lines (ceiling 151; headroom 0)」「references/lanes/hotcrm.md is 53 lines (ceiling 53; headroom 0)」; no line over the 120-byte budget.
    • pnpm check:skill-frame-sync → exit 0 — 「2 copies of the decision frame are structurally isomorphic across 2 files … 76 markdown files scanned for undeclared copies」.
    • pnpm check:skill-compatibility → exit 0 — 「11 SKILL.md file(s) reconciled against 80 workspace packages … 11 pinned major(s) all match」.
    • pnpm check:pm-skill-id-lint → exit 0 — 「27 file(s) clean (pattern /#[0-9]{3,}/g)」.
    • pnpm check:pm-governed-prose → exit 0 — 「2 instruction surface(s) name all 5 registered governed surfaces … and claim no others」.
    • pnpm check:nul-bytes → exit 0 — 「OK (scanned 8150 text file(s) … no raw ASCII control bytes)」.
    • pnpm check:pm-governed-merges → exit 0 (self-test 274 assertions; live generator certified this tree).
    • Whole-tree families the derivation names on every card: check:agent-test-spelling, check:doc-authoring, check:driver-memory-census, check:refd-timer-probe, check:watch-hint-literal, node scripts/check-closing-keyword-parity.mjs (+ --self-test), node scripts/check-comment-mask-corpus.mjs, node scripts/pm/check-governed-queue-guard.mjs --self-test → all exit 0.
    • pnpm --filter @objectstack/lint run check:doc-formula-expressions → exit 3 PREREQUISITE NOT MET on the fresh worktree (@objectstack/formula and @objectstack/lint unbuilt); built both under scripts/pm/os-verify-lock.sh (VERDICT command-exit 0, lock held 169s, waited 0s) and reran → exit 0 — 「✓ check:doc-formula-expressions: 14 predicate(s) on a statically determinable field layer judged clean; 6 skipped as undeterminable」.
    • Derivation: node scripts/pm/dispatch-gates.mjs --commands (no paths; the script took the changeset itself — 3 committed paths vs merge base 8c9bd8f) = 16 families, identical to the path-based preview; --ran reconciliation: 「16 derived famil(ies) accounted for — 16 run, 0 NOT-MEASURED」, one extra beyond the union (check:skill-compatibility).
  • Ratchet arithmetic. SKILL.md 812 → 812 (3 lines rewritten in place); core-rules.md 151 → 151 (1 line); lanes/hotcrm.md 53 → 53 (1 line). Widths 111→117, 71→114, 84→119, 90→118, 67→111 bytes, all ≤ 120. No ceiling touched.
  • Assumptions A–E, measured. A: ceilings 812 / 151 / 53 all at headroom 0 — confirmed, hence in-place rewrites and the hotcrm mirror folded into an existing row; the 120-byte width rule is the second constraint the PM's candidate wordings did not clear (they measured 128 / 123 / 121 / 136 B), so each was tightened. B: same-day churn c47edbb2, d03c3c96, 8efe2753 confirmed on git log; the rows sat at :191 / :210 / :235 on 8c9bd8f5 — re-measured after fetch, unchanged. C: check:pm-governed-prose and check:skill-compatibility both green above (the prose gate reads governed-surface code spans, not these rows). D: no card numbers in any skill file; the relocation of the existing repo:hotcrm / repo:objectui cards is not in this diff. E: the state table's needs-user-decision row stays byte-identical.
  • Deviations from the dispatch's line plan (measured, not preference). (i) The core-rules twin lands on the digest line carrying 「在飞卡 ⛔ 不中途转仓」 rather than on the 单车道 / 缝卡 lines — width rule, see item 4. (ii) The hotcrm mirror sentence is folded into the 「纯 hotcrm 修复住 hotcrm 仓」 row rather than into the exception row or the seam-label row, which the card asks to keep — both stay byte-identical. (iii) The unreachable-target row's wording carries 「此前请求记座位贴或协调卡」 as the ruling reading gave it; a coordination card is a record, the seat post an accelerator — consistent with the 规则 5 row above it.
  • Not this PR, remains open. [Decision] 22 pure-objectui defect cards live in objectstack under repo:objectui, but objectui IS reachable — the seam fallback is being used where its precondition does not hold #17250 is evidence only and is not decided here; the six repo:hotcrm cards in objectstack and the 22 repo:objectui cards are relocation acts for triage / the repo seats. Delete the published skills/objectstack-pm-dispatch skill — a stale three-state copy of the internal PM protocol with no known consumer, shipped into every new app — and retire its catalog row, docs page, frame-sync copy, tier-table entry, ratchet pins and gate fixtures (maintainer ruling 2026-09-10) #17311 (parallel) owns scripts/pm/dispatch-gates.mjs, scripts/check-*, skills/**, packages/** and the docs page — none touched here.
  • Out of scope, noted, not filed (bearer: none): none found.

Generated by Claude Code

…its own repo; only platform problems are filed on objectstack/objectui

Three 多仓协调 rows sent a single-lane repo's decision cards to the objectstack
inbox, fixed the maintainer's inbox at objectstack, and made an unreachable
target repo a home for the card. The maintainer's ruling (2026-09-10, verbatim
in the PR body) says the practice is the other way round: a metadata project's
cards — work and decision cards alike — live in that project's own repo, and
the only cards it files on the platform are the platform problems it finds.

- SKILL.md 单车道仓 row: decision cards enter the repo's own inbox, never
  objectstack by default.
- SKILL.md 收件箱 row: the decision inbox is per repo — platform decisions in
  objectstack / objectui, each metadata project's in its own repo; 在飞卡
  ⛔ 不中途转仓 unchanged.
- SKILL.md 目标仓不可达 row: unreachability is a reading gap, not a home — a
  seat that can reach the target repo files the card there; until then the
  request rides the seat post or a coordination card.
- core-rules digest: the same inbox rule beside 在飞卡 ⛔ 不中途转仓 (the
  twin slot; the neighbouring digest lines have no byte headroom and their
  own rules are unchanged).
- hotcrm charter: hotcrm's own cards, decision cards included, live in hotcrm;
  the platform-gap exception row and the seam-label row stay byte-identical.

Net-zero lines in all three files (812 / 151 / 53), every rewritten line
within the 120-byte width rule.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MoTv7pn338AZ71owsp19gQ
@github-actions github-actions Bot added size/s documentation Improvements or additions to documentation labels Sep 10, 2026
@os-justin os-justin added the skip-changeset PR has no user-facing published change; bypasses the changeset gate label Sep 10, 2026 — with Claude

Copy link
Copy Markdown
Collaborator Author

维护者速读

改了什么 —— 派发协议里三行把「元数据项目的决策卡」送进 objectstack 收件箱的规则,改成你说的做法:单车道仓(hotcrm 等元数据项目)的决策卡入本仓收件箱;收件箱按仓,平台决策在 objectstack / objectui,元数据项目在本仓;目标仓够不着是读数缺口不是落点,由够得着的席位在目标仓立卡。核心条款一处孪生行同改,hotcrm 章程一行改成「hotcrm 自己的卡(含决策卡)都住 hotcrm 仓」。三个文件各改一行级,净零行,全在天花板上。

为什么改 —— 你的原话(PR 正文顶部逐字引用):hotcrm 所有的卡本来就应该在 hotcrm,其他元数据项目同理,只有平台问题才给平台立卡,现在就是这么操作的。实测也是:hotcrm 有全套状态标签,三张决策卡已经住在 hotcrm。规则文本反着写,新席位照本宣科就会把卡放错仓。

风险与代价(含回滚) —— 纯文本,无代码、无门禁逻辑。风险一点:「目标仓不可达」那行从「落 objectstack」改成「由可达席在目标仓立卡」,对没有任何可达席的仓(cloud / objectos / www 当前无席位)意味着卡先只在座位贴或协调卡上记着;这是把真实状态写明,不是新的等待。回滚 = 整个 PR 反向,无依赖。

席位意见 —— 本席按契约复审档自审通过:三行与你的原话逐句对得上;core-rules 孪生行落在带「在飞卡不中途转仓」的那行(dev 量过另两行没有 120 字节余量,本席认可这个落点);hotcrm 章程改在「纯 hotcrm 修复住 hotcrm 仓」那行,例外行与缝标签行保持原样。棘轮 812 / 151 / 53 净零,决策框架块 md5 未动,frame-sync、id-lint、governed-prose 本席在复核 worktree 重跑全绿。objectstack 里现存 6 张 repo:hotcrm 卡的搬迁是分诊/hotcrm 席的动作,不在本 PR。

你要做的 —— 人工合并本 draft PR(受管面 .claude/**,席位不翻 ready、不入队、不批准)。


Generated by Claude Code

@os-zhuang
os-zhuang marked this pull request as ready for review September 10, 2026 06:32
@os-zhuang
os-zhuang added this pull request to the merge queue Sep 10, 2026
Merged via the queue into main with commit 47863f4 Sep 10, 2026
34 of 35 checks passed
@os-zhuang
os-zhuang deleted the claude/issue-17288-card-home branch September 10, 2026 06:54
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentation Improvements or additions to documentation needs-user-decision size/s skip-changeset PR has no user-facing published change; bypasses the changeset gate

Projects

None yet

3 participants