Skip to content

[ac#1334] 网络轴重勘破:老裁决的汇流层 profile 会让引擎起不来 - #1335

Merged
jinjunnn merged 1 commit into
alphafrom
verify/1334-network-egress-resurvey
Sep 10, 2026
Merged

[ac#1334] 网络轴重勘破:老裁决的汇流层 profile 会让引擎起不来#1335
jinjunnn merged 1 commit into
alphafrom
verify/1334-network-egress-resurvey

Conversation

@jinjunnn

Copy link
Copy Markdown
Owner

勘破票,产物是文档,未改任何生产代码。同一份 Developer ID 签名包按 env 摆出四种网络形状,
一条一条量「流量到底通没通 / 文件到底落没落盘」,不看有没有报错。

  • 结论:docs/architecture/2026-09-10-network-egress-on-process-fence.md
  • 取证:docs/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> 出网。照抄到新接缝上:

profile 形状 被围栏进程 listen(0,"127.0.0.1") 外部客户端
(allow default) ok(58327) CLIENT_GOT=SERVED
§5 逐字 ERR EPERM 没有端口
§5 + network-bind ERR EPERM 没有端口
§5 + network-inbound ok(58333) CLIENT_GOT=SERVED

出货形态复验(sec5 臂):围栏装上了 —— process fence applied … profile=2244B —— 然后

03:40:55.816  sidecar spawn failed before health handshake
03:40:55.817  (utility) sidecar exited { code: 1 }

health 从来没有 200,而 main.log / server.log / utility.log / crash.log / opencode.log
五份日志里没有一行点名原因。AC4 的六条 fail-closed 覆盖「围栏装不上」,不覆盖
「围栏装上了、引擎被自己的策略掐死」。

能工作的形状(deny 臂)下六格逐格:

open(出货形状) deny(汇流层,无策略层) choke(+ loopback CONNECT 代理)
1 冷启动 health 200 200 200
2 连接器 MCP stdio connected connected connected
2 provider 安装 26 包 / 62 636 KB × 2 处 0 包 × 2 处,~/.npm/_cacache 不在 26 包 / 62 636 KB × 2 处
3 开终端
4 shell 工具
5 写配置 + ext 装载
6 三工作区并集 workspaces=3 workspaces=3 workspaces=3
集合外落盘 0 0 0

断的只有一格,而且断在最像绿的地方:
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 误伤语料换底座重跑 —— 九条里八条逐格不变,唯一变的那条变的是「解析不了」。

语料 open deny choke
其余八条(工作区写 / tmp 写 / git commit / node 写 TMPDIR / 读文件 / mkdir -p / grep / which) ok ok ok
curl https://example.com CURL=200 000,Could not resolve host CURL=200
npm view semver version(新增) 7.8.5 npm error network … 7.8.5
git ls-remote github.com(新增) b8242b0… Could not resolve host: github.com b8242b0…
node dns.lookup(新增) 198.18.7.158 ENOTFOUND ENOTFOUND

最后一行是重点:装上代理后 npm / git 回到基线,而 dns.lookupENOTFOUND
—— 能干活不是因为 DNS 回来了,是因为解析搬到了代理那一侧

Q4 引擎自身出网从哪走 —— 打包产物里 useEnvProxy() 成立,但没有代理 env 时流量不会自己汇过来。

远端 MCP 指向结构上不可解析的 ac1334-probe.invalid(只有引擎进程内 fetch 会发起):

引擎侧读数 代理日志
open getaddrinfo ENOTFOUND ac1334-probe.invalid 0 条
deny getaddrinfo ENOTFOUND ac1334-probe.invalid 0 条
choke Request was cancelled.: Proxy response (502) !== 200 when HTTP Tunneling connect …:80 ×2、:443 ×2

choke 臂代理日志共 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 字节上限 —— 够,但裁剪器的归因会骗人。

生产渲染器 + 真编译器,本机生产根:

工作区数 无网络行 §5 两行 能工作的四行 四行 + mDNSResponder
1 1 353 B 1 424 B 1 519 B 1 587 B
32(MAX_WORKSPACES) 4 980 B 5 051 B 5 146 B 5 214 B

出货形态实读:open 2 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
—— 运维读到的第一句是「最小可写集都编不过」,而错根本不在并集大小。

仪器自证(先证明测得出已知的坏)

  • 内核 Sandbox 日志:nc -U /var/run/syslog 在 deny-all 下落
    deny(1) network-outbound /private/var/run/syslog;touch /private/tmp/…file-write-create
  • 代理日志:控制臂 0 条(不会幻觉命中)。
  • 试编译器:已知撞墙报 exceeds maximum,语法坏报 unbound variable: host
  • 四条臂真 HOME 六个哨兵 mtime 前后逐字相同,残留进程 0;
    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

接缝从 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
@jinjunnn
jinjunnn merged commit 3197acf into alpha Sep 10, 2026
5 of 6 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[REQ-137][DECIDE] 进程围栏换了地基,网络轴要重新勘破:装上「只连授权目的地」之后引擎还活着吗

1 participant