- [2026-05-16] 文档与代码严重脱节 — ARCHITECTURE-OVERVIEW 描述的"全球 AI 智能体网络"与实际代码差距巨大。已重写为诚实版本,标注每个模块的真实成熟度。教训:文档必须根植于可运行的代码,不能超前描述不存在的能力。
- [2026-05-16] NeuralMesh 从未被实例化 — 类定义了但零引用,是死代码。neural_share 消息在 swarm.js 中未路由(已修)。教训:写完模块必须写集成代码,否则等于没写。
- [2026-05-16] 旧 HTTP 服务器 (端口 3800) 零鉴权运行数月 —
/shutdown、/api/chat、/api/config等敏感端点无任何保护。已加 Bearer Token 鉴权。教训:两条 API 路径必须统一安全管理。 - [2026-05-16] P2P 权重接收无数据验证 — 可投毒 NaN/Infinity/超大数组。已加 validateWeights() 和 sanitizePeerId()。教训:所有来自网络的输入必须验证,无一例外。
- [2026-05-16] 测试 ESM/CJS 混用导致 import 失败 —
package.json声明"type": "module"但某些测试文件使用 CJS 风格 import。统一 ESM,不要混用。 - [2026-05-16] bridge 根目录散落 12 个 .cjs 一次性修复脚本 — 已移到
bridge/scripts/migrations/,以后此类脚本直接放 scripts/。 - [2026-05-16]
app/是废弃旧版 Flutter 项目,已删除。唯一前端是openchat-flutter/。
- MDCT 频域编解码器:48kHz, N=1024, 16 组 × 64bin, 50% 重叠 TDAC, 完美重构
- 分类器:3 模式(窄带/宽带/全频),基于 MDCT 峰值比自动切换,2bit metadata
- 定比分组:低频频带高 bpc(8),高频低 bpc(1-2),按频段能量分布配置
- EPC 打包:
BB 01 CC [PL] [Tags] [CS] 7E,每 tag 13B(1 头 + 12 载荷) - 性能:jzlg 5s 48kHz → 51.6KB EPC, 22.6dB SNR, 85kbps
- 重叠 50% 是 MDCT 保持无损的必要条件,不叠有混叠噪音
- FFT 基 MDCT 优化未完成(DCT-IV 公式验证失败),回退 O(N²) 预计算表
- 阶段一只做波形,扒谱归入阶段二
- 谱包络(LPC 替代) + HPS 音高从同一组 MDCT 系数推导,不另开 FFT
核心问题:从 MDCT codec 的同一帧数据最多能扒出多少音乐信息?
| 轮 | 测试 | 结果 | 判决 |
|---|---|---|---|
| R1 | 算法排名(7类×5音) | HPS 31.4% 最差,YIN 85.7% 最佳,Fusion 74.3% | HPS 已从生产代码移除 |
| R2 | 和弦检测(双音/三音) | Fusion 90%/63%,PeakTrack 80%/73% | Fusion 和弦最优 |
| R3 | 噪声耐受 | 全部通过 +10dB,YIN 0% 虚警 | ✓ |
| R4 | 帧耗时 | Fusion 8.1ms = 19% 帧预算 | 每帧可跑 |
| R5 | MDCT vs FFT 谱 | 谱相关系数 93.5%,Hybrid-Fusion 63.9% > FFT-Fusion 41.7% | MDCT 可替代 FFT |
| R6 | 重建质量梯 | 连续相位 73% vs 随机 1%,5 次谐波够用 | 相位连续性 = 关键 |
| R7 | 真实 vs 合成 | Fusion 保持 100%,PeakTrack 降 40% | Fusion 对真实乐器鲁棒 |
| R8 | 起音延迟 | 100% 检出,0-5.3ms | ✓ |
| R9 | 连续帧抖动 | 100% 帧检出,边界 ~3.5st 抖动 | 稳态抖动 < 10ms |
| R10 | 参数敏感度 | YIN 阈值 0.15 最优,FFT 2048 足够 | 算法对参数鲁棒 |
| R11 | 编解码端到端 | 退化 0.0%,前后一致 | Codec 对扒谱完全透明 |
- HPS 全面失败(31.4%)→ Fusion(YIN + PeakTrack):已替换 Dart 生产代码
- MDCT 振幅谱 + PCM YIN = 零额外 FFT:Hybrid Fusion 直接从 MDCT pipeline 提取 Pitch
- Bridge JS 同步:自相关 F0 → YIN 算法
- MDCT 振幅谱与 FFT 峰值位置偏移(55.6% 匹配),但不影响 Hybrid Fusion 整体精度
- C8(4186Hz)超出 YIN 搜索范围,需增加高音扩展
- 编解码引入量化噪声后的扒谱退化尚未测试
- 测试: 138/138 全绿(1 flaky evolution-integration,单跑通过)
- Lint: eslint 9.39.4 + eslint.config.js 配置完成,59项预存错误待修
- Demo:
npm run demo一键 sandbox 体验脚本完成 - P2P教程: docs/p2p-voice-tutorial.md 完成
- HTTP 路径: 已统一到 Express 服务器(端口 3800),废弃 raw HTTP server
- 基础端口: 固定为 3800,所有衍生端口以 3800 为基准推导
- OpenAPI:
/api-docs端点可通过 Swagger UI 浏览
-
[2026-06-03] Bridge agent 端到端打通:手机录音 → 微信 → Qiniu → bridge → agent → 文字气泡,中午实测成功。provider-kit 收口为单 import gate(provider-service.js),agent 改为 2-pass 系统(call-tools + final-answer),加 response cache + 上下文截断,prompt 改 20-token CoT。修复 config.json 缺逗号导致的静默 parse 失败。
-
[2026-06-24] EPC 旁路检测门 + 流式修复 (18项修复,未推送):
- BYPASS 门架构:
chat-poller.mjs新增validateEpcFrame()/validateEpcBuffer()结构校验器。流式每 chunk encodeEpcFrame → validateEpcFrame → 失败则 raw text 入 meta.bypassText(零 EPC 处理)。非流式 validateEpcBuffer(r.epc) → 失败则 raw content 入 meta.bypassText。Flutter_pollReplies读 meta.bypass 标志,直接显示 bypassText 不走 content 解析。删了伪 hash 自比旁路(sha8(r.epc)===sha8(epcBuf)永远 true → else 死代码)。 - 流式真正工作:3 个互相掩盖的 CRITICAL bug —
parseLlmReply覆盖不拼接(只显最后一段)、_seenReplyKeys拦 stream.bin 导致不重读、found=true对 stream.bin 也设导致首条流式即停轮询。全部修通后流式才真正渐进更新。 - 上传失败不死锁:
_sendTextputBinary 失败 →_isWaiting=false+ log。Qiniu 未初始化同理。 - dispose 全生命周期:
_startReplyPoll/_sendText.then()/_endVmRecord加mounted守卫,_init()失败时_pollTimer?.cancel(),_qiniu = null。 - 桥端 200ms throttle 移除:每 chunk 即时写 S3。Flutter 轮询简化到固定 1s(取消 adaptive backoff)。
- 教训:
parseLlmReply的=覆盖是大模型常犯的"逐帧处理不考虑流式"错误。_seenReplyKeys加 stream.bin 是"用同一个 set 管理两种不同语义的 key"。 - 未推送:GitHub push 被墙。本地 main 已有全部 commit。
- BYPASS 门架构:
-
[2026-06-11] lingbao 子项目落地 + M3 档 3 baseline (本地 14 commit, 未推送):
- lingbao — 工地临时漏电 AI 协同防护,9/15 子任务完成 (60%),5 新原语 (40-45):waveform-sim/signal-algo/mqtt-push/doc-gen/calendar-parse, 4 task demo (10/13/14/15) 端到端跑通 (push 33ms, 5620B 报告, 1741B 方案书)。L1 硬件+L3 UI 依赖外部环境标 skeleton。
- cap/60.mjs — M3 能力档位诊断骨架,5 档任务 baseline 5/5 通过(simulateIdealLLM)。U 假说雏形:retry-state 状态机下沉到 tool 层,LLM 只调 recordAttempt()。下一步跑真实 M3 填 failure-taxonomy.json。
- verify-commit 升级:支持 .mjs 白名单 + invariants 检查 + 排除 lingbao/tasks/ demo 目录。
- 教训:cap 实验的"baseline 5/5"是硬编码理想 LLM, 不是真实 M3。S 路线结论必须等真实 M3 跑完才能下, 当前数据不足以做 S/T/U 决策。
-
[2026-05-25] 音频链路 E1 完成:队列播放 + 淡入淡出 + Opus 集成 + SDUI 三模式可切(raw/opus/neural)。RNNoise/AGC/VAD 管线已接入并通过 CI。AGENTS.md 新增 SDUI 优先原则(UI 变动先问 SDUI 能不能做,不 rebuild)。AGENTS.md 新增 Flutter API 签对签规则(推送前去 pub.dev 逐行核对 API)。修复 OpenRouter API key 泄露(git filter-repo 误删仓库后从 CI 引用恢复)。清理 33 个 apk-* tag 和所有旧 Actions runs。
-
[2026-05-16] 项目定位大讨论:通过多角色审视(VC、安全研究员、贡献者、核心工程师、Petals 开发者、考古学家、学生用户、记者、Flutter App 视角)确认项目真实竞争力在 P2P 语音通讯,而非分布式大模型。AI 居民社区方向保留但标注为实验。
-
[2026-05-16] 安全加固:修复 neural-mesh.js 权重验证+路径穿越、swarm.js neural_share 路由、main.js 旧 HTTP 鉴权。
-
[2026-05-16] 文档大修:重写 ARCHITECTURE-OVERVIEW.md、docs/README.md、GLOSSARY.md,与代码真实状态对齐。
-
[2026-05-16] 项目审核:发现并修复 AGENTS.md 空文件、MEMORY.md 空文件、测试 ESM 问题、清理废弃
app/目录。
涉及以下领域时读取对应文件
| 触发词 | 文件 | 说明 |
|---|---|---|
| Bridge/后端/main.js | memory/core-logic.md | Bridge 核心启动流程、配置加载、模块初始化 |
| P2P/DHT/节点发现 | memory/p2p.md | hyperswarm P2P 网络、节点发现、消息路由 |
| Agent/代理/多AI | memory/agents.md | 5 种代理角色、反馈聚合、决策系统 |
| 热更新/Watchdog | memory/hot-update.md | SafeEvolution、热更新流程、回滚机制 |
| API/REST/端点 | memory/api.md | 31 个 API 端点、认证、限流 |
| Flutter/客户端/UI | memory/flutter.md | openchat-flutter 架构、API Client 层 |
| 语音/音频/WebRTC | memory/audio.md | RNNoise、神经编解码、语音网关 |
| 调试经验 | memory/debugging.md | 常见 bug、调试技巧 |
| lingbao/工地漏电/cap 档位 | memory/lingbao.md | 灵保 5 原语 + 4 demo, M3 能力档位诊断 |
-
[2026-05-18] 泛化引擎已实现 — generalization.js (300行) + 集成到 resident-manager think() 流程。当用户提问时:vector memory 搜相关经验 → generalization 分析模式 → LLM 生成多解法 → 回存知识库 → gossip 同步全网。实现了"一次查询,所有居民复用"的闭环。
-
[2026-05-18] AI 居民内部循环 — 已完整链路:状态机 + 能量系统 + vector memory + generalization + gossip。think() 不再是裸 LLM 调用。
-
[2026-05-16] Dashboard 实时推送 — 后端状态变化需要通过 WebSocket 推送到前端,而非前端轮询。
-
[2026-05-18]
bridge/src/main.js已从 ~1900 行拆至 26 行(死代码清理后),但 MEMORY.md 和 MAINJS_REFACTOR_PLAN.md 保留旧数据导致专家评审反复吃假粮。教训:文档中的数字指标必须在代码变更后立即同步更新,否则自动摘要工具会重复传播过期信息。 -
[2026-05-18]
protocol/README.md存在(265 行协议文档),之前误记为空目录。已保留。 -
[2026-05-18] 四轮专家评审共执行 24 项 P0,Bridge 根目录清理 12 个 Python 遗留文件,AI 居民状态机+多路径推理替换预制回答。教训:专家评审每轮都套用相同提问模式——架构/测试/安全/AI——不会问完全重复的问题。当评审开始聚焦"居民不够聪明"和"知识不共享"时,说明基础设施债已还完,轮到产品力了。
-
[2026-05-20] 第五轮专家评审 — HTTP 路径统一 + 首次全绿:测试从 98/98 推进到 120/120(第五轮 98→第六轮 120,最终全绿)。完成 5 项 P0 执行:Express 监听端口 3800,废弃 raw HTTP server,所有衍生端口以 3800 为基准。教训:大量遗留代码(startServer 中的 ~250 行路由/WebSocket 逻辑)在首次 edit 时未完全匹配删除,因文件行号已因前序 edit 偏移。大段替换时必须用唯一匹配锚点(如
}+ 下一方法签名)。 -
[2026-05-20] 第七轮专家评审 — console.log→pino 结构化日志:114→115 测试(全绿)。完成 7 轮共 29 项 P0。134 个文件批量替换 console.log → logger.info/warn/error,pino 集成带敏感数据脱敏。教训:PowerShell
Set-Content -NoNewline会以错误编码写入文件,导致 UTF-8 多字节字符损坏。文件修改必须统一用 Node.jsfs.writeFileSync(file, content, 'utf-8')。pino.transport()创建 worker 线程会阻止 Node.js test runner 退出,必须用同步 pino API。 -
[2026-05-20] 第八轮专家评审 — 安全加固+CoT+测试+目录精简:128/128 全绿。完成 7 项 P0 执行:mathjs 替代 Function()、SSRF 防护、CoT 超时/token门禁、14 个 tool-registry 测试、src 目录 22→11、README 差异化描述、CI npm pack+docker build。教训:大量目录合并涉及跨文件 import 路径更新,必须先 grep 所有引用再移动。
git stash可用于对比 pre-existing test failures 与引入的失败。 -
[2026-05-20] 第九轮专家评审 — catch{}系统性清理+死代码删除+子系统测试:138/138 全绿(新增10个子系统测试)。完成5项P0执行:105处catch{}加日志(36文件)、19个.log垃圾文件清理、bridge.js死代码删除、ConvergenceEngine+FairyGuardian测试(10个)、evolution-integration确认仍flaky。教训:R4修catch{}只限于topic-registry,这次grep出全项目105处。单文件"已修"不代表全项目已修,每次评审必须做全量扫描。
-
[2026-05-20] 第十轮专家评审 — core/ 129文件拆10子目录:129文件从core/扁平→10语义子目录(agent/ evolution/ security/ convergence/ p2r/ monitoring/ memory/ audio/ collaboration/ quality/)。137/138测试全绿(仅剩evolution-integration flaky)。教训:跨目录文件移动必须用自动化脚本处理import路径。PowerShell glob/正则局限性大,Node.js脚本更可靠。
../xxx/yyy.js中xxx可能同时是src/xxx和core/xxx,必须按core/xxx优先解析。动态import(await import())容易被批量替换漏掉,必须全量grep确认。17个test.mjs文件漏了动态import。
| R14 | Flutter编译状态验证 | Flutter开发者 | P0-5 | ❌ 待修(部分完成) | Flutter开发者 | | R14 | evolution-integration flaky续存 | 测试工程师 | P1-6 | ✅ 已修(R16) | 测试工程师 | | R15 | CLI体验改造 — sandbox交互(颜色/持久化) | 技术经理 | P0-1 | ✅ 已修(R15) | 用户支持+架构师+竞品分析师 | | R15 | Flutter编译验证+CI(端口3000→3800) | 技术经理 | P0-2 | ✅ 已修(R15) | Flutter开发者+安全研究员 | | R15 | lint error 59→48 (comment-eats-code/duplicate/mac) | 技术经理 | P0-3 | ✅ 已修(R15) | 核心工程师+SRE | | R15 | evolution-integration flaky根因分析 | 技术经理 | P0-4 | ✅ 已修(R16) | 测试工程师 | | R15 | 单分支开发整改(清理bridge_setup.py+BRANCH_STRATEGY.md) | 技术经理 | P0-5 | ✅ 已修(R15) | Git专家 | | R15 | Agent loop闭环验证 | 技术经理 | P1-6 | ❌ 待修 | AI研究员+测试工程师 | | R15 | 模块级README | 技术经理 | P1-9 | ❌ 待修 | 架构师+开源社区经理+技术写作者 | | R16 | resident-scheduler syntax error修复(demo崩溃) | 技术经理 | P0-1 | ✅ 已修(R16) | 全体13位专家 | | R16 | 全量编码损坏文件扫描+修复(house-orchestrator) | 技术经理 | P0-2 | ✅ 已修(R16) | 安全研究员 | | R16 | 添加 smoke test(所有src/文件node --check) | 技术经理 | P0-3 | ✅ 已修(R16) | 测试工程师+架构师 | | R16 | evolution-integration重写为node:test(根除flaky) | 技术经理 | P0-4 | ✅ 已修(R16) | 测试工程师 | | R16 | 618 lint warnings清零(eslint --fix) | 技术经理 | P0-5 | ✅ 已修(R16) | 核心工程师+SRE |
| 轮次 | 意见摘要 | 提出专家 | 对应任务 | 状态 | 验收人 |
|---|---|---|---|---|---|
| R1 | 死代码太多(analysis-*.cjs, .js.js) | Git专家 | P0-1 清理4770文件 | ✅ 已修(R1) | Git专家 |
| R1 | 测试20%失败率不可接受 | 测试工程师 | P0-2 修复17个失败 | ✅ 已修(R2) | 测试工程师 |
| R1 | 旧HTTP无鉴权 | 安全研究员 | P0-3 API鉴权统一 | ✅ 已修(R2) | 安全研究员 |
| R1 | P2P零测试 | 测试工程师 | P0-4 8个P2P测试 | ✅ 已修(R2) | 测试工程师 |
| R1 | agent-engine session store缺失 | 核心工程师 | P0-1 注入deps | ✅ 已修(R2) | 核心工程师 |
| R2 | 两条HTTP路径共存 | 架构师 | P0-1 废弃raw HTTP | ✅ 已修(R3) | 架构师 |
| R2 | agent-session混用jest/ESM | 测试工程师 | P0-2 删除jest测试 | ✅ 已修(R3) | 测试工程师 |
| R2 | Flutter API对齐未验证 | Flutter开发者 | P0-3 baseUrl确认 | ✅ 已修(R3) | Flutter开发者 |
| R3 | //注释吃掉后续代码(3处) | 核心工程师 | 修复topic-registry/route-handlers | ✅ 已修(R4) | 核心工程师 |
| R4 | WS clients未追踪 | Code Review | server.js加this.clients | ✅ 已修(R4) | Code Review |
| R4 | _queryTopicPeers递归爆栈 | Code Review | 改为_getLocalPeers | ✅ 已修(R4) | Code Review |
| R4 | catch{}吞异常 | 安全研究员 | topic-registry加日志 | ✅ 已修(R4) | 安全研究员 |
| R4 | isMain端口检测被移除 | Code Review | 恢复port===DEFAULT_PORT | ✅ 已修(R4) | Code Review |
| R5 | forge.js零测试覆盖 | 核心工程师 | 16个测试 | ✅ 已修(R5) | 核心工程师 |
| R5 | generalization单测试不可信 | AI研究员 | 基准重算+扩展 | ✅ 已修(R6) | AI研究员 |
| R5 | evolution-integration flaky | 测试工程师 | 重写为node:test | ✅ 已修(R6) | 测试工程师 |
| R6 | 产品无一句话定位 | VC/投资人 | README重写 | ✅ 已修(R7) | VC/投资人 |
| R6 | 无新人onboarding | 开源社区经理 | first-steps.md | ✅ 已修(R7) | 开源社区经理 |
| R6 | 无CI | SRE/运维 | .github/workflows/ci.yml | ✅ 已修(R7) | SRE/运维 |
| R6 | eval-report残留 | Git专家 | 清理+.gitignore | ✅ 已修(R7) | Git专家 |
| R7 | console.log→pino结构化日志 | SRE/运维 | P0-1 替换134文件 | ✅ 已修(R7) | 测试工程师 |
| R7 | AI居民CoT+tool-use | AI研究员 | P0-4 tool-registry + CoT loop | ✅ 已修(R7) | 核心工程师 |
| R8 | calculate Function()构造器RCE | 安全研究员/核心工程师 | P0-1 mathjs替代 | ✅ 已修(R8) | 安全研究员 |
| R8 | web_fetch SSRF无防护 | 安全研究员/核心工程师 | P0-2 URL验证+内网阻断 | ✅ 已修(R8) | 安全研究员 |
| R8 | CoT无inter-iteration超时 | 核心工程师/AI研究员 | P0-3 per-iteration timeout+token门禁 | ✅ 已修(R8) | 核心工程师 |
| R8 | tool-registry+CoT零测试 | 测试工程师 | P0-4 14个测试(128→128) | ✅ 已修(R8) | 测试工程师 |
| R8 | src目录22个膨胀 | 架构师 | P0-5 22→11目录合并 | ✅ 已修(R8) | 架构师 |
| R8 | README未突出P2P语音差异 | 竞品分析师/VC | P0-6 差异化描述+Features表格 | ✅ 已修(R8) | 竞品分析师 |
| R8 | CI无构建产出验证 | SRE/运维 | P0-7 npm pack+docker build | ✅ 已修(R8) | SRE/运维 |
| R9 | 105处catch{}吞异常(36文件) | 安全研究员/核心工程师 | P0-1 批量加logger.warn | ✅ 已修(R9) | 安全研究员 |
| R9 | 19个.log垃圾文件 | SRE/运维 | P0-2 删除+gitignore已有 | ✅ 已修(R9) | SRE/运维 |
| R9 | bridge.js独立入口=死代码 | 核心工程师/架构师 | P0-3 删除bridge.js | ✅ 已修(R9) | 核心工程师 |
| R9 | core/目录149文件膨胀 → 10子目录 | 架构师 | P0-5 拆分子目录 | ✅ 已修(R10) | 架构师 |
| R9 | main.js start() 470行 | 核心工程师 | P0-2 拆阶段方法(待执行) | ❌ 待修 | 核心工程师 |
| R9 | evolution-integration flaky未根除 | 测试工程师 | P0-6 确认仍flaky(非R9引入) | ❌ 待修 | 测试工程师 |
| R9 | P2P通话step-by-step教程 | 用户支持/竞品分析师 | P0-7 文档(待执行) | ❌ 待修 | 用户支持 |
| R10 | core/ 129文件拆10子目录 | 架构师 | P0-1 core/拆分 | ✅ 已修(R10) | 架构师 |
| R10 | evolution-integration重写为node:test | 核心工程师 | P0-3 evolution重写 | ❌ 待修 | 测试工程师 |
| R10 | main.js start() 470行拆分 | 核心工程师 | P0-2 main.js拆分 | ❌ 待修 | 核心工程师 |
| R10 | lint接入CI | SRE | P0-5 lint配置 | ❌ 待修 | SRE |
| R10 | P2P教程+demo | 竞品分析师 | P0-12 P2P教程制作 | ❌ 待修 | 用户支持 |
| R13 | 四项原则评审—可交付版本验收标准 | 技术经理 | 写入AGENTS.md原则4 | ✅ 已修(R13) | VC/投资人+SRE |
| R13 | 四项原则评审—PRINCIPLE_TRACKING.json | Git专家 | 创建跟踪文件 | ✅ 已修(R13) | Git专家 |
| R13 | 四项原则评审—原则3强制执行机制 | Code Review | 写入AGENTS.md原则3 | ✅ 已修(R13) | 技术写作者 |
| R13 | 四项原则评审—换方案触发机制 | 核心工程师 | 写入AGENTS.md原则1 | ✅ 已修(R13) | 核心工程师 |
| R13 | 四项原则评审—每3轮硬性版号 | 竞品分析师 | 写入AGENTS.md原则4 | ✅ 已修(R13) | 竞品分析师 |
| R14 | main.js空catch加logger(5处) | 安全研究员 | P0-4 | ✅ 已修(R14) | 安全研究员 |
| R14 | CI lint替换eslint.config.js+devDependencies | SRE/运维 | P0-2 | ✅ 已修(R14) | SRE/运维 |
| R14 | npm run demo一键sandbox体验脚本 | 用户支持 | P0-1 | ✅ 已修(R14) | 用户支持 |
| R14 | P2P端到端demo教程 | 竞品分析师 | P0-3 | ✅ 已修(R14) | 竞品分析师 |
| R14 | src/*.js 59项预存lint错误(no-undef/no-empty等) | SRE/运维 | P1-后续 | ✅ 已修(R15, 59→48) | SRE/运维 |
| R14 | evolution-integration flaky续存 | 测试工程师 | P1-6 | ❌ 待修 | 测试工程师 |
| R14 | Flutter编译状态验证 | Flutter开发者 | P0-5 | ❌ 待修(部分完成) | Flutter开发者 |
| R17 | 测试超时 — --test-force-exit 修复 |
技术经理 | P0-1 | ✅ 已修(R17) | 测试工程师 |
| R17 | lint no-undef 41 → 0 (commands.js 缺 import) | 技术经理 | P0-2 | ✅ 已修(R17) | 核心工程师 |
| R17 | main.js start() 拆 lifecycle 方法 (_printBanner/_initCoreSystems/_enterSandboxMode) | 技术经理 | P0-3 | ✅ 已修(R17) | 架构师 |
| R17 | core/ restructure import 路径修复 (agent-monitor/ai-personhood 等12处) | 技术经理 | P0-3 | ✅ 已修(R17) | 核心工程师 |
| R17 | CI lint gate 加固 (--max-warnings=0) | 技术经理 | P0-2 | ✅ 已修(R17) | SRE/运维 |
| R17 | evolution-memory.test.mjs import 路径修复 | 技术经理 | P0-1 | ✅ 已修(R17) | 测试工程师 |
| R17 | resident-scheduler class 导出供测试 | 技术经理 | P0-1 | ✅ 已修(R17) | 测试工程师 |
| R17 | agent-loop-e2e 3 个 scheduler 测试全部修复 | 技术经理 | P0-1 | ✅ 已修(R17) | 测试工程师 |
| R17 | main.js 6 处空 catch 加 logger | 安全研究员 | P0-2 | ✅ 已修(R17) | 安全研究员 |
| R18 | voice_client.dart 编译修复(_onAudioData 重复/UdpHolePunch 孤儿代码/RawDatagramSocket API) | 技术经理 | P0-1 | ✅ 已修(R18) | Flutter 开发者 |
| R18 | main.js:612 getPublicIPv4 未定义修复 | 技术经理 | P0-2 | ✅ 已修(R18) | 核心工程师 |
| R18 | 全项目 39+ no-empty lint 清零 | 技术经理 | P0-3 | ✅ 已修(R18) | 核心工程师 |
| R18 | CI lint gate 升级 --max-warnings=0 | 技术经理 | P0-4 | ✅ 已修(R18) | SRE/运维 |
| R19 | 提交 R18 变更并推送 CI | 技术经理 | P0-1 | ✅ 已修(R19) | 13 位专家 |
| R19 | 语音数据流文档 docs/voice-data-flow.md | 技术经理 | P0-6 | ✅ 已修(R19) | 技术写作者 |
| R19 | CI 全绿 — bridge lint error(getPublicIPv4) + Flutter analyze(voice_client+pubspec) | 技术经理 | P0-1 | ✅ 已修(R19) | 全体 |
| R19 | Flutter 依赖修复 — web_socket_channel 加回 pubspec | 技术经理 | P0-2 | ✅ 已修(R19) | Flutter 开发者 |
| R19 | 端到端语音通话验证 — APK 构建通过(CI) | 技术经理 | P0-3 | 竞品分析师+用户支持 | |
| R20 | app_themes.dart 死代码删除 | 架构师/Flutter开发者/Git专家/核心工程师/开源社区经理 | P0-1 | ✅ 已修(R20) | 架构师 |
| R20 | README Quick start 加最短路径(下载APK→输入peerId→看到用户) | 用户支持/Flutter开发者/竞品分析师/开源社区经理 | P0-8 | ✅ 已修(R20) | 用户支持 |
| R20 | README 引用 first-steps.md + p2p-voice-tutorial.md | 开源社区经理/用户支持/SRE | P1-14 | ✅ 已修(R20) | 开源社区经理 |
| R20 | COMPILATION_BOUNDARY.md 补充 CI paths-ignore: docs/** | 架构师/测试工程师/SRE | P1-5 | ✅ 已修(R20) | 架构师 |
| R20 | version.dart 硬编码预签名 URL 删除,改为运行时 _presignedUrl() | Qiniu/S3专家/Git专家/SRE | P1-9 | ✅ 已修(R20) | Qiniu/S3专家 |
| R20 | qiniu-direct-arch.md 补充音频文件 ACL 说明 + 删除过期 UDP hole punch 描述 | 安全研究员/Qiniu专家/测试工程师 | P1-10 | ✅ 已修(R20) | 安全研究员 |
| R21 | voice_room_screen.dart 改为 SDUI 渲染(+增强 _button 支持 icon/iconSize/size/color + mic_off/call_end 图标) | 技术经理 (P0-2 12票) | P0-2 | ✅ 已修(R21) | 全体 |
| R21 | RS API 残留代码从 Flutter 客户端完全删除(_rsPut/_rsGet/_rsList/_rsDelete + _uploadToken + 4 个 per-op flag),默认全走 S3 V4 | 安全研究员/Qiniu专家/核心工程师 | P1-8 | ✅ 已修(R21) | 安全研究员 |
| R21 | CI workflow_dispatch 默认 build_apk: false + 条件检查 inputs.build_apk | 测试工程师/SRE/Git专家 | P0-4 | ✅ 已修(R21) | 测试工程师 |
| R21 | COMPILATION_BOUNDARY.md 诚实标注 voice_room 非 SDUI(P0-2 12票承认) | 技术写作者/竞品分析师 | P1-7 | 技术写作者 | |
| R22 | _handleAction 改为可扩展(_customActions map + exec: 前缀),新 action 可通过 map 注册 | 架构师/Flutter开发者/核心工程师/竞品分析师/开源社区经理 | P0-2 | ✅ 已修(R22) | 架构师 |
| R22 | catch(_) 吞异常加日志(_pollResponse/record stream/pollEncodedAudio) | 安全研究员/用户支持/Flutter开发者 | P0-4 | ✅ 已修(R22) | 安全研究员 |
| R22 | CI flutter-apk 拆分:analyze-only(所有 Flutter 改动)+ build-only(仅 Dart/pubspec/gradle) | 时间管理师/测试工程师/SRE/Git专家 | P0-3 | ✅ 已修(R22) | SRE/运维 |
| R22 | COMPILATION_BOUNDARY.md 重写:85%+诚实列出 APK 场景+决策树修正 | 技术写作者 | P0-5 | ✅ 已修(R22) | 技术写作者 |
| R22 | AGENTS.md "95%→85%" | 技术写作者 | P0-5 | ✅ 已修(R22) | 技术写作者 |
| R22 | AK/SK + endpoint/region 硬编码(仍需 APK) | 架构师/安全研究员/Qiniu专家/SRE/竞品分析师 | P0-1 | ❌ 待修(需 Bridge 端签名代理) | 安全研究员 |
| R23 | Bridge GET /api/v1/config/storage-config 端点 + Flutter initFromBridge() 运行时下发凭证 | 架构师/安全研究员/Qiniu专家/SRE/竞品分析师 | P0-1 | ✅ 已修(R23) | 安全研究员 |
| R23 | _handleAction 可扩展(_customActions map) | 架构师/Flutter开发者/核心工程师/竞品分析师/开源社区经理 | P0-2 | ✅ 已修(R22) | 架构师 |
| R23 | CI flutter-build 拆分(analyze-only × build-only)+ 所有 catch 日志 | 时间管理师/测试工程师/SRE | P0-3/4 | ✅ 已修(R23) | SRE/运维 |
| R23 | 版本宣布 v0.2.0-alpha | 时间管理师/竞品分析师 | P0-5 | ✅ 已修(R23) | 时间管理师 |
| R23 | docs/sdui-quickstart.md — 5 分钟改 UI 指南 | 用户支持/技术写作者/开源社区经理 | P0-8 | ✅ 已修(R23) | 用户支持 |
| R24 | SDUI null fallback 改为功能完整的硬编码 UI(按钮/图标/文字) | 用户支持/时间管理师 | P0-3 | ✅ 已修(R24) | 用户支持 |
| R24 | fetchConfigFile 加 in-memory 缓存,失败时返回上次成功加载的配置 | Qiniu专家/用户支持/SRE | P0-2 | ✅ 已修(R24) | Qiniu专家 |
| R24 | docs/sdui-quickstart.md 补充 _customActions 注册文档 | 技术写作者/开源社区经理 | P0-5 | ✅ 已修(R24) | 技术写作者 |
| R24 | exec: 前缀 RCE — 已不存在于代码中(R23 cleanup 时已删除,专家误判) | 安全研究员 | P0-1 | ✅ 无需修改 | 安全研究员 |
| R24 | voice_room 5 个 crash 点全加固(null 断言+try-catch) | 用户/架构师 | — | ✅ 已修(R24) | 架构师 |
| R24 | chat_list_screen.dart → SDUI(加载 oc/config/ui_chat_list.json) | 用户 | — | ✅ 已修(R24) | 用户 |
| R24 | docs/ui_chat_list.json 参考 JSON | 技术写作者 | — | ✅ 已修(R24) | 技术写作者 |
| R25 | fetchConfigFile 重试 (指数退避 0/1/2s) + 缓存保底 | SRE/Qiniu专家 | P0-4 | ✅ 已修(R25) | SRE |
| R25 | docs/sdui-coverage.md 覆盖矩阵 | 技术写作者/用户支持 | P1-6 | ✅ 已修(R25) | 技术写作者 |
| R25 | 核心 4 页全硬编码 (P0-1 11票) — 转换为 chat_screen SDUI + main_shell 导航 | 全体 | P0-1 | ✅ 已修(R25) | 架构师 |
| R25 | dev_ide 重写为 SDUI 调试控制台 + agent_hub/resident_detail 从导航移除(AI居民弃用) | 用户 | — | ✅ 已修(R25) | 用户 |
| R25 | 双机语音验证 (P0-2 7票) | 时间管理师/竞品分析师 | P0-2 | 用户支持 | |
| R25 | SDUI 数据绑定 (P0-3 5票) | 架构师/核心工程师 | P0-3 | ⏳ 待修(R26) | 核心工程师 |
| R21 | CI workflow_dispatch 默认 build_apk: false + 条件检查 inputs.build_apk | 测试工程师/SRE/Git专家 | P0-4 | ✅ 已修(R21) | 测试工程师 |
| R21 | COMPILATION_BOUNDARY.md 诚实标注 voice_room 非 SDUI(P0-2 12票承认"当前无法零APK") | 技术写作者/竞品分析师 | P1-7 | ✅ 已修(R21) | 技术写作者 |
| R20 | ui_design_system.md 更新日期 + 清理旧版引用 | 技术写作者/竞品分析师 | P2-12 | ✅ 已修(R20) | 技术写作者 |
| R20 | 双机端到端语音实测 | 时间管理师/AI研究员/核心工程师 | P0-4 | 用户支持+竞品分析师 |
- 测试: 147/147 全绿 + 39 provider-kit 测试全绿
- Lint: 0 errors, 0 warnings ✅
- CI: 全线全绿(bridge-lint、bridge-test、flutter-test、flutter-apk)
- APK: 手动触发构建成功,artifact 可下载
- Flutter: voice_client.dart 编译修复 + people_screen.dart 修复 + record pkg 升级到 6.x
- Demo:
npm run demo一键 sandbox 体验脚本正常 - P2P教程: docs/p2p-voice-tutorial.md 完成
- Bridge Agent E2E: ✅ 手机录音 → 微信 → Qiniu → bridge → agent → 文字气泡 (2026-06-03)
多条工作线并行推进,版本号标识当前综合成熟度。每条线独立迭代,不互相阻塞。
| 版本 | 交付 | 状态 |
|---|---|---|
| A1 | 录音→Qiniu→播放完整链路(队列播放、淡入淡出、Opus/raw/neural 三模式 SDUI 可切、GET 改用 Qiniu RS API 修复手机时钟偏差) | ✅ v1.0.0 |
| A2 | 双手机端到端通话验证 | ⏳ 待测试 |
| A3 | 延迟优化(bufferMs/pollMs SDUI 可调) | ✅ |
| A4 | UDP 打洞直连 | ⏳ |
| 版本 | 交付 | 状态 |
|---|---|---|
| B1 | Qiniu Direct 架构(注册/发现/预签名 URL) | ✅ |
| B2 | SDUI 引擎 + 远程配置(JSON→Widget) | ✅ CI 编译中 |
| B3 | Debug 命令通道 | ✅ CI 编译中 |
| B4 | 远程配置 + 轮询间隔可调 | ✅ 代码已提交 |
| B5 | CHANGELOG + README 更新 | ✅ 已提交 |
| 版本 | 交付 | 状态 |
|---|---|---|
| C1 | Audio mode 切换按钮(Raw/Opus/Neural)→ 纯 SDUI file:write | ✅ |
| C2 | Voice room 通话界面(状态文字、mute/挂断按钮)→ SDUI 模板变量 | 📋 |
| C3 | Settings/Home 页移除硬编码兜底 | 📋 |
| C4 | 新建 UI 功能默认走 SDUI,不改 Dart | 📋 |
| 版本 | 交付 | 状态 |
|---|---|---|
| D1 | 互相发现→呼叫→接听→音频通 | ⏳ |
| D2 | 通话中状态管理(mic mute、挂断) | ⏳ |
| D3 | 联系人管理、通话记录 | ⏳ |
| 版本 | 交付 | 状态 |
|---|---|---|
| E1 | 音频链路修复 + AudioProcessor 接入 CI | ✅ |
| E2 | 32 频段 Mel 滤波器组替代 4 正弦波,正弦+噪声混合合成 | ✅ |
| E3 | 瞬态编码:能量 onset 检测 + 指数衰减噪声瞬态层 | ✅ |
| E4 | 音色模型:16-class 码本 + 残差编码 + 合成时音色整形 | ✅ |
| E5 | Source separation:HPSS 谐波-打击乐分离 + 多轨合成 | ✅ |
| E6 | 乐谱表示:自相关 F0 追踪 + 脉冲列激励 + 有声/无声判断 | ✅ |
| 版本 | 交付 | 状态 |
|---|---|---|
| F1 | provider-kit 收口为单 import gate (provider-service.js) | ✅ |
| F2 | agent 2-pass 系统 (call-tools + final-answer) | ✅ |
| F3 | system prompt 改 20-token CoT | ✅ |
| F4 | response cache + 上下文截断 | ✅ |
| F5 | skeleton-agent.mjs + skeleton.mjs walking skeleton | ✅ |
| F6 | 端到端 IM 链路 (手机录音 → Qiniu → bridge → 文字气泡) | ✅ v0.3.0 (2026-06-03) |
| F7 | 国内免费模型 + forge proxy 评估 | 📋 |
| 版本 | 含义 | 条件 |
|---|---|---|
| v1.0.0 | 首次可用 | 单机 Demo 能完整走通(看到用户→呼叫→听到声音) |
| v1.1.0 | 双机通话 | 两台设备端到端语音通 |
| v2.0.0 | 生产可用 | 多人组会 + AI 居民接入 + 加密 |
| v3.0.0 | 高音质音乐通话 | Neural Codec E3 以上 + 音乐场景可闻无损 |
| 轮次 | 意见摘要 | 提出专家 | 对应任务 | 状态 | 验收人 |
|---|---|---|---|---|---|
| R1 | 编译边界文档(定义什么需要 APK 编译 vs 远程配置) | 架构师 | P0-1 | ✅ 已修(R1) | 架构师 |
| R1 | fetchConfigFile 删除 RS API 残留,全程走 S3 | Qiniu/S3 专家 | P0-2 | ✅ 已修(R1) | Qiniu/S3 专家 |
| R1 | file:write 加路径白名单(oc/config/ oc/debug/ oc/logs/) | 安全研究员 | P0-3 | ✅ 已修(R1) | 安全研究员 |
| R1 | 音频参数远程化(bufferMs、pollMs、codec、采样率等) | Flutter 开发者 | P0-4 | ✅ 已修(R0,audio_config.dart 已有) | Flutter 开发者 |
| R1 | CI 路径过滤——只有 flutter 改动触发 APK 构建 | 时间管理师 | P0-5 | ✅ 已修(R0,CI 已有 dorny/paths-filter) | 时间管理师 |
| R1 | 信令行为远程化(call 流程状态文案/超时/按钮标签) | Flutter 开发者 | P1-6 | ⏳ 待评估 | — |
| R1 | SDUI 行为扩展(action 路由表远程化) | 架构师 | P1-7 | ⏳ 待评估 | — |
| R1 | 新人 5 分钟体验文档(不改 Flutter 代码看到效果) | 用户支持 | P1-8 | ⏳ 待评估 | — |
| R1 | CHANGE_DECISION_TREE.md(20 种改动决策表) | 技术写作者 | P1-10 | ⏳ 待评估 | — |
| R1 | 改动积攒策略(Flutter 改动每周/攒够 3 个才提交) | 时间管理师 | P2-11 | ✅ 已修(R1,当前策略) | 时间管理师 |
| R2 | voice_room 状态文本远程化(Calling/Connected 等抽取到 ui_voice.json) | Flutter 开发者 | P0-1 | ✅ 已修(R2) | Flutter 开发者 |
| R2 | audio.json 新增 DSP 常量(fadeBytes/fadeSamples/demoDelayMs) | Qiniu/S3 专家 | P0-4 | ✅ 已修(R2) | Qiniu/S3 专家 |
| R2 | 来电弹窗文本远程化(incomingTitle/incomingBody/acceptLabel/declineLabel) | 用户支持 | P0-3 | ✅ 已修(R2) | 用户支持 |
| R3 | AudioConfig/VoiceUiConfig 换方案:Map<String,dynamic> 泛型包装,新增字段零 Dart 改动 |
架构师 | P0-1 | ✅ 已修(R3) | 架构师 |
| R3 | 空 catch 吞异常修复(log() 记录错误) |
安全研究员 | P0-2 | ✅ 已修(R3) | 安全研究员 |
| R3 | 版号宣布:v0.1.0-alpha | 技术经理 | — | ✅ 已宣布(R3) | 技术经理 |
这章节是用户/我自检得出的项目结构定位,不是 13 专家评审流的意见。专门记"以后别再找不到了"的关键路径与能力对照。
| 项 | 值 |
|---|---|
| 位置 | bridge/src/experiments/lib/dev-repl.mjs(src/core/dev-repl.mjs 是 1 行跳板) |
| CLI 入口 | bridge/bin/openchat.js(openchat / openchat server / openchat -c / openchat --goal X) |
| 自我定位 | 实验 22 tool-loop 第 5 行注释:"Multi-turn tool loop ... (like opencode goal)" |
| 实验 10 关系 | dev-aux 名字直接含 dev-repl,是它的"骨架测试"(只测模块可加载) |
| 38 里和它最像的 | 22 tool-loop(多轮工具循环)/ 10 dev-aux(CLI 骨架) |
| 本质 | CLI agent 循环:读 ~/.config/openchat/config.json → 建降级链 → 拉 5 个工具模块(system-exec/coding/multi-edit/ast-edit/diff-review)→ provider.chat() 多轮 → 输出 think/tool_call 着色到 stdout |
| 关键能力对照 | ✅ 多轮循环 / 工具缓存 / 错误引导 / 思考折叠 / 降级链 ❌ 启动 doctor(已补)/ slash 命令(已补 P0)/ 流式输出(未做)/ history 续接(未做)/ TUI(未做)/ subagent(未做) |
38 个实验清单速查(桥接实验树)
- 原子层 01-20:01 config / 02 feature-flag / 03 provider-kit / 04 skill-loader / 05 codec / 06 isolation / 07 compressor / 08 qiniu / 09 coding / 10 dev-aux / 11 backpressure / 12 multi-session / 13 process-recovery / 14 code-reviewer / 15 verify-commit / 16 tool-rescue / 17 step-workflow / 18 guardrails-pipeline / 19 guardian / 20 neural-brain
- 单依赖层 21-34:21 teach-me / 22 tool-loop / 23 code-search / 24 edit-advanced / 25 dev-tools / 26 retry-guidance / 27 storage / 28 relay / 29 p2p / 30 naming / 31 session-tree / 32 system-exec / 33 memory / 34 orchestrator
- 多依赖层 35-38:35 chat-poller / 36 poll-one / 37 dream-consolidation / 38 goal
- 灵保并列 5(39-43):waveform-sim / signal-algo / mqtt-push / doc-gen / calendar-parse(在
experiments/lingbao/)
| 用户说 | 实际位置 | 修复 |
|---|---|---|
| "做实验时提示本地没有 LLM 可用" | experiments/lib/dev-repl.mjs:127 throw new Error('No available provider') |
替换为 await diagnose({silent:false}) 打印 actionable 报告 + 友好 throw |
| "38 实验里没对应到" | 25 dev-tools 有 check_failover 但只读 config 不 ping 端点 |
provider-health.mjs 补 check_provider_alive 等价能力 |
| 文件 | 作用 |
|---|---|
bridge/src/experiments/lib/provider-health.mjs |
启动 doctor:5 维检查(config 存在/JSON 合法/current.provider/apiKey/真 ping 端点)+ actionable 修复 |
bridge/src/experiments/lib/provider-health.spec.md |
R3 spec |
bridge/src/experiments/lib/slash-commands.mjs |
opencode 风格 P0 slash:/help /status /clear /model /exit |
bridge/src/experiments/lib/slash-commands.spec.md |
R3 spec |
bridge/src/experiments/lib/dev-repl.mjs |
+38/-4:调 diagnose 替换 throw + readline 顶部 slash dispatch + banner 升级 |
AGENTS.md |
顶部加 38 实验路由(防下次再找) |
| # | 文件 | 作用 |
|---|---|---|
| A | bridge/src/experiments/10.mjs |
实验 10 dev-aux 升级:5a/5b 验证 provider-health 契约 + slash 7 用例 + applySlash 关键路径(+43 行) |
| B | bridge/src/experiments/lib/dev-repl.mjs |
+48/-4 流式输出:接 provider.chatStream,累积 content/toolCalls 边写 stdout,lastStreamed 防重复打印 + 修 max-rounds fallback 边界 |
| C | bridge/src/experiments/lib/dev-repl.mjs |
+18/-2 history 续接:调 repl-history 落盘 user/assistant/tool,-c 启动时灌回 messages,/clear 触发清空 |
| — | bridge/src/experiments/lib/repl-history.mjs |
93 行,消息持久化(~/.openchat/repl-history/<chatId>.json),原子写 + 路径穿越防护 + 1000 条裁剪 |
| — | bridge/src/experiments/lib/repl-history.spec.md |
R3 spec |
| — | bridge/tests/integration/dev-repl-smoke.mjs |
153 行,14 用例端到端 smoke(diagnose/slash/history/消息流),无需 apiKey 也能跑通 |
| — | MEMORY.md |
本节 |
- P2 TUI 升级:opencode-style inquirer TUI(多行编辑/翻历史/Markdown 渲染)。不做:拉新依赖 + diff 超 500 + 收益纯体验。重启条件:dev-repl 成为日常主入口或 ≥2 用户主动提。
| 文件 | 作用 |
|---|---|
bridge/src/experiments/lib/slash-commands.mjs |
+/resume 命令:无参列 ≤20 个有历史的 session(按 lastActivity 倒序,当前标记)+ by id / 序号跳;+availableSessions ctx 注入(不硬耦合 repl-history) |
bridge/src/experiments/lib/slash-commands.spec.md |
更新 C1-C8 检查点 |
bridge/src/experiments/lib/dev-repl.mjs |
+resumeTo sideEffect 处理:重置 resumedHistory + 灌入目标 session msgs(读不写,保护原 session) |
bridge/src/experiments/lib/repl-history.mjs |
修 Windows EPERM:writeFileSync 替代 .tmp+rename(单用户可接受非原子) |
bridge/src/experiments/lib/repl-history.spec.md |
同步更新不变量块 |
bridge/src/experiments/10.mjs |
契约测试 7→9 用例(含 /resume 无参/有参) |
bridge/tests/integration/dev-repl-smoke.mjs |
+6 用例 /resume:空/列表/by id/by 序号/当前/找不到;parseSlash 7→9;listCommands 6→7 |
MEMORY.md |
本节 |
| # | 文件 | 作用 |
|---|---|---|
| 1 | bridge/src/experiments/lib/failover-picker.mjs |
pickFirstAlive(fallbacks, cfg) — 对每个候选先 ping 3s, 首个 alive 再 createProvider+connect, 省 5-10s |
| 1 | bridge/src/experiments/lib/failover-picker.spec.md |
R3 spec |
| 1 | bridge/src/experiments/lib/provider-health.mjs |
+导出 pingProvider(name, pcfg, opts) 供 picker 复用(baseUrl 拼接唯一源) |
| 1 | bridge/src/experiments/lib/dev-repl.mjs |
启动 + 运行时切降级链改用 picker(替代 connect 试错) |
| 2 | bridge/src/experiments/lib/slash-commands.mjs |
+/commit 命令:async 调 ctx.onCommit 拿结果(committed true/false/error),applySlash 改 async 兼容 |
| 2 | bridge/src/experiments/lib/slash-commands.spec.md |
C8-C10 检查点(commit 4 结果分支) |
| 2 | bridge/src/experiments/lib/dev-repl.mjs |
注入 onCommit 回调(动态 import auto-commit, hasGitRepo/gitDiff/generateMessage/autoCommit) |
| 2 | bridge/src/experiments/10.mjs |
parseSlash 9→10 用例 |
| 2 | bridge/tests/integration/dev-repl-smoke.mjs |
+4 /commit 用例 + 6 pingProvider + 1 pickFirstAlive;listCommands 7→8 |
| — | MEMORY.md |
本节 |
| # | 文件 | 作用 |
|---|---|---|
| 4 | bridge/src/experiments/lib/edit-quality-gate.mjs |
edit_file/write_file/multi_edit/ast_edit 后异步跑 lint, 失败塞 messages+history, 不阻塞 REPL (8s 超时) |
| 4 | bridge/src/experiments/lib/edit-quality-gate.spec.md |
R3 spec |
| 4 | bridge/src/experiments/lib/dev-repl.mjs |
edit tool 完成异步 fire-and-forget checkEditedFile, 失败 [lint-gate] 黄色提示 + 写入 history |
| 4 | bridge/tests/integration/dev-repl-smoke.mjs |
+5 用例:isEditTool 6 + checkEditedFile .json skip + null + 不存在 .js + run 契约 |
| 5 | bridge/src/experiments/lib/dev-repl.mjs |
顶部加 // === invariants === 块(8 条不变量) |
| 5 | bridge/src/experiments/lib/slash-commands.mjs |
顶部加 invariants 块(7 条) |
| 5 | bridge/tests/integration/dev-repl-smoke.mjs |
顶部加 invariants 块(5 条) |
| — | MEMORY.md |
本节 |
| 文件 | 作用 |
|---|---|
bridge/src/experiments/lib/cost-tracker.mjs |
字符→token 粗估(4 字符/token)+ DEFAULT_COST 主流 model 单价 + user 覆盖(providers.<name>.costPer1k)+ CostTracker 类(record/summary/formatSummary/reset)+ compose 入口 |
bridge/src/experiments/lib/cost-tracker.spec.md |
R3 spec |
bridge/src/experiments/lib/dev-repl.mjs |
启动时 new CostTracker(cfg) + 每轮 chat 后 recordUsage + 注入 ctx.costSummary |
bridge/src/experiments/lib/slash-commands.mjs |
/status 加 costSummary 块(多 model 列表) |
bridge/tests/integration/dev-repl-smoke.mjs |
+7 用例:charToToken 5 + lookupCost 3 + 基础 record + 多 model + 未知 model + formatSummary + compose 入口 |
MEMORY.md |
本节 |
快速测试(bridge/scripts/test-bridge.mjs):
cd bridge && node scripts/test-bridge.mjs "你好,测试"自动:写 .msg → Qiniu → 等桥处理 → 读 .reply.epc → 解析 EPC 内容 → 清理。
手动对照:
# 发
node -e "const {qiniuPut}=await import('./src/experiments/lib/storage-lib.mjs'); await qiniuPut('oc/chat/测试会话/'+Date.now()+'.msg', Buffer.from(JSON.stringify({type:'text',text:'你好'}),'utf8'))"
# 收(等几秒)
node -e "const {qiniuList,qiniuGet}=await import('./src/experiments/lib/storage-lib.mjs'); const {parseEpcPayload}=await import('provider-kit'); const f=(await qiniuList('oc/chat/测试会话/')).find(x=>(x.key||x).endsWith('-reply.epc')); if(f){const r=parseEpcPayload(await qiniuGet(f.key||f));console.log(r.content?.slice(0,500))}"
# 删
node -e "const {qiniuList,qiniuDelete}=await import('./src/experiments/lib/storage-lib.mjs'); (await qiniuList('oc/chat/测试会话/')).forEach(f=>qiniuDelete(f.key||f))"