fix(ui-mac): REQ-052 出厂技能改两跳桥 —— ~/.alpha 真源 + .opencode 只放指针 - #131
Merged
Conversation
用户点名:~/.opencode/skill/ 出现 skill-creator/agent-creator 直链 app Resources 的 symlink(REQ-036 初版零拷贝捷径),绕过 .alpha 真源纪律。 - factory-skills.ts 改与目录安装同构的两跳桥:~/.alpha/skills/<name> → app 资源(真源,零拷贝保留)+ 复用 alpha-bridge 落 ~/.opencode/skills (多跳链引擎可见,REQ-004 实测) - 启动 reconcile 自动迁移旧直链并顺手拆空的 ~/.opencode/skill/(仅 isAlphaFactoryLink 判我方链才拆;用户真实目录/异源链照旧不碰) - 所有权纪律全保留 + 新增异源 bridge item 链前置挡(绝不替换) - 测试 10→15 例(两跳/迁移/异源桥链);ADR-019 修订成文不变量: 「.opencode 内 alpha 自有条目只允许指向 .alpha」 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
jinjunnn
pushed a commit
that referenced
this pull request
Jul 28, 2026
owner 亲自登录后跑完登录态相位。23 项判据:AC2(登出态 keyless)已在前一轮通过;
本轮登录态暴露六条必需红,其中两条是真缺陷、两条是探针判据缺陷:
真缺陷
- 云 MCP tools/call 恒 forbidden:cloud_web_search 要 purpose=model.invoke,
而桌面云通道令牌 ALPHA_CLOUD_TOKEN 恒为 cloud.dispatch(alpha-platform#131)
- /mcp 传输层零鉴权,tools/list 与账户无关 ⇒ P1.3 那条 PASS 是空绿(alpha-platform#132)
探针判据缺陷(alpha-code#651)
- P1.5 断的是「每个 agent 配置键有 deny」这个机制,而有效判决本来就全是 deny
- P1.2 断言观测点错:引擎加载时已解析 {file:},/config 天然看不到 file ref
- P3.8 判据构造上不可满足(工具已被 Permission.disabled 过滤,模型拿不到)
另:引擎侧真实工具 id 实测为 cloud_cloud_web_search(双前缀),按字面量
cloud_web_search 下的 permission 闸因此是空闸门(alpha-code#650)。
#643 不能关:AC1 待 #131 修复并手动部署后重取,AC3 待 #651 收敛判据。
jinjunnn
added a commit
that referenced
this pull request
Jul 28, 2026
* docs(verification): #643 E7 打包版取证准备 —— 探针 + 证据骨架 + 一个阻断项 #223 AC5「packaged 真调用与 keyless fallback 均有证据」的取证需要 owner 本人的登录态, 只有取证之前的一切可以先做完。本 PR 交付那一切: - 打包应用重打并真机启动验(alpha@94a76b669;装机版 app.asar 的 sha256 钉进探针, 在错的构建上跑出来的绿会被第一条判据挡住)。 - 一个两相位探针:默认 = 登录态,`--keyless` = 登出态,**各自对错误的登录态 fail-closed**。 故意不做自动识别 —— 会自己切相位的探针永远报不出「未登录,无法取证」。 每项自带运行前定好的判据,输出机器可读 JSON;造不出来的失败态记 `not-producible` + 理由, 不记成绿。探针零密钥:用的每个凭证都是打包应用自己写进 alpha-secrets 的,写盘前经 redact。 - 证据骨架:逐项判据表(登录态那半留空待 owner)、复现步骤、边界。 准备阶段已实跑出两件事: 1. **未登录自检**:登录态相位 blocked + exit 2,零证据产出(results/logged-in-*.json)。 2. **一个阻断项**:登出态 keyless 真调在本构建上是坏的。`readBoundedBody` 用的 `Stream.runForEachWhile` 在谓词恒真时仍只读第一个 chunk(实测 4,090 / 18,063 字节), 于是任何多 chunk 的搜索响应被截断 → `invalid_response`。#639 之前该处是 `response.text`, 属那一刀带进来的回归;本仓 read.ts:143-145 早已记过同一个 API 的雷。 修复归一张 CODE 票,不在本 VERIFY 票里动源码。 另记两项待裁决:402 的采集范围(Issue 正文与基线票 6 的 2026-07-25 更正相反), 以及云工具在引擎里的真实 id 可能是 `cloud_cloud_web_search`(MCP catalog 会拼 server 名前缀)。 Refs #643 * docs(verification): #643 重打包到 e578e00 —— keyless 阻断项解除,登出态相位 10/10 绿 上一份装机产物(`94a76b669` / `8706d0c4…`)早于 #648 的 `readBoundedBody` 修复, K1.5(登出态 keyless 真调)在其上必红 —— #643 的 AC2 不可能转绿。在当前 alpha HEAD `e578e00ae` 上重跑 `ship:mac` 并重新装机,证据目录的指纹与 `probe.ts` 的 `PINNED_ASAR_SHA256` / `PINNED_COMMIT` 同步换成新产物 (`60589c59c58e44ac0daede93fc7397a8a04365f5345eac4312e205a0d8f48e44`)。 真机启动已验:main / renderer / GPU / NetworkService / NodeService 五进程齐, CDP 列出 `oc://renderer/index.html` page target(窗口真开), `server ready { url: 'http://127.0.0.1:50360' }`,crash.log 无崩溃。 本仓两个打包坑(source-only contracts-consumer 留原始 .ts、eager ajv `new Function` 撞 renderer CSP)均未复现。 阻断项解除,用两条独立判据确认「打包版里真的生效」而非「源码合了就假定」: 1. 解包 app.asar,`out/main/chunks/node-*.js` 的 `McpWebSearch.readBoundedBody` 确为 `Stream.runForEach` + `catchTag("BodyCapReached")`; 2. 真机跑 `--keyless`:K1.5 `completed`,拿到完整多 chunk 的真实搜索结果,exit 0、 10/10 必需项通过。 两条反向 fail-closed 自检也在新产物上复验:登出态跑登录态相位 → blocked + exit 2; 登录态跑 `--keyless` → blocked + exit 2。两者都只记前置、零证据产出。 未改动源码,未改动 `docs/verification/` 下任何其它目录;旧产物的原始记录 (`*20260727T0952*.json`)保留不动。登录态那一半仍待 owner 本人执行。 Refs #643 Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> * docs(verification): #643 402 按裁决改为「采」+ MISMATCH 判读方法 owner 2026-07-27 在 #643 上裁定 402「采」(多采一项没有害处,漏采要再叫 owner 一次), 但上一轮探针仍按 Issue 正文走 out-of-scope —— 裁决没落进代码。本次补上。 **P3.7 从「跳过」改成真打的判据**,且不预设结论:发一次带真 bearer 的 `POST /v1/tools/web_search`,按运行前定好的规则判读 —— 402 ⇒ pass;200 ⇒ `not-producible`(账户被预授权通过,这本身就是「今天产生不了」的 可观测证据,带实测 balanceFen/walletUsedFen/plan 作理由);其它状态 ⇒ fail(LOUD)。 不记成绿,也不静默跳过 —— 与 P3.4/P3.5/P3.6 同一套处置。 可产生性已按平台源码判定(alpha-platform `packages/gateway/src/worker.ts`): - 臂 A(per-job 预算耗尽)**桌面端不可达** —— 需 `auth.via === "job"` 的 job token (`lib/tenant-auth.ts:114-123`);桌面端拿的是 route-purpose 绑定 JWT,jobId 恒空 ⇒ `perJobPrecall` 直接 pass/enforced:false。与 P3.4 同源。 - 臂 B(`accountPreauth` 拒绝)只在账户余额+会员额度双空时触发;估价是路由常量, 客户端无调价杠杆。把账户打空是破坏性计费变更,且会连带打红同轮的 P2.1/P2.2/P2.3 —— 402 证据与 AC1/计费证据不可能在同一账户形态下同时取到。**owner 无需为 402 做额外操作。** 映射本身由 L1 覆盖:`packages/opencode/test/tool/alpha-websearch-failure.test.ts`。 `#643` 正文冲突已消:out-of-scope 与退出条件两处按裁决改成与基线票 6 的 2026-07-25 更正一致(须含 402,产生不了则记 not-producible)。 README §7 补上 **`MISMATCH` 的判读方法** —— 此前只记录不解读,等于把判断留给一个没有 上下文的人。现在写清:出现 MISMATCH 意味着所有按 `cloud_web_search` 字面量下的闸 **当前是空闸门**(盯着一个引擎从不注册的工具名),并逐个列出要重核的闸(permission deny / ext `tool.execute.before` / catalog 拼名)、下错了各会怎样、以及判据必须是「用真实 id 跑一遍确认真的命中」而不是 grep 到字面量。 证据同步重跑,使committed 证据由 committed 探针产出: 登出态相位在新产物上独立两遍均 10/10(K1.5 不是侥幸);两条反向 fail-closed 自检复验通过。 本地闸门:north-star UPSTREAM 命中 0;docs gate 11 个相对链接全解析。 未改源码,未改 `docs/verification/` 其它目录,未动应用登录态(保持登出)。 Refs #643 Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> * docs(verification): #643 owner 登录态取证结果(打包版 e578e00) owner 亲自登录后跑完登录态相位。23 项判据:AC2(登出态 keyless)已在前一轮通过; 本轮登录态暴露六条必需红,其中两条是真缺陷、两条是探针判据缺陷: 真缺陷 - 云 MCP tools/call 恒 forbidden:cloud_web_search 要 purpose=model.invoke, 而桌面云通道令牌 ALPHA_CLOUD_TOKEN 恒为 cloud.dispatch(alpha-platform#131) - /mcp 传输层零鉴权,tools/list 与账户无关 ⇒ P1.3 那条 PASS 是空绿(alpha-platform#132) 探针判据缺陷(alpha-code#651) - P1.5 断的是「每个 agent 配置键有 deny」这个机制,而有效判决本来就全是 deny - P1.2 断言观测点错:引擎加载时已解析 {file:},/config 天然看不到 file ref - P3.8 判据构造上不可满足(工具已被 Permission.disabled 过滤,模型拿不到) 另:引擎侧真实工具 id 实测为 cloud_cloud_web_search(双前缀),按字面量 cloud_web_search 下的 permission 闸因此是空闸门(alpha-code#650)。 #643 不能关:AC1 待 #131 修复并手动部署后重取,AC3 待 #651 收敛判据。 --------- Co-authored-by: jinjunnn <slmbaovanetti99@gmail.com> Co-authored-by: Claude Opus 5 (1M context) <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.
背景(用户点名,2026-07-07)
环境重建时打开
~/.opencode/skill/看到 skill-creator / agent-creator 两条 symlink 直指 app Resources —— 出厂技能通道(REQ-036 初版)走了零拷贝捷径,跳过~/.alpha,破坏「alpha 自有内容都在.alpha、.opencode只是引擎发现面」的约定。目录安装链路(alpha-bridge)一直合规,唯此通道漂移。改动
~/.alpha/skills/<name>→ app 资源(真源,零拷贝保留)+ 复用bridgeItem落~/.opencode/skills(多跳链引擎可见,REQ-004 spike 实测)~/.opencode/skill/<name>我方直链(仅isAlphaFactoryLink判定命中才动),迁移后空目录顺手拆掉;用户真实目录 / 异源链照旧不碰(整项跳过,防引擎重名双源).opencode内 alpha 自有条目只允许 ① 指向.alpha的 symlink ②opencode.jsoncconfig 条目;内容本体一律先落.alphaserver.ts增 migrated 日志四件套
备注
用户真机上现存的两条旧直链要等下个签名包安装后由启动迁移自动清理(旧版 app 启动会重建旧链,手工改无意义)。
🤖 Generated with Claude Code