GOVERNANCE IN ACTION
治理与证明
提示词引导生成,仓库通过可执行规则、回归证据和失败即阻断的门禁决定接受。
自守卫仓库
Super Dolphin 把实现权与接受权分开:AI 负责实现和重构,人类负责产品意图、高影响决策、凭据与发布,仓库负责确定性的接受规则。
提示词可以引导 Agent 选择路径,但不是最终边界。真正持久的约束存在于类型化契约、生成式地图、AST/SSA 测试、聚焦回归测试与本地 Git 门禁中。
intent
-> generated orientation
-> LSP-scoped inspection
-> narrow implementation
-> AST / SSA / dependency guards
-> focused tests and generated-state checks
-> reviewable evidence
-> accepted change
治理层次
| 层次 | 作用 | 失败时发生什么 |
|---|---|---|
| 仓库指令 | 把 Agent 引导到当前地图、契约、工具和验证方式 | 缺少必要证据仍然是 blocker |
| LSP 工作区范围 | 把定义、引用、诊断和编辑限制在可信 checkout | scope 缺失或过期时在编辑前失败 |
| 类型化契约 | 让模块依赖窄 port,而不是具体实现 | 编译、架构或契约测试失败 |
| AST 与 SSA 守卫 | 检测语法、导入、值流和调用路径违规 | 测试指出规则与位置 |
| 生成式导航 | 让文件与能力地图跟随源码 | 漂移检查失败 |
| 变更感知门禁 | 把当前 diff 映射到必需检查与证据 | 要求保持显式,warning 不算证明 |
| Git hooks | 在 commit 和 push 附近执行仓库检查 | 修复失败项,或保留为明确 blocker |
后端边界注册表同时服务于规则执行器和生成式架构地图。发现绕过方式后,应添加负向 fixture,而不是把绕过记录成例外。
什么才算证据
一个可复查的结果至少需要说明:
- 源提交或精确 working-tree diff。
- 产生结果的命令或工具动作。
- 对应规则、测试、诊断或生成物。
- 退出状态与保留的失败输出。
- 跳过的表面和尚未解除的 blocker。
Agent 报告 done、空日志或后来一次绿色重跑,都不能抹去此前的确定性失败。证据既要足够窄,方便复现,也要足够完整,防止错误关闭任务。
五个公开案例
1. LSP 读到了错误的 Worktree
早期 LSP sidecar 在缺少调用级 CWD 时可能退回更宽的进程或 workspace 根。在多 worktree 环境中,请求会看似成功,却从相邻 checkout 返回定义、诊断甚至编辑目标。
修复后,可信 workspace scope 成为强制条件,manager pool 按 CWD 隔离,并加入多项目诊断隔离、缺失 CWD、过期根目录和 symlink escape 的回归测试。错误 scope 必须在编辑发生前失败。
公开证据位于 cmd/mcp-lsp/multilsp/multi_cwd_e2e_test.go、cmd/mcp-lsp/tools/tool_grep_test.go 和 tool_edit_support_test.go。
2. Provider 身份缺失却进入共享 Server
Codex server pool 启用时,缺失或损坏的 Provider identity 曾可能落入旧共享 app-server 路径。表面可用性被保留,但调用方要求的 home、实例与 Provider 隔离已经失效。
修复将 pool routing 改为 fail-closed,要求 start 与 resume 之间持久化 canonical identity,并拒绝冲突身份。公开测试同时证明 process spawner 不持有 pool mutex,避免一次慢启动阻塞其他实例。
3. 缺少运行时真相的持久 Agent
当全局默认开启时,缺少 thread identity 或 runtime metadata 的持久 subagent 曾可能通过兼容 fallback 看似创建成功,但系统并没有恢复它所需的持久状态。
当前实现把相应错误提升为共享契约,删除私有 fallback,并用回归测试证明:即使宽松的全局默认开启,缺少身份或运行时真相仍必须失败。
4. 异步错误被 UI 静默吞掉
空的 .catch(() => {})、catch {} 或只丢弃错误的 handler 会让失败的用户动作看起来成功。修复加入 TypeScript AST 守卫、覆盖多种静默形式的负向 fixture,并要求受影响路径提供可见错误处理。
规则允许有文档说明的 best-effort fallback,但没有解释的空 handler 会失败。公开入口是 frontend-app/scripts/no-silent-async-failure.mjs 与 npm run guard:critical-skip。
5. 架构守卫本身存在 Type Alias 盲区
早期编排边界守卫只统计对宽 OrchestrationService 的直接引用,本地 type alias 可以保持相同宽依赖,却绕过 selector 计数。
该绕过方式随后成为回归 fixture;当前规则使用 Go type information 与 SSA 检查 alias、容器、函数调用和值传播。守卫并不因为“已经存在”就自动可信,它也必须通过针对自身盲区的证据。
这些案例证明什么
它们不证明 AI 生成的变更不会出错,而是支持更窄、可复现的主张:
- 错误 scope 的证据必须在 Agent 编辑错误 checkout 前失败。
- 身份或运行时所有权缺失时,不能降级成表面成功。
- 用户可见失败不能消失在空错误处理器中。
- 已发现的守卫绕过必须成为永久负向 fixture。
- Agent 完成运行后,仍需相关证明为绿色,变更才可被接受。
边界与限制
- 守卫只能证明它明确编码的不变量。
- 本仓库的架构规则不是任意项目的通用扫描器。
- Language server 能力取决于安装和工作区配置。
- 测试自身也可能有盲区,发现后必须补充回归 fixture。
- 绿色本地门禁不能替代安全评审、发布评审或外部服务验证。
- 发布前事件属于维护者记录;公开树证明的是保留下来的守卫与测试,而不是私有历史本身。