Repository navigation
[decision-shaped] may an upstream-port-pin divergence ADD upstream code that postdates the pin, rather than ADAPT pinned code? objectui#9387 made one real and the gate's header does not describe it #10205
Description
Ruled: 5770936679 · letter C + retirement card objectui#10208 · 2026-09-22T03:49Z — batch #211 item 5; closed not_planned
The question
May a declared divergence in scripts/upstream-port-pin.json ADD upstream code that postdates the pin, rather than ADAPT pinned code?
Route B on objectui#9387 did exactly that, and it is now real in the tree: entry proxy-rearm-plan on files[0] (scripts/pm/check-half-states.mjs) adds a 90-line block taken verbatim from objectstack eec56c37d, while the entry is pinned at bf10debd5. Every other divergence in that file adapts pinned code. ⇒ that port is now a deliberate SUPERSET of the ref it is pinned at, which is a relationship the gate's header does not describe.
Why it is being asked, and what it is NOT
The maintainer chose route B over a full --resync for its blast radius — a re-sync crosses roughly 23,000 lines of upstream change and silently re-homes every predicate the half-state patrol runs. ⛔ That is a decision about SCOPE, not a ruling that this gate's contract allows an ADD-shaped divergence. The two are separate and only the first has been made.
check:upstream-port-parity exits 0 with it. So nothing is broken. What is undescribed is the rule.
Why it recurs rather than being a one-off
The thing that forced it is structural: a port pinned behind the upstream that a NEW port depends on. That happens every time a sibling repository adopts a second objectstack tool whose own dependencies moved after the first adoption. objectui#9387 is the first instance; it will not be the last.
Options
| route | cost | |
|---|---|---|
| A | Ratify it — amend check-upstream-port-parity's header to describe the superset relationship, and require an ADD-shaped divergence to carry the ref it was taken from (this entry's why already does). |
the relationship becomes described instead of silently permitted |
| B | Forbid it — make the gate refuse an ADD-shaped divergence by shape, forcing a full re-sync whenever a port needs something newer than its pin. | defensible if ADD is rare; it is not |
| C | Leave it undecided; the entry's own why carries the warning and the next re-sync deletes it. |
the gate's header stays out of step with what it permits |
Recommendation: A, and the reason is this repository's own posture rather than taste — the failure mode it treats as worst is a gate whose header no longer matches what it permits, which is precisely what C leaves behind. ⛔ Not the filing seat's to do: it changes a gate's contract, and that belongs to whoever owns check:upstream-port-parity.
⛔ Not a blocker for objectui#9387 or PR objectui#10203 — that PR is green, the gate passes, and the entry documents itself. This is the rule the tree now needs stated.
业务含义直译
- A(批准) —— 端口与它的上游钉之间「可以更新、不只可以改写」这件事,写进闸门自己的说明里。客户看不见任何变化,下一个读这个端口的人少踩一次坑。
- B(禁止) —— 任何一次「新工具要的上游比老钉子新」都变成一次全量 re-sync。客户看得见的后果是:巡逻脚本会在一次无人预期的批次里整体换血,而换血的理由只是另一个工具想被采用。
- C(不裁) —— 今天什么都不动。代价是闸门的说明书继续描述一件它已经不做的事,下一个人按说明书判断,判错。
四棱从业务立场论证
- ① 项目长远合理性 —— 兄弟仓采用第二个、第三个上游工具是这个平台的既定方向(本卡是第一例,objectui#9387 就是它)。⇒ ADD 形背离不是意外,是这条路上的常态;让常态无名无据,是把长期成本记在每一个后来者头上。指向 A。
- ② 实际业务拉动 —— 今天就有一条真的在树上:
proxy-rearm-plan。⛔ 不是设想。闸门今天 exit 0,所以拉动不是「坏了」,而是「说明书与行为已经不一致,而且已经不一致了」。指向 A 或 B,⛔ 不指向 C。 - ③ 防 AI 犯错 —— 这一棱最硬。C 的出错形态是静默:下一个 agent 读闸门 header,以为背离只能 ADAPT,于是把一个本该 ADD 的需求做成 re-sync,拖进两万多行上游变更,而闸门全程绿灯、没有任何一句拒绝。A 的出错形态是响亮:header 说清楚 ADD 允许且必须带来源 ref,漏带就是可判的缺失。B 也响亮(按形状拒绝),但它把每次 ADD 变成一次大改,AI 在大改里犯的错更难看见。指向 A。
- ④ 创业阶段不扩散 —— A 不新增任何能力面:它描述一个已经存在的关系,并对它加一条「必须写明来源 ref」的约束。⇒ 是收敛,不是扩张,从紧原则在这里不反对 A。B 才是扩张——它要给闸门写一个新的形状判别器。指向 A。
Prior rulings read: upstream-port-pin,port parity divergence,superset of pin,add divergence → 0 hits; none; thread: none; repo: objectstack-ai/objectui
推荐 · 回退 · 置信缺口
推荐:A。 自检:只看①选 A;②③④ 是否翻转:否 —— ②③④ 与 ① 同向,④ 经判别不成立(描述既有关系 ≠ 新增面)。
回退:C,且只在一种情形下:check:upstream-port-parity 的所有者判定这个闸门根本不该有「端口可以领先它的钉」这层语义,那么正解不是改 header,而是另立一个「ADD 清单」结构——那是一张新卡,⛔ 不是本卡的字母。
裁后执行段(维护者只裁字母,不背执行)
- 裁 A ⇒ 一张
domain:devx卡:改check-upstream-port-parity的 header 描述 superset 关系,并让闸门要求 ADD 形条目带upstream_ref(本卡的proxy-rearm-plan已经带了,所以它是第一个合规样本而不是第一个违例)。 - 裁 B ⇒ 一张
domain:devx卡:闸门按形状拒 ADD;同批必须把proxy-rearm-plan改成一次files[0]的--resync,⛔ 不能只加拒绝而留着树上那条已存在的 ADD,否则main当天变红。 - 裁 C ⇒ 关本卡 not planned,并在
proxy-rearm-plan的why里补一行「本形状未经裁定」,让下一个读到的人知道这是未决而不是已许。
四棱卡面块
- ① 项目长远合理性:兄弟仓采用上游工具是既定方向,ADD 形背离是这条路的常态;A 给常态一个名字,C 让它继续无名。
- ② 实际业务拉动:树上今天就有一条真的(
proxy-rearm-plan),闸门 exit 0 —— 拉动是「说明书与行为已不一致」,⛔ 不是「坏了」。 - ③ 防 AI 犯错:C 静默(下一个 agent 读 header 会做成 re-sync,拖进两万多行,全程绿灯);A 响亮(ADD 允许但必须带来源 ref,漏带可判)。
- ④ 创业阶段不扩散:A 描述既有关系 + 加一条约束 = 收敛;B 要新写一个形状判别器 = 扩张。从紧原则在这里不反对 A。
装箱记录
needs-user-decision,现由立卡席补挂,时间 2026-09-21T08:57Z。理由与 objectui#10179 同一条:needs-user-decision 不在分诊席的垄断里(垄断是 domain:* 与 type),而 SKILL.md 〈升级与决策〉② 写的是「决策默认锚在所属 issue(分析发评论,中文;挂 needs-user-decision、退出活动队列)」—— 锚定决策的席位就是装箱的席位。⛔ 这正是 objectui#10171 量到的洞。priority:* 与 domain:* 仍是分诊的,仍然欠着。
Dedupe words: upstream-port-pin · ADD divergence · superset of its pin · check-upstream-port-parity contract · proxy-rearm-plan
Filed by the domain:ui execution seat · session_01Xr7APep6jm1Zta3KUzPzZf · 2026-09-21T08:27Z
Generated by Claude Code
Activity
os-support-ai commentedon Sep 22, 2026
Ruling: batch #211 item 5 · letter C + retirement card objectui#10208 · maintainer 「同意,10205 根治(一张 devx 卡,你一字)——退役端口本身」 2026-09-22T03:49Z
Director seat, summon #26 (
session_01SPwf6Kmqo1gqzCSWSuMtQM). This seat first recommended A (describe the superset relationship, requireupstream_ref); the maintainer asked whether this class of work is a waste of time and how to simplify (「这种开发是否浪费时间,怎么简化怎么处理」); the seat proposed C now plus retiring the port itself; the maintainer approved in the words quoted above.Governing text: the maintainer's 2026-09-21 「我们系统开发了太多无用的门禁,反而在浪费时间」 (ruling #202); the four-axis framework ④ (更少零件); objectstack
.claude/skills/pm-dispatch/SKILL.md「工装只答被告知的仓,缺--repo/PM_SWEEP_REPO即答 objectstack」 — the PM scripts are already built to run against any board.Ruled (C): this card closes with no change to the gate. The
check-upstream-port-parityheader is not amended and noupstream_refrequirement is added;proxy-rearm-plan's ownwhyalready carries its warning, and the port is retired under the card below.Ruled, the retirement — objectui#10208 (
domain:devx,pm:queue, maintainer direct dispatch): objectui stops porting objectstack tooling throughscripts/upstream-port-pin.json(13 entries, ~123 declared divergences) and its parity gate. Three classes, three treatments: ① PM scripts (check-half-states.mjs,board-snapshot.mjs;invoked-as.mjs/check-bash32-floor.mjsmeasured) — deleted from objectui; the objectui seats run the objectstack originals from an objectstack checkout with--repo objectstack-ai/objectui/PM_SWEEP_REPO; the two objectui-only switches are DROPPED, ⛔ not upstreamed — ruled here on the reading:PM_SWEEP_CLOSED_WINDOW_PAGESsurvives onorigin/main0cf2d6644bdbonly in commented-out lines of.github/workflows/half-state-patrol.yml(an escape hatch that expired 2026-08-28) and in the port's own tests;closedWindowDisabledonly in those tests (scripts/__tests__/check-half-states.test.ts), which are deleted with the port. ②.claude/hooks/*(8 files) — kept as plain copies the harness loads, one header linecopied from objectstack@<sha>, no ledger, no parity check. ③board-snapshot.yml— as ②, or a step calling the objectstack script. Thenupstream-port-pin.json,check-upstream-port-parity.mjs,--resync, self-test, script entry and workflow step are deleted. Net −13 pins, −123 divergences, −1 gate; the accepted cost is that hook drift is found by hand.State in this stroke: closed
not_planned;needs-user-decisionremoved.Generated by Claude Code