fix(mcp): 远程 MCP 连接器改从真源派生 —— 地址存进围栏写不到的地方,配置文件里的条目既不放行也不启用 - #1409
Merged
Merged
Conversation
…与引擎注入都按它算,配置文件里的远程条目既不放行也不启用 (#1381) 与 `#1392` 同形(`#1383` 基线 §四 子票 4): - 真源四模块:mcp-server-truth.ts(严格读)/ -write.ts(原子写,不进 sidecar 闭包)/ -records.ts(生产读取绑定)/ -lifecycle.ts(main 侧 upsert / remove / find);位置解析抽成 alpha-environment.ts resolveAlphaStateBase,custom-provider-records.ts 改用同一份 - 写入改道:ext-config.ts persistMcp 的 type:"remote" 先清配置文件副本再写真源;readMcpLeaf / restoreMcpLeaf / removeMcp / removeMcpConfigInLock 一并接上;alpha.jsonc 缺席的叶按 no-op 删 - 派生改源:network-egress-derived.ts deriveMcpEgressDestinations(同一个 classifyBaseUrl),server.ts 与 provider 并成一次登记;alpha-config-injection.ts 从真源注入完整条目;mcp-default-deny.ts 把 alpha.jsonc 里不在真源的远程条目压成 enabled:false - 启停:ext-install-planner.ts 对真源里的远程 MCP 只翻账本 - 准入同源:validateServer 的 URL 判据换成 classifyBaseUrl(删掉未引用的第二份 isAllowedUrl),拒绝带 code,hub 用用户语言说原因(en / zh) - 旧记录只忽略 + 每进程一行日志;CHANGELOG / 出网架构文档更新;gate-files 登记两个新闸门文件;module-size 基线抬到实测;.alpha 残留表行号跟随 Refs #1383 Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
jinjunnn
added a commit
that referenced
this pull request
Sep 24, 2026
… ⚠ (#1430) (#1434) `origin/alpha@f245627` 上跑第 [14/14] 步,判官报: ⚠ 超基线:packages/ui-mac/src/main/ext-install-planner.ts 实测 3539 行 > 基线 3525(+14) 不是某条分支带来的。逐 commit 量 `ext-install-planner.ts`:`329847979`(2026-08-30) 是 3525,下一个碰它的 commit `ad3864206`(`#1381` / PR `#1409`)就是 3539 —— **+14 全部 来自这一个已合并的 commit**,而那一票把 tree 那一行从 57,542 抬到 59,055、理由里逐字写了 「ext-install-planner.ts 的启停投影(+13)」,却漏改 file 这一行。所以这次的动作不是新开一次 抬基线,而是把 `#1381` 只做了一半的登记补完。 选 B(抬基线并写明理由),不选 A(拆文件),理由写在 tsv 那一行的理由列里,要点: - 这 14 行是远程 MCP 的启停投影,**全长在本文件的私有函数 `computeEnableProjectionEdit` 上**(调用点全在本文件内)。搬出去要把启停投影的内部形状导出成公共 API。 - 只把 `remoteMcpTruthNames()` 那 6 行挪进新文件也只能到 3533、**仍超基线**,而 tree 那一行一点不降 —— 那正是本表抬头点名要挡的「把行搬进新文件」式绕过。 - 整文件按阶段拆是另一件事:`#1289` 票面明写 out of scope,本表 file 行的理由列也写着 「拆分本身另立票」。那张票至今没开(本票不开,超范围)。 按 `#1430` 边界只改这一行:没动另两行、没动判官、没加 `--update`、没删这一行。 Fixes #1430 Co-authored-by: jinjunnn <slmbaovanetti99@gmail.com> Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
jinjunnn
pushed a commit
that referenced
this pull request
Sep 24, 2026
…第几行 (#1435) 缺陷本体(实测链条,来自 `#1430` 的修复过程):`#1381` / PR `#1409` @ad3864206 把 tree 行从 57,542 抬到 59,055,理由列里**逐字写着**「ext-install-planner.ts 的启停投影」, 却**没改那个文件自己那一行**(仍 3525,实测已 3539)⇒ 主干自身超基线三个月,每条从 alpha 开出的分支都背一条不属于自己的 ⚠。`#1430` 补完了那半边登记,但**没有任何东西** 会发现下一次同样的漏 —— 抬 tree 行的时候,没人会被问一句「你抬的这些行,是不是也长在 某个被单独盯着的文件上」。 ① 交叉判据落在 scripts/assert-module-size.sh(判官测试只判脚本的行为,不该自己变成 第二个供数方)。理由:这条判据要问的是「**这一次**有没有抬高某个 tree 行」,那是 push 时相对 origin/alpha 的分支事实;脚本已经持有 BASELINE_REF、已经逐行解析登记簿、 已经量出每行的实测值,而判官测试的夹具正好能造出「tree 抬了 / file 行没跟着改」这个 状态并复制脚本本体进去跑。把判据写进测试则等于让 push 时真正跑的那道门继续瞎着。 判据:把本次登记簿与 origin/alpha 上那一份比 —— 某个 tree 行的基线被**抬高**了 ⇒ 那棵树 下每个「实测已超自己基线、而自己那一行的基线一个字没动」的 file 行,逐条点名(第几行 + 路径 + 实测/基线/差值 + 本次抬的是第几行)并 exit 1。 为什么是 1 不是 2:半份登记不是「量到了、结果不好看」(那是 2 档),是**登记簿在骗人**, 与「点名的路径不存在」同一族。它结构上到不了「主干恒红」:合并之后登记簿 diff 归零, 这一条自动闭嘴 —— 能红的只有正在改登记簿的那条分支,而那正是唯一能修它的人。 取不到基准上的登记簿时**明说「本次没比对」**,不静默当绿(与 ⑪ 同一条纪律)。 ② 顺带订正 tsv 里 `#1381` 那段理由的错数字:「启停投影(+13)」→ +14 (`#1430` 逐 commit 量过:329847979 = 3525 → ad38642 = 3539)。file 行里**引用**那句 原文的地方同时注明「原文那个数本身也错了」,否则两行互相矛盾。三行基线一个没动 (与 origin/alpha 逐字节比过)。 证据: - 真仓 AC1:人为把 tree 行 59075 → 59085 并给 ext-install-planner.ts 加 10 行而不改它那行 ⇒ exit 1,点名「第 27 行(...ext-install-planner.ts):实测 3549 > 基线 3539(+10)」 与「本次抬高的是第 29 行(packages/ui-mac/src/main:59075 → 59085)」; - 真仓 AC2:同一次把 file 行也改成 3549 ⇒ exit 0,三行全 = 基线;还原后仍 exit 0; - 判官夹具 AC1/AC2 + 两个控制组(抬 tree 但树下 file 行都在基线内 ⇒ 绿;取不到基准 ⇒ 明说没比对); - 变异实测(改生产脚本再还原):去掉 exit 1 ⇒ AC1 红;去掉「只在抬高时问」⇒ 既有的 ②③ 两条反向/控制组红(证明它不会在没抬 tree 的分支上乱响);去掉「没比对」那句 ⇒ ⑰ 红。 登记:gate-files.tsv 那一行的**精确条数** 13 → 17 并逐条写清新增四条守什么; docs/runbooks/ci.md 第 [14/14] 行补上这条判据与 exit 1 的新成因; alpha-check.sh 消费 exit 1 的那句话补上新成因(否则总结行在骗人)。 Fixes #1435 Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
jinjunnn
added a commit
that referenced
this pull request
Sep 24, 2026
…第几行 (#1435) (#1438) 缺陷本体(实测链条,来自 `#1430` 的修复过程):`#1381` / PR `#1409` @ad3864206 把 tree 行从 57,542 抬到 59,055,理由列里**逐字写着**「ext-install-planner.ts 的启停投影」, 却**没改那个文件自己那一行**(仍 3525,实测已 3539)⇒ 主干自身超基线三个月,每条从 alpha 开出的分支都背一条不属于自己的 ⚠。`#1430` 补完了那半边登记,但**没有任何东西** 会发现下一次同样的漏 —— 抬 tree 行的时候,没人会被问一句「你抬的这些行,是不是也长在 某个被单独盯着的文件上」。 ① 交叉判据落在 scripts/assert-module-size.sh(判官测试只判脚本的行为,不该自己变成 第二个供数方)。理由:这条判据要问的是「**这一次**有没有抬高某个 tree 行」,那是 push 时相对 origin/alpha 的分支事实;脚本已经持有 BASELINE_REF、已经逐行解析登记簿、 已经量出每行的实测值,而判官测试的夹具正好能造出「tree 抬了 / file 行没跟着改」这个 状态并复制脚本本体进去跑。把判据写进测试则等于让 push 时真正跑的那道门继续瞎着。 判据:把本次登记簿与 origin/alpha 上那一份比 —— 某个 tree 行的基线被**抬高**了 ⇒ 那棵树 下每个「实测已超自己基线、而自己那一行的基线一个字没动」的 file 行,逐条点名(第几行 + 路径 + 实测/基线/差值 + 本次抬的是第几行)并 exit 1。 为什么是 1 不是 2:半份登记不是「量到了、结果不好看」(那是 2 档),是**登记簿在骗人**, 与「点名的路径不存在」同一族。它结构上到不了「主干恒红」:合并之后登记簿 diff 归零, 这一条自动闭嘴 —— 能红的只有正在改登记簿的那条分支,而那正是唯一能修它的人。 取不到基准上的登记簿时**明说「本次没比对」**,不静默当绿(与 ⑪ 同一条纪律)。 ② 顺带订正 tsv 里 `#1381` 那段理由的错数字:「启停投影(+13)」→ +14 (`#1430` 逐 commit 量过:329847979 = 3525 → ad38642 = 3539)。file 行里**引用**那句 原文的地方同时注明「原文那个数本身也错了」,否则两行互相矛盾。三行基线一个没动 (与 origin/alpha 逐字节比过)。 证据: - 真仓 AC1:人为把 tree 行 59075 → 59085 并给 ext-install-planner.ts 加 10 行而不改它那行 ⇒ exit 1,点名「第 27 行(...ext-install-planner.ts):实测 3549 > 基线 3539(+10)」 与「本次抬高的是第 29 行(packages/ui-mac/src/main:59075 → 59085)」; - 真仓 AC2:同一次把 file 行也改成 3549 ⇒ exit 0,三行全 = 基线;还原后仍 exit 0; - 判官夹具 AC1/AC2 + 两个控制组(抬 tree 但树下 file 行都在基线内 ⇒ 绿;取不到基准 ⇒ 明说没比对); - 变异实测(改生产脚本再还原):去掉 exit 1 ⇒ AC1 红;去掉「只在抬高时问」⇒ 既有的 ②③ 两条反向/控制组红(证明它不会在没抬 tree 的分支上乱响);去掉「没比对」那句 ⇒ ⑰ 红。 登记:gate-files.tsv 那一行的**精确条数** 13 → 17 并逐条写清新增四条守什么; docs/runbooks/ci.md 第 [14/14] 行补上这条判据与 exit 1 的新成因; alpha-check.sh 消费 exit 1 的那句话补上新成因(否则总结行在骗人)。 Fixes #1435 Co-authored-by: jinjunnn <slmbaovanetti99@gmail.com> Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
alpha-code#1381:用户在「接入其它服务」里配的远程 MCP 连接器从 0.1.13 起连不上 —— 它的地址写进alpha.jsonc(围栏可写根 W2),出网围栏不敢照它放行。与#1379(自带 Key)、#1392(未列明 provider)是同一堵墙、同一个修法。实现方在收尾时被模型额度掐断(Fable 429),代码已提交并推送;PR 与门由主 session 接手完成,下表是我自己跑的。
改了什么
packages/ui-mac/src/main/mcp-server-truth.ts(+ 测试 285 行):<casBaseRoot>/mcp-servers/<env>.json,与env/、cas/、custom-providers/、fence-workspaces/同级 —— 不在围栏任何可写根之下。照#1392的模式:严格读 fail-closed、原子写、读写分离。url经既有的egressDestinationFromBaseUrl进放行集合(与 provider 的结果一并喂给setConfiguredEgressDestinations)。alpha.jsonc里的远程条目既不放行也不启用。type:"local")一个字没动 —— 它不需要出网授权,它要的 pypi 一类在静态白名单里。extension-hub.tsx/use-extensions.ts)与 i18n 相应接上。门(主 session 实跑)
bun run --cwd packages/ui-mac typecheckmcp-server-truth+process-fence-wiring+custom-provider-derivationnetwork-egress-derived.ts与server.ts回退到d06ad9b4d(改前)⇒ 端到端那条判据当场红(process-fence-wiring11 pass / 1 fail);还原后绿。第一次我挑错了判据文件(只跑真源模块的单测,那一份不依赖接线、回退后照样全绿)—— 如实记在这里:反向臂挑错文件等于没做反向臂。scripts/north-star-guard.shscripts/assert-gate-files.sh--no-verify推:pre-push 的alpha-check.sh在本机(30+ worktree)会挂住。Fixes #1381