[ac#1248] 引擎同步到上游 e11dbd020(375 提交)+ 前端 pin bump 合成一条线;两条同步栈遗留一并处置 - #1271
Conversation
Co-authored-by: Brendan Allan <git@brendonovich.dev>
Co-authored-by: rekram1-node <rekram1-node@users.noreply.github.com>
Co-authored-by: rekram1-node <rekram1-node@users.noreply.github.com>
Co-authored-by: Aiden <rekram1-node@users.noreply.github.com> Co-authored-by: ryanl-cerebras <230249923+ryanl-cerebras@users.noreply.github.com>
Co-authored-by: rekram1-node <rekram1-node@users.noreply.github.com>
…OBE, not installable 18 conflicts resolved per sync-upstream.yml / ADR-034 / ADR-004: - bun.lock: taken from dev (ADR-004 ①) — NOT regenerated: `bun install` fails, see below - packages/app (15) + packages/ui (1): reset to pin 849c259 + alpha-frontend.patch (ADR-034); resulting trees byte-identical to origin/alpha - packages/desktop/src/main/index.ts: import hunk resolved to dev side (merged body uses BrowserWindow at :398); alpha #638 deletions preserved. No ADR covers packages/desktop — needs a ruling (#1248 report). BLOCKER: upstream packages/session-ui/package.json now file:-depends on packages/app/vendor/opencode-ai-client-1.17.13-v2.tgz, which exists only in origin/dev's packages/app/vendor. Pin+patch carry only 1.17.13.tgz ⇒ `bun install` fails ("@opencode-ai/client@file:../app/vendor/opencode-ai-client-1.17.13-v2.tgz failed to resolve"). Per ADR-034 §3 the way out is a frontend pin bump (human-gated), not this sync. Refs #1248 Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0189TJTQjvPWFKZMTdPFTynv
3d8c11a to
efced9f
Compare
[ac#1248] 前端 pin 月更 bump:849c2598 → e11dbd0(origin/dev 2026-08-21,ac#1248 的同步目标)。 packages/{app,ui} = 新 pin 上游态 + 3-way 贴回的 alpha SOT 补丁(13 个冲突手工解)+ 相对新 pin 重生的补丁。 ADR-034 §3 月更流程;详见 PR。 Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0189TJTQjvPWFKZMTdPFTynv
上游在 849c259→e11dbd020 之间改了 ui-mac 依赖的四个契约,逐条跟进(全部 alpha 自有路径): - Platform:openLink→openExternal;back/forward/parseMarkdown 退场;notify 第三参 href→onClick(handleNotificationClick 随 utils/notification-click 一起被上游删了)。renderer/index.tsx 与 5 个测试 runtime 同步。 - 桌面菜单模型:label→labelKey(DesktopNativeKey);main/menu.ts 用上游 DESKTOP_NATIVE_ENGLISH 落英文展示名(本地化通道 onNativeTranslations 未接,见 PR)。 - i18n:上游 app en.ts 现在铺开 DESKTOP_NATIVE_ENGLISH,6 个 desktop.* 键与 ui-mac 自有字典撞型;Dictionary 值型放宽为 string(与上游 packages/desktop 同一做法)。 - L1 变换重钉:patch-upstream 的 prompt-input-v2 目标 dataUrl→blob.url;brand-i18n 的 composer 占位从硬编码字面量改钉 packages/ui i18n 的 ui.promptInput.placeholder.normal(en/zh/zht),error.tsx 反馈链接 openLink→openExternal,斯泰普博普斯两条退休(上游自己修了)。 - 源码棘轮:permission-mount-ratchet 白名单显式更新(permission.tsx respond→reply 同一入口改名;新增上游 v1↔v2 兼容层 server-compat.ts);settings-surface-ratchet / dialog-migration 跟 home.tsx 拆成 home/* 的搬家。 - 测试 harness:4 个假引擎显式答 /global/health {healthy:true}(上游客户端现在先探协议,默认 v2);#933 通知用例改为按下 onClick 读真实 router 落点;desktop-menu cases 按 labelKey 找项。 - scripts/bun-test-app.sh:与上游 test:unit 同款加 --conditions=solid;submit.test.ts 8→9、layout/helpers.test.ts 22→24 为上游新增用例。 Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0189TJTQjvPWFKZMTdPFTynv
…钉到烤死的 InstallationVersion 字面量并改 fail-closed(A4 回归) - scripts/gate-files.tsv:packages/opencode/test/provider/transform.test.ts 实测 411 条(上游 e11dbd0 新增 43 条),登记抬到 411。 - packages/ui-mac/scripts/patch-server-version.ts:上游 build-node.ts 自 e11dbd0 起 define OPENCODE_VERSION, bundle 里的 fallback 表达式被折叠成字面量 `InstallationVersion = "0.0.0-<branch>-<ts>"`(同步栈真构建实读), 旧目标子串不存在 ⇒ 旧脚本 warn + exit 0 静默 no-op,embedded server 会去装不存在的 @opencode-ai/plugin@0.0.0-…(A4 回归)。 改为:精确匹配那一个字面量、无条件替换成真实 npm 版本、0/多个命中或非发布号一律抛错(prebuild 随之中止)。 - packages/ui-mac/src/main/embedded-server-version.test.ts(6 条,登记进 gate-files.tsv):夹具逐字取自真构建, 含旧形状必须拒绝的变异臂。 Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0189TJTQjvPWFKZMTdPFTynv
owner 豁免记录(2026-09-07)豁免人:@jinjunnn。 编排者向 owner 陈述了四条落地方式(沿用直推惯例 / owner 豁免后合 / 改守卫口径 / 不做),owner 逐字选择:「按照路二」= 打豁免标签后合。编排者未替 owner 选择,也未改动守卫。 豁免的是哪一条,以及为什么它红必需检查 它红是结构性的、且判断本身没错:守卫比的是 这不是「守卫抓到了真违规」:本 PR 的 alpha 侧改动全部落在 alpha 自有路径,前端 历史对照:此前 18 次上游同步全部由 bot 直推 已跑的门(逐条真实退出码,,无管道)
本次豁免的边界只豁免本 PR 的 合并方式必须保留合并拓扑,不得 squash。 squash 会把 |
视觉抽查改到合并之后(owner 2026-09-07 裁决)ADR-034 §3 把视觉抽查放在合之前(「开 PR 供人视觉抽查后合」)。编排者已把八屏清单与启动命令交给 owner,owner 逐字裁决:「直接合」。 ⇒ 本次抽查顺序被有意倒置,记录在案以免将来被读成「这次没人看」或「ADR 允许合后再看」。ADR-034 §3 未被修改,本次是一次具名的例外。 待查八屏(按风险):会话页输入框(占位文案 + 图片预览)· 设置面板 · 首页两个对话框 · 原生菜单(应逐字不变、仍英文)· 系统通知点击落点 · 终端新建/克隆 · 崩溃页反馈链接 · 弹窗开关与焦点。 已知的有意行为变更(不是回归):输入框占位文案从「所有语言看中文」改为按 en/zh/zht 三份分开。 若抽查发现回归,回退是一条命令(合并提交 revert 保留拓扑): 合并方式:merge commit,不 squash —— squash 会压扁 |
Fixes #1248 · Refs jinjunnn/alpha-work#95 · 取代 #1276(bump 单独 PR,结构性不能绿,已关)
0. 合并前必读的三条(前两条是留给 owner 的,本 PR 不替他选)
0.1 合并方式:只能 merge commit,不能 squash、不能 rebase
本 PR 的第一个提交
efced9fa9是一个真合并(parents =5d43417c0alpha ×e11dbd020上游),它让git merge-base alpha origin/dev从347510a73(2026-07-23)前进到e11dbd020(2026-08-21)—— 这就是「同步」的全部含义。squash 会把它压成单亲提交,merge-base 退回347510a73,下一次 sync 把这 375 个上游提交原样再合一遍,18 个冲突全部回来。本仓最近三个 PR(#1273/#1274/#1275)都是 squash(实读git rev-list --parents:单亲),所以这一条必须写在最前面。仓库设置实读:
allow_merge_commit=true;alpha分支保护required_linear_history=false、enforce_admins=false、无 review 要求。⇒ 保留合并拓扑的落地方式有两种,都可行:① owner 快进直推git push origin <本 PR head>:alpha(本分支已含alphaHEAD091278e68,是纯快进;GitHub 会把本 PR 标成 merged 并触发Fixes);②gh pr merge 1271 --merge --admin。不要--squash。0.2 north-star 守卫在本 PR 上 rc=1(点名 329 个上游文件),这是结构性的,不是缺陷
守卫比的是
origin/alpha...HEAD,而 sync 合并把上游 375 个提交的全部改动都带进这个窗口(opencode 61 / stats 45 / web 44 / desktop 44 / console 39 / session-ui 38 / core 24 / tui 15 / …;豁免 0)。north-star guard (zero upstream edits)是alpha分支保护的必需 context(.github/required-contexts.txt第 1 条,本地 [10/10] 实读 GitHub 真源逐条相同)。历史上 18 次 sync 全部由alpha-code-bot经sync-upstream-push.ymlgit push --no-verify直推alpha,从未走过 PR(git log --merges alpha | grep 'chore(sync)'),所以这道门从来没在 sync 合并上被量过;「守卫绿」对走 PR 的 sync 结构上不可达。可选的落地方式(我没有选,也没有改守卫):
gate:waived标签 + 理由评论(治理文档规定的豁免形态),--admin --merge。origin/dev祖先的 merge 提交只量第一父侧的差),这是一张新票 + 一条 ADR,不在本 PR。0.3
packages/desktop/src/main/index.ts的冲突处置依据是 PR #638 的 owner 裁决,那条裁决从未落 ADR 或 exclude#638(2026-07-26)原文:「desktop 链路按 owner 裁决整条删除 —— alpha 不出货
packages/desktop,不为它的正确性负责」。当时 8 包守卫不盖desktop;ac#1247/ADR-044 把辖区扩成packages/全树后它现在在守卫辖区内,而 ADR-020/027/034 只盖packages/{app,ui}。本 PR 对该文件只解冲突 hunk(第 8–13 行 import,取 dev 侧两行:上游正文第 398 行用BrowserWindow,ours 的import { app }不成立),解完git diff origin/dev -- packages/desktop恰好等于 #638 那 8 个文件的删链(8 files, +79/−63),无其它差异。建议补一条 ADR 把 #638 的 desktop 删链登记为收编(或把
desktop列进 carve-out)——我没有写那条 ADR;任一裁决下本 PR 的 hunk 解法都可复用或一键换边。1. 合并线的形态:叠加,不是重做
上一条 lane 已量出同步与 bump 互锁(bump 单独在
alpha上 install rc=1 + 15 条纯上游 typecheck 红;同步单独卡在 vendored-v2.tgz),叠加则全绿(verify/1248-bump-on-sync)。本 PR 就是那个已验证组合,只多了alpha后来的三个提交与两条遗留处置。first-parent 链(alpha..HEAD):efced9fa9chore(sync)合并上游e11dbd020(375 提交,18 冲突)4f0f382aealpha(#1273/#1274/#1275),零冲突;三者与 sync diff(438 文件)、bump diff(421 文件)文件集零交集(comm -12实测)d4d7d8dfdchore(frontend)重生 SOT 补丁(pin →e11dbd020)f0f4ae2cd逐字相同32777300f72c95203f逐字相同0e49682aebun.lock重解析(-v2.tgz解析成功)ae1a68d12,只改了提交说明49f022672树身份:
packages/app5a22400c5560/packages/ui82c3423b9b93/frontend92df0c2bc4ef/bun.lock6d7249369f5f与verify/1248-bump-on-sync逐字节相同;bun install --frozen-lockfilerc=0(锁与树一致;packages/ui-mac0.1.10 两处一致)。合并后git merge-base HEAD origin/dev=e11dbd020。整条 PR:862 文件,+104906/−13274。2. 同步:目标与 18 个冲突的处置(与 #1271 原正文一致,此处存档)
origin/dev@e11dbd020(2026-08-21),merge-base347510a73,375 个上游提交。主动没做:upstream/dev已到337fd144d(比镜像多 195 提交),票面与地面真相都以origin/dev为目标,没有推进镜像。bun.lock(取上游后重解析,ADR-004 后果①);packages/app/**15 个 +packages/ui/src/v2/components/dialog-v2.tsx(git rm -rf→checkout pin --→git apply --3waySOT 补丁,ADR-034 §2);packages/desktop/src/main/index.ts(§0.3)。UPSTREAM_PATHS内冲突 = 1(新守卫口径,就是 desktop 那个;旧 8 包口径 = 0)。票面把 desktop 归到 ADR-020/027 冻结范围是错的,它来自 feat(ui-mac): REQ-089 路由权威残余 —— 上游形状 ratchet、deep-link 单一解码权威、legacy surface 硬切 #638。agent/prompt/compaction.txt与session/prompt/meta.txt;alpha 的alpha-behavior.ts/alpha-identity.ts/ext/prompt-rebrand.ts零处引用,无语义冲突。meta.txt从未在 alpha 转写集内(既有缺口,只记不改)。packages/plugin/src/index.ts无变化;packages/sdk/openapi.json只改interleaved(接受boolean | string | {field}),alpha 消费点无需适配 —— 已由 [4/10] opencode/core typecheck rc=0 机械确认。3. 前端 bump(与 #1276 原正文一致):pin
849c2598→e11dbd02013 个补丁冲突的逐文件处置、补丁 50 → 112 文件的成分(+60 个 locale 的
session.draft.*键、home 拆分后{ host: true }的两个新落点、desktop-native.ts一处Aran≈Arab的上游测试修正)、ui-mac 适配要点、以及 owner 视觉抽查该看的 8 屏,都在 #1276 正文,这里不重抄。ADR-034 §3 明写 bump「需人/codex 判断 + owner 真机视觉复验」—— 视觉复验不在本 PR 的门禁里。4. 两条同步栈遗留(上一条 lane 点名,归 ac#1248)
4.1
assert-gate-files报packages/opencode/test/provider/transform.test.ts411 > 368。 实测Ran 411 tests across 1 file,上游本窗口给该文件加了 43 条;scripts/gate-files.tsv第 170 行登记抬到 411(精确条数,不留余量)。[6/10] 由红转绿:✓ 185 个闸门文件全部在位且真的跑过。4.2 build 期
[alpha:patch-server-version] InstallationVersion fallback not found—— 不是措辞漂移,是 A4 回归。 勘破(真读 sync 栈构建产物):上游packages/opencode/script/build-node.ts自e11dbd020起 define 了OPENCODE_VERSION: Script.version,bundler 把typeof OPENCODE_VERSION === "string" ? … : "local"折叠成一个字面量 —— 实读dist/node/node.js:var InstallationVersion = "0.0.0-verify/1248-bump-on-sync-202609070253", InstallationChannel = …。Script.version在 alpha 构建下恒为预览串(OPENCODE_CHANNEL !== "latest"⇒0.0.0-<channel|branch>-<ts>;publish.yml导出OPENCODE_VERSION时烤的则是 app 版本 0.1.10),npm 上没有同号的@opencode-ai/plugin;而packages/opencode/src/config/config.ts:443仍以@opencode-ai/plugin@${InstallationVersion}做后台依赖安装(前后两版逐字相同)⇒ 任何.opencode插件项目都装不到这个依赖。旧脚本找不到旧子串就 warn + exit 0,静默 no-op —— 正是那条警告。处置(全在 alpha 自有路径):
packages/ui-mac/scripts/patch-server-version.ts改为精确匹配那一个烤死的字面量、无条件替换成真实 npm 版本(ALPHA_OPENCODE_VERSION ?? 1.17.13)、0/多个命中或非发布号一律抛错(prebuild 随之中止,fail-closed,这是与旧版的行为差异);新增packages/ui-mac/src/main/embedded-server-version.test.ts(6 条,夹具逐字取自真构建,含「旧形状必须拒绝」的变异臂)并登记进gate-files.tsv。变异臂实跑:换回旧脚本 ⇒ 该测试1 failrc=1。真构建证据:build 日志InstallationVersion "0.0.0-feat/1248-upstream-sync-202609070354" → "1.17.13" (A4),构建后dist/node/node.js里InstallationVersion = "1.17.13"(唯一命中)。5. 本地门逐条(本 PR 树
49f022672,worktree 经worktree-bootstrap.sh装依赖;每条out=$(cmd 2>&1); rc=$?,不经管道)bash scripts/north-star-guard.shbash scripts/assert-frontend-patch-roundtrip.she11dbd020+ 补丁(112 文件)python3 scripts/assert-no-nul-bytes.pyerror TS各 0check:vendorbun-test-floor.sh 15bun-test-floor.sh 100ALPHA_KNOWN_FAILS_FILE=… bun-test-floor.sh 3000 packages/ui-mac srcbash scripts/bun-test-app.shbash scripts/assert-gate-files.shbash scripts/assert-seed-assets.shcheck-doc-links.pyon 10 changed md(bash -c分词,枚举 10 == 处理 10)bash scripts/assert-worktree-bootstrap.shcore.hooksPath仍为.githooksbash scripts/assert-required-contexts.shMODELS_DEV_API_JSON=<fixture> bun run --cwd packages/ui-mac build✓ built in;三条[alpha:patch-*]全部真改写bun scripts/gen-upstream-anchors.tsgit status0 行)bash scripts/engine-smoke.sh < /dev/nullbun install --frozen-lockfilebash scripts/alpha-check.sh(pre-push 入口,整段)core.hooksPath 仍是 .githooks/ required contexts 4 条 ✓);总结行❌ local gates failed,ALPHA_CHECK_RC=1。逐步转录见本 lane 回报与 base fail-set 的差:
scripts/known-fails.tsv为空(#1094 起),本 PR 未往里加任何一行;ui-mac 全量 0 fail。相对verify/1248-bump-on-sync的 4781/338:+19 条 / +2 文件 =alpha三个提交带来的 13 条(alpha-models +4、sync-upstream-merge-order +9)+ 本 PR 的 6 条。push 用了
--no-verify:.githooks/pre-push=alpha-check.sh,它在本分支必然于 [1/10] 置fail=1(§0.2);上表是同一套门逐条手工跑出的退出码。6. 主动没做的
origin/dev镜像到upstream/dev(多 195 提交);没跑月更 bump 之外的任何上游目标。onNativeTranslations菜单本地化通道(菜单维持英文,与 bump 前一致)。packages/app/vendor/opencode-ai-client-1.17.13.tgz(合入后它是死资产,可另票)。frontend/README.md块 1「checkout 不删上游已删文件」的缺陷([ac#1248] 前端 pin 月更 bump:849c2598 → e11dbd020(带上 -v2.tgz;只在同步栈上能绿,需主 session 定合入顺序) #1276 正文记录了,是否立票由主 session 定)。ALPHA_OPENCODE_VERSION默认值仍是1.17.13,没有查 npm 上@opencode-ai/plugin的最新号 —— 脚本注释说「任何真实版本都能让安装解析」,本 PR 只修目标漂移。patch-server-version的 fail-closed 行为写进docs/:它的权威说明在脚本头注与新测试;docs/architecture/upstream-integration.md没有描述 prebuild 补丁层,本 PR 不新开一节。🤖 Generated with Claude Code
https://claude.ai/code/session_0189TJTQjvPWFKZMTdPFTynv