[ac#1334] 网络轴重勘破:老裁决的汇流层 profile 会让引擎起不来 - #1335
Merged
Merged
Conversation
接缝从 REQ-138 的 `cfg.shell` wrapper(叶子进程树)换成 `#1321` 的整进程围栏 (sidecar 自己,而 sidecar 就是 HTTP 服务器)之后,网络轴重测五问。产物是文档, 未改任何生产代码。 关键读数: - 2026-08-25 勘破 §5 的两行照抄到新接缝 ⇒ `listen()` EPERM;出货形态复验:围栏 照常自报 `process fence applied … profile=2174B`,fork 后 560 ms `sidecar exited { code: 1 }`,health 从来没有 200,而**五份日志里没有一行点名原因**。 能工作的形状要补 `(allow network-inbound (local ip "localhost:*"))`。 - 装上强制汇流层而没有策略层(deny 臂):六格里只断一格,断的正是静默那条 —— provider 装不上(`getaddrinfo ENOTFOUND registry.npmjs.org`)而 health 仍 200; 加上 loopback CONNECT 代理后 26 包 / 62 636 KB × 2 处全回来。 - `(deny network*)` 对系统 unix socket 一刀切(七个全 EPERM)、逐条 `(literal …)` 可放回、**不覆盖 mach IPC**(钥匙串 / 目录服务照常,`(deny mach-lookup)` 对照臂证明 探针看得见 mach 死掉);真工作负载里引擎只碰 mDNSResponder 一个。 - 误伤语料九条 + 新增三条,三臂逐格:八条与网络无关的完全不变,curl 变的方式是 「解析不了」而非「连不上」;装上代理后 npm / git 回到基线而 `dns.lookup` 仍 ENOTFOUND。 - 打包产物里 `useEnvProxy()` 复验成立(远端 MCP 的 CONNECT 落到代理日志,拒绝时响亮)。 - 字节:网络行净成本 234–268 B;墙(1 264 个工作区 / `data object length 65574`)四臂 逐字相同。真问题是归因 —— 网络行写坏时 `trimUntilCompiles` 会丢光工作区再报 「最小可写集都编不过」。 仍未验:真模型请求、models 目录那条 fetch、代理日志的进程归属。 Fixes #1334 Refs #1073 Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01HE3Jmp5ZDzEvnCNhgCDreN
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.
勘破票,产物是文档,未改任何生产代码。同一份 Developer ID 签名包按 env 摆出四种网络形状,
一条一条量「流量到底通没通 / 文件到底落没落盘」,不看有没有报错。
docs/architecture/2026-09-10-network-egress-on-process-fence.mddocs/verification/2026-09-10-req159-1334-packaged-network-fence/(run.ts + 三个独立探针 + 四份结果 JSON)2026-08-25-network-egress-seam.md加了「部分被推翻」的抬头与 front-matter;2026-09-09-req159-process-fence.md§7 加一条交叉引用;docs/README.md加三行索引。五问结论
Q1 整进程 network-deny 底座下引擎还活着吗 —— 活着,但老裁决的那个 profile 形状会当场把它掐死。
老勘破 §5 的汇流层是
(deny network*)+ 只放行<chokePort>出网。照抄到新接缝上:listen(0,"127.0.0.1")(allow default)CLIENT_GOT=SERVEDERR EPERMnetwork-bindERR EPERMnetwork-inboundCLIENT_GOT=SERVED出货形态复验(
sec5臂):围栏装上了 ——process fence applied … profile=2244B—— 然后health 从来没有 200,而
main.log/server.log/utility.log/crash.log/opencode.log五份日志里没有一行点名原因。AC4 的六条 fail-closed 覆盖「围栏装不上」,不覆盖
「围栏装上了、引擎被自己的策略掐死」。
能工作的形状(
deny臂)下六格逐格:open(出货形状)deny(汇流层,无策略层)choke(+ loopback CONNECT 代理)~/.npm/_cacache不在workspaces=3workspaces=3workspaces=3断的只有一格,而且断在最像绿的地方:
NpmInstallFailedError (cause: FetchError: … getaddrinfo ENOTFOUND registry.npmjs.org),而
/global/health仍然 200。点名规则是(deny network*)连带拦掉 DNS,不是某条端口规则。Q2
(deny network*)到底关掉了什么 —— AF_UNIX 一刀切、逐条可放回、不覆盖 mach。七个系统 unix socket 三臂矩阵:无围栏 6 CONNECTED + syslog
EPROTOTYPE→(deny network*)全部 EPERM → 逐条
(literal …)放行后逐格回到第一臂读数。mach 对照:同一份 deny-all 下
dscl/security/id -un与无围栏臂逐字相同;换成(deny mach-lookup)后分别变成eServerError/parameters … not valid/501—— 探针看得见 mach 死掉,所以「不覆盖 mach」不是探针瞎了。
真工作负载的内核日志枚举:
deny臂 22 条network-*拒绝行全部是network-outbound /private/var/run/mDNSResponder(sidecar / curl / node / git-remote-http),open臂同窗 0 条。除 mDNSResponder 外,引擎没碰过任何系统 unix socket。Q3 误伤语料换底座重跑 —— 九条里八条逐格不变,唯一变的那条变的是「解析不了」。
opendenychokecurl https://example.comCURL=200000,Could not resolve hostCURL=200npm view semver version(新增)7.8.5npm error network …7.8.5git ls-remote github.com(新增)b8242b0…Could not resolve host: github.comb8242b0…node dns.lookup(新增)198.18.7.158ENOTFOUNDENOTFOUND最后一行是重点:装上代理后 npm / git 回到基线,而
dns.lookup仍ENOTFOUND—— 能干活不是因为 DNS 回来了,是因为解析搬到了代理那一侧。
Q4 引擎自身出网从哪走 —— 打包产物里
useEnvProxy()成立,但没有代理 env 时流量不会自己汇过来。远端 MCP 指向结构上不可解析的
ac1334-probe.invalid(只有引擎进程内 fetch 会发起):opengetaddrinfo ENOTFOUND ac1334-probe.invaliddenygetaddrinfo ENOTFOUND ac1334-probe.invalidchokeRequest was cancelled.: Proxy response (502) !== 200 when HTTP Tunnelingconnect …:80×2、:443×2choke臂代理日志共 32 条:registry.npmjs.org:443×17、codepuppy.cn:443×5、alpha-gateway.tidelabs.click:443×2、github.com:443×2、release-assets.githubusercontent.com:443×1、example.com:443×1。Q5 字节上限 —— 够,但裁剪器的归因会骗人。
生产渲染器 + 真编译器,本机生产根:
MAX_WORKSPACES)出货形态实读:
open2 040 B / 2 218 B(1 / 3 工作区),加网络行 2 308 B / 2 486 B。净成本 234–268 B。墙四臂完全一样:第 1 265 个工作区起编不过,报的数字逐字相同
data object length 65574 exceeds maximum (65535),每多一个工作区 +51 B ⇒ K=32 下离墙约 39 倍余量。真问题不是字节,是归因:网络行若写坏(例如 §1.1 已证不存在的
(remote host …)),trimUntilCompiles会丢光工作区再抛does not compile even with the minimum writable set (1 workspace, 4 dropped, 5 attempts): unbound variable: host—— 运维读到的第一句是「最小可写集都编不过」,而错根本不在并集大小。
仪器自证(先证明测得出已知的坏)
nc -U /var/run/syslog在 deny-all 下落deny(1) network-outbound /private/var/run/syslog;touch /private/tmp/…落file-write-create。exceeds maximum,语法坏报unbound variable: host。app.asar里实验开关标记 ×1、对照针 ×0。仍未验(不许写进 AC 当已知事实)
真模型请求一次都没发过 ·
models.opencode.ai那条 fetch 本轮没有发生 ·代理日志不区分 main 与 sidecar(catalog / gateway 两族归属未定) · ssh 经 CONNECT ·
公证 / x86_64 片 ·
deny臂两条时序读数只跑两轮,不构成结论。Fixes #1334
Refs #1073
🤖 Generated with Claude Code
https://claude.ai/code/session_01HE3Jmp5ZDzEvnCNhgCDreN