Skip to content

[REQ-125][CODE] packages/{app,ui} 的非测试源码改动没有任何闸门校验它已重生进 SOT 补丁 #976

Closed

Description

@jinjunnn

现状(实测,勘破于 #579 实现期)

ADR-034 的滚动 pin 通道里,frontend/alpha-patches/alpha-frontend.patch 是 packages/{app,ui} 全部 alpha delta 的唯一 SOT。.github/workflows/sync-upstream.yml:103-105 每天 06:00 UTC:

rm -rf packages/app packages/ui
git checkout "$PIN" -- packages/app packages/ui
git apply --binary --3way ... frontend/alpha-patches/alpha-frontend.patch

⇒ 补丁里没有的改动被无声删除(loud-fail 只在 apply 失败时发生)。

而全仓没有任何闸门校验「改了 packages/{app,ui} 的源码 → 补丁重生了没有」:

  • scripts/bun-test-app.sh:125-134 的两轴交叉只扫 ^packages/app/.*\.test\.(ts|tsx)$ —— 纯源码改动(比如只改 context/terminal.tsx 不加测试)完全在它视野外;
  • frontend/README.md 块 4 的 round-trip 判据只写在月更 bump 的 runbook 里,不在 scripts/alpha-check.sh,也不在 CI。

#579 恰好也新增了 app 测试文件,所以被两轴交叉顺带盖住了 —— 那是运气,不是设计。下一张只改源码的票不会有这个运气。

顺带:块 4 的 runbook 脚本自己会打假绿

#579 实现期实测:把 frontend/README.md 块 4 原文粘进 zsh 执行,diff -r 输出了两行 Only in ...(即 round-trip 失败),脚本照样打印 round-trip OK —— set -e 在那个执行形态下没有中止。同一段用 bash -c 跑才会按预期中止。

即:这份 runbook 的判据本身有一个「假绿」的执行形态,而它正是那条无声删除路径的唯一人肉防线。

(附带一条同源的:git diff 看不见 untracked 文件 ⇒ 新增 alpha 文件必须先 git add -N 再重生补丁,否则重生出来的补丁少文件而 git diff 那一步不会报错。)

建议范围

  1. 往 bin/check / scripts/alpha-check.sh 加一步:按块 4 的口径做 round-trip,判据是 diff -r 零输出(而不是脚本自己 echo 的那句话),覆盖 packages/{app,ui} 的全部文件而不只是 *.test.ts;
  2. 该步骤脚本化落地(scripts/ 下一个文件),frontend/README.md 块 4 改成调用它 —— 消掉「同一段逻辑两份、其中一份能假绿」;
  3. 脚本里显式 #!/usr/bin/env bash,并对「本次没有真的比对成」打「测量作废」而不是 OK。

来源

alpha-code#579 实现期勘破 + 实测。不在 #579 边界内,故另开。

Activity

  1. jinjunnn commented on Aug 15, 2026

    @jinjunnn
    OwnerAuthor

    票面订正(实现方,2026-08-14,PR #993)

    本票的缺陷本体成立、而且比票面更重;但票面里有两条论断被实测推翻,按「原文不改、订正块点名覆盖」处理 —— 下面这四条是权威口径。

    1. 修法 = 把 bun-test-app.sh 的两轴交叉扩到 packages/{app,ui} 的全部文件 不成立。 扩了仍然只是文件名集比较。实测(本分支上真跑):给 packages/app/src/context/terminal.tsx 加一行并提交、不重生补丁 ⇒ 现行两轴 5 == 5 绿,扩到全部文件 46 == 46 仍绿,同一棵树上 bash scripts/bun-test-app.sh rc=0(628 tests / 94 files),north-star-guard.sh rc=0。判据必须落在内容层:PR fix(gates): assert packages/{app,ui} == pinned upstream + SOT patch (#976) #993 改用 git 自己的对象模型(临时 index → read-tree $PIN → apply --cached --binary → write-tree,比 tree sha),同一棵树当场 rc=1 并点名 M packages/app/src/context/terminal.tsx。

    2. 票面漏了一条更重的:现有那半边两轴交叉在 CI 里从来没执行过 —— alpha-ci 的 test job 是浅 checkout,脚本自己打「未比对:pin 849c259 的对象本地取不到(浅克隆/未 fetch)」后继续。所以新门挂在 upstream-guard(已 fetch-depth: 0),否则等于原地重演。

    3. 票面漏了一条:bun-test-app.sh 的两轴交叉在 delta_tests 为空时 exit 0 直接跳过整个 [b] 半场 —— 补丁里哪天没有 app 测试文件,这半格保护自动消失(条件门)。

    4. 块 4 在 zsh 下会打出假绿的 round-trip OK 未复现。 六种执行形态(bash/zsh × 脚本文件 / stdin / 交互 stdin)全部 exit 1,round-trip OK 出现 0 次。可复现的真缺陷是另一个:块 4 的 diff -r --exclude=node_modules 在一棵健康的主 checkout 上今天就红 —— packages/app/.turbo 与 packages/ui/.turbo 都在盘上且被 .gitignore:16 忽略(git 看不见、diff -r 看得见),输出正是票面记的那两行 Only in …: .turbo。照抄进闸门 = 一道恒红门(#754 形态)。已在 frontend/README.md 块 4 留了带日期的订正块。

    另补一条把本票从「理论风险」抬成「已发生过」的实证:该不变量在已合并历史上真的被破坏过 —— f420fe2bb / cea23d639 / 0061eec19 / 7281627ed(2026-07-24→07-26)四个提交上 SOT 补丁不含 packages/app/vendor/opencode-ai-client-1.17.13.tgz 而树里有,存活约两天,期间无任何门变红。没出事只因为 sync-upstream 自 2026-07-22 起一直红着没跑到还原步 —— 那是保险丝不是设计,已单独开票 #995,与本票互相 ref。

    顺带开出的另两张:#997(bun test (app rolling pin) 缺 !cancelled())、#1000(仓内陈旧步骤编号)。

  2. added 2 commits that reference this issue on Aug 15, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions