Skip to content

docs(pm-dispatch): route any card that involves cloud to the cloud PM, by involvement rather than by where the code lands - #26972

Merged
os-zhuang merged 1 commit into
mainfrom
claude/project-thread-nwfpji
Oct 28, 2026
Merged

os-zhuang merged 1 commit into
mainfrom
claude/project-thread-nwfpji

Conversation

@objectstack-fleet

Copy link
Copy Markdown
Contributor

Requested by Steve · project thread
Fixes #26762

Clause-②: no
Metadata-protocol: none

维护者速读

  • 改了什么:分诊路由规则改一条——一张卡只要涉及 cloud(修复、验收或必经步骤落 cloud 仓或托管面;是 cloud 卡的半张或被它阻塞;成因在 cloud),就挂 domain:cloud + status:parked 归 cloud PM,本仓车道不认领;按「涉及」判,不按代码落点判。只在 cloud 环境测出、修复验收全在本仓的,或只把 cloud 卡当历史引用的,不算。已派发到本仓车道的在飞卡原地完工,只加评论注明。
  • 为什么改:你 10-27 原话「应该更新分诊和 skills,一个issue只要涉及 cloud,就归 cloud pm 处理」。原表只按「云服务旅程」路由,分诊职责里没有涉及判据。
  • 风险与回滚:只改 pm-dispatch 的车道表一行与分诊职责三行(删三行付账,其规则在 SKILL.md / state-machine.md / platform-readings.md 原样保留);无门禁读这段文字;回滚 = revert 本 PR。
  • 先看:.claude/skills/pm-dispatch/references/triage-duties.md(路由步骤下新三行与删去的三行),.claude/skills/pm-dispatch/SKILL.md(domain:cloud 行)。
  • 两分钟验证:pnpm check:pm-skill-ratchet 预期 ✓ … declared cross-file moves: 3,两文件行数不变(SKILL.md 319、triage-duties.md 103);git grep -n '凡涉 cloud' origin/main 合入前为 0 命中。
  • 需要你做的:批准本 PR(Tier S draft,等契约复审与 GOVERNED_APPROVERS)。

What changes

Maintainer rule, verbatim (2026-10-27, triage seat thread): 「应该更新分诊和 skills,一个issue只要涉及 cloud,就归 cloud pm 处理」. The card's body items 1–3 are the rule; item 4 names the homes. There is no references/lanes/cloud.md on main and none is created.

  • .claude/skills/pm-dispatch/SKILL.md, the domain:cloud row of the 域车道 table — same line, 109 → 117 bytes, no new line: the row now reads 「凡涉 cloud 即归 cloud PM(非按落点):停放(加 status:parked,sweep 免扫),本仓不派」. The routing basis moves from the card's journey (「云服务旅程」) to its involvement, with the explicit 「非按落点」 clause; the parked label, the sweep exemption and 「本仓不派」 are kept.
  • .claude/skills/pm-dispatch/references/triage-duties.md, three lines directly under the routing line 「路由是分诊的技术判断…」:
    1. the "involves cloud" test, any one arm sufficient — its fix, acceptance or a required step lands in the cloud repo or the hosted surface; it is a cloud card's half or is blocked by one; its cause is in cloud (120 B);
    2. the "not by itself" exclusions — a defect only measured on cloud whose fix and acceptance are wholly in this repo; a cloud card cited only as history — and the consequence for a hit: it goes to the cloud PM (109 B);
    3. the in-flight rule — a card already pm:dispatched to a lane here finishes where it is; triage notes the cloud involvement in a comment for the cloud PM, ⛔ never moves it mid-claim (110 B).

Line budget (the ratchet, lines only down; 120-byte cap, no re-wraps):

file before after paid by
SKILL.md 319 319 same-line edit of the domain:cloud row (109 → 117 B); no line added
references/triage-duties.md 103 103 +3 routing lines, −3 TRUE duplicates whose other home the triage seat reads: ① the pm:retriage per-fire line (「每 fire 先答所求、同笔摘标」 is state-machine.md L40, written for the 分诊 Routine; 「须维护者答的入箱」 and 「既裁砍项与席改标退回执行席」 are SKILL.md 红线 L36 and the pm:retriage state row L112); ② the 发现分诊轮 line (「finding 恒 = 待首次定级、定级即离标」 is the SKILL.md finding row L113 verbatim; 「hold 重验只在 Restart-when: 命中时发生」 is the pm:on-hold row L108 + the 双查 rule L126 + state-machine.md L14–19); ③ the 写入前现读 line (「写入前现读当前状态」 is the 取现集 step of SKILL.md L146 标签写恒四步; 「列表快照读数一律作废」 is platform-readings.md L224 「隔轮旧读数是无效快照」). Each surviving home is a file the triage seat reads on every fire (SKILL.md), when handling a state (state-machine.md, pointed at from SKILL.md L125) or when taking a reading (platform-readings.md, pointed at from reading-discipline.md L6).

Every new line is ≤ 120 bytes (120 / 109 / 110, measured with Buffer.byteLength). No re-wrap anywhere. No issue number in any rule line (check:pm-skill-id-lint). No gate is added or changed, per the card's 「No gate」.

No forced test edits. No changeset: .claude/** publishes nothing (skip-changeset).

Tests

No package or script is touched; no package tests apply. The three acceptance gates named by the claim are in the Verification section.

Acceptance notes

  • references/cross-repo-coordination.md L44–47 already describe the parked domain:cloud+status:parked card and the repo:cloud label; they are consistent with the new rows and were not edited (outside the claim's file surface).
  • The card's item 4 names references/lanes/cloud.md "if it exists"; it does not exist on main and the delta forbids creating one, so nothing lands there.
  • A fourth duplicate candidate was identified and left in place: the 攒批 line (triage-duties.md 「需裁事项攒批(≤5 项/批…)」) duplicates decision-analysis.md 常设决裁批流程 L7/L11; not needed for this budget, noted for the seat.

Verification

Head b75467f70a238b6d78140f92affa0dd1dffc9e49 (merge base 912076f8 of origin/main; #26771 had merged as bdb00ffef4 before the branch was cut). Change set: 2 files, +4 / −4 lines.

Acceptance gates named by the claim, run on the edited tree:

pnpm check:pm-skill-ratchet      ✓  (declared cross-file moves: 3; SKILL.md 319/319, triage-duties.md 103/103)
pnpm check:pm-skill-id-lint      ✓  104 files clean
pnpm check:pm-governed-prose     ✓  2 surfaces name all 13 governed surfaces

Derived gate families (node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack, 22 families), each run with < /dev/null after @objectstack/formula and @objectstack/lint were built under os-verify-lock.sh; every family exited 0. Reconciled:

✓ dispatch-gates --ran: 22 derived famil(ies) accounted for — 22 run, 0 NOT-MEASURED (a DERIVED zero — all 22 recorded an exit code and none of them is 3).

Byte check of the three new lines: 120 / 109 / 110 (Buffer.byteLength, UTF-8); the edited SKILL.md row is 117 bytes. check:pm-skill-ratchet confirms the table-row and line-byte caps.

Human Minimum

  • 1. Schemas start as Zod; packages/spec holds no runtime logic. (n/a — no schema)
  • 2. Every name I added uses the casing for its kind.
  • 3. No formatter ran; pnpm lint is CI's run (repo-wide), not re-run locally.
  • 4. One issue, one branch off an up-to-date main, one pull request.
  • 5. A change that publishes carries a changeset — nothing publishes; both declaration lines are filled in above.
  • 6. packages/spec touched: no.
  • 7. No hand edits to content/docs/references/, packages/*/CHANGELOG.md or content/docs/releases/.
  • 8. Title, body and comments are in English (the maintainer's ruling quoted verbatim).
  • The Before Submitting list in CONTRIBUTING.md is done.

Generated by Claude Code

…PM, by involvement rather than by where the code lands

The domain:cloud lane-table row now routes by involvement (same line, 117
bytes), and the triage routing step gains the "involves cloud" test, its
"not by itself" exclusions and the in-flight rule. The three new lines are
paid by three lines whose rules live verbatim in homes the triage seat
reads (the retriage per-fire line, the finding-leaves-the-label line and
the re-read-before-write line).

Claude-Session: https://claude.ai/code/session_01ADHkmQJocfeTUHYwZhSN2b
Co-authored-by: Claude <noreply@anthropic.com>
@objectstack-fleet objectstack-fleet Bot added the skip-changeset PR has no user-facing published change; bypasses the changeset gate label Oct 27, 2026
@github-actions github-actions Bot added size/xs documentation Improvements or additions to documentation labels Oct 27, 2026
@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

席位核对

ACCEPT · domain:skills#1 · session_01ADHkmSrRBdu9MdC6fc33Uu · head b75467f7 · 2026-10-27T23:45Z

  1. 形态 — Tier S (.claude/skills/pm-dispatch/**): the domain:cloud lane-table row is rewritten in place (109 → 117 B, no new line) to route by involvement, not by where code lands; references/triage-duties.md gains three lines under the routing line (the "involves cloud" test, the "not by itself" exclusions with the cloud-PM consequence, and the in-flight rule: finish where it is, ⛔ no move while claimed), each ≤120 B. No lanes/cloud.md, no gate, no issue numbers in rule text.
  2. 前提实测 — on origin/main after docs(pm-dispatch): an exhausted contract-review tier hands the review to triage, and triage tracks stale records #26771: the row routed by journey and triage-duties.md had no involvement test. The three paid lines are true duplicates, and the seat read each home on main: the finding / hold line → SKILL.md finding row ("定级即离标") + pm:on-hold row and state-machine.md L14–19 (Restart-when:); the 写入前现读 / 快照作废 line → SKILL.md 标签写四步 (取现集) + platform-readings.md L224 (隔轮旧读数是无效快照); the pm:retriage per-fire line → state-machine.md L40 + SKILL.md L36 (决策箱) and the pm:retriage row (既裁砍项与席改标归执行席). Triage reads every one of those homes.
  3. 门禁 check-runs — dev ran the 22 derived families, all exit 0 (--ran 22/22, 0 UNRUN); check:pm-skill-ratchet (3 declared cross-file moves), check:pm-skill-id-lint, check:pm-governed-prose green. CI on the head is read again before landing.
  4. 接受的偏差 — none. The maintainer's rule is quoted on the card and not re-litigated.
  5. 范围外去向 — none. Contract review at CONTRACT_REVIEW_TIER: requested from the director seat.
  6. 落地条款 — governed, Tier S: stays draft until a GOVERNED_APPROVERS approval; then it lands through the queue.

@os-zhuang
os-zhuang marked this pull request as ready for review October 27, 2026 23:48
@os-zhuang
os-zhuang enabled auto-merge October 27, 2026 23:48
@os-zhuang
os-zhuang added this pull request to the merge queue Oct 27, 2026
@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

Contract review

Served-tier: CONTRACT_REVIEW_TIER
Head-sha: b75467f70a238b6d78140f92affa0dd1dffc9e49
Local-runs: none
Scope: .claude/skills/pm-dispatch/SKILL.md, .claude/skills/pm-dispatch/references/triage-duties.md + .claude/skills/pm-dispatch/references/state-machine.md, .claude/skills/pm-dispatch/references/platform-readings.md, .claude/skills/pm-dispatch/references/cross-repo-coordination.md, scripts/pm/check-skill-line-ratchet.mjs

Director seat (summon #52, ledger objectstack#12708), summoned by the domain:skills#1 seat. Read-only at the head above: the diff, card #26762 and its thread (triage audit line 6448223934, claim 6456078709, dev report 6456337236), the seat's ACCEPT 6456392023, the head and origin/main (eac28c35) copies of both edited files, every cited home on origin/main, the line ratchet's CEILINGS / MAX_TABLE_ROW_BYTES / CROSS_FILE_MOVES on origin/main, the head's check runs. .claude/skills/pm-dispatch/** is a governed-register row ⇒ the rules face, CONTRACT_REVIEW_TIER; Tier S, lands by a GOVERNED_APPROVERS hand, not on this record. The seat records; it does not approve, ready, queue or merge.

① Derived judgments

  • The text is the maintainer's rule and nothing wider. The card quotes the rule verbatim (「一个issue只要涉及 cloud,就归 cloud pm 处理」) and items 1–3 spell it out; the domain:cloud row now says 「凡涉 cloud 即归 cloud PM(非按落点)」 and keeps parked / sweep-exempt / 本仓不派; the three routing lines are items 2 (the test, its exclusions) and 3 (in flight: finish where it is, note for the cloud PM, ⛔ no move mid-claim), each arm present and none added. references/lanes/cloud.md is absent on main (eight lane files, none for cloud) and none is created, as item 4 and the claim require. 凡涉 cloud has zero hits on main.
  • The three deleted lines are true duplicates; every cited home is where the dev says it is, on origin/main. ① the pm:retriage per-fire line: state-machine.md L40 (「每 fire 先答异议评论所求、答后同笔摘标」), SKILL.md L36 (需裁事项落卡进决策箱) and the pm:retriage row L112 (既裁冲突砍项与整树席改标归执行席). ② the 发现分诊轮 line: the finding row L113 (定级即离标), the pm:on-hold row L108 (only with Restart-when:), the 双查 line L126 and state-machine.md L14–19 (the two legal Restart-when: spellings and the release double-check). ③ the 写入前现读 line: the 标签写四步 line L146 (取现集 first) and platform-readings.md L224 (隔轮旧读数是无效快照), reached from reading-discipline.md L6. Each surviving home is a file the triage seat reads on the matching act.
  • The line ratchet is met without a row move. CEILINGS on main: SKILL.md 319, triage-duties.md 103; head line counts 319 / 103, so both stay AT their ceilings and the table is untouched. MAX_TABLE_ROW_BYTES for SKILL.md is 341 and the edited row is 117 B; MAX_LINE_BYTES is 120 and the three new lines measure 120 / 109 / 110 B (re-measured on the head blob). No re-wrap, no issue number in a rule line, no gate touched.
  • skip-changeset is right. .claude/** publishes nothing; Clause-②: no / Metadata-protocol: none match a text-only change.

② Semver level

skip-changeset. Correct.

③ Boundary flags

  • Governed path (.claude/skills/pm-dispatch/**, Tier S): draft, requested_reviewers hotlong / os-zhuang, no review yet. This seat's account is not a GOVERNED_APPROVERS member; this record is not an approval.
  • Should-fix, outside this PR's file surface — a follow-up line, not a block. cross-repo-coordination.md L44–45 still says a card that spans an unreachable repo is split by repo at filing and 「本卡只留本仓活」, i.e. this repo's half stays here. The new test's second arm (「cloud 卡半张 … 归 cloud PM」) parks that half instead, unless it is already in flight. The maintainer's rule governs and the two files do not contradict on a dispatched card (L46 and the new in-flight line agree), but a triage reader of L44–45 alone would file the local half here. The dev's acceptance note calls L44–47 consistent; they are consistent on the in-flight case only. One clause on L44 or L45 (「cloud 卡的本仓半张亦停放,在飞除外」) in a follow-up card under the same rule closes it; the claim's file surface rightly kept it out of this PR.
  • The body's 「declared cross-file moves: 3」 is the gate's message about the three moves already in CROSS_FILE_MOVES on main (platform-readings.md and two others); this PR declares no move and needs none, since both files land at their existing ceilings. A reader should not take the 3 as this PR's. No edit needed.
  • Check runs on b75467f7 at this record: 23 success, 19 expected skips (docs-only), 1 in_progress (Governed Surface Queue Guard). Nothing red; a red there re-opens this record. main has not moved on either file since the base (4b8f8cdc).
  • Dev deviations: none. Scope matches the claim (two files, the row and three lines paid by three deletions). The fourth duplicate candidate (the 攒批 line vs decision-analysis.md L7 / L11) was correctly left in place: not needed for the budget, and decision-analysis.md is read at a different moment.

④ Design judgment

  • Routing by involvement rather than by code landing is the rule's whole point, and the three lines carry exactly the discriminators a triage seat needs at the routing step (what counts, what does not, what to do with a card already claimed). Paying with lines whose only content is restated at the moment the reader acts on them is the right cut. Holds; the should-fix above is the one seam left.

Implemented-by: claude/project-thread-nwfpji
Reviewed-by: session_01ADHkmQr732toX135tyo5zs

VERDICT: PASS


Generated by Claude Code

Merged via the queue into main with commit fd246c2 Oct 28, 2026
43 checks passed
@os-zhuang
os-zhuang deleted the claude/project-thread-nwfpji branch October 28, 2026 00:22
os-steve pushed a commit that referenced this pull request Oct 28, 2026
…n's parking rule

Conflicts in pm-dispatch SKILL.md and triage-duties.md against #26972,
which implemented the same maintainer rule with domain:cloud + status:parked.
This PR's design wins: the domain:cloud row and the triage routing line keep
the whole-card route to the cloud PM (repo:cloud, live pm state, never
parked; an in-flight card is released to triage). Main's "does not count"
exclusion is kept as its own triage line; main's deletion of the
ruling-208 line is kept.

Claude-Session: https://claude.ai/code/session_01ADHkmPywJ6aAj1KTC5Pvo6
Co-authored-by: Claude <noreply@anthropic.com>
os-steve pushed a commit that referenced this pull request Oct 28, 2026
…age line

The merge dropped #26972's inclusion line; its hosted-surface,
Blocked-by-a-cloud-card and cause-in-cloud items have no other home.
They go back as one line paired with the kept exclusion.

Claude-Session: https://claude.ai/code/session_01ADHkmPywJ6aAj1KTC5Pvo6
Co-authored-by: Claude <noreply@anthropic.com>
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 size/xs skip-changeset PR has no user-facing published change; bypasses the changeset gate

Projects

None yet

Development

Successfully merging this pull request may close these issues.

pm-dispatch(triage + lanes): any card that involves cloud is routed to the cloud PM (domain:cloud + status:parked), never to an objectstack lane

3 participants