Files
AirCoding/状态交接.md
AirCoding 5e282a39b4 feat(round2+round3): 完整实现 A/B/C/D 主线 + round3-F/H 修复
Round2 主线:
- A: 事件落库地基 (RuntimeApp EventStore 单例 + 14 repo wiring)
- B: 执行体对齐 (read-before-edit, verification-before-completion)
- C: 界面对齐 (@opentui/solid, 删除 runtime 依赖)
- D: 经验闭环 (ExperienceMiner, DebuggerRole, CompactorRole)

Round2 补充修复:
- fail-on-missing 反作弊门禁
- projection-store-apply.test.ts 补写
- 3个空壳测试转行为 (evidence-store, recovery-impl, knowledge-store)
- ask 项目根支持 AIRCODING_PROJECT_ROOT
- Worker 事件契约修复 (task.attempt.started → checkpoint)

Round3-F: cpp 工具切换
- 删除 BuiltInToolRegistrar cpp.* 闭包
- 接入 toolchain-cpp 真实 CppToolRegistrar
- canonical envelope {status/output/metadata}
- ExecutorRole system prompt 对齐新工具名

Round3-H: Doctor 5 类报告
- toolchain (cmake/ninja/cppcheck/clangd/g++)
- display (X11/Wayland + ImageMagick)
- network (internet connectivity)
- provider (api_key/base_url/model/connectivity)

Secret 脱敏:
- 状态交接.md: sk- → \${OPENAI_API_KEY}
- .gitignore: 添加 .air/ .claude/

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-09 16:13:16 +08:00

11 KiB
Executable File
Raw Permalink Blame History

AirCoding 全量上下文导出 — 回话恢复用

导出时间2026-06-08 用途在新会话中还原本轮全部状态决策、plan、问题根因、参考复用映射、执行框架。 使用方法:新会话中 Read /home/airlongdian/DataDevices/AirWorkSpace/AirCoding/状态交接.md 即可恢复全部上下文。


1. 仓库与分支

  • 仓库根:/home/airlongdian/DataDevices/AirWorkSpace/AirCoding(软链 /run/media/airlongdian/EasyU/AirCoding 指向同一目录)
  • 远端:<remote-url-credentials-stored-locally>
  • 第一轮修复分支:GLM5-Achieve已推送commit ddefcbb
  • bun 路径:/home/airlongdian/.bun/bin/bun
  • LLM 配置(真实端点,用 OPENAI_ 前缀,不要用 AIRCODING_API_URL 否则适配器重复加 /v1
    • OPENAI_API_KEY=${OPENAI_API_KEY}
    • OPENAI_BASE_URL=http://newapi.airlongdian.fun
    • AIRCODING_MODEL=glm-5.1
    • AIRCODING_REPO_ROOT=/home/airlongdian/DataDevices/AirWorkSpace/AirCoding

2. 本轮之前做了什么第一轮集成修复commit ddefcbb

真实修复(已验证):

  • 工具契约 output/content 统一BuiltInToolRegistrar
  • shell.run AsyncGenerator 消费ToolRegistry.execute_executor_final
  • Scheduler 删除"!has_running() 全标 completed"假完成逻辑,改为按 WorkerResult.status 终结
  • WorkerProcess on_exit → WorkerManager handle_worker_exit无结果退出生成 failed result
  • MainAgent 接入 ContextAssemblerL0-L9 + project_files 快照)
  • run.ts 确认门 y/n 路由pendingConfirmation 状态机)+ 中英文危险词正则
  • ExecutorRole 严格 DONEis_done_signal 整行匹配、code block 原文保留
  • CapabilityRegistry 接入 RuntimeApp/DoctorService/ServiceRegistry
  • ArchitectureDesigner 接入 MainAgent 主路径impact gate
  • Permission ask_user/deny 保留 call_id
  • release.ts findRepoRoot/findBun + 真实 gates
  • /results 优先 WorkerResult.changed_files过滤 .air
  • 新增 release-critical-gates.test.ts5 条真实行为 gate+ CLI run-command-regression.test.ts

未修复(第一轮遗留):

  • EventStore.setRepositories 运行路径从不调用 → domain 表恒空
  • task.created 从不发出
  • TUI 是手写 ANSI非 OpenTUI
  • air ask 旁路 Scheduler/Worker 架构(自带内联循环)
  • ProjectionStore 运行时不被事件驱动run.ts 手工假 snapshot

门禁air e2e 14/14release --dry-run 3/3。但绿灯和可用性正交。

3. opus 四视角交叉审查结论2026-06-08四 opus 子代理并行)

四视角综合判定:可内测演示(限 air ask不可对外 Alpha 发布

新发现的核心问题:

  • P0-1 EventStore.setRepositories 运行路径从不调用 → INV-1/FR-004 运行时整体失效
  • P0-2 Scheduler.create_tasks 不发 task.created注释谎称发出
  • P0-3 TUI 非 OpenTUI/Solid手写 ANSI@opentui 零依赖
  • P0-4 air ask 旁路整个调度/Worker 架构
  • P0-5 failed 任务被调度机当成 COMPLETED
  • P0-6 Worker exit/result 竞态('exit' vs 'close'
  • P0-7 fs.edit 参数名不匹配old_str/new_str vs find/replaceAgent 调用恒失败
  • Worker 心跳不刷新,>5min 任务被误判 lost

审计报告文件(仓库根):

  • 集成测试阶段MiniMax-M3审查结果.md
  • 集成测试阶段Deepseek审查结果.md
  • 集成测试阶段GLM5.1审查结果.md
  • 集成测试阶段Gpt5.5审查结果.md
  • 集成测试阶段opus审查结果.md(本轮新增)

4. 用户核心要求(本轮拍板,优先级明确)

  1. 无工作量优先级,三条主线全部实现(事件地基 + 执行体 + UI
  2. 界面对齐 opencode(复用它现成的 @opentui/solid TUI不要自己写简陋版
  3. 执行体对齐 claude code cliread-before-edit / verification-before-completion / 结构化工具调用 → 代码层强制,不只是 prompt 文字)
  4. 复用 reference/ 全部项目,不是"参考模式重写"——能直接移植就移植,冗余依赖可接受,最终产品编译质量不受影响即可
  5. 需求 > 架构冻结:当原始需求与冻结的 UML/contracts 冲突时,改 UML 服从需求,记录但不停等批准
  6. 廉价模型执行 + 主模型复审:每个主线由廉价模型做机械执行,主模型每阶段复审(读 diff、查 DB、跑验收不信自报
  7. 经验学习闭环不要漏hermes 的 debug 经验总结、curator、skill 系统)

5. 根因分析(为什么"约束很详细还是做歪了"

三个逃生舱:

  1. unknown? 逃生舱contracts 用 tools?: unknown[] 占位 → 实现合法不做tsc 不报错
  2. 源码字符串断言冒充验收28 测试 18 个是 readFileSync(src).toContain('词') → 空壳能过
  3. completed 由"写了代码"触发,不由"达成意图"触发:#158 TUI 标 completed 实为手写 ANSI

事件链路割裂(主线 A 修复的根因):

  • EventStore.ts:942 导出模块单例 eventStore = new EventStore({})(空 DB handle
  • EventIngestor.getEventStore() 用这个单例
  • Scheduler 通过 import { eventIngestor } 发事件 → 全部流向这个空单例
  • RuntimeApp 另建 new EventStore({db}) 赋给 this.event_store,只对它 setTransactionManager
  • 两个实例割裂domain 表恒空

6. 参考项目复用映射关键reference/ 就是 AirCoding 的设计血统)

参考项目 对应 AirCoding FR
opencode-1.15.5 TUI 结构 + @opentui/solid 用法 FR-016
claude-code-cli 执行原语、Tool 契约、ToolUse/Result block、FileEditTool readFileState FR-009
openai-codex 工具广度、shell/patch/test loop FR-009/010
hermes-agent-2026.5.16 经验学习闭环(curator/memory/skill/error_classifier/context_compressor) FR-008/014
claude-hud-0.0.12 HUD 显示context/tools/agents/todo FR-016
anthropic-skills SKILL.md 标准 + Agent Skills spec FR-012
air-suite-20260518 AirCoding 插件原型airarc/aireng/airdo/airdbg/airxdb/airndb/airsdb FR-006/007/008/017
atuin-18.16.1 shell 历史(辅助)
asciinema-3.2.0 终端录制(辅助 evidence FR-015

复用核心来源(取证确认):

  • claude-code-cli tools/FileEditTool/FileEditTool.ts:275-290readFileState.get(path) 检查 → 未读报错 "File has not been read yet"
  • claude-code-cli Tool.ts:1-6import { ToolResultBlockParam, ToolUseBlockParam } from '@anthropic-ai/sdk'
  • opencode footer.prompt.tsxOpenTUI textarea 输入框 + keymap
  • opencode opentui 版本0.3.0package.json:41-43
  • hermes agent/curator.pymemory_manager.pyerror_classifier.py

7. 第二轮规划文件(全部在 /home/airlongdian/.claude/plans/

文件 内容
round2-MASTER.md 总纲:根因 + 永久纪律 N1-N5 + 需求§6 锚定 + 三主线总览
round2-REUSE-MAP.md 参考项目→AirCoding 复用映射表(每个 reference 项目对应的模块/文件)
round2-A-events.md 主线A事件落库地基统一 EventStore 单例 + task.created 发出 + 验收DB 真有数据)
round2-B-execution.md 主线B执行体对齐 claude codecontent block 类型 + read-before-edit 强 + verification + 结构化 tool_use
round2-C-ui.md 主线C界面对齐 opencode@opentui/solid 直接移植优先 + 冗余依赖可接受)
round2-D-experience.md 主线D经验学习闭环hermes curator/error_classifier/skill 移植到 ExperienceMiner/Debugger/Compactor
round2-E-gates.md 主线E反作弊门禁需求§6 13条行为化 + NFR-006 + fail-on-missing
round2-EXECUTOR-PROMPT.md 可直接复制给廉价模型的启动指令

执行顺序A → B → (C ∥ D) → E

  • A 是 C/D 的前提(事件落库才能有真实投影供 TUI 消费)
  • B 与 A 无强依赖,建议顺序做(改动交叉)
  • C 和 D 可并行(都依赖 A
  • E 贯穿收口

每主线验收硬线

  • Asession.db 的 tasks 表 count > 0不达成不准进 C/D
  • Bread-before-edit 代码强制(未读先改被拒)+ 结构化 tool_use + executor-role 功能测试
  • CTUI 无手写 ANSI、可输入、状态来自真实投影、不依赖 runtime
  • DExperienceMiner/Compactor 非空壳、CapabilityRegistry 加载 skill
  • E需求 §6 13 条各有行为 gate 且绿

8. 永久纪律 N1-N5各 plan 文件中重申)

  • N1 消灭 unknown? 逃生舱(本轮触及的契约字段补具体类型去可选)
  • N2 验收必须执行被测代码(禁止用 grep 源码字符串当 gate
  • N3 completed 由验收命令通过触发(不是"我写完了"
  • N4 改不动或与描述不符就停下报告,不自由发挥
  • N5 每阶段贴真实输出TSC 退出码、测试 pass/fail、DB 行数——原样贴)

9. 五份审计报告(仓库根,已 git 跟踪)

  1. 集成测试阶段MiniMax-M3审查结果.md
  2. 集成测试阶段Deepseek审查结果.md
  3. 集成测试阶段GLM5.1审查结果.md
  4. 集成测试阶段Gpt5.5审查结果.md
  5. 集成测试阶段opus审查结果.md(本轮新增)

10. 回话恢复操作(新会话中执行)

  1. 确认仓库存在:cd /home/airlongdian/DataDevices/AirWorkSpace/AirCoding && ls
  2. 确认分支:git log --oneline -3(应在 GLM5-Achieve最新 ddefcbb
  3. 读本文件恢复上下文:Read /home/airlongdian/DataDevices/AirWorkSpace/AirCoding/状态交接.md
  4. 读总纲:Read /home/airlongdian/.claude/plans/round2-MASTER.md
  5. 定位上次进度如果主线A尚未完成round2-A-events.md 继续如果A已完成检查 session.db 的 tasks 表确认后发主线B
  6. 给廉价模型的指令模板:读 round2-EXECUTOR-PROMPT.md,复制「===」之间的内容给廉价模型
  7. 复审流程:执行模型贴回验收输出 → 主模型读 diff / 查 DB / 跑验收 → 通过放行下一主线

11. 当前剩余核心决策点(可选在新会话中确认)

  • TUIC0 如果 @opentui/solid 0.3.0 在当前 Bun 版本装不上,是降版本还是换方案?当前用户已确认「冗余依赖可接受、直接移植优先」
  • air ask 旁路架构:是否要删掉内联循环统一到 Scheduler→Worker不在本轮A-E留后续
  • 第二轮修复的 git 分支:是继续 GLM5-Achieve 还是新开分支

12. 用户核心价值取向(从会话中提取,新会话中如遇决策歧义以此为锚)

  • 不接受架构降级,但需求 > 冻结(需求冲突时改 UML 服从需求)
  • 不接受空壳实现prompt 文字冒充代码强制不可接受)
  • 复用成熟实现 > 自己写(手写简陋版是之前反复出问题的根源)
  • 质量 > 速度;真实验收 > 绿灯数字
  • "小步快走"但每一步交付物真实可验证,不靠标记自报

如需在新设备继续git pull GLM5-Achieve 后按 §10 操作即可。