Skip to content

docs(pm-dispatch): split a card that straddles an unreachable repository by repository (ruling D) - #24712

Merged
objectstack-fleet[bot] merged 1 commit into
mainfrom
claude/issue-24591-cross-repo-split-rule
Oct 20, 2026
Merged

objectstack-fleet[bot] merged 1 commit into
mainfrom
claude/issue-24591-cross-repo-split-rule

Conversation

@objectstack-fleet

Copy link
Copy Markdown
Contributor

Fixes #24591

Clause-②: no

Ruled: letter D, ruling record 6279888513 (director seat, batch #373 item 3, 2026-10-19T23:48Z). The maintainer's two sentences, verbatim:

  • 「这一类的卡片能否直接把 cloud 部分分拆成一个 cloud 车道的卡片」
  • 「如果没有办法分拆,就立一张 cloud 车道的前置卡」

What the ruling binds, items 1-3 verbatim. Items 4 and 5 are already on main: item 4 is the reading definition in AGENTS.md, and item 5 is the decision-card rule in SKILL.md. They are not restated here.

  1. 「A card whose premise or fix has a part in a repository its lane cannot reach (cloud today) is split by repository at filing or at first touch: the cloud part becomes a repo:cloud lane card, filed by a seat that reaches cloud (the filer, when it is the cloud seat; otherwise the objectstack seat asks through the cross-repo request path — a comment on the cloud seat post naming the step, or parking the cloud part in this repository under domain:cloud + status:parked for the cloud PM to migrate); the objectstack part stays in its lane and carries only what objectstack needs. Neither lane reads the other repository.」
  2. 「Where the objectstack part depends on the cloud part, the objectstack card goes pm:blocked with Blocked-by: objectstack-ai/cloud#N and returns to its queue when that card closes (the unlock scan's cross-repo spelling; where the cloud part ships through a pin, the consumer-installable test applies).」
  3. 「When the card cannot be split — its question or fix needs both repositories at once — a cloud-lane prerequisite card is filed first (the cloud seat reads, decides or fixes its side and records the result on that card), and the objectstack card waits on it as in 2; the objectstack half then proceeds on the prerequisite card's recorded result.」

The workload line, verbatim:

「skills lane · 1 Tier S text PR: cross-repo-coordination.md L51's rule becomes the split / prerequisite rule above (one or two lines, line-neutral at the file's ceiling); reading-discipline.md L17 unchanged · precedent PR #24521 (+2/−2).」

What changed: two lines in one file, no net lines

The file is .claude/skills/pm-dispatch/references/cross-repo-coordination.md, lines 50-51. Base is 8e14ce057, which was origin/main at dispatch. It already carries line 37 from PR #24691. Head is ad5a10688. Byte counts are of the whole line, with the leading list marker included and the newline left out. The cap is MAX_LINE_BYTES = 120 (scripts/pm/check-skill-line-ratchet.mjs). The file stays at 51 lines against a ceiling of 51.

  • line 50
    • before (109 bytes): 「等待方同一笔把自卡翻 pm:blocked + Blocked-by: 指向请求卡;⛔ 不设新标签新 sweep。」
    • after (119 bytes): 「跨不可达仓的卡立卡或首触按仓拆:该仓部分由可达席立卡,或挂 domain:cloud+status:parked。」
  • line 51
    • before (119 bytes): 「目标仓不可达是读数缺口,不是落点:由可达席在目标仓立卡,此前请求记座位贴或协调卡。」
    • after (120 bytes): 「本卡只留本仓活,不读他仓;拆不开先立该仓前置卡;依赖即 pm:blocked+Blocked-by: owner/repo#N。」
  • Lines 48 (117 bytes) and 49 (107 bytes) are unchanged. They are the cross-repo request path that item 1 names: a request rides on the existing card, with a comment naming the seat and the step.
  • reading-discipline.md line 17 is unchanged, as the workload line requires.

How the two lines map onto the ruling:

  • New line 50 carries item 1's first half. A card that straddles an unreachable repository is split by repository at filing or first touch. A reaching seat files that repository's part, or the part is parked here under domain:cloud + status:parked.
  • New line 51 carries the rest of item 1: this card keeps only its own repository's work and does not read the other. It also carries item 3: when the card cannot be split, that repository's prerequisite card is filed first. Finally it carries item 2: the dependent card goes pm:blocked + Blocked-by: owner/repo#N. That is the generic spelling state-machine.md:23 defines for the ruling's objectstack-ai/cloud#N.
  • Old line 50 said 「等待方同一笔把自卡翻 pm:blocked + Blocked-by: 指向请求卡」. It points the same way as item 2, so it is folded into new line 51's pm:blocked+Blocked-by: clause. Old line 51 is the rule the ruling replaces.

What the 240 bytes could not carry, and the text on main that already carries it

Two lines at 120 bytes each cannot hold every clause of items 1-3 plus old line 50. These clauses are left to text already on main:

  • Item 1, "otherwise the objectstack seat asks through the cross-repo request path — a comment on the cloud seat post naming the step": this is lines 48-49, kept verbatim. The parking alternative on line 50 needs no request at all.
  • Item 2, "returns to its queue when that card closes": SKILL.md:108, the pm:blocked row (released by the unlock scan).
  • Item 2, "where the cloud part ships through a pin, the consumer-installable test applies": SKILL.md:137-141, which says 「跨仓解锁判据是消费方可安装」 and that pin-consumed repositories read pin lag.
  • Item 3, "the cloud seat ... records the result on that card ... the objectstack half then proceeds on the prerequisite card's recorded result": ruling item 4 and AGENTS.md's 「A reading you cite is a count plus the tree it was taken against」. A reaching seat's verbatim quotation with repository and commit is the reading the lane acts on.
  • Old line 50, 「同一笔」: SKILL.md:269 「受阻执行卡同笔挂 pm:blocked+Blocked-by:」 and SKILL.md:142 「状态变更不过夜」.
  • Old line 50, 「⛔ 不设新标签新 sweep」: both new lines name only labels and readers that already exist (domain:cloud, status:parked, pm:blocked, Blocked-by:). The state model holds the rest: SKILL.md:136 「一个标签存在当且仅当有具名读者」, and state-machine.md:26 「⛔ 不设新标签」.

Reader check: who reads Blocked-by: owner/repo#N, item 2's cross-repo spelling

This was read on this branch's tree; no script is changed here.

  • state-machine.md:23 defines the spelling: 「正典标记 = 行首 Blocked-by: #N(跨仓 owner/repo#N)」.
  • scripts/pm/check-half-states.mjs parses it. blockedByTargets (line 3744) collects an optional owner/repo or bare repo qualifier before each #N. H4's presence test accepts any value, so a cross-repo-only line counts as present. buildBlockingIndex (line 3797) skips cross-repo refs on purpose, because it asks which local card is waiting. H19 does resolve cross-repo targets (blockerTargetKey, line 4814), but only when the target repository answers the install's own repo-scoped token. Otherwise it reports the block UNJUDGED as a loud row. The header (line 61) says so: "cross-repo Blocked-by: targets stay unresolvable per install (each token reads its own repo), so H19 reports them as UNJUDGED — accepted, and made loud separately."
  • scripts/ci/scheduled-full-run.mjs, driven by scheduled-full-run-card.yml, reads Blocked-by: only on the hourly full-run card it refreshes. It never releases that card on a closed cross-repo target (workflow header, line 52).
  • scripts/pm/sweep-closed-cards.mjs has no Blocked-by: reader. It matches zero times, case-insensitive, for "blocked". It only strips residue state labels from cards that are already closed.
  • The release itself is the unlock scan, which is a seat procedure. dispatch-runbook.md:72 says 「逐仓 state=CLOSED + since 与 Blocked-by: 反向索引求交」.

Conclusion: the spelling is defined and parsed, and no reader refuses it. What no script does from this repository's install is judge whether a cloud target has closed: H19 reports it UNJUDGED and leaves it to a seat. Under the new rule, a seat therefore releases an objectstack card blocked on a cloud card by hand. That seat is one that reads cloud, or one that acts on a reaching seat's quotation. This is the ruled per-install credential limit the script's header names, not a defect. It is recorded under Acceptance notes and not filed.

Acceptance notes

  1. Cross-repo release from an objectstack card is judged by hand (reader check above). Nothing mechanical in this repository's install answers "has objectstack-ai/cloud#N closed". The release rests on a seat: the triage seat's per-repo unlock scan, or a reaching seat's comment on the waiting card. Carrier: none. This is a standing, accepted limit and not a defect to file.
  2. The instance named by the ruling, objectstack-ai/objectstack#24525, answers 301 Moved Permanently on a single-card REST read today (2026-10-20). The ruling record and this card's body name objectstack-ai/cloud#3089 as its address. The redirect was not followed, because this lane does not read cloud.
  3. Clauses carried elsewhere are listed above. If the maintainer wants them verbatim in this file, that takes a ceiling raise by ruling (one or two lines). The ruling of record says line-neutral, so this PR takes no raise.

Verification, on head ad5a10688

  • node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack derived the change set from merge base 8e14ce057: 1 path, +2/-2. It derived 17 commands, the same 17 as the dispatch order. All 17 were run on the head, with exit codes captured before any pipe:
    • node scripts/check-closing-keyword-parity.mjs → exit 0
    • node scripts/check-closing-keyword-parity.mjs --self-test → exit 0
    • node scripts/check-comment-mask-corpus.mjs → exit 0
    • node scripts/pm/check-harness-current.mjs --self-test → exit 0
    • pnpm --filter @objectstack/lint run check:doc-formula-expressions → exit 0
    • pnpm check:agent-test-spelling → exit 0
    • pnpm check:cross-package-test-inputs → exit 0
    • pnpm check:doc-authoring → exit 0
    • pnpm check:driver-memory-census → exit 0
    • pnpm check:gitlink-declared → exit 0
    • pnpm check:nul-bytes → exit 0
    • pnpm check:pm-governed-merges → exit 0
    • pnpm check:pm-skill-id-lint → exit 0
    • pnpm check:pm-skill-ratchet → exit 0
    • pnpm check:refd-timer-probe → exit 0
    • pnpm check:skill-frame-sync → exit 0
    • pnpm check:watch-hint-literal → exit 0
  • pnpm --filter @objectstack/lint run check:doc-formula-expressions first exited 3 (PREREQUISITE NOT MET: @objectstack/formula and @objectstack/lint were not built). That run measured nothing. Both packages were then built through scripts/pm/os-verify-lock.sh (VERDICT command-exit 0, turbo cache hit), and the rerun exited 0.
  • --ran reconciliation over the exit-coded record: "Run reconciliation — 17 derived, 17 run, 0 NOT-MEASURED, 0 UNRUN." It ended with "✓ dispatch-gates --ran: 17 derived famil(ies) accounted for — 17 run, 0 NOT-MEASURED (a DERIVED zero ...)".
  • The ratchet's own line for this file: "✓ check-skill-line-ratchet: .claude/skills/pm-dispatch/references/cross-repo-coordination.md is 51 lines (ceiling 51; headroom 0)."
  • Two more gates were run: pnpm check:pm-settings-deny-roster exited 0 (the derivation flags its roster as living under .claude), and pnpm check:pm-governed-prose exited 0.
  • No ablation: this is a text-only diff under .claude/**, and the dev contract excludes docs from ablation.
  • CI is in progress at the time of the report. The seat reads the check-runs.

Landing

Tier S: every path is under .claude/**. The PR stays draft. The seat flips it ready and queues it after an isolated CONTRACT_REVIEW_TIER review PASS on this head, with every check green. The PR carries skip-changeset because .claude/** publishes nothing from any released package. Precedent: PR #24521 (+2/-2).

维护者速读(草稿)

  • 改了什么: 改的是 pm-dispatch 的跨仓协调规则(cross-repo-coordination.md 第 50–51 行),内容是您 10-19 裁的 D。一张卡如果有一半落在本车道读不到的仓(今天是 cloud),立卡或第一次接手时就按仓拆开。那一半有两条去路:由能读 cloud 的席位在 cloud 立卡,或在本仓挂 domain:cloud+status:parked 停放,等 cloud PM 迁走。本仓这张卡只留本仓的活,两边都不读对方的仓。拆不开的,先在 cloud 车道立前置卡,本仓卡挂 pm:blocked+Blocked-by: 等它。文件行数不变(51/51)。
  • 为什么改: 依据是您的两句原话:「这一类的卡片能否直接把 cloud 部分分拆成一个 cloud 车道的卡片」「如果没有办法分拆,就立一张 cloud 车道的前置卡」。实例是 #24525:三个席位在三小时里各碰一遍,没人关得掉。按本裁决它整张归了 cloud,今天读它答 301,已迁走,裁决记录写它现在是 objectstack-ai/cloud#3089。
  • 风险与代价(含回滚): 两行装不下裁决的全部从句。省下的几条(请求路径、关闭即回队、pin 的可安装判据、按前置卡记录续做、不设新标签)在现有文本里都有,正文逐条点了出处。本仓巡查脚本认得跨仓 Blocked-by: 的写法,但判断不了 cloud 那张卡关没关:它报 UNJUDGED,交给席位人工判断。这是既有裁定下的凭据边界,不是这次新出的问题。回滚就是 revert 这一个 commit。
  • 席位意见:
  • 你要做的: 不需要您动手。席位隔离复核 PASS、检查全绿后,由席位入队落地。如果您希望省下的从句原文写进本文件,需要您说一句抬上限(+1–2 行)。

Generated by Claude Code

…ory by repository (ruling D)

cross-repo-coordination.md lines 50-51 now carry the maintainer's
letter D: a card with a part in a repository its lane cannot reach is
split by repository at filing or first touch; that part is filed by a
reaching seat or parked here under domain:cloud + status:parked; this
card keeps only its own repository's work and does not read the other;
when it cannot be split, that repository's prerequisite card is filed
first; the dependent card goes pm:blocked + Blocked-by: owner/repo#N.
The old line 51 (unreachable target = reading gap) is replaced, and
the old line 50 (waiter flips pm:blocked + Blocked-by:) is folded into
the new line 51. Line-neutral at the file's 51-line ceiling.

Claude-Session: https://claude.ai/code/session_01HEdP5tPhqQfzwRmKDxwn85
Co-authored-by: Claude <noreply@anthropic.com>
@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

Contract review

Rendered 2026-10-20T01:29Z · isolated reviewer at CONTRACT_REVIEW_TIER · PR #24712 (draft) for card #24591 · ruling letter D, record 6279888513

Served-tier: CONTRACT_REVIEW_TIER
Head-sha: ad5a10688bf5783916a6b01ff9ed1d66d6dafd0e
Local-runs: none
Scope: .claude/skills/pm-dispatch/references/cross-repo-coordination.md + .claude/skills/pm-dispatch/SKILL.md, .claude/skills/pm-dispatch/references/state-machine.md, .claude/skills/pm-dispatch/references/reading-discipline.md, .claude/skills/pm-dispatch/references/instrument-discipline.md, .claude/skills/pm-dispatch/references/dispatch-runbook.md, AGENTS.md, scripts/pm/check-half-states.mjs, scripts/pm/ensure-pm-labels.sh, scripts/pm/check-skill-line-ratchet.mjs, .github/workflows/scheduled-full-run-card.yml, scripts/pm/sweep-closed-cards.mjs

Inputs read: card #24591's body and all 5 comments (seat delta 6279626277, ruling 6279888513, serial note 6280214060, claim 6280787852, os-dev-report 6281048362); PR #24712's body, file list (1 path) and net diff against main (+2/−2 from merge base 8e14ce057, an ancestor of origin/main 73d4cc739, on which the file is byte-identical to the base); the 38 check-runs on the head. Cited files read with git show at origin/main and at the head; nothing checked out, built, run or re-run. Judged against the ruling's items 1–3 and the two replaced lines, not against the PR narrative.

① Derived judgments

  1. Accept-set: one governed path, cross-repo-coordination.md L50–L51, +2/−2. The file stays 51/51 (ceiling 51 at check-skill-line-ratchet.mjs:1242); L50 is 119 bytes and L51 is 120 bytes against MAX_LINE_BYTES 120 (:2350); L48 117 and L49 107 unchanged; trailing newline kept. Line-neutral inside the ruling's 「one or two lines」 — RIGHT.
  2. Public surface: none. No package, script, workflow or gate is touched; .claude/** publishes nothing — RIGHT.
  3. New L50 against item 1, first half: a card straddling an unreachable repository is split by repository at filing or first touch; that repository's part is filed by a reaching seat, or parked under domain:cloud+status:parked. Both labels exist on the roster (ensure-pm-labels.sh:440, :450), and SKILL.md:167 carries the parking semantics plus the 「待 cloud PM 迁移」 clause the line could not hold (a carrier the PR body does not cite; it holds) — RIGHT.
  4. New L51 against item 1's second half (「本卡只留本仓活,不读他仓」: the card keeps only its own repository's work; neither lane reads the other), item 3 (「拆不开先立该仓前置卡」: unsplittable ⇒ that repository's prerequisite card first) and item 2 (「依赖即 pm:blocked+Blocked-by: owner/repo#N」) — RIGHT. The owner/repo#N spelling is state-machine.md:23's canonical cross-repo form; check-half-states.mjs parses it (BLOCKED_BY_REF :3742, blockedByTargets :3744), buildBlockingIndex :3808 skips cross-repo refs by design, and H19 (blockerTargetKey :4814) reports an unresolvable target UNJUDGED per the header at :60–63 — the PR body's reader check is accurate line for line.
  5. Old L51 (「目标仓不可达是读数缺口,不是落点…」) replaced wholesale: the ruling's workload line names L51 as the rule that becomes the split / prerequisite rule, so the removal is the ruling's own; its one surviving clause 「由可达席在目标仓立卡」 is new L50's 「该仓部分由可达席立卡」 — RIGHT.
  6. Old L50 consumed as the second line (inside 「one or two lines」). Clause survival, each citation verified in the cited file:
    • 「同一笔」 ⇒ SKILL.md:269 (「受阻执行卡同笔挂 pm:blocked+Blocked-by:」) and :142 (「状态变更不过夜」) — holds.
    • 「把自卡翻 pm:blocked + Blocked-by: 指向请求卡」 ⇒ L48 unchanged (「请求席在自卡写 Blocked-by:」) + SKILL.md:108 + new L51 — holds.
    • 「⛔ 不设新标签」 ⇒ state-machine.md:26 (「⛔ 不设新标签、不重派」) and SKILL.md:136 — holds.
    • 「新 sweep」 ⇒ NOT at the lines the PR body cites: neither SKILL.md:136 nor state-machine.md:26 mentions a sweep, and after this diff no line of the pm-dispatch skill spells 「不设新 sweep」. The prohibition survives only generically, in instrument-discipline.md:9 (a new gate, patrol row or ratchet needs the maintainer's verbatim words on the card; 「⛔ 无原话不新增」) — FINDING: citation wrong, clause not lost. Not verdict-bearing; recorded because the explicit sentence disappears exactly where the dev's own Acceptance note 1 names the tempting gap (no mechanical cross-repo release from this install).
  7. Item 1's request-path clause (「asks through the cross-repo request path — a comment on the cloud seat post naming the step」) ⇒ L48–L49, unchanged, define that path (a comment on the target card naming seat and step); the ruling's parenthetical is a gloss of those two lines — holds. NOTE: the file no longer names the seat post as the target card when the target repository is unreachable (old L51's 「此前请求记座位贴或协调卡」): the coordination-card half survives at L26 (repo:* card naming reader and step), the seat-post half is now inferred, not stated. The parking alternative on L50 needs no request at all, which is why this stays a note.
  8. Item 2's 「returns to its queue when that card closes」 ⇒ SKILL.md:108 (「#N 关闭时由解锁扫描或 scheduled-full-run-card.yml 刷新放回」) — holds; 「pin ⇒ consumer-installable test」 ⇒ SKILL.md:137 and :141 — holds.
  9. Item 3's 「records the result on that card … proceeds on the recorded result」 ⇒ the PR body cites ruling item 4 and AGENTS.md's reading definition (L366); the nearer carrier is reading-discipline.md:17 (「等读数回贴再派」, unchanged as the workload line requires) with :18 (tree readings carry ref/tip) — holds either way.
  10. No conflict introduced: L20 (seam cards, objectstack side leads) is scoped away by the new lines' 「不可达」 qualifier; L27 (in-flight cards are not transferred) is consistent with a split at filing or first touch.
  11. Attribution: the commit carries the model-free trailer pair AGENTS.md names (Claude-Session: plus Co-authored-by: Claude); the PR footer is the session-URL form prescribed for PR bodies; no model identifier anywhere in the PR body — RIGHT.

② Semver level

skip-changeset is right: the diff publishes nothing from any released package (one .claude/** text file). Check Changeset: success. Clause-②: no on the PR body is right — nothing is narrowed; the review is owed on the rules face (the --paths hit), which is what places it at CONTRACT_REVIEW_TIER.

③ Boundary flags

  • open_questions: none declared; none found.
  • Out-of-scope finding (H19 reports a cross-repo Blocked-by: target UNJUDGED; carrier none): verified at check-half-states.mjs:60–63 and scheduled-full-run-card.yml:52–54 (「a closed CROSS-REPO target never releases it」); the ruling's item 2 itself assigns the release to the unlock scan, a seat procedure (dispatch-runbook.md:72, 「逐仓 state=CLOSED + since 与 Blocked-by: 反向索引求交」), so there is no gap against the ruling. Answered: correctly not filed.
  • Deviation 1 (clauses not verbatim, byte budget): answered in ① 6–9; one citation wrong (the sweep half), no clause lost; a verbatim carry needs a ceiling raise by ruling, which the ruling of record withholds (line-neutral). Not escalated.
  • Deviation 2 (#24525 answers 301): informational; the diff makes no claim about it. Answered.
  • Deviation 3 (one attempted GET /repos/objectstack-ai/cloud, refused 403 by the proxy): nothing was read, so the ruling's 「Neither lane reads the other repository」 is not breached; recorded that the dev probed the repository its own new line says not to read. Answered.
  • Deviation 4 (attribution choice): matches AGENTS.md; right. Deviations 5–6 (shallow checkout, worktree cleanup): no bearing on the diff.
  • Gates: 38 check-runs on the head, all completed — 26 success, 12 skipped (path-filtered), 0 failure, 0 in progress — read in this act; the two lint jobs still running at the dev's report time (PM dispatch-gates; CI, release and engine gates) both concluded success.
  • Nothing escalated to the maintainer.

Implemented-by: claude/issue-24591-cross-repo-split-rule
Reviewed-by: session_01HEdP5tPhqQfzwRmKDxwn85

VERDICT: PASS


Generated by Claude Code

@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

维护者速读(终稿)· PR #24712 · domain:skills seat 1 · os-justin · session_01HEdP5tPhqQfzwRmKDxwn85 · 2026-10-20T01:30Z

  • 改了什么: 多仓协调手册第 50–51 行改为您裁的 D:前提或修复落在车道读不到的仓(今天是 cloud)的卡,立卡或首触时按仓拆开 —— 该仓部分由可达席在该仓立卡,或在本仓挂 domain:cloud+status:parked 停放;本卡只留本仓的活、不读他仓;拆不开就先立该仓的前置卡;有依赖就 pm:blocked+Blocked-by: owner/repo#N。两行各 119/120 字节,文件仍 51 行。
  • 为什么改: 您的两句原话:「这一类的卡片能否直接把 cloud 部分分拆成一个 cloud 车道的卡片」「如果没有办法分拆,就立一张 cloud 车道的前置卡」。旧第 51 行写的是「由可达席在目标仓立卡、此前记座位贴」,没有拆分与前置卡的规则;#24525 就卡在这里三席三小时。
  • 风险与代价(含回滚): 纯文本,不发布。两行 120 字节装不下裁决 1–3 项的每个从句,dev 把装不下的从句逐条指到已承载它们的现行文本(第 48–49 行的跨座位请求路径、SKILL.md 的状态模型与一笔转换、state-machine.md 的跨仓拼法);旧第 50 行的「⛔ 不设新标签新 sweep」半句随之离开本文件,SKILL.md 的「标签存在当且仅当有具名读者」仍管着它。跨仓 Blocked-by: 的机械放回今天到不了 cloud(本仓令牌读不到 cloud,巡查报 UNJUDGED),放回靠席位手读 —— 这是裁决记录自己点名的「per-install」限制,不是本 PR 的缺陷。回滚 = revert 一个提交。
  • 席位意见: 接受。两行把裁决的三个动作(拆、停放/立卡、前置卡+阻塞)都写进了规则位,其余从句的指向逐条核过。dev 顺手量到 #24525 已迁到 cloud#3089(本仓 301),速读按新地址写了。
  • 你要做的: 无。Tier S,席位在达档复核 PASS 后入队。

席位核对

  • 形态: draft、base main、首行 Fixes #24591、行首 Clause-②: no、assignee os-justin、skip-changeset 随创建同笔;1 文件 +2/−2,一个提交;正文无尖括号、页脚 1 条;闭合关键词只有首行一处(另引 docs(pm-dispatch): hotcrm lane charter grades at first touch per the single-lane rule #24521、docs(pm-dispatch): scope the three triage-only grading lines to multi-lane repos (single-lane leftovers of the hotcrm ruling A) #24691、#24525、Add autonomous software development agent architecture and feasibility study #373、cloud#3089 旁无动词)。
  • 前提实测(席位,origin/main 8e14ce057 与分支 tip ad5a10688): 旧第 50–51 行如卡所引;新第 48–51 行 117/107/119/120 字节、文件 51/51;第 37 行保留 PR docs(pm-dispatch): scope the three triage-only grading lines to multi-lane repos (single-lane leftovers of the hotcrm ruling A) #24691 的多车道仓限定;state-machine.md:23 的 owner/repo#N 拼法在;domain:cloud、status:parked 标签在(HTTP 200)。
  • 门禁 check-runs(head ad5a10688): 2026-10-20T01:22Z 38 条,26 success、12 skipped、0 failed、0 in_progress;check-expected-skips --pr 24712:OK,全在名单;check-governed-merges --pr 24712:GOVERNED,Tier S,4 行。dev 本地 17 条派生门禁全 0,--ran 17/17。
  • 接受的偏差: 裁决从句分流到既有文本(PR 正文逐条点名);#24525 实例在本仓答 301(已迁 cloud#3089)—— 派发令写「已停放」,dev 实测更正,速读按实测;doc-formula-expressions 首跑 exit 3 为前置未建,补建后 0;dev 一次 GET /repos/objectstack-ai/cloud 被会话代理 403 拒,未再试、未读 cloud。
  • 复核记录的一项发现(非判决项): PR 正文把旧第 50 行「⛔ 不设新 sweep」半句指向 SKILL.md:136 与 state-machine.md:26,两处都只讲标签不讲 sweep;该禁令在技能里只剩 instrument-discipline.md:9 的通则(新门禁/巡查行/棘轮需维护者原话)。本席读法:条款未丢、引文错位;PR 正文是记录不是规则,不为改一处引文再写正文,此处记明即可;若日后要把「不设新 sweep」写回技能正文,另立卡。
  • 范围外去向: 跨仓 Blocked-by: 目标在本仓装置下 UNJUDGED、放回靠席位手读 —— 裁决记录点名的 per-install 限制,记座位贴 Carried pointers,不立卡。
  • 落地条款: Tier S;达档复核记录 PASS 在案(6281189225)后由本席 pr_ready + automerge_enable 入队。

ACCEPT


Generated by Claude Code

@objectstack-fleet
objectstack-fleet Bot marked this pull request as ready for review October 20, 2026 01:31
@objectstack-fleet
objectstack-fleet Bot enabled auto-merge October 20, 2026 01:31
@objectstack-fleet
objectstack-fleet Bot added this pull request to the merge queue Oct 20, 2026
Merged via the queue into main with commit d20bf9b Oct 20, 2026
39 checks passed
@objectstack-fleet
objectstack-fleet Bot deleted the claude/issue-24591-cross-repo-split-rule branch October 20, 2026 02:14
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

2 participants