- 人工智能
- AI 应用
- 桌面应用
【免费下载链接】open-codesign
Open-source Claude Design alternative. One-click import your Claude Code / Codex API key. Prompt → prototype / slides / PDF. Multi-model (Claude, GPT, Gemini, Kimi, GLM, Ollama). BYOK, local-first, MIT.
本文以仓库中 .Codex/workspace/core_fail_fast_audit.md 这份审计文档为主体骨架,结合
packages/core、packages/providers、packages/shared与apps/desktop/src/main下的真实源码与测试,系统讲解 Open CoDesign 如何通过 fail-fast(快速失败)策略消除"把失败伪装成成功"的隐性缺陷。读完本文,你将掌握该项目的错误分类体系(throw / typed error / explicit recovery / valid empty state / explicit migration 五类决策)、各边界上的 105 项具体审计结论,以及对应的验证命令与源码佐证路径。
一、审计背景:为什么需要一次 Fail-Fast 专项审计
这份审计文档记录于 2026-04-27,标题为Core fail-fast audit,其核心目标是:找出所有"把一次核心操作的失败静默转换成成功"的代码路径,并逐条决定应该 throw、返回类型化错误、还是明确保留为空状态/迁移/恢复语义。
审计范围横跨四个包/目录:
packages/core(Agent 运行时、工具、设计技能加载)packages/providers(多模型供应商封装、校验、OAuth)packages/shared(EDITMODE 协议、config schema、错误码)apps/desktop/src/main下的 provider / auth / config / import / connection / generate 各类 IPC 边界
审计启动时的 dirty 文件清单(即审查起点):
| 文件 | 关注点 |
|---|---|
| packages/core/src/agent.test.ts / agent.ts | Agent 生命周期与凭据处理 |
| packages/providers/src/gemini-compat.test.ts / gemini-compat.ts | Gemini 模型 ID 归一化 |
| packages/providers/src/index.ts | 供应商 complete() 封装与错误映射 |
文档为每一条审计结果定义了一张记录表:ID | Path | Fail trigger | Current behavior | Risk | Decision | Fix | Test | Status。政策明确:标为valid empty state、explicit migration、explicit recovery的行故意不 fail-fast,因为它们不会把失败的核心操作转换成成功;其余行则必须消除"失败被吞掉"的行为。
二、五类决策模型:Fail-Fast 的分层处理
通读 105 条记录(FF-001 ~ FF-105),可以把项目的决策归纳为五类,这也是理解整份审计的钥匙:
- must throw:协议违规、凭据缺失、配置损坏等必须立即以
CodesignError(携带ERROR_CODES)抛出让调用方可见,绝不允许降级为"看起来成功"。 - typed error result:IPC/网络这类面向渲染进程的边界,返回类型化错误结果(如
{ ok:false, code, message }),而不是让 IPC 进程崩溃,也不是返回ok:true的空结果。 - explicit recovery:明确声明的恢复/降级路径(如"目录 ENOENT 视为首次运行空状态"),允许保留但必须语义清晰、注释准确。
- explicit migration:仅存在于 v0.1→v0.2 迁移边界的兼容逻辑(如旧 schema 读取、safeStorage 迁移),保留但只作为迁移,不做运行时兜底。
- valid empty state / rename / document:本身就是"空即合法"的函数契约(如谓词辅助函数返回
false),或仅需改写误导性的fallback措辞。
错误码的集中登记见 packages/shared/src/error-codes.ts:所有CodesignError都携带ERROR_CODES中的字面量(如IPC_BAD_INPUT、PROVIDER_AUTH_MISSING、ARTIFACT_PROTOCOL_INVALID、TOOL_EXECUTION_FAILED、KEYCHAIN_EMPTY_INPUT),并通过ERROR_CODE_DESCRIPTIONS提供面向用户的文案与诊断分类(ipc / provider / generation / snapshot / preferences / connection / other)。
三、协议与工具层:让"协议错误"不再伪装成"没有该功能"
3.1 EDITMODE / TWEAK_SCHEMA 标记块协议(FF-001~003、FF-037)
packages/shared/src/editmode.ts 解析 Agent 在产物源码中声明的两个标记块:
TWEAK_DEFAULTS:const TWEAK_DEFAULTS = /*EDITMODE-BEGIN*/{ "key": "value" }/*EDITMODE-END*/;TWEAK_SCHEMA:与前者并列的 UI 提示块(color / number / enum / boolean / string 五种 entry)。
审计发现并修复的问题:
| ID | 失败触发 | 原行为/风险 | 决策与修复 | 测试 |
|---|---|---|---|---|
| FF-001 | EDITMODE 标记存在但内容是非对象 JSON 或非法 JSON | 返回null,如同没有 tweak,协议错误被隐藏成"无 tweak 面板" | must throw:抛CodesignError(ARTIFACT_PROTOCOL_INVALID) | editmode.test.ts malformed marker rejects |
| FF-002 | 存在裸const TWEAK_DEFAULTS = {...}而无标记 | 自动推断 token 并重写标记,静默修补 Agent 协议违规 | 移除裸常量推断与标记自动包裹,只认规范标记 | bare const returns no block / replace unchanged |
| FF-003 | TWEAK_SCHEMA标记存在但内容非法 | 返回null,畸形 schema 被隐藏 | 抛ARTIFACT_PROTOCOL_INVALID | malformed schema rejects |
| FF-037 | schema entry 的可选字段类型错误、enum 选项混入非字符串 | 丢弃非法字段/过滤 enum 值,协议被"部分修复"成另一种 schema | 错误类型的可选字段与非字符串 enum 选项一律视为非法 entry | malformed option/type tests |
从源码看,parseEditmodeBlock()对标记内 span 依次做:JSON 解析(失败抛ARTIFACT_PROTOCOL_INVALID)、必须是对象(数组/null 也抛)、每个 token 值必须是 string/number/boolean(否则抛)。parseTweakSchema()同样对每个 entry 调用validateEntry(),任何非法 entry 直接抛错而不是跳过。值得注意的是 v0.2 中ensureEditmodeMarkers()已退化为"原样返回"——Agent 必须自己输出规范协议,运行时不再代为修补。
3.2 工具执行与产物校验(FF-004、FF-042、FF-083、FF-096、FF-104)
| ID | 失败触发 | 风险 | 决策/修复 | 测试 |
|---|---|---|---|---|
| FF-004 | preview工具的宿主执行器抛错 | 合成ok:false空结果,工具崩溃看起来像普通预览失败 | 抛CodesignError(TOOL_EXECUTION_FAILED)并携带 cause | preview.test.ts executor throw rejects |
| FF-042 | scaffold目标/清单源路径通过前缀技巧或..逃逸声明根目录 | 工具可越界读写却报告成功 | 用path.relative做根包含校验;逃逸时返回显式工具错误 | scaffold.test.ts root containment tests |
| FF-083 | generate_image_asset持久化失败(fs.createreject) | 未 await,写入未落盘就返回成功 | await 资产持久化,写穿失败先于工具成功传播 | generate-image-asset.test.ts persistence failure test |
| FF-096 | manifest.json可解析为 JSON 但非合法 scaffold manifest 形状 | 未校验的 cast 导致后续属性访问抛裸TypeError | 加载时校验 manifest 形状,runScaffold返回 manifest-unavailable 工具错误 | scaffold.test.ts malformed manifest-shape test |
| FF-104 | ask工具输入含畸形 question、缺 prompts/options、非法 slider 区间、重复 id | 仅检查数组存在/数量,畸形输入直达渲染桥,UI 层挂起或失败 | 深度校验每个 question 形状,桥接前拒绝 | ask.test.ts malformed question tests |
以 packages/core/src/tools/preview.ts 为例:makePreviewTool的execute用 TypeBox 校验输入(validatePreviewInput),并把整个执行体包在 try/catch 中,任何异常统一改写为CodesignError(TOOL_EXECUTION_FAILED, { cause });而PreviewResult.ok:false只保留给"预览确实失败"这类业务结果,两者不再混淆。
3.3 图片生成与工作区二进制资产(FF-084、FF-086~090、FF-097)
| ID | 失败触发 | 风险 | 决策/修复 | 测试 |
|---|---|---|---|---|
| FF-084 | 资产路径内容是生成的data:image/...;base64,...URL | 把 data URL 字符串写进磁盘assets/*.png,产出"带 PNG 后缀的文本文件" | 工作区/迁移写入时解码为二进制,虚拟 DB/状态保留 data URL;畸形 data URL 拒绝 | runtime/snapshots workspace asset tests |
| FF-086 | 图片生成端点返回 2xx 但 body 非 JSON | 裸SyntaxError从res.json()逃逸 | 包装为CodesignError(PROVIDER_ERROR)并保留 cause | images.test.ts non-JSON response test |
| FF-087 | 端点返回非空但畸形的 base64 图片数据 | 被归一化为"成功"的 dataUrl | 返回GenerateImageResult前校验 base64 载荷 | images.test.ts malformed image data tests |
| FF-088 | Codex OAuth token 端点返回非 2xx | 抛出裸Error,类型化失败被推迟到主进程包装层 | 抛CodesignError(PROVIDER_ERROR);body 读取保留为显式诊断恢复 | oauth.test.ts non-2xx typed error tests |
| FF-089 | base64 语法合法但与图片 MIME 签名不符 | 任意非空 base64 都被当作成功图片资产 | 供应商/工作区边界校验 PNG/JPEG/WEBP 已知签名 | provider/workspace signature tests |
| FF-090 | data URL 首尾带空白 | 未 trim 导致工作区把有效 data URL 当普通文本写入 | trim 后解析并持久化规范化 data URL | workspace/provider>赞
【免费下载链接】open-codesignOpen-source Claude Design alternative. One-click import your Claude Code / Codex API key. Prompt → prototype / slides / PDF. Multi-model (Claude, GPT, Gemini, Kimi, GLM, Ollama). BYOK, local-first, MIT. 项目地址:https://gitcode.com/gh_mirrors/op/open-codesign 相关推荐
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
版权声明:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设
2026/9/28 20:16:56
书霸AI降重清单|www.shubaai.com论文写完,并不等于可以直接提交。很多同学最后卡住的地方,往往是重复率、AIGC检测结果,或文档格式没有处理妥当。书霸AI的“降重/降AIGC”功能,可以把这些检查集中到一个流程中完成。使用前,建议先准备好论文原稿&…
网站建设
2026/9/28 20:16:51
从MVVM到Provider注册表:Claude Usage Tracker用量追踪架构深度解析完整指南从MVVM到Provider注册表:Claude Usage Tracker用量追踪架构深度解析完整指南 【免费下载链接】Claude-Usage-Tracker Native macOS menu bar app for tracking Claude AI usage limits in real-time. Built with Swift/SwiftUI. 项目地址: https://gitcode.com/gh…
网站建设
2026/9/28 20:16:42
Xberg Dart 批量提取容错实战:extract_batch 处理全部缺失 URI 输入后端AI 应用NLP 【免费下载链接】xberg Polyglot document intelligence with a Rust core: extract text, metadata, images, tables, and structured data from 106 formats across 140 file extensions, plus code intelligence for 371 languages. Fifteen bindings, with …
网站建设
2026/9/28 20:16:39
真空共晶焊接空洞率偏高?青岛真空共晶机公司推荐排查思路焊接面空洞率从3%跳到12%、瓦片TR组件垂直互联真空共晶焊接的互连柱出现裂纹、同一炉产品批次一致性忽好忽坏——这三类异常占了我这些年处理过的真空共晶问题的七成以上。多数时候设备没坏,问题出在真空度、升温曲线、冷却段这三个环节中的一个。先做空洞率分布测试…
网站建设
2026/9/28 20:16:37
Eclipse Mosquitto 0.7 发布解析:poll() 事件驱动、max_connections 与高并发客户端支持物联网消息队列后端 【免费下载链接】mosquitto Eclipse Mosquitto - An open source MQTT broker 项目地址: https://gitcode.com/gh_mirrors/mosquit/mosquitto 点击查看 免费下载 导读 本文以 Eclipse Mosquitto 官方 2010 年 6 月发布的 version 0.7 发布说明…
网站建设
2026/9/28 20:16:19
我对等保2.0的理解等保2.0即网络安全等级保护2.0,是《网络安全法》规定的基础性网络安全制度。它将系统划分为5个保护等级,核心框架为一个中心,三重防护,防护思路从静态被动转为动态主动的全生命周期防护。保护对象覆盖传统系统及云、大数据、物联网… |