@@ -126,9 +126,11 @@ for R in objectstack-ai/objectstack objectstack-ai/objectui objectstack-ai/cloud
126126 gh label create finding -R " $R " -c c2e0c6 -d " Recorded observation — held, not dispatchable until the findings triage round grades it" || true
127127 gh label create pm:epic -R " $R " -c 5319e7 -d " Parent delegated to a dedicated epic PM (session + territory in the parent's own body) — other PMs never dispatch into its subtree" || true
128128done
129- # routing labels exist only on the main backlog repo:
130- gh label create repo:objectui -R objectstack-ai/objectstack -c fbca04 -d " Lands in objectui (frontend)" || true
131- gh label create repo:cloud -R objectstack-ai/objectstack -c c5def5 -d " Lands in cloud" || true
129+ # routing labels exist only on the main backlog repo — and since the 2026-08-10
130+ # file-at-destination ruling (#7165, multi-repo rule 1) they mark SEAM cards only;
131+ # pure sibling-repo fixes are filed in (or transferred to) the target repo instead:
132+ gh label create repo:objectui -R objectstack-ai/objectstack -c fbca04 -d " Seam card: cross-repo ordering with objectui is the substance (pure objectui fixes live in objectui — rule 1)" || true
133+ gh label create repo:cloud -R objectstack-ai/objectstack -c c5def5 -d " Seam card: cross-repo ordering with cloud is the substance (pure cloud fixes live in cloud — rule 1)" || true
132134# domain lanes — the roster under "Domain lanes"; ⛔ keep the two lists in sync:
133135for D in engine-core metadata drivers services identity devx spec spec-surface cli spec-tooling; do
134136 gh label create " domain:$D " -R objectstack-ai/objectstack -c bfd4f2 -d " Domain lane — seat card indexed by label:pm:seat" || true
@@ -526,15 +528,39 @@ The product spans three repos with a fixed dependency direction:
526528` objectui ` (frontend; its build flows back via ` pnpm objectui:refresh ` ) and
527529` cloud ` . The loop coordinates them with five rules:
528530
529- ** 1. One main backlog.** Feature-level issues live in ` objectstack ` ,
530- whatever repo the code lands in. A ` repo:objectui ` / ` repo:cloud ` label
531- routes the dev agent's working repo; no routing label = backend. ** 分诊座位
532- applies these labels itself at triage (round loop step 2)** — the maintainer
533- just files the task and is never expected to pre-route it. The dev
534- still branches/pushes/PRs ** in the target repo** (its own worktree there —
535- one worktree per repo, as always). Repo-local trivia may still be filed in
536- the sibling repos directly; to drain such a local queue, run
537- ` /pm-dispatch repo:objectstack-ai/objectui ` (the pm labels exist there too).
531+ ** 1. Issues live where the fix lands** (维护者 2026-08-10 裁决,#7165 ;取代原
532+ 「One main backlog」条款). An execution card is filed in — and lives in — the
533+ repo whose code the fix changes. ` objectui ` / ` cloud ` each run their own
534+ backlog under their own whole-repo seat (rule 4), with the same pm labels and
535+ the same one-producer-per-backlog discipline(发版板一节,#6903 ). Two
536+ deviations, both deliberate:
537+
538+ - ** Exception A — the maintainer's inbox stays ` objectstack ` .** The
539+ maintainer keeps filing everything into ` objectstack ` without pre-routing;
540+ the 分诊座位 routes at triage (round loop step 2), and for a card that
541+ lands in a sibling repo routing now means ** transferring the issue to that
542+ repo** — GitHub issue transfer preserves the thread and redirects the old
543+ URL. When transfer is unavailable to the session's credential (fine-grained
544+ / app tokens cannot call it — #7167 实测 404), recreate at the destination
545+ with a provenance header, rewrite bare ` #N ` references to full
546+ ` owner/repo#N ` form, and close the source as moved(#7167 的迁移形状).
547+ - ** Exception B — seam cards stay in ` objectstack ` .** A card whose content
548+ IS the cross-repo ordering — a contract-first chain per rule 2 (spec
549+ change with downstream adaptation), a console-bump linkage chore (rule 3),
550+ anything whose ` Blocked-by: ` line against an objectstack artifact is the
551+ substance — stays in the main backlog and carries the ` repo:* ` label.
552+ Test: would the body still make sense if objectstack did not exist?
553+ Yes ⇒ file at destination; no ⇒ seam card. In-flight (` pm:dispatched ` )
554+ cards are never transferred mid-dispatch — they exit via their PR.
555+
556+ The ` repo:objectui ` / ` repo:cloud ` labels are thereby narrowed to seam cards
557+ (⛔ do not delete the labels; their descriptions carry the new meaning). The
558+ dev still branches/pushes/PRs ** in the target repo** (its own worktree there
559+ — one worktree per repo, as always). To drain a sibling backlog, run
560+ ` /pm-dispatch repo:objectstack-ai/objectui ` — the pm labels exist there, and
561+ since this ruling that queue is not "trivia": it is that repo's primary
562+ backlog. The historical ` repo:* ` transfer-card stock was migrated one-time
563+ under #7167 (2026-08-10); only seam and in-flight cards remained.
538564
539565** 2. Contract-first splitting.** A cross-repo feature is never one dispatch.
540566Split it: a parent issue plus one sub-issue per repo (native GitHub
@@ -589,7 +615,9 @@ issues that collide on shared files — and「谁来分诊」原本是每个 PM
589615所有权是** 双射** :
590616
591617- ** 分诊 PM(全仓唯一)** — 只扫、只分类、只打标签(` domain:* ` / ` pm:queue ` /
592- ` finding ` / ` needs-user-decision ` / ` repo:* ` )、只拆跨域 issue、只查重。
618+ ` finding ` / ` needs-user-decision ` / ` repo:* ` )、只拆跨域 issue、只查重、
619+ ** 只转仓** (落点在姊妹仓的非缝卡按 rule 1 例外 A 转移过去 —— 转移是路由动作
620+ 的一种,不是越界)。
593621 ⛔ ** 永不认领、永不派发、永不写代码。** 它是 ` domain:* ` 的** 唯一生产者** ,
594622 于是「未打标签的 issue 谁都不得认领」这条纪律第一次有机械保障:标签只有一个
595623 产出者,缺标签就意味着分诊还没走到它,而不是某个 PM 可以自己判一下。
@@ -607,7 +635,13 @@ issues that collide on shared files — and「谁来分诊」原本是每个 PM
607635 变成要翻评论才知道的事实 —— 那正是本次改版要消灭的成本。
608636- ** 姊妹仓仍是整仓座位。** ` repo:objectui ` / ` repo:cloud ` 各占一行,同一套双射
609637 与登记规则,接管方式不变(` /pm-dispatch repo:objectstack-ai/objectui ` );域车道
610- 是「同仓多 PM 并发」的切法,不是第二套仓库标签。
638+ 是「同仓多 PM 并发」的切法,不是第二套仓库标签。自 rule 1 的 file-at-destination
639+ 裁决起,姊妹仓座位是** 本仓 backlog 的唯一分诊/定级生产者** (含 ` target:<major> ` ,
640+ 见发版板一节),其收件箱包括按例外 A 转移进来的卡。
641+ - ** 维护者直派通道(2026-08-10 常设授权)。** 维护者当面指挥的 PM 会话在立卡/
642+ 裁卡时** 直接路由** (打 ` domain:* ` ,或按 rule 1 例外 A 直接转仓),审计评论逐字
643+ 引用授权指令(「以后你应该直接路由」)。这不是第二个自然生产者:它只对维护者
644+ 明示指挥下经手的卡成立;自然增量的扫描分诊仍是分诊座位的单通道。
611645- ** 分诊座位空缺时** :欠账由任一** 会话型** 执行 PM ** 代扫** —— 只做分诊动作
612646 (标签、拆分、查重、审计评论),⛔ 代扫不解除双射,仍不得跨车道认领 —— 并在
613647 自己座位贴「说明」段写明处于代扫状态。座位有主后代扫立即停止。
@@ -792,8 +826,9 @@ updated **by PR** — the taxonomy evolves deliberately, never per-claim.
792826 ` check-objectui-pin-fresh.mjs ` ),归 ` scripts/ ` (门禁类)那一行。
793827
794828本表只覆盖** 本仓(objectstack)的包** 。` objectui ` / ` cloud ` 是** 整仓座位** ,
795- routing 用 ` repo:* ` 表达(rule 4 的座位协议),不另打 ` domain:* ` —— 域车道是
796- 「同仓多 PM 并发」的切法,不是第二套仓库标签。
829+ 各管自己仓里的 backlog(多仓协调 rule 1: issue 住在修复落地的仓);本仓里仅剩的
830+ ` repo:* ` 卡是缝卡(rule 1 例外 B),不另打 ` domain:* ` —— 域车道是「同仓多 PM
831+ 并发」的切法,不是第二套仓库标签。
797832
798833### 词表 —— 在流通的 ` domain:* ` 标签与它们的座位贴
799834
@@ -1019,7 +1054,7 @@ sub-issue(递归)。**每轮重新读子树,不缓存清单** —— 这一条
10191054| 类型 | 判据 | 去向 | 谁派发 |
10201055| :--| :--| :--| :--|
10211056| in-scope 衍生 | 不修则 epic 验收不过 | 挂为父单 sub-issue(原生) | epic PM,下轮自动入队 |
1022- | 顺带发现 | 与 epic 验收无关,只是路过看见 | 独立立单进主 backlog(查重先行,` finding ` 分诊纪律照旧) | 分诊座位定级 → 域座位派发 ;epic 不吸收 |
1057+ | 顺带发现 | 与 epic 验收无关,只是路过看见 | 独立立单进 ** 修复落地仓 ** 的 backlog(多仓 rule 1; 查重先行,` finding ` 分诊纪律照旧) | 该仓的分诊/整仓座位定级 → 对应座位派发 ;epic 不吸收 |
10231058| 触 spec / 公共契约 | 无论是否阻塞 epic | 按跨座位转移协议转 ` domain:spec ` 座位队列,epic 侧 sub-issue 写 ` Blocked-by: ` | spec 座位 |
10241059
10251060第一行防「衍生项没人管、epic 烂尾」;第二行防「epic 无限膨胀吞掉整个仓」;
@@ -2946,7 +2981,8 @@ close, re-scope, or re-file the issue — never as a failed dispatch.
29462981entry becomes input to a ` [决策] ` issue. ` out_of_scope_findings ` should already
29472982be filed as unassigned issues by the dev per the filing discipline in the
29482983os-dev definition (search-first, sub-issue attachment, ` finding ` labeling —
2949- objectstack #4949 ). The PM verifies they exist ** and cross-checks the round's
2984+ objectstack #4949 ; and since the file-at-destination ruling, filed ** in the
2985+ repo where the fix lands** with a backlink — multi-repo rule 1). The PM verifies they exist ** and cross-checks the round's
29502986parallel reports against each other** : two devs auditing adjacent code file
29512987twins within the hour (cloud #1054 duplicated cloud #1031 same-day), and only
29522988the PM sees both reports.
0 commit comments