缺口、限制与待验证问题
Developer Preview 中尚未闭合的语义和证据
结论:这里没有一个“完成度”数字,只有不同证据状态的问题清单
DeepSeek Harness 在公开仓库中主动维护限制台账,但台账的存在不等于所有限制具有同一性质。本章把问题严格分为五类:源码和公开合同直接证明的明确缺口;能力存在、但交付、隔离或一致性只到某一边界的弱保证;同一提交内公开说明与实现不一致的文档/代码漂移;由操作系统或 runner 决定、不能归并为单一承诺的平台差异;以及静态阅读无法判定、必须用真实网络、进程、崩溃或并发夹具回答的运行实验问题。
这套分类首先防止两种误判:已明确排除的能力不自动等于缺陷;尚未做运行实验也不自动等于已经失败。所有事实固定在提交 47f943859bef60e4160492346772ded9b24f765a。
1. 五种证据状态不能混用
| 状态 | 本章采用的判据 | 能下的结论 | 不能下的结论 |
|---|---|---|---|
| 明确缺口 | 实现、类型合同或公开 Known Limitations 直接写明缺失、stub、保留但未实现,或代码路径会返回不安全值 | 该能力在此提交上不存在或不能被安全依赖 | 已经发生过生产事故 |
| 弱保证 | 能力已实现,但 ack、原子性、隔离、一致性、完成判定或恢复只覆盖有限边界 | 调用者必须承担剩余策略 | 实现等于完全无效 |
| 文档/代码漂移 | 同一提交内,公开合同描述的值或覆盖面与实际实现直接冲突 | 至少一侧需要校正,消费者不能同时信任两者 | 所有手写文档普遍陈旧 |
| 平台差异 | Linux、macOS、Windows 或 CI runner 明确提供不同机制、强度或 verdict 权重 | 结论必须携带平台与 runner | 较弱平台必然是 bug |
| 运行实验问题 | 答案取决于 DNS、kernel、SDK、文件系统、崩溃时点、并发进程或真实模型行为 | 可以设计可证伪实验 | 仅凭源码宣告通过或失败 |
仓库门禁扫描每个 packages/*/*/package.json,要求相邻 README 使用唯一规范标题并至少有一个顶层 bullet;本次运行报告 219 个 package README 被检查、1 个白名单项、全部符合。OPEN-LIMITATIONS-GATE
2. 明确缺口:两个输入边界仍可能把敏感目标或秘密带过去
Settings wire redaction:redactSecrets 只递归 object、dict 和 array。默认分支明确指出:只经 union、intersection 或 transform 可达的 secret 会被原样返回,而且没有 miss 记录。OPEN-SETTINGS-REDACTION-CODE公开 README 还补充了第二条路径:schema.toJSON() 会把 secret field 的 default 带给客户端;两种情况目前都不会 fail closed。OPEN-SETTINGS-REDACTION-DOC
HTTP fetch SSRF:provider 已有限 URL、协议、大小、超时、内容类型和同源 redirect 策略,但明确没有 private、loopback、link-local、multicast 目标阻断,没有 resolve-then-validate,也没有逐 hop 重验。公开合同直接称它在能访问敏感内网的部署中是 SSRF primitive,不应启用。OPEN-WEB-SSRF
这两项不是“纵深防御还可更好”,而是当前 wire/network admission 无法覆盖已点名输入形状或目的地址。现有 schema、cookie-free 请求、同源 redirect 和 byte cap 不能替代缺失的 fail-closed secret proof 或网络目的地政策。
3. 明确缺口与范围边界:文件约束不等于 hostile-code 隔离
Sandbox seam 的完整政策词汇只描述文件 effect;network、process、syscall、device 和 credential restriction 不在合同内。它还是 same-world confinement,denial 依赖 stderr dialect,runner diagnostic 也在带内,恶意 child 可以伪造诊断而造成误归因,但不能借此绕过实际 confinement。OPEN-SANDBOX-SCOPE
当前 workflow engine 每个 run 使用一个 worker thread。它解决 host event loop 被同步脚本阻塞以及强制终止问题,但文档明确说 node:vm 只是 API shaping;逃逸后的脚本可以取得 host process 权限,真正的不受信脚本需要另一个 process/container engine。OPEN-WORKFLOW-ISOLATION
“Sandbox 不限制网络”是已实现 seam 的明确范围,不应写成文件约束失效;“现有 workflow engine 不能承载 hostile script”则是相对于不受信代码部署的明确缺口。两者共同说明:看到 sandbox、worker 或 vm 名称,不能自动推导通用安全边界。
4. 明确缺口:长运行、资源预算与生命周期还有空席
Workflow 目前只支持 foreground collection,不记录 script、child progress 或 intermediate value,因此 process restart 不能续跑;接口也没有跨 child 的 token-budget vocabulary,live run 由 holder 而不是 service registry 跟踪。OPEN-WORKFLOW-DURABILITYRalph 的完成状态由 worker 自报,没有独立 evaluator;aggregate effort 只有 round count,token、price 与 elapsed-time budget 仍属 deferred work。OPEN-RALPH-VERIFICATION
附件对象是不可变且可跨 resume/fork 共享的,但 retention 与 reference-aware garbage collection 尚未实现;本地 backend 公开声明会无限期保留对象。OPEN-ATTACHMENT-RETENTIONOPEN-ATTACHMENT-LOCAL-RETENTION通用 atomic-write primitive 保证同目录 rename 的可见原子性,却没有 file/directory fsync,因此不是 crash durability;owner 崩溃留下的 lock 也只能由 operator 在确认无活 writer 后恢复。OPEN-ATOMIC-DURABILITY
这些缺口不会否定 foreground workflow、immutable attachment 或 atomic replacement 的现有价值;它们限定了不能承诺的产品语义:process-resumable orchestration、aggregate model budget、自动对象回收、以及普通 atomic-write caller 的 crash-durable commit。
5. 弱保证:恢复会保留未知结果,而不会创造 exactly-once
Checkpoint policy 在 top-level tool body 前持久化 execution intent;如果 crash 落在 call 已持久、result 未持久的窗口,recovery 写入 TOOL_OUTCOME_UNKNOWN。合同明确指出它无法证明外部 effect 是否完成,因此不会自动重试;side-effecting provider 若支持,应使用 exec.callId 作为 idempotency key。OPEN-CHECKPOINT-UNKNOWN
系统保证的是“意图可恢复、未知性不被伪装成成功”,不是任意外部系统的 exactly-once。这里没有待修复的通用算法:没有 provider-side idempotency、查询或补偿协议时,进程内 runtime 无法从 durable call 单方面推断现实世界结果。
6. 弱保证:Telemetry 的 cursor 是 handoff 水位,不是 delivery acknowledgement
Telemetry disclosure 明确只声称把 record 非阻塞地交给 backend;batching、retry 和 loss policy 属于 SDK。module-scope cursor 记录最高 handed-off sequence,不记录 delivered sequence;旧进程没有交付的记录不会在 resume 时 backfill。OPEN-TELEMETRY-HANDOFF
它还不附带任何 redaction rule:没有 listener 时,record 按捕获内容离开进程;crash 时 backend queue 中的内容可能丢失。OPEN-TELEMETRY-LIMITSOTel backend 的 authentication、TLS、throttling 和 live collector 行为由 upstream SDK 决定,shutdown deadline 也不能取消 transport。OPEN-OTEL-BOUNDARY
“full”表示每个 eligible event 都进入 handoff path,不表示成功送达;“feedback-only”表示在 feedback 时重放 eligible prefix,不表示 capture-time snapshot。端到端 delivery、dedupe、privacy 和 retention 必须在 deployment 与 collector 侧另行证明。
7. 明确缺口:公开 API 与客户端生命周期中的保留席位
session.list 的 request 接受可选 cursor,但 v1 返回全部 persisted sessions,cursor 只是未实现的保留席位;events.mux.since 同样被忽略,重连策略是重新打开 stream 并重新拉 history。OPEN-API-RESERVED-SEATSOPEN-EVENT-RESUME-SEAT
客户端 runtime 的公开限制还写明 loader.unload 是会抛出 not-implemented 的 stub,没有从 fiber disposal 到 registration/style removal 的通用卸载链。OPEN-CLIENT-UNLOAD
这些是可定位的缺失能力,不是整个 reconnect 或 effect cleanup 都不存在:当前重连有 reopen + refetch 路径,许多具体 contribution 也由 fiber effect 清理。准确缺口是 wire-level cursor resume、unpaginated list 的扩展性,以及通用 module unload chain。
8. 文档/代码漂移:host.describe.version 不是合同所说的值
公开 Host API 注释把 version 定义为 apps/cli 的 package version。OPEN-HOST-VERSION-CONTRACT同一提交的实现却带着 TODO,固定返回 0.0.1;该提交中的 CLI package version 是 0.1.0-rc.5。OPEN-HOST-VERSION-IMPLOPEN-CLI-VERSION
这不是 protocol-version negotiation 缺口的别名;合同明确把字段解释成 host app version。修复前,消费者不能把该字段当作真实应用版本,也不应从它推断兼容性。
另一个较小的公开文档遗漏出现在 sandbox seam 的实现摘要:父 README 的实现括注只列 Linux 和 macOS,但同页错误文案与 provider README 都包含 Windows ACL runner。provider 的真实存在不受影响;需要修的是摘要覆盖面。OPEN-SANDBOX-DOC-OMISSIONOPEN-SANDBOX-PLATFORM-LADDER
9. 平台差异:同一个“sandbox”或“process cleanup”不是同一强度
| 表面 | Linux | macOS | Windows | 正确读法 |
|---|---|---|---|---|
| 本地文件 confinement | 优先 bwrap,之后 Landlock;旧 ABI 可报告 partial | Seatbelt,依赖已 deprecated 的 sandbox-exec | ACL restricted-token,因 Everyone 权限与 NTFS hard link 明确报告 partial | enforcement 是逐 backend/ABI 事实,不能只看 mode 名称 |
| Terminal process observation | tree/session inspection;调用 setsid 的 child 可逃离观察范围 | ps snapshot;首次 snapshot 前 reparent 的 child 可丢失 | terminal inspector 不支持;普通 tree kill 是 best-effort taskkill | process-tree termination 与连续 OS containment 不是同一承诺 |
这些差异由 provider 明示而不是隐藏:Windows ACL 与某些 Landlock ABI 报告 partial,Seatbelt 的可持续性取决于 Apple 仍提供其 policy engine。OPEN-SANDBOX-PLATFORM-LIMITS本地 subprocess 也明确列出 Windows best-effort、Linux/macOS inspector 范围和 daemonized descendant escape。OPEN-PROCESS-PLATFORM-LIMITS
不能把 Linux bwrap 的实测结论外推到 Windows ACL,也不能因 Windows 标注 partial 就断言该 backend 完全无约束。部署声明必须同时写 mode、backend、kernel/ABI、报告的 enforcement 与测试过的 effect。
10. 验证缺口:确定性 replay 有明确未覆盖状态空间
LLM replay 通过 live session 的 first-call order 绑定已录制 parent/child scripts;这依赖 delegation 顺序。并发 sibling 会非确定地绑定到 scripts,更强的 keying 仍被 deferred。纯 pre-chunk throw、cancel/hang 和未标记的 external summarizer call 也必须靠 sidecar 表达。OPEN-REPLAY-CONCURRENCY
对于每个符合条件的已录制 scenario,ACP snapshot suite 会运行真实组装入口,归一化波动值,并把 stdout、采集到的 parent/child log 分别与 fixture 比较。TINV-SNAPSHOT-COMPARE它的 session harvest 只支持 raw JSONL;compressed JSONL 与 SQLite composition 没有 harvest path。OPEN-SNAPSHOT-BACKEND-GAP因此 green 结果只证明该次真实比较覆盖的已录制 scenario 与 channel,不能外推到并发 child interleaving 或所有 persistence backend 的相同路径。
这里缺的是反例生成与 fixture 采集能力,不是已证明的生产语义错误。应先补更强的 replay identity 与 backend-neutral harvest,之后才能把相应状态空间纳入 deterministic regression。
11. CI 聚合边界:有信号不等于进入同一个 workflow aggregate
Pull request 的 windows job 在 hosted Linux 上使用 Windows Node under Wine,并被列入 all-checks-passed.needs。它调用的 runner 会验证 Windows Node archive 与 win32 x64 身份,然后只运行 workspace build 与 production-site build 两个 surface。OPEN-CI-WINDOWS-SIGNALSTINV-WINE-RUNNER真实 Windows kernel job 运行 complete inventory,但明确不进入这份 needs 列表。OPEN-CI-VERDICTHosted Linux 与 macOS serial reference jobs 在当前配置为 if: false;self-hosted serial lanes 只在 master push 运行。OPEN-CI-SERIAL-LANES
Real-API E2E 是独立 workflow:fork 与 Dependabot PR 因 secret model 被整个 job 跳过,而 GitHub 会把该 job-level skip 报成 successful check。OPEN-REAL-API-CIMaster-push real-kernel sandbox matrix 覆盖 bwrap、两种 Landlock architecture 与 Seatbelt;它还在命令中断言两个 platform file 都实际运行,防止 self-skip 伪装成 green。OPEN-SANDBOX-CI这两个 workflow 均不在 ci.yml 的 all-checks-passed 依赖图中。
这些不是“CI 没有测试”;仓库有独立 observational/reference signal。静态 workflow 文件只能证明 trigger、job 和 all-checks-passed aggregate 的范围。本研究没有验证仓库实时 ruleset 或 required-status 配置,因此不声称哪些 check 能实际阻止合入。
12. 跨进程与资源上限:局部串行化不能外推成全局保证
Message feedback 的 per-Session mutation queue 只序列化一个 service process;storage-domain 没有跨进程 conditional write,多个 Host process 写同一 storage root 时没有 compare-and-swap 或 lost-update 保证。它也没有 durable Session deletion cascade、item-count 或 aggregate-row byte cap。OPEN-FEEDBACK-CONSISTENCYSettings seam 同样只在进程内按 namespace 串行;跨进程收敛由 provider 决定,本地文件 provider 对同 namespace 冲突采用 last-write-wins。OPEN-SETTINGS-CROSS-PROCESS
资源方面,浏览器 /api bridge 会把每个 request body 全量缓存在内存,默认 resident bound 为 160 MiB;native-command helper 则同时无界缓存 stdout 与 stderr,只因当前 caller 预期很小而暂时成立。OPEN-API-BODY-BOUNDOPEN-NATIVE-OUTPUT-BOUND
单进程队列和当前小输出 caller 是有效的局部前提,但不是多写者一致性或通用资源隔离。若部署会共享 storage root、扩大 command surface 或接受接近上限的并发 image request,就必须单独验证内存与冲突行为。
13. 待运行实验:每个问题都要有可证伪判定
| 优先级 | 问题 | 最小实验夹具 | 可证伪判定 | 证据状态 |
|---|---|---|---|---|
| P0 | Secret schema 能否在任何 wire-exposed 形状泄漏? | 为 union/intersection/transform/default/error-text 构造 canary secret,经真实 settings describe carrier 读取 | 不支持的 schema 在发布前 fail closed;任何 response/error/serialized schema 均不含 canary | 现有缺口已确认;修复效果待实验 |
| P0 | HTTP fetch 能否穿过 DNS rebinding 或 redirect 访问内部地址? | 双答案 DNS、TTL 切换、IPv4/IPv6、十进制/映射地址、每 hop redirect 与本地 metadata canary server | resolve 后和每 hop 都验证实际 destination;任何非公开地址在 socket connect 前被拒绝 | 现有缺口已确认;防护完整性待实验 |
| P0 | Hostile workflow script 能否逃逸 worker/vm 并读取 host authority? | 把模型脚本移到候选 separate-process/container engine,投放 CPU、memory、filesystem、network 与 credential canary | 只能访问显式 capability,越界被 OS boundary 拒绝;cancel/kill 后无 surviving child | 当前 engine 非边界已确认;替代 engine 待实验 |
| P1 | Crash 窗口内的 tool effect 如何收敛? | 在 intent flush、external commit、result append 各点注入 process kill,provider 用与不用 callId idempotency 各跑一组 | log 始终可恢复;无 idempotency 时只报告 unknown,有 idempotency 时重试不产生第二个 effect | 弱保证;provider-dependent |
| P1 | Telemetry 在 collector 故障下实际丢失、重复与泄露多少? | 用真实 OTLP collector 注入 TLS/auth error、429、断网、queue saturation、hung shutdown 和 crash;先跑当前无 redaction listener 的 baseline arm,再跑显式挂载候选 redaction rule 的 policy arm,并分别放置 privacy canary | Baseline arm 只量化 disclosure/loss/duplication,不冒充 privacy pass;candidate arm 仅在 canary 不外发、receiver dedupe 有效、实测 loss/shutdown 符合预声明目标 policy 时通过 | SDK/deployment-owned,静态不可判定 |
| P1 | 两进程写同一 feedback/settings root 时是否丢更新? | 实验前声明“强一致”或“last-write-wins 特性刻画”目标,再让两个独立 Host process 做 barrier-synchronized update、kill/restart 与 watcher replacement | 强一致目标要求冲突全部可检测且无 silent lost update;特性刻画目标要求不同调度下的 winner 与 lost-update window 可复现、可记录,并明确保持非原子,不能计作强一致通过 | 局部保证已知;实际部署行为需要实验 |
| P1 | 平台 sandbox 与 process cleanup 的真实边界是什么? | 在 bwrap、各 Landlock ABI、Seatbelt、Windows ACL 上运行同一 file/network/process/hard-link/reparent/setsid corpus | 报告 enforcement 与实际 effect 一致;fail-closed;残存 process 与误归因均有平台化结果 | 平台差异已知;kernel behavior 待实验 |
| P2 | 并发 sibling replay 与非 raw backend 能否确定性回归? | 同时释放两个 child 的 first model call,并从 raw、compressed 与 SQLite 分别 harvest | script 绑定不依赖调度;三种 backend 产生同一规范化 logical log | 测试能力缺口已确认 |
| P2 | 资源上限在并发负载下是否满足部署预算? | 并发发送接近 160 MiB 的 API bodies,并让 native helper 产生受控大 stdout/stderr | resident memory、拒绝点、cleanup 和 operator diagnostic 均落在预先声明预算内 | 静态只知单请求/无界模型;容量待实验 |
14. 优先级:先关闭会扩大 authority 的缝,再补规模与便利性
| 优先级 | 项目 | 理由 | 完成条件 |
|---|---|---|---|
| P0 | Settings fail-closed wire description;HTTP destination policy;hostile workflow engine 选型 | 错误会把 secret、内网或 host process authority 带过原本被理解为边界的位置 | 代码修复 + 上节 canary/escape 实验 + 公开合同收敛 |
| P1 | Telemetry redaction/outbox policy;跨进程 CAS;真实平台 blocking signal;workflow journal/budget | 决定隐私、恢复、一致性和长运行运维承诺 | 先声明目标语义,再由 fault injection 或 native lane 证明 |
| P2 | API cursor/since;client unload;attachment GC;snapshot backend parity;resource tuning | 主要影响规模、生命周期完整性与测试覆盖,不应抢在 authority 缝前面 | 协议兼容路径、迁移/GC 安全性与回归证明齐全 |
| 立即文档修复 | host.describe.version 与 sandbox platform 摘要 | 已有直接矛盾或遗漏,修复成本低且会影响消费者判断 | 代码和公开说明在同一提交上相符 |
15. 本章验证范围
- 仅使用公开 DeepSeek Harness 仓库在固定提交上的源码、package README 与 GitHub workflow;正文和 evidence 均不包含其他项目名、路径或标识符。
- 对每个引用重新核对了 live path 与 line range;明确缺口、弱保证、文档/代码漂移、平台差异和待实验问题使用不同标签。
- 只执行了结构性文档门禁
pnpm run verify-package-readme-limitations:219 个 package README、1 个白名单项,退出码 0。 - 未运行 full build、unit/coverage/snapshot/browser suite、real-API、真实 collector、crash injection、并发多进程、native Windows/macOS 或 kernel sandbox 实验;相关结论均未冒充运行证明。
- 中英文页面 section、table、claim/caveat、evidence 引用的结构与首次引用顺序相同。
我的学习体会
内容仅自动保存到当前浏览器,不上传、不进入仓库。你可以导出 Markdown 自行归档。