跳转到内容

Aira 代码风险复核与修复

日期:2026-09-08。原图谱扫描是定位线索,本版以工作区、锁定的 ai@7.0.91 源码及本地运行结果重新定性。 原报告把源码阅读称为“实测”,并包含限流、并发、安全头及迁移处置误判,本版替换这些结论。 本轮未重算图谱规模、复杂度或共变指标;它们不构成缺陷证据。

本次确认的问题已在本地产品路径修复。验证范围包含假 provider、真实 Node HTTP、Workerd/SQLite 和 Chromium IndexedDB;不代表云端版本已更新。云端仍保持 provider-off,未启用外部邀请、调用付费模型或部署。 实施状态及验收结果只在工作进度 §7.2维护。

问题 复核证据 产品修复
后续准入拒绝仍发生 provider 调用 SDK notify/mergeCallbacks 等待通知但忽略回调拒绝;原路径本地复现 2 次准入、第二次拒绝、仍 2 次 fetch / 1 次结算且报告 success 准入移动至实际 provider fetch 前;结算失败锁存错误并 abort,未结算请求阻止后续 fetch;流与 observation 明确失败
usage 部分缺失低估费用 对象存在时曾将缺失 input/output 当作 0 两项必须同时为非负安全整数,否则按模型策略上限保守结算;合法 0 保留,未发起 provider 的请求释放预留并计 0
浏览器未发送邀请码 SDK transport 原先只有同源 credentials,服务端只读 Bearer 工作台“AI 访问”输入邀请码,当前标签页 sessionStorage 保存;SDK 每次请求动态读取,包括续传;清除后下一请求生效
多标签页升级阻塞与迟到连接泄漏 旧连接缺 versionchange,blocked 拒绝不终止 IDB open 请求 versionchange 关闭连接;blocked 后迟到 success 也关闭;明确提示关闭其他标签页并重新加载
损坏旧库迁移反复失败、无恢复入口 旧于 v3 的迁移发现缺父、环、多父会原子 abort 保留 abort 与原库;失败界面可下载原始记录,导出历史完整分支并经既有导入验证写入新库;损坏分支逐项诊断,不补造历史
初始项目恢复被拒 实际点击发现初始化失败被当作待处理候选;源修订没有 Candidate 证据却被强制重放 失败状态允许打开/恢复备份;源修订复用原有初始状态,后继修订仍核验完整证据、身份和几何
Node 背压等待可能挂住 原写循环只等 drain,close/error 不收尾 复用 Node Readable.fromWeb 与 pipeline;实际慢客户端关闭已验证上游取消、单次结算、监听清理
预留占满导致持久全局关闭 spent + reserved 曾同时用于准入和持久 kill switch 准入仍计预留;80% 告警计预留,100% 持久关闭及重新启用检查按实际支出;核算异常仍熔断
状态长期累积与拒绝洪泛 审计、终态租约及已送达告警没有历史清理 90 天保留、分批 alarm 清理、保留累计计数与预算;拒绝审计按主体/原因/限流窗口保留首条;保留近期审计防改删和未送达告警
带 query 的 API 路由不一致 外层 pathname 匹配,内层拼上 search 后 404 Node/Fetch 内层统一 pathname 匹配,query 不参与路由
重复运行常量和静态路径过早构造配置 reasoning 白名单、输出上限重复;静态 fallback 前构造 composition 共用 contracts 常量;静态及未知 API 路由提前返回;正式发布仍须由已有脚本注入运行策略

关键源码:provider 边界、 HTTP 结算、费用策略、 Durable 状态、 Node 传输、IDB、 恢复入口、邀请码。

  • “一次任务最多 10 步”与“并发至少应为 2”:10 次是固定分钟窗口,任务可跨窗口;浏览器 turn 与服务端 step 也不同。SDK 等待前一步 onStepEnd 完成才推进下一步,不需要通过放宽并发掩盖错误传播。保留生产并发 1。 工作树的临时 16 turns / 12 分钟等配置不是发布默认值,本轮保留原改动。
  • “90 秒租约到期就能恢复预算”:过期会把全额预留计入支出,不能保证恢复额度。本轮没有改变保守核算。
  • “迁移应跳过坏链继续提交”:会破坏原子性与历史可信性。保留失败事务回滚,通过独立新库恢复可验证分支。 仅凭 Promise microtask 写法也不能认定 IDB 事务失活;真实浏览器迁移已通过。
  • “onEnd rejection 必然无人接管”:SDK UI 流在 TransformStream flush/cancel 中 await onEnd。 本轮明确验证准入拒绝、结算失败和断流的消费者路径,无未处理 rejection。
  • “没有任何安全头”:deploy/cloudflare/_headers 已定义安全头,正式打包会复制。 缺少某一特定响应头不等于没有防护,本次也不声称已经重验线上响应。
  • “没有测试文件是遗漏”:项目明确要求删除 test/spec 和配套框架,以实际产品操作、构建、类型与静态检查验收。 未使用的依赖及手动 CI 是独立维护背景,不能推出未验证或授权重建测试体系。
  • 复杂度、共变分数与 dist 总量:不能推出每次改动必须涉及 12 文件,也不能把未压缩 dist 总量等同首屏下载。 全仓函数重构、composition 缓存及体积优化需要具体耗时或变更样本,本轮没有把未测量的建议当作缺陷。
  • Rust expect 与肯定性全仓统计:被点名访问前已有 schema 校验,未给出可绕过输入;不能宣称已证实 panic 或实例永久失效。原报告的 TODO、catch 等数量未重算,不保留为保证性结论。

公开 SDK 报文、模型身份、AMIR 修订与 .aira.json 0.2 格式不变。SDK 保持官方工具及循环,本轮未引入依赖。 90 天后的审计/终态幂等明细不再永久留存,拒绝审计改为窗口首条;这两项是明确的保留策略变化,累计费用不清零, 也未增加外部归档。待送达告警继续持久重试,运营方仍需处理长期投递失败。

剩余生产运行验证仍按上线计划 G2执行, 不能把本地假 provider、dry-run 或静态检查当作真实模型费用与告警送达证明。