Skip to content

pm-dispatch execution-duties: a split-off off-lane card does not inherit the parent's domain; ceiling 183 → 185 by ruling - #23660

Merged
objectstack-fleet[bot] merged 1 commit into
mainfrom
claude/issue-23579-split-off-card-domain
Oct 15, 2026
Merged

objectstack-fleet[bot] merged 1 commit into
mainfrom
claude/issue-23579-split-off-card-domain

Conversation

@objectstack-fleet

Copy link
Copy Markdown
Contributor

Fixes #23579
Clause-②: no

Lands item 3 of ruling record 6184818831 (letter D): the rule in .claude/skills/pm-dispatch/references/execution-duties.md that says who splits an off-lane item out of a queued card, how the split-off card is filed, and that it does not inherit the parent's domain. That file's CEILINGS row in scripts/pm/check-skill-line-ratchet.mjs moves by the measured delta, under ruling record 6184799323 (letter B, item 1).

The ruling and the raise authorization

What changed

Two rule lines, inserted directly after the derived-sub-issue pair in 〈候选与批次〉 (the lines beginning 「在飞卡衍生三分」 and 「该 sub-issue 带父卡域与优先级直接派发」). No other line in the file moved or was reworded.

- 排队卡含他车道项 ⇒ 发现席自拆:新卡无 `domain:*`,首行 `carries item k of #N; #N keeps items …`。
- 分诊首触定域可改判;拆出卡 ⛔ 不承父卡域(承域只及本车道 sub-issue),父卡余项照 `Fixes`。
  • Line 1 carries ruling items 1 and 2's filing: a queued card carrying another lane's item ⇒ the seat that finds it splits it out itself, with no triage round; the new card has no domain:* and its first line is the literal carries item k of #N; #N keeps items …. ("他车道项" reads against SKILL.md's anchor rule: domain:* is the domain of the package the fix lands in.)
  • Line 2 carries the rest: triage stamps the domain at first touch and may regrade; the split-off card does not inherit the parent's domain, while the inheritance on the line above keeps applying to sub-issues of the card's own lane; the parent keeps Fixes on its remaining items.

scripts/pm/check-skill-line-ratchet.mjs: only the execution-duties.md row of CEILINGS (183 → 185), plus a comment block above it in the map's own convention (what the text is, the ruling that ordered it, the maintainer's word verbatim and untranslated, the authorization, "Landed count, headroom 0, same convention"). The header docblock and the refusal text are untouched; they belong to #23606.

Why two lines, not one (measured): this same ratchet caps every line of the file at 120 bytes. The tightest one-line spelling of the ruled content (the two lines joined into one bullet) is 235 bytes. The two lines land at 120 B and 119 B. No neighbour was re-wrapped and no rule was deleted to pay for them.

Verification (head b609a9164)

  • node scripts/pm/check-skill-line-ratchet.mjs: exit 0. Its verdict lines for the file:
    • ✓ check-skill-line-ratchet: .claude/skills/pm-dispatch/references/execution-duties.md: widest table row is 0 bytes (pin 0; headroom 0).
    • ✓ check-skill-line-ratchet: .claude/skills/pm-dispatch/references/execution-duties.md is 185 lines (ceiling 185; headroom 0).
  • Reverse reading, with the md edited and the row not yet moved: exit 1, ✗ check-skill-line-ratchet: .claude/skills/pm-dispatch/references/execution-duties.md is 185 lines; the ratchet ceiling is 183. That was the only red line, so the two new lines pass the 120-byte rule, and the row move is what makes the gate green.
  • node scripts/pm/check-skill-line-ratchet.mjs --self-test: exit 0, 157 cases pass. It accepts the plain ruled raise and pins no map-wide total.
  • node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack (no paths) at b609a9164: 36 commands, all run locally, every final exit code 0. pnpm --filter @objectstack/lint run check:doc-formula-expressions first exited 3 (PREREQUISITE NOT MET: @objectstack/formula and @objectstack/lint not built). It was re-run after the build it prescribes and exited 0. pnpm check:pm-dispatch-gates: fast tier, 1884 cases pass. --ran: 36 derived famil(ies) accounted for — 36 run, 0 NOT-MEASURED.
  • CI runs the full farm on this PR. Its check-runs are the evidence for every family CI owns.

Changeset

None. The diff publishes nothing (.claude/**, scripts/pm/**), so this PR gets the skip-changeset label.

Landing

Governed surface (.claude/**, Tier S). The PR stays in draft; the owning seat lands it on a contract-tier review PASS.

Acceptance notes

  • Observation, not filed (no carrier): the 认领 section's line 「余项需换道/拆分加 pm:retriage」 still routes the remainder of a partially landed card through triage. The new lines cover a different case: a queued card found mixed before dispatch. The two do not collide.
  • The dispatch asked for "ONE rule line". The 120-byte cap makes the ruled content two physical lines, so the row moves by the measured two, as the dispatch's own mechanism assumption (c) allowed.

维护者速读(草稿)

改了什么:在 PM 执行职责文件 execution-duties.md 里加两行规则。排队卡里如果夹着属于别的车道的工作项,由发现它的席位自己拆成新卡:新卡不打 domain:*,首行写明承接原卡哪一项、原卡留哪几项;分诊首次接触时定车道,可以改判;拆出的卡不继承原卡车道,原卡剩余项照常用 Fixes 关闭。行数门禁里这个文件的上限按实测从 183 抬到 185。

为什么改:执行裁决 6184818831(D 案,维护者「同意」)第 3 项。这个文件已经顶到上限。按裁决 6184799323(B 案第 1 项,维护者「同意」),有裁决下令写入的文本,裁决本身就是抬上限的授权,抬幅等于实测行数 +2。

风险与代价(含回滚):只改给 agent 读的协议文本和一个行数上限,不碰产品代码,不发版。代价是每个席位会话多读两行(约 240 字节)。回滚 = revert 本 PR。

席位意见:

你要做的:无需操作。本 PR 属 Tier S,席位达档复核 PASS 后自行落地。


Generated by Claude Code

…rit the parent's domain; ceiling 183 → 185 by ruling

Two rule lines beside the derived-sub-issue rules in 候选与批次: a queued
card found carrying an item whose fix lands in another lane is split out
by the finding seat itself (new card with no domain label, first line
"carries item k of #N; #N keeps items …"); triage stamps the domain at
first touch and may regrade; the split-off card does not inherit the
parent's domain, and the parent keeps Fixes on its remaining items.

Ordered by ruling record 6184818831 (letter D, item 3). The CEILINGS row
moves by the measured delta, +2, under ruling record 6184799323 (letter B,
item 1).

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

Copy link
Copy Markdown
Contributor Author

Contract review

Served-tier: CONTRACT_REVIEW_TIER
Head-sha: b609a9164734ecec479b68881e9f90c9b145a635
Local-runs: none
Scope: .claude/skills/pm-dispatch/references/execution-duties.md + scripts/pm/check-skill-line-ratchet.mjs

① Derived judgments

  • Face: rules — one governed path, .claude/skills/pm-dispatch/references/execution-duties.md (register row .claude/**, Tier S); scripts/pm/check-skill-line-ratchet.mjs is unregistered and is the file the governed hunk makes a claim about (its CEILINGS row must move with the lines), so it is inside the scope and read in full. hits.rules = the md, hits.schema empty ⇒ CONTRACT_REVIEW_TIER, in seat (the served tier equals the constant's value this session).
  • Accept set and public surface: no change; no package touched. Clause-②: no, no arm — right.
  • The rule text (+2 lines after L41, 183 → 185): carries ruling 6184818831 letter D items 1–3 — the finding seat splits the off-lane item itself (no triage round), the new card has no domain:* and the literal first line carries item k of #N; #N keeps items …, triage stamps the domain at first touch and may regrade, the split-off card does not inherit the parent's domain while the inheritance of L41 stays with the card's own-lane sub-issues, the parent keeps Fixes on its remaining items. L40–41 and every other line byte-identical; no table row (width pin 0); #N is a literal placeholder, not an issue number (check:pm-skill-id-lint 87 files clean on the head).
  • Two lines, not one: the ruling's workload says 「1 line」; the ratchet's own per-line cap is MAX_LINE_BYTES = 120 (check-skill-line-ratchet.mjs:2282), the tightest one-line spelling measures 235 B, and the two lines land at 120 B and 119 B. Ruling 6184799323 letter B item 1 authorizes 「the measured lines the text needs」 — the measured need is two, the row moves by exactly two, both ids and the delta are quoted in the PR body. Judged right, not a widening.
  • The ratchet diff: the execution-duties.md row 183 → 185 with a comment block in the map's convention (text, ordering ruling and letter, the maintainer's 「同意」 verbatim, the authorization, 「not a CROSS_FILE_MOVES destination, so no ruledRaises record」, landed count); the header docblock and the refusal text untouched (they are [Decision] The line ratchet (check:pm-skill-ratchet): 32 of 37 files at zero headroom, so a sentence already ruled still needs a second ruling to land — keep it, let the ordering ruling carry its lines, add slack, or narrow it #23606's region); no other row moved. The dev's reverse reading (md edited, row at 183 ⇒ exit 1 with exactly one ✗ line) shows the row move is load-bearing and the new lines pass the width cap.
  • Relation to the sibling rule: the 认领-section line 「余项需换道/拆分加 pm:retriage」 covers a partially landed card's remainder; the new lines cover a queued card found mixed before dispatch — distinct cases, no collision (the dev's acceptance note, agreed).

② Semver level

No published package in the diff ⇒ no changeset owed; skip-changeset is the correct declaration.

③ Boundary flags

  • open_questions: none.
  • deviations: the ASCII-paren heading (no reader keys on it); 「ONE rule line」 → two by the measured cap, as the dispatch's mechanism assumption (c) allowed; the worktree base 286eb9ef3 with both files byte-identical to c5dd7fce3. All accepted.
  • out_of_scope_findings: one observation, no carrier, acceptance note only — agreed, not a card.

Implemented-by: claude/issue-23579-split-off-card-domain
Reviewed-by: session_01GjUZrCo7Yi58T4vPXqx88e

VERDICT: PASS

Reviewed 2026-10-15T11:11Z against the PR's committed diff, the card's records and the head's check-runs (Governed Surface Queue Guard success; Lint, Type Check and Test Core lanes still converging — the pre-landing gate reading is the seat record's).

@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

席位核对 — PR #23660 (#23579) @ b609a9164734ecec479b68881e9f90c9b145a635 · seat domain:skills#1 · session_01GjUZrCo7Yi58T4vPXqx88e (os-sales) · 2026-10-15T11:21Z

Verdict: ACCEPT. Tier S — node scripts/pm/check-governed-merges.mjs --pr 23660 exit 3: governed, .claude/** ×1 (references/execution-duties.md), scripts/pm/check-skill-line-ratchet.mjs not on the register, 22 changed lines (+21/−1) under the 3000 human-merge threshold. The at-tier contract review of record is 6190695761 (PASS on this head, rendered in seat at CONTRACT_REVIEW_TIER).

  1. 形态: draft, base main, first body line Fixes #23579 (the card is pm:dispatched, assignee os-sales); no other open card number sits near a closing keyword in the body (the other numbers are ruling ids and the sibling cards named as context); Clause-②: no at line start, no arm; skip-changeset label; PR assignee os-sales; 2 files, 1 commit; the 维护者速读 draft present with 席位意见 blank; footer in the session-URL form; no model identifier.
  2. 前提实测: on origin/main 1ced0f82b (the dev's base 286eb9ef3; both files byte-identical between the two): execution-duties.md is 183 lines at ceiling 183 with L40–41 present and no line naming a split-off card; the ratchet's execution-duties.md row reads 183; MAX_LINE_BYTES = 120. The PR adds exactly two lines after L41 and moves the row to 185 with its comment block; nothing else in either file moves.
  3. 门禁 check-runs on b609a9164 (read in this act): required five — Lint & Repo Gates success · TypeScript Type Check success · Test Core success (shards 1–6 success) · Build Core skipped · Governed Surface Queue Guard success. Every other check success or an expected skip: node scripts/pm/check-expected-skips.mjs --pr 23660 → 「OK — 11 skipped check-run(s), every one in the roster」, exit 0. The dev's local subset: 36 derived families at the head, all exit 0, --ran reconciled; check-skill-line-ratchet.mjs plain run and --self-test (157 cases) green; the reverse reading (row left at 183) red on exactly one line.
  4. 接受的偏差: 「ONE rule line」 landed as two by the measured 120-byte cap, the row moved by the measured two (ruling 6184799323 B item 1: 「the measured lines the text needs」); the ASCII-paren heading; the worktree base. mcp_calls 0; api_writes 3 relay strokes, each read back identical.
  5. 范围外去向: out_of_scope_findings: one observation (the 认领-section pm:retriage route covers a different case), acceptance note only, no carrier owed.
  6. 落地条款: Tier S ⇒ the seat lands through the queue: relay pr_ready, mergeable_state read after the flip, automerge_enable once it reads clean or blocked, added_to_merge_queue awaited on the timeline. Sibling in flight: [Decision] The line ratchet (check:pm-skill-ratchet): 32 of 37 files at zero headroom, so a sentence already ruled still needs a second ruling to land — keep it, let the ordering ruling carry its lines, add slack, or narrow it #23606's dev edits the same script's header and remedy text (disjoint hunks) and merges origin/main before its PR. At MERGED the card closes by Fixes, pm:dispatched leaves it in the same act, and the landing comment (the two-reading probe table) goes on the card. Pointer line on the card follows this record.

@objectstack-fleet
objectstack-fleet Bot marked this pull request as ready for review October 15, 2026 11:23
@objectstack-fleet
objectstack-fleet Bot enabled auto-merge October 15, 2026 11:24
@objectstack-fleet
objectstack-fleet Bot added this pull request to the merge queue Oct 15, 2026
Merged via the queue into main with commit 881eeff Oct 15, 2026
44 checks passed
@objectstack-fleet
objectstack-fleet Bot deleted the claude/issue-23579-split-off-card-domain branch October 15, 2026 11:35
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/s 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.

[Decision] A card triaged to one lane carries an item that lands in another (#23513: an engine card with a skills/** item) — who splits it, and when

2 participants