zcbot/PROGRESS.md

93 KiB
Raw Blame History

实施进度

配合 DESIGN.md。本文件只记 phase 状态、决策偏差、文件量、下一步。每条 1-2 句:做了啥 + 关键判断;细节查 git log / git diff / DESIGN §7.9

最后更新:2026-08-06(模型标签禁止断行,bump 0.62.6)


状态

Phase 标题 状态 备注
1-3 骨架 + Skill + run_python 多 skill(coding/proposal/ppt/research/documents/imagegen/videogen/review/patent);CoreCoder 唯一匹配 edit;敏感 env 过滤
4 演化性能力 🟡 Model Profile + Probing ;版本化 prompt 未做
5 Eval Suite ⏸ 不做 dogfooding 替代,probe 覆盖健康检查
6 长任务工程化 🟡 task + 恢复 ;双层记忆 ;context 压缩 (加压力门槛);长会话中段折叠摘要 (§8.8 Phase 2)
7 打磨 Docker 沙盒 / 更多 skill
§7 SaaS DESIGN §7 路线 🟡 A 事件流化 ;B 完工 ;D /v1 JSON API ;D' 过渡 auth + dev SPA ;单活 run 锁 + cancel ;0004 schema 瘦身 ;入口归位 ;真 OIDC 待;C Step 1-3 + 3d (Executor + Docker 池 + DockerExecutor + fs 工具进容器)+ Step 5 部署前置对账 + 容器资源 yaml + 应用层磁盘配额 + dogfood 网络放开 + 容器内 pip/npm 源持久化 ;Step 4 完整 egress proxy + Step 3b PGID kill 协议延后到外部用户开放前(还需 egress proxy + xfs project quota OS 层硬化,§7.5 落地清单 #2 #4)。

已完成关键能力

2026-08-06

  • 08-06 / 0.62.6 / 模型标签禁止断行:对话顶部模型控件增加不可断行约束,中栏宽度收紧时优先压缩下拉框,不再把“模型”两个汉字拆成两行;静态前端与更新日志共 12 项 unittest、diff 检查通过。纯样式修复,无 schema、migration、HTTP API、依赖或运行方式变化未连接生产 DB。
  • 08-06 / 0.62.5 / 新对话模型控件单行 + 媒体入口恢复:新对话顶部改用专用的 draft-controls 单行布局,不再复用历史 task meta 的强制换行 spacer模型清单异步加载完成后统一重绘草稿 meta同时恢复既有“⚙ 媒体”入口及生图/生视频选择弹层。相关静态前端、无 DB 路由及更新日志共 34 项 unittest、JavaScript 语法与 diff 检查通过;当前环境无可用浏览器实例,未连接生产 DB。无 schema、migration、HTTP API、依赖或运行方式变化。
  • 08-06 / 0.62.4 / 新对话创建前选择模型 + 目录浮层优化:快速新对话草稿在顶部复用既有模型选择位置,只展示当前用户可用模型并在首次发送或上传附件懒创建 task 时持久化所选档位;清单失败继续由后端默认模型兜底。工作目录候选改为视口级浮层,按可用空间自动向上或向下展开,不再扩大 chat-stream 滚动范围;窄屏保持标题与模型同排。相关静态前端、无 DB 路由及更新日志共 34 项 unittest、JavaScript 语法与 diff 检查通过;当前环境无可用浏览器实例,未连接生产 DB。无 schema、migration、HTTP API、依赖或运行方式变化。
  • 08-06 / 0.62.3 / PPT 取消定向模型:删除 ppt skill frontmatter 的 glm.pro52 定向配置load 后继续沿用 task 当前模型,显式选模型与通用 skill 定向机制保持不变。同步更新 Skill 清单与设计记录;定向模型 7 项 unittest、PPT frontmatter 解析及 diff 检查通过;无 schema、migration、HTTP API、依赖或运行方式变化未连接生产 DB。
  • 08-06 / 0.62.2 / 外部结果持久导出 + task 点目录查看开关:外部大响应缓存统一迁入 user/task 隔离的 .zcbot_cache,兼容读取 0.62.1 旧目录;用户明确要求保存时新增 external_system_result_export,重验当前连接授权后把完整响应及 operation/参数/查询时间溯源导出到 data/external/,不受 24h TTL 影响。媒体 prompt/model/cost sidecar 改存 figures|videos/.meta/;文件面板默认隐藏所有 dotdir当前 task 工作目录子树可用 .* 开关查看 .meta/.build/.preview 等目录user_root 平台目录和点文件始终不展示。完整 483 项 unittest 全绿(17 skip)Node 语法、Ruff 致命规则与 diff 检查通过;当前环境无可用浏览器实例,真实点击留部署后冒烟。无 schema、migration 或依赖变化,未连接生产 DB。
  • 08-06 / 0.62.1 / OpenAPI 请求体契约 + 大响应无损读取:生产 task 506c6ad0 暴露 Swagger 2 body $ref 未进入搜索结果,模型无法得知 BI dataset exec 需要 body.query,并在 400 只剩状态码时连续盲猜;现统一解析 Swagger 2/OpenAPI 3 请求体 schema返回限长脱敏的上游错误详情。外部响应不再按字节切成半截 JSON超出模型内联额度时完整写入 user/task 隔离的 24h 缓存并返回 result_ref,新增 JSON Pointer、分页和字段投影 reader单响应/task/user 分别以 10/50/200 MiB 守门;完整 479 项 unittest 全绿(17 skip),外部系统专项 26 项、Ruff、隔离 mypy、Python 编译与 diff 检查通过。无 schema、migration、依赖或 HTTP API 变化,未写生产 DB。

2026-08-05

  • 08-05 / 0.62.0 / 通用 OpenAPI 外部系统 + 可配置认证:将 Factory 专用运行态拆为通用 OpenAPI connector、认证 strategy 和 provider preset 注册表;标准 ERP/LIMS 等系统可直接在管理后台选择用户名密码换 Token、API Key 或 Bearer Token并配置 Token 字段与认证 Header无需再新增 Python connector。Factory MES 保持内置 preset、既有配置和旧 {username,password} HTTP 请求兼容;用户凭据表单按 definition 动态生成Swagger JSON 不落盘并按 definition_id+user_id 隔离缓存 5 分钟。完整 475 项 unittest 全绿(17 skip),相关 41 项回归、Python/JavaScript 语法及 diff 检查通过;当前环境无可用浏览器实例,真实页面点击留部署后冒烟。无 schema、migration 或依赖变化,未连接生产 DB。

2026-08-04

  • 08-04 / 0.61.1 / MES OpenAPI 业务路径前缀兼容:生产 task 1ade8062 显示光芯 MES 登录与 OpenAPI 搜索均成功,但 operation path /mtm/... 直接拼到主机根路径后被 nginx 404真实业务路由位于 /api/mtm/...。Factory 连接器现读取 Swagger 2 basePath 与 OpenAPI 3 servers 的同源路径前缀,兼容规范 path 或管理员 Base URL 已含前缀的情况且不重复拼接;登录路径继续独立解析,跨主机 server 仍拒绝。外部系统与无 DB Web 路由共 34 项 unittest、Ruff 致命规则及 diff 检查通过mypy 仍报告既有 core/external_systems/service.py:242 SQLAlchemy rowcount 类型问题,本次未改该文件;无 schema、migration、配置或依赖变化未写生产 DB。

  • 08-04 / 0.61.0 / Factory MES 外部系统目录 + 按用户授权查询:新增管理员维护的可信外部系统目录(Base URL/OpenAPI/登录路径/只读 POST allowlist),支持“全部用户/指定用户”可见范围;普通用户只选择获权 MES 并提交自己的账号密码,凭据以独立 ZCBOT_CREDENTIAL_MASTER_KEY 强制加密、不回显且不进 prompt/日志/沙箱。持久化收敛为 external_system_definitions + external_systems 两表,后者兼作 selected 授权与用户连接pending 未配凭据、active 才挂三个 host-side 元工具管理员撤权立即删密文并阻断调用Swagger operationId 是唯一调用入口GET/HEAD 默认只读POST 逐项放行。新增 0026 migration、管理后台/用户“外部”界面及 API完整 463 项 Python 全绿(17 skip)16 项 Node 回归、JS/Python 语法、Alembic 单 head、PostgreSQL DDL 编译与 diff 检查通过;未配置 ZCBOT_TEST_DB_URL,未连接或迁移任何数据库。

  • 08-04 / 0.60.29 / PPT 总院红候选硬门 + 别名直达:新建 PPT 未说明所属机构时,模板 / 品牌 / visual_style 候选必须包含 zongyuan_red;明确外部机构或其他唯一模板时不强制加入。总院、中国建材、中建材、建材集团、CNBM 等“机构词 × 模板/风格词”表达直接归一到总院红,不再追问具体模板;删除易混淆的通用 business-red 品牌预设,普通商务红仅保留为即时配色候选。新增路由回归测试,相关 5 项 unittest、品牌索引 JSON 校验及 diff 检查通过;无 schema、migration、HTTP API、依赖或运行方式变化。

  • 08-04 / 0.60.28 / 对话产物宽版预览 + 文件 chip 优化:包含 HTML 产物的助手消息改用接近占满对话区的宽版布局HTML 画布取消 760px 上限;内联视频上限提升至 720px图片上限提升至 560px 并保持原比例。文件 chip 从小胶囊调整为偏方形附件卡直接展示扩展名类型块、文件名和预览入口粘贴附件同步统一样式并保留键盘焦点反馈。Node 前端 15 项、JavaScript 语法及 diff 检查通过;无 schema、migration、HTTP API 或依赖变化。

2026-08-03

  • 08-03 / 0.60.27 / 工程类型门禁 + 安全审计清零:修复 141 个源文件中的 203 项 mypy 错误,新增按第三方无类型依赖与动态工具签名精确收口的 mypy 配置外部协议规定的弱哈希显式标注非本地密码用途host shell 前后台执行均改用明确解释器 argv移除隐式 shell=True。提高 aiohttp、Pillow、cryptography、Starlette、python-multipart、pydantic-settings 与 pip 的安全版本下限,pip check 无冲突、pip-audit 无已知漏洞;新增显式 shell 回归测试,完整审计 448 项 unittest 全绿(17 skip)Ruff/mypy/Bandit/pip-audit 通过engineering 80/100 PASS、security 100/100 PASS。无 schema/migration/API 变化,未连接生产 DB。
  • 08-03 / 0.60.26 / DeepSeek Flash-0731 + thinking 参数统一:默认 deepseek-v4-flash 无需换模型 ID 即接入官方 0731 后训练升级Flash 改为显式开启 thinking 并透传 reasoning_effort=high,校准当前常规时段 token 成本但保留 8K 稳定输出预算。模型档案统一用 thinking_enabled(开关)+thinking_transport(协议)+reasoning_effort(强度)DeepSeek/GLM/方舟共用纯函数请求构造,移除 family 分支与旧 thinking_mode 字段方舟保持既有思考开启GLM 保持生产验证过的显式关闭,未验证网关标记 none/v1/models 同步只返回新字段445 项 unittest 全绿(17 skip)Ruff 与 diff 检查通过;未连生产 DB、未发真实模型请求无 schema/migration/依赖变化。
  • 08-03 / 0.60.25 / 交互式 HTML 预览 + 对话内嵌:文件预览将 HTML 从普通源码提升为可切换“预览 / 源文件”的 sandbox iframe允许脚本与 HTTPS CDN/接口但保持 opaque origin禁止宿主权限、表单和顶层跳转助手最终答复中的 HTML 产物改为进入可视区才加载的内嵌卡片并可放大复用完整预览Markdown 同步补源文件切换。Node 14 项、Python 27 项、JavaScript 语法及 diff 检查通过;当前环境无可用浏览器实例,真实页面点击/截图留部署后冒烟;无 schema、migration、HTTP API 或依赖变化。
  • 08-03 / 0.60.24 / Web Mermaid 直出 + Markdown 围栏容错:模型偶发用同长度围栏嵌套 Markdown/Mermaid 示例CommonMark 会把后续正文吞进未闭合代码块;新增仅针对该明确形态的前后端确定性修复,提示词统一要求外层使用更长异类围栏,历史上下文加载时同样修正且不批量回写生产数据。聊天页本地 vendoring Mermaid 11.16.0,仅在助手文字段定稿后顺序渲染 language-mermaid,采用 strict 安全级别、文本/边数上限,语法错误或组件不可用时保留源码并提示;真实 Edge 冒烟确认中文流程图与 XYChart 柱线组合图可生成 SVG。Python 27 项、Node 9 项、Ruff、JS/Python 语法及 diff 检查通过;无 schema、migration、HTTP API 或 Python 依赖变化。
  • 08-03 / 0.60.23 / Office→PDF 组件感知 + 展示路径兼容:生产 task 92ac20cf 暴露两层问题:上传消息给出 user-root 相对的 测试pdf/x.dochost tool 又按 task_dir 拼接导致首次找不到改用裸文件名后host 仅安装 libreoffice-impress 却因只检测 soffice 而错误宣称支持 DOC最终 Writer 导入返回 source file could not be loaded。现 office_to_pdf 同时解析 task 相对、user-root 展示路径与 /workspace 路径Debian/Ubuntu 按 Writer/Calc/Impress 实际安装包缓存支持后缀,工具 schema 只声明可用格式缺组件在启动转换前给出明确管理员提示。RUN bootstrap 与故障表同步要求 host 安装三组件;相关 30 项 unittest、Python 编译及 diff 格式检查通过,本机无 LibreOffice真实 .doc/.xlsx/.pptx 冒烟留部署 host无 schema、migration、HTTP API 或 Python 依赖变化,无需重建沙箱镜像。
  • 08-03 / 0.60.22 / 通用 PDF 路由修复 + host Office 转换:复盘生产 task 发现通用 system prompt 只展示 report --format docx,模型遂误判平台渲染器只能出 Word进而在 Docker 内探测 LibreOffice、临时安装 WeasyPrint 并手写转换脚本;现补齐 report --format pdf 唯一入口,新写 Markdown 报告直接由沙盒 Chromium 出 PDF。新增按 host soffice 实际可用性注册的 office_to_pdf typed tool已有 DOCX/PPTX/XLSX/ODF 文件通过 backend host LibreOffice 转换,复用 /workspace→user_root 路径翻译并强制用户目录边界Docker 内不再探测宿主命令。相关 34 项 unittest、Python 编译及 diff 格式检查通过;本机未安装 LibreOffice真实 soffice 冒烟留部署 host 执行;无 schema、migration、HTTP API 或依赖变化,新增 host 工具无需重建沙箱镜像。

2026-07-31

  • 07-31 / 0.60.21 / GPT Image 2 尺寸与质量参数:gpt_image 开放 size(auto 或合法 WIDTHxHEIGHT)与 quality(auto/low/medium/high),按官方约束校验 16 倍数、3:1 比例、边长及总像素范围,并从 PNG IHDR 回填实际尺寸到 banner、meta 与 usage真实 1024x1024 + low 请求返回同尺寸 PNG。同步确认 unifyllm /images/edits 的 JSON、multipart 及 Responses image_generation 三条改图路径当前均不可用,故不暴露必失败的参考图参数,继续明确引导改图切 Seedream手工脚本显式 mock 用量记录,杜绝真实探针触库。相关 41 项 unittest 通过1 项测试库门控跳过Python 编译与 diff 格式检查通过;无 schema、migration 或 HTTP API 变化。
  • 07-31 / 0.60.20 / GPT 生图模型路由修复:unifyllm 的 Images 端点已由历史文本渠道名切换为专用图像模型,媒体配置同步改用当前 /v1/models 开放的 gpt-image-2,保持既有 /images/generations、prompt-only 工具契约与 b64_json 解析不变;手工干跑增加模型 ID 回归断言。真实 OpenAI 格式请求返回 HTTP 200 及完整 base64 图像,相关 16 项 unittest 通过1 项按环境跳过diff 格式检查通过;未连接数据库、无 schema、migration 或 API 变化。
  • 07-31 / 0.60.19 / 清空对话 500 修复:清空接口补查后续标题重置逻辑所需的 title_source,修复仅查询 run_status 后访问缺失字段导致的 AttributeError 与事务回滚;原有 DB 路由用例已覆盖自动标题和人工标题两类清空行为,无 schema、migration、API 或数据语义变化。16 项无 DB 路由测试、Python 编译、致命静态检查与 diff 格式检查通过;未设置 ZCBOT_TEST_DB_URLDB 路由测试按安全门控跳过。
  • 07-31 / 0.60.18 / 任务列表默认按最近更新时间排序:普通任务列表的前后端默认排序统一由创建时间倒序改为更新时间倒序,最近继续处理的对话会回到顶部;显式 ordering=-created_at 等既有排序参数和全部下拉选项保持兼容。新增默认值、非法参数回退及创建时间兼容 3 项单元测试Python/JavaScript 语法与 diff 格式检查通过;无 schema、migration 或依赖变化。
  • 07-31 / 0.60.17 / 消息 JSONB NUL 字符兼容:外部工具从论文、PDF 等来源提取的文本可能夹带真实 NULPython JSON 会编码为 PostgreSQL jsonb 无法转换成 text 的 \u0000,导致 tool message INSERT 回滚并中断 run。新增递归清洗并在 Message.payload ORM 写入边界统一守门,Session.append 同步清洗内存上下文,保留制表符、换行及其余 Unicode无 schema、migration 或存量数据改动。相关 6 项单元测试、Python 编译及 diff 格式检查通过;未设置 ZCBOT_TEST_DB_URL,未连接数据库。
  • 07-31 / 0.60.16 / platform 历史 task 稳定进入 + 新建任务名称可选:普通 platform iframe 不再复用 localStorage 缓存 JWT 抢跑,始终等待父页面本次 zcbot-token 后再进入初始 task消除旧 token 401 后界面永久停在“加载中”的时序;企微/App fragment 登录路径不变。POST /v1/tasks 省略/留空 name 且提供 working_dir 时自动以“新对话”占位并启用首条消息标题生成,旧 auto_title 语义继续兼容;快速新对话不再发送冗余字段,自定义创建统一为工作目录必填、任务名选填,并换用可搜索/可创建的目录组合框。27 项无 DB 测试、Python 编译、3 个 JavaScript 语法及 diff 格式检查通过DB 路由用例已补,未配置 ZCBOT_TEST_DB_URL 时安全跳过。
  • 07-31 / 0.60.15 / 嵌入初始 task 直接进入工作目录:platform iframe、企业微信和 App 携带 task_id 首次进入时,由 enterApp 直接选择目标 task跳过新对话草稿及 user_root 文件面板初始化,随后沿既有 selectTask 链路同步 working_dir401 重签仍不重复定位普通登录空态不变。JavaScript 语法、7 项静态前端测试及 diff 格式检查通过;无 API、schema、migration 或依赖变化。
  • 07-31 / 0.60.14 / 清空对话后自动标题重生成:tasks 新增 title_sourceauto/manual/fixedauto_title_version0024 migration快速新对话的自动标题在清空后重置为“新对话”下一条消息重新生成人工重命名及微信/企微/调度固定标题保持不变。版本闸阻止清空前在途标题跨轮次写回;历史任务无法可靠判定“自动命名后又人工改名”,除当前 pending 外保守回填 manual。相关 18 项无 DB 测试、Python 编译、Alembic 单 head 与 diff 格式检查通过DB 路由用例已补,未配置 ZCBOT_TEST_DB_URL 时按安全门控跳过。
  • 07-31 / 0.60.13 / 渠道常驻会话操作收口:微信与企业微信的 web 只读镜像只保留导出和清空对话,隐藏普通任务才适用的完成、废弃、重命名和删除操作,顶部独立完成按钮同步隐藏;普通任务菜单不变。纯前端行为修正,无 API、schema、migration 或依赖变化JavaScript 语法及 diff 格式检查通过。

2026-07-29

  • 07-29 / 0.60.12 / 任务与文件列表右键菜单:任务行、文件行和目录行增加原生 contextmenu 入口,直接复用既有 taskMenuItems / fileMenuItems,因此与「⋯」按钮保持相同权限、状态禁用、确认弹框和后端调用;单例浮层菜单增加按鼠标坐标定位及视口双向钳制,右键任务不切换当前会话、右键文件不触发打开。纯前端加法,无 API、schema、migration 或依赖变化3 个 JS 文件语法及 diff 格式检查通过,浏览器实例不可用故真实鼠标回放留页面复核。
  • 07-29 / 0.60.11 / Web 对话流去卡片化 + 工具活动合并 + 语音状态修复:工作台背景统一以纯白为主,浅灰仅保留在 hover、代码块等局部状态助手历史/实时回复移除重复角色标签、大卡片边框、左色条与运行态红框,改为左锚开放文档流。历史态按 tool_call_id 将 assistant 调用与 tool result 合并,实时态复用同一 details 原位更新结果,统一为默认折叠单行活动项(执行中/成功/失败状态明确),产物 chip、媒体 banner 与后台进程活化继续保留;顶部 task progress dock 的位置和逻辑未改。另修短按语音转连续录音时直接覆写按钮 textContent、销毁 SVG/label 导致停止后无法恢复“语音”的问题,收口为 class/label/ARIA 状态函数。相关 Python 24 项 + Node 5 项及 JS 语法、diff 格式检查通过;无 API、schema、migration 或依赖变化。
  • 07-29 / 0.60.10 / Web 工作台移动端空间优化:根据第二轮手机实图反馈把暖白/浅米灰改回中性白色桌面助手回答、工具卡与任务进度恢复左侧阅读轴手机端压缩顶栏、Tab、任务操作区、模型区、消息间距和 composer高频操作键由 44px 收至 40px、输入框最低高度由 64px 收至 52px并隐藏空闲态“请选择文件保存位置/就绪”占位行,运行、上传与错误等有效状态提示继续按需显示。相关 Python 21 项 + Node 5 项及 JS 语法、diff 格式检查通过;无 API、schema、migration 或依赖变化。
  • 07-29 / 0.60.9 / Web 工作台视觉复核修正(桌面 + 手机实图):据上线截图把冷蓝灰改为暖白/浅米灰;任务与文件行恢复明确分隔,助手消息收进居中 52rem 文档型回答块,工具与进度对齐同一阅读轨道;同时修掉 task_progress-only assistant 被过滤工具后仍留下空“助手”壳。手机端 composer 改为独立状态行 + 3 个 44px SVG 图标键 + 发送键,缩短 placeholder、加入安全区并压缩操作/模型区;录音与润色状态改只更新 label/ARIA不再覆盖 SVG DOM。相关 Python 21 项 + Node 5 项及 JS 语法、HTML/SVG 结构、CSS 括号检查通过;无 API、schema、migration 或依赖变化。
  • 07-29 / 0.60.8 / Web 工作台 Visual Polish v1:新增零构建 web/static/ui.css 作为内部轻量视觉基础层,集中颜色、间距、圆角、阴影与 focus/disabled 等控件状态;收敛三栏层级、任务/资源导航、对话正文与工具过程块、输入区、文件栏、modal/toast 及 ≤640px 触控尺寸,不改 DOM 契约、API 或业务交互。新增 CSS 文件接入、MIME 与 no-cache 回归测试;相关 Python 20 项 + Node 5 项通过,浏览器连接不可用故截图级视觉验收留真实页面复核。
  • 07-29 / 0.60.7 / 组合框内直接新建工作目录:新对话目录 combobox 增加 allow-create 语义:输入时继续过滤已有目录,无完全同名项时在同一下拉内提供“创建工作目录「名称」”,明确选择后才进入新建状态,失焦搜索词不会误提交;删除外部新建按钮与二级输入框。纯前端改动,无 API、schema、migration 或目录绑定语义变化;全量 387 测试通过17 项按环境跳过)。
  • 07-29 / 0.60.6 / 新对话目录选择改可搜索组合框:将上一版独立搜索框 + 原生 select 合并为单一 combobox同一输入区完成已选目录展示、即时过滤和下拉选择并补方向键、Enter、Esc、失焦恢复与 ARIA 状态;最近目录置顶、明确选择 working_dir 和新建目录入口均保持不变。纯前端改动无依赖、API、schema 或 migration全量 387 测试通过17 项按环境跳过)。
  • 07-29 / 0.60.5 / 新对话目录选择提速:保留首发前明确选择 working_dir 的归档约束;本机最近实际使用目录在候选中自动选中、置顶并标记,目录达到 6 个时按需显示搜索框,目录较少时维持原有简洁界面;同步精简“文件保存位置”文案。纯前端改动,无 API、schema、migration 或目录绑定语义变化;相关静态资源与无 DB 路由 18 项测试通过。
  • 07-29 / 0.60.4 / 工具失败信号分层 + run_python 同错保护 + wire 健康观测:管理端保留近7天低阈值全量事实默认把近24h活跃数据拆成跨任务系统性故障、单任务反复失败、按设计非零退出的质量门已归零记录沉入历史区空输出 shell 关联最近 assistant tool_call 补 search/no match / dependency probe 等稳定类别。RepeatGuard 仅将 run_python traceback+非零退出纳入同错 streak普通 shell exit 1 保持原语义。新增只读 /v1/admin/tool-wire-health,按 model_profile+tool 对既有 tool_salvaged/tool_malformed 计算24h/7d抢救率无新表、migration、索引或执行策略变化。全量387测试通过17项按环境跳过

2026-07-28

  • 07-28 / 0.60.3 / Web、渠道、定时任务统一 run 生命周期:新增 web/run_lifecycle.py,收口 task 行锁/忙碌判断、user 消息与 running 原子提交、broker/inflight 登记及调度失败转 error网页、微信/企微、定时任务全部消费已持久化轮次,消除渠道与 scheduler 原有的 worker 启动前丢输入窗口。Web 模型降级/自动标题、渠道回复、定时结果统计继续留在各自模块CLI 保留旧 run(message)无新表、migration、队列或 run 实体。全量 379 测试通过17 项按环境跳过)。

2026-07

  • 07-27 / 0.60.2 / Web 消息接收事务化(消除 202 后丢输入窗口):POST /messages 先完成媒体 variant 校验,再在 task 行锁保护下把用户消息与 run_status=running 同事务提交Web worker 新增已持久化轮次入口,只消费 Session 末尾 user 而不重复 appendCLI/渠道/定时入口继续走旧入口保持兼容。后台 coroutine 调度失败会把 task 收敛为 error不再留下假 running不新增 runs 表、队列或 migration。全量 375 测试通过17 项按环境跳过),新增 DB 路由测试因未设置 ZCBOT_TEST_DB_URL 按安全门控跳过。
  • 07-27 / 0.60.1 / 联网搜索动态时效约束:真实 task 24d6b609 在 2026-07-27、用户未指定年份时deepseek_v4.flash 两次自行给 web_search query 加 2025;工具原样转发且默认 freshness=noLimit,根因是 system prompt 虽注入 today 却仅标作宪法文件命名用途,工具 schema 也无年份策略。修为 system prompt 首段按 Asia/Shanghai 动态注入当前时间/日期/年份,并给唯一规则:未指定时间则 query 无年份,“最新/当前/近期”按当前日期配合 freshness明确时间窗则服从用户web_search 的 query/freshness schema 再局部强化。5 项定向测试通过。
  • 07-27 / 0.60.0 / 目录优先的新对话草稿页 + 首条消息自动命名:登录未选任务与左栏「+ 新对话」统一进入不落 DB 的草稿页,选择/新建 working_dir 后首发才创建 task避免空任务原完整表单保留为「自定义」。新增 0023 tasks.auto_title_pending 一次性闸与 auto_title 可选创建字段,首条消息并行生成短标题(usage_events.kind=task_title),只改 task 显示名不动目录,人工 PATCH name 清闸且条件 UPDATE 防在途覆盖;失败保留「新对话」不阻塞主 run。
  • 07-27 / 0.59.6 / 对话内安全重命名 working_dir:新增 rename_working_dir 受控工具agent run 内只登记目标 leaf 名,正常回复结束并把当前 task 退出 running 后再落地,避免 executor/system prompt/宿主工具仍握旧 cwd取消或失败不执行。文件面板与对话路径共用 core/working_dirs.py DB-aware 原语:锁定并同步更新共享目录的全部 task、活跃邻居与 no-subtask 冲突安全拒绝、DB UPDATE 后再做 FS rename。system prompt 明确当前 task_dir 禁走 shell/run_python 直接改名,定时 run 不挂该工具;无新增 schema/migration。全量 357 测试通过17 项按环境跳过DB 路由测试未设 ZCBOT_TEST_DB_URL 时按安全门控跳过。
  • 07-27 / 0.59.5 / Seedance 图生视频(单图首帧 + 最多 9 张多图参考):seedance 在原文生视频契约上向后兼容增加 image(唯一 first_frame)与 reference_images(0-9 张 reference_image),两者合计最多 9 张;复用 image_ref 的 task/user_root 三形态路径解析、越界防护与 base64 内联,新增单图 10MB / 合计 30MB 请求体闸。请求按有无图片切图生/文生单价banner/meta/usage snapshot 记录 mode、首帧及参考图videogen skill、工具系统提示、RUN 与能力清单同步。5 个离线单测覆盖单图、多图、文生兼容、越界与超量拒绝。
  • 07-24 / 0.59.4 / kb 冷启动契约(修「放进知识库」误存记忆)+ 查看原件 + 条目精简:①真实用户事故——说「放进我的知识库」被 agent 写进 .memory/:根因 kb_block 零库返回空串,模型不知道 KB 机制存在(memory 空契约常驻恰是为解冷启动,kb 当时没照抄这课)。修 = 零库注 ~百 token 冷启动契约(建库步骤 / INDEX 行格式 / 「成篇资料进 KB、短事实进记忆」分工;仅用户明确要求才建库),建库落盘后下轮 build_agent 自然切全量注入;skill 方案再否(召回同为概率召回还多一层间接,且违背「机制而非 skill」定稿)。DESIGN §3.8 取舍随 commit 更新,tests/test_kb_block.py 4 用例锁两分支。②前端「查看原件」三入口(已入库条目行 👁 / 单篇页头 / 待入库列表),复用 openFilePreview.kb/<库>/sources/ 相对路径零后端;关键层级修正:file-preview-modal z 90→114 盖过 kb/skills/memory 等 112 层 modal(仍低于 app-dialog 130,删除确认在预览上),fp-open chat-form 95→115、mini 96→116,main.js Esc 关栈顺序同步先关预览再关 modal。「像文件目录浏览 .kb」提议对齐后定维持现状:.kb 继续对文件面板隐藏,守住删单篇「doc+原件+INDEX 行」三件联动判据。③已入库条目压两行:标题 + 单行省略摘要(原 .sk-desc 省略规则只覆盖左栏 .sk-item,右栏整段换行铺开),关键词挪进悬停 title 不丢信息。
  • 07-23 / 0.59.3 / 知识库下载入口(原件 + 解析 Markdown,纯前端):kb 面板此前只能在线看不能取回。关键发现:.kb/ 就在 user_root 下且 /v1/files/download 的 safe_join 只挡越界不挡 dotfile → 零后端改动,kb.js 复用 media.js::downloadFile(Bearer + blob)拼 .kb/<库>/{sources,docs}/… 路径即可。入口三处:已入库条目行「⬇ 下载原件」(agent 手写无原件的条目不显示)、单篇查看页头「下载原件 / 下载 Markdown」(doc→source 映射渲染详情时记 _docSources)、待入库列表逐项「下载」。弃选方案:新增 /v1/kb/*/sources 专属下载端点(与 files 下载全量重复,公测期白养一个对外契约)。改动仅 kb.js + dev.html 三行 CSS。
  • 07-23 / 0.59.2 / 移动端对话附件入口(📎 拍照 / 照片库 / 选文件):chat 输入区此前仅粘贴 / 拖拽两条附件路(移动端双双不可用,手机没有任何传文件入口)。加 📎 按钮:触屏(pointer: coarse)弹 showMenu 三项菜单——拍照(capture="environment" 直起后置相机)/ 照片库(accept="image/*,video/*")/ 选取文件(无 accept);桌面端点击直开系统文件选择器(拖拽 / 粘贴照旧)。三个隐藏 input 的 change 统一走既有 uploadAttachFiles()(chip 托盘 / 发送注入行零改动);change 后清 value 允许连选同一文件;微信 / 企业微信只读镜像随 applyChannelComposerLock 禁用按钮 + 点击侧 _composerLocked() 双保险。纯前端(dev.html / chat.js),无后端改动。裸 file input 方案(靠 iOS 原生三选单)因 Android 行为不确定被弃,三项菜单跨平台确定。
  • 07-23 / 0.59.1 / 架构审查落地:15 commit 内部重构大扫除(对外行为零变化):全库审查(web/核心循环/工具渲染/数据层四路并行探查)后按优先级逐项执行。①web 拆分——app.py 3972→197 行:73 路由迁 11 个 web/routers/*(register 范式同 admin.py),lifespan 后台协程按域析出(background/scheduler_runner/wechat_runner),schemas/model_gate/runs/userfiles/common 各归位;②计费收口——units JSONB 读侧唯一出口 core/storage/usage_report.py(web 层清零 cast),写侧拆 telemetry.py(四类 cost=0 留痕与真计费分家,kind 常量成 loop↔toolfail 契约单一事实源);③loop 拆分——传输健壮性层(畸形/吐空检测、留痕、非流式降级重试)析出 core/llm_transport.py(loop 1158→812),_execute_tool_call 148 行拆 4 个正交方法,测试打桩缝(_collect_stream_once/_nonstream_once)原样保留;④工具注册声明式化——core/tool_registry.py (组名,gate,factory) 表收敛四种 env-gate 写法(§7.5 #7 获代码强制),32 工具挂载逐名比对不变;⑤媒体工具去重——五工具同构(配额闸/落盘命名/记账兜底/超时重试/递归找 URL)收 tools/media_common.py,净减 122 行,banner/轮询等刻意差异不动;⑥渲染统一——块收集器(fence 闭合/表格/blockquote/段落并合)与 brief inline 切分下沉 rendering/common,golden 基线(四 profile 渲富 fixture、document.xml 逐字节对账,tests/golden/)零 diff 验收,分派状态机(in_refs 等)留 profile;⑦测试 286→351——scheduler 服务层、usage 口径、media 原语、wecom 加解密(自造密文覆盖失败路径)、路由两套(无 DB 面:11 router 鉴权门 19 端点 + kb/skills/memory/files FS;DB 面:tasks CRUD 全链 + files 顶层目录 DB-aware 四分支 + upload);测试库基建 = docker PG@5433 + ZCBOT_TEST_DB_URL 显式门控(RUN.md 一键命令)。修 2 个真 bug:restore 恢复真软删过的任务必 500(server-side onupdate 列 flush 后 expired → DetachedInstanceError,幂等路径掩盖多时,路由测试抓出);DB 测试曾沿 .env 连到生产隧道(127.0.0.1:6012)——插入的到点 job 被生产 green 调度守护真跑,门控收紧为只认 ZCBOT_TEST_DB_URL + connect_timeout=5 兜挂库,产物已全量清理。附带:scripts 50→29(已结案诊断/backfill 归档 scripts/archive/)、tools/output.py(输出处理自 base.py 析出)、export_docx 复用 rendering.common 字体助手(rendering 保持无 core 依赖的沙箱可用性,修正审查"迁 rendering"建议)。
  • 07-22 / 0.59.0 / 个人知识库(纯文件 .kb/ 机制,照记忆范式):方案 07-22 对齐后落地(DESIGN §3.8)。core:core/kb.py(状态/视图层:库名与文件名校验、INDEX 单行格式 - [标题](docs/x.md)|来源 sources/x.pdf摘要关键词 的 parse/format、"已入库判据 = INDEX 有条目"派生 pending、删单篇连带原件与 INDEX 行、kb_block 注入)+ core/kb_ingest.py(入库管线:markitdown Python API → 扫描件 PDF 文本近零走方舟 OCR 兜底(§8.13 同通道)→ flash 单次 chat 写标题/摘要/关键词(失败降级不阻塞)→ 追加 INDEX;编排 create_task+to_thread+per-(user,库) 锁,进度内存态供轮询)。记账:0022 迁移放宽 usage_events.task_id 可 NULL(kb 入库无 task 上下文),溯源 = kind="kb_ingest"/"vision" + units {"kb","source"}(record_chat/vision_usage 签名同步放宽)。API:/v1/kb* 8 端点(列/建/删库、详情带入库进度、上传即入库、手动 ingest、看/删单篇),不设 HTTP 检索端点。agent 侧零新工具:agent_builder 在 memory_block 后注 kb_block(有库才注,docker/host 路径换算同 .memory);documents skill「何时不用」补自建资料路由行。前端:kb.js 两栏 modal(建/删库、上传 XHR、入库进度 3s 轮询、看/删单篇),rail 底部四按钮改图标+小字两行布局(用户 07-22 定)。冒烟:core 层 28 项全过(真实 markitdown + flash 摘要),TestClient API 15 项全过(usage 行实测 task_id=NULL + units 溯源),受影响存量测试(usage_accounting / system_prompt_paths)绿。
  • 07-21 / 0.58.55 / 扫描件 PDF 直读(read_document,方舟文档理解):markitdown 只抽文本层,扫描件(老标准/检测报告/红头指南)转出为空=死路。探针(scripts/probe_ark_doc.py)验证方舟 chat file 内容块直读 PDF:格式 {"type":"file","file":{filename,file_data}} + data:application/pdf;base64, 前缀、base64 内联 17MB 可用(免 TOS)、单页栅格化 3600 万像素硬限(PIL 存 PDF 需标对 dpi)、~1300 输入 token/页(约 1 厘/页)、100 页魔术串全覆盖。落地 tools/read_document.py(seed_2_lite 同 variant 同 key,记账走 record_vision_usage):体积/页数双闸(30MB/100 页,pdfminer 软探页数免白付撞上下文)+ finish_reason=length 截断提示 + 多页 OCR save_md 全文落盘只返 1500 字预览(防上下文爆);image_ref.pyload_pdf_as_data_url 复用三形态路径解析与 user_root 边界。agent_builder 注册 + 系统提示 _MEDIA_READDOC_SEG(何时调/何时不调防重复花钱);六 skill(paper/patent/standard/proposal/rebuttal/ppt)摄取段加扫描件兜底一行。冒烟 scripts/smoke_read_document.py 全过(3 页 ¥0.0066,表格→md 表、公式→LaTeX)。选型对比(外部解析 API=新增第三方数据面 / 本地 OCR=过度投资)见 DESIGN §8.13。host 侧工具,无需重建沙箱镜像
  • 07-21 / 0.58.55 / 长对话点目录圆点首次跳不到位修复:根因链=loadMessagesAround 后 renderMessages 尾部无条件滚底钉到窗口末尾,底部 sentinel 入视口立刻触发 loadNewerMessages 整窗重渲染删掉平滑滚动目标。修:renderMessages 加 stickBottom 参数(三个调窗口路径传 false);jumpToMessage 重建窗口后瞬时定位(auto)不留动画窗口期;_msgScrollObserver_outlineJumpLock 期间不补载、解锁时对 sentinel 重投交叉状态。
  • 07-21 / 0.58.54 / 手机端文件预览改悬浮卡片(四边留边距、不压输入区):用户反馈移动端预览弹框全屏贴边(100vw×100dvh、直角)观感差且糊在消息输入框上。改 dev.html ≤640px 媒体查询:遮罩层 padding:10px 四边留呼吸边距、底部 calc(--preview-bottom-inset + 10px) 在 chat-form 让位之上再加间隙;卡片尺寸改 100%(相对遮罩内容区,弃 100dvh,旧 WebView 兼容更稳),恢复默认圆角。输入区仍走既有 body.fp-open #chat-form z-index 抬升保持可用;桌面端不动。
  • 07-21 / 0.58.53 / App 套壳进入契约(embed app 变体 relogin_url)+ 对接文档:移动 App 方案定型——原生壳(WebView)+ 原生登录页,登录走 platform 自有接口(/api/login/token/api/login/external-login,已实测打通,后者服务端用 PLATFORM_KEY 换 zcbot JWT,user_id=platform user.uuid)。顶层 WebView 无父窗口,iframe 的 postMessage 协议失效(zcbot-401window.parent 发不出去),故把企微免登模式泛化为 app 变体:?embed=1&relogin_url=<绝对地址>#token=..&user_id=.. —— fragment 注入(读完即清,同 wecom)+ 401/logout 时 location.replace(relogin_url)(原生壳拦自定义 scheme 如 zcbotapp://relogin → 静默换新 token 重进;H5 登录页同契约)。改动:state.jsEMBED_RELOGIN_URL 解析+消毒(必须带 scheme 的绝对地址,拦 javascript:/data: 等可执行 scheme——该值喂 location.replace,不消毒是 XSS 口子);embed.js 抽共用 readFragmentToken/gotoInitialTask,加 embedAppInit/embedAppRelogin;auth.js logout 分支序 wecom→app→iframe。新增 APP.md(进入契约 + platform 登录链路实测 + 原生壳杂活清单 + H5 备选),EMBED.md 精简 243→约 120 行。ESM 语法检查过,浏览器级实测待跑(逻辑与线上企微免登同构)。顺带:实测发现 platform /api/login/token 响应把 hashed_password 下发到客户端,修复建议已写进 APP.md §5 转交对方。
  • 07-21 / 0.58.52 / 窗口体量估算实测校准(50%压缩/85%折叠/前端占用环共用):diag 复盘窗口约束现状(scripts/diag_context_pressure.py 留仓):机制有效(折叠上线后唯一越线 task 9a863424 下个 run 起点即回落 400k→137k)、零撞硬上限(6 条终态错误无一 context 超限),但量出静态 CHARS_PER_TOKEN=2.5 对中文密集窗口低估近一倍——名义 85% 折叠线实际 ~155% reliable 才触发(该 task 实测 40.7 万 tokens);代码密集反向虚高(fe2d8b73 估 1.2M 实际 616k)。修(信号校准,不加新机制):context.pyestimate_window_tokens(provider 实报 tokens_in/out 覆盖窗口主体,仅实测点后尾巴按 2.5 估)+ calibrated_chars_per_token(比值夹 [1.0,4.0] 带宽);Session.last_measured_usage() 从 messages 表取窗口内最后一条实报 usage(best-effort 绝不抛,idx→内存 pos 映射校验 role);maybe_fold 触发判定换 token 实测口径;loop 的压缩门槛与 context_limit_chars(前端环)用校准比值,每轮成功调用后以 (sent_chars/prompt_tokens) 刷新。已知残余:折叠后 run 若在首次 chat 完成前崩,下个 run 起点读到旧实测会多折一次(后果=摘要偏保守,原文全在 DB,不为此加持久化状态)。run 中途折叠/超限自愈按 §5 无信号不实施继续搁置。真实生产 task 验证映射与校准(9a863424 drift 0.95x、fe2d8b73 0.51x、74696048 0.86x),286 测试全绿。
  • 07-21 / 0.58.50 / salvage 成功提示降噪(黄→灰):用户反馈"工具调用参数损坏但已就地抢救"黄字吓人、问是否影响后续对话——核实零影响(salvage 只就地改写 arguments,当轮照常执行,对话历史与正常轮无异;warn 是纯前端 SSE 展示事件,不入 messages 不回灌 LLM,刷新即消失)。处置:不全静默(上游返脏数据的事实要可见、可与 tool_salvaged DB 留痕对上),改分级降噪——loop.py 该 emit 加 level:"info" + 措辞软化「已自动修复工具调用参数…继续执行」;chat.js warn 渲染按 level 分流,info 走灰色 muted 无 ⚠,黄色 ⚠ 只留给真打断本轮的路径(丢弃重试/熔断等)。
  • 07-21 / 0.58.51 / 系统提示护栏:大段中文正文别内联进 .py(run_python 语法预检失败治本):失败面板 run_python/error 语法预检簇(近7天31次/12task)根行为=模型手写 python-docx/pptx 把大段中文正文硬拼进 .py 源码,ASCII 引号/全角标点/缩进崩成 SyntaxError。定位:①现有正规路径充分(所有出 docx 的 skill 都指向 rendering/render.py md→docx、且写"别自己手搓"),但 DB 显示 16 个涉事 task 中 7 个没 load 任何 skill→够不着 SKILL 指引;②precheck(pysyntax)已 host 侧拦截+回根治 tip+喂 RepeatGuard,浪费已 bound(每任务~2.6次自愈、无失控循环)。故走最高覆盖、最低改动:base 系统提示 prompts/system/general_v1.md(所有任务加载)的 run_python 段加一句原则级护栏——生成/改 docx·pptx 时大段中文正文别内联进 .py、先 write 进 .md/.txt 再 read、有 skill 优先走其渲染路径(守 recipe-ban 不给可 copy 配方)。纯提示词引导、无法端到端 verify,ROI 本就低(precheck 已兜),只求少发。遗留 Option 4:改现有 .docx 无平台路径(render.py 只从 md 新生成),模型只能手写 python-docx→内联中文,需另设计(docx→md 拆/模板填充)。prompts/ 每次 build 实时读、git pull 即生效免重启。
  • 07-21 / 0.58.50 / salvage 成功提示降噪:抢救成功的畸形 tool_call 对后续对话零影响(warn 纯前端 SSE 不入 messages),黄色⚠警告降级为灰色 info 行(emit 加 level:"info"),黄⚠只留真打断路径。改 web UI + loop emit。
  • 07-21 / 0.58.49 / glm.pro52 空响应治本(禁 thinking + loop 区分截断):探针定层坐实根因——①glm-5.2 thinking 网关侧默认开(线上探针实测 reasoning_content=766>0,尽管 config thinking_mode:false —— 那开关是 glm.yaml 未做的 TODO,根本没传);②重任务(100k 上下文)上思考膨胀烧穿模型自带输出上限(65536)被截断(finish_reason=length)、content 空 → loop 判空响应整轮丢弃 + 同上下文无效重试(task 35744bea:5 次 empty 全 tokens_out=65536,事件4=attempt2 铁证);后果单任务烧 ~327k 输出 token。与 opus48/deepseek 网关 wire bug 不同根。:core/llm.py._build_kwargs 加 family=="glm" 分支,据 thinking_mode 透传 extra_body={"thinking":{"type":"enabled|disabled"}}(GLM 协议,与 reasoning_effort 不同族)——线上探针 A/B 实测 disabled 后 reasoning_content 766→0、正文照常;core/loop.py_finish_reason,空响应路径区分 length(截断,思考烧穿输出上限,重试无效)与 wire 吐空,warn 措辞据实 + record_empty_response units 记 finish_reason(JSON 免 migration,便于面板区分性质)。修好既坏的 test_loop_empty_response(mock 缺 executor)+ 补截断措辞用例,61 测试全绿。探针 scripts/diag_glm_empty_probe.py 留仓(monkeypatch _resolve_executor 绕沙箱池、PROBE_THINKING_OFF A/B 开关)。
  • 07-20 / 0.58.48 / glm.pro52 空响应定层探针:失败面板 empty 簇(15)主角从 opus48 换成 glm.pro52(11/15)。加 scripts/diag_glm_empty_probe.py——build_agent(resume=True) 复原真实 system prompt + 全工具 schema + 完整多轮上下文(空响应发生在深层,单条 user 消息复现不了,这是与 2a1bc25d narrated 探针的关键差别),打 glm.pro52,三态判定 EMPTY(真吐空)/NARRATED(工具意图漏成正文)/STRUCTURED。默认锁 task 35744bea(近7天 empty 5 次最可复现)。本机 import litellm 卡 ~20min,交生产机 .venv/Scripts/python.exe scripts/diag_glm_empty_probe.py 跑,输出写 scripts/_glm_empty_probe_*.txt。定层后再决处置。
  • 07-20 / 0.58.47 / 工具失败面板 6 簇巡检 + svg 质量门签名诚实化:扫近7天失败聚集逐簇定根因。①write/edit malformed(45/32)=100% DeepSeek v4 wire 把并行 tool_call 的 arguments 拼成 {...}{...},salvage(0.58.24)复盘提前到 07-20:命中率稳 ~85%(post-launch salvaged 252/malformed 44)、残差涉事 task 全在跑无终态失败=落非流式重试自愈,决策保持现状不再写代码(面板绝对数被上线前 07-13/14 尾巴撑高,要看 salvaged/malformed 比)。②shell/exit "Font issues"(20)=svg_quality_checker 质量门按设计 exit-1,但 toolfail._classify[exit] 前尾行当签名,而尾行永远是通用 tip「4. Font issues:…」→ 所有门失败(typography/alignment/spec_lock drift)误标成 Font issues 误导排查。修:checker 在 errors>0 时末尾多打确定性 gate_verdict_line()「[GATE FAIL] svg_quality_checker: N error file(s) / M total; top issues: …」作为最后一行 stdout(放 main() 里 export 之后),toolfail 现有取尾行逻辑自动拾取诚实签名、toolfail 零改动;_categorize_issuespec_lock/typography 类避免真错落 "Other"。补 3 测试(GateVerdictLineTests),39+3 全绿。③run_python 预检(31)=pysyntax 按设计拦中文正文硬拼进 .py(引号/缩进崩),非平台 bug=提示词治理待办。④empty(15)=主角换成 glm.pro52(11/15,非旧 opus48 案),需生产跑 narrated 探针定层(本机 import litellm 卡,task e7c2f50b 备用)。⑤web_fetch(6)=外部 403 拒抓为主,非平台锅。
  • 07-20 / 0.58.45 / glob 绝对路径崩溃(工具失败聚集 #2):巡检近7天工具失败聚集,glob 排第2(3次/3task/3用户、近24h 仍在发)。根因:tools/fs.py GlobTool 直接 base.glob(pattern),模型传绝对 pattern(沙箱 cwd 就是 /workspace,自然写 /workspace/**/*.py)时 pathlib 抛 NotImplementedError: Non-relative patterns are unsupported,整个调用崩返 [Error executing glob]。改:绝对 pattern 先 _split_abs_glob 拆成「存在的静态前缀目录 + 相对 glob 串」(左起吃掉不含 *?[ 的组件当 base)再匹配;补首字符 /`\判定(POSIX 前导斜杠在 Windows 宿主is_absolute()为 False,沙箱是 Linux,两处对齐)。顺手删掉原if "**"/else 两分支代码完全相同的死重构。/sandbox/tools/是 DockerfileCOPY tools/` 拷贝,需重建沙箱镜像才生效。
  • 07-20 / 0.58.45 / PPT 页脚漂移治本(工具失败聚集 #1,A+C):shell/exit 排第1(近7天16条 exit-1、近24h 6条,9task/7用户),实测拆解 15/16 是逐页手写绝对坐标偏离 spec_lock.layout_grid 锁定值 216px 的「想对齐没对齐」(footer_y 近失 27行为最大头,margin_x/content_top 各7行,content_bottom 溢出12行),字体/spec_lock 只是 WARN 不 fail。关键发现:executor-base.md §180-185 早有「HARD—checker-enforced」的 snap 纪律却仍被漂移,加 prose 无用,治本须机械化。A:spec_lock_reference 新增 ## footer 锁定片段——x/y 用 margin_x/footer_y 预填好、页码 text-anchor="end"canvas_wmargin_x、留 {PAGE} 占位,executor 每页逐字粘贴只换页码,把 footer_y 这个跨页漂移第一大头从「每页手算」收敛成「一次编写」(executor-base 加对应硬规则,SKILL.md 同步);冒烟验证锁定片段过质检 errors=0、无 footer_y/margin_x 报错。C:svg_quality_checker._ALIGN_TOL 2→3px(2px 对手写实测过严),同步刷 SKILL/spec_lock_reference/executor-base 的「215px/212px」表述与测试值(margin drift 用例 60/63/66→60/64/68,30 测试全绿)。content_bottom 溢出(装太多项,另一性质)与 grid-snap 后处理(B)本轮未做。
  • 07-19 / 0.58.43:文件预览遮罩改整屏、消除"上暗下亮"割裂——旧实现用 #file-preview-modal { bottom: var(--preview-bottom-inset) } 把遮罩顶到 chat-form 之上,好让预览时能边看边打字,代价是底部整条(输入区+左栏入口+右栏+状态)全不压暗,与上方压暗区形成一条硬边界的通亮带,很割裂。改为遮罩铺满整屏(bottompadding-bottom,仍让居中卡片停在输入区之上不遮挡),底部随整屏统一压暗;仅 chat-form 由新 body.fp-openposition:relative;z-index:95(压过遮罩 z90,层叠上下文已核:#app/#pane-mid 均不建 context)+ 上向阴影,上浮成"悬浮活动条",继续可打字。预览时左栏/右栏/状态点击落到遮罩=关预览(符合"背景不可用"预期)。改 web/static/dev.html + web/static/js/preview.js(open/close 加/去 fp-open)。
  • 07-20 / 0.58.46:文件预览背景撤回毛玻璃、改回压暗遮罩——用户反馈 0.58.44 的毛玻璃虚化(rgba(20,22,28,.22) + blur(6px))"不行",要求变暗且背景仍看得到、注意度适中。改回半透明深色遮罩 rgba(0,0,0,0.45)(比 0.58.43 的 .5 略透、背景内容仍隐约可辨),去掉 backdrop-filter,chat-form 悬浮阴影恢复 0 -10px 28px/.22。因 0.58.44 之上已叠 0.58.45(工具修复),不走 git revert(会冲突版本/CHANGELOG),改为前向修复。只动 web/static/dev.html
  • 07-19 / 0.58.44(已被 0.58.46 撤回):文件预览背景一度改毛玻璃虚化,用户反馈观感"不行",0.58.46 改回压暗遮罩。
  • 07-19 / 0.58.42:页内弹框替代原生 alert/confirm/prompt——用户反馈原生浏览器弹框(顶部丑框)应改成页内样式,且区分两类(对标 Element dialog/message)。新增 web/static/js/dialog.js:dialogConfirm/dialogPrompt(遮罩+卡片 modal,复用改密码那套头/体/脚布局,Promise 化以一比一替换同步的 confirm/prompt,Esc/点遮罩=取消、Enter=确认、danger 变体红键)+ message(顶部居中轻量 toast,success/error/info 三态,自动消失、点即消)。dev.html 加 #app-dialog 容器 + #app-messages toast + 对应 CSS。全量替换主应用 8 文件调用点(chat/files/crons/procs/wechat/skills/media/auth,共 30 处);admin.js(独立 admin-only 页、独立 <style>、无 CSS 变量)刻意保留原生 alert 避免缺样式。纯前端加法,不动后端/接口。
  • 07-18 / 0.58.41:任务改名 UI——后端 PATCH /v1/tasks/{id} 早支持 name(validate_task_name 校验)但前端无入口;taskMenuItems 加「重命名」项(列表行 ⋯ 与顶栏 ⋯ 共用此菜单,一处插入两处生效),renameTask() 走 prompt→PATCH→更 state.tasksById/taskMeta.name + renderChatMeta() + loadTaskList() 全同步。刻意只改 DB 显示名,不动 working_dir/磁盘宪法文件(定位锚是 task_id/short_id,name 设计为自由可变标签)。仅改 web/static/js/chat.js
  • 07-18 / 0.58.39:JWT 滑动续签——活跃用户临期(剩余寿命 < TTL 1/4,env ZCBOT_JWT_REFRESH_THRESHOLD_SECONDS 可调、0 关)由 _authenticate 中间件就地重签发新 token 走响应头 X-Refreshed-Token/X-Token-Expires-At,前端 api() 无感吸收换 state.token,不再因 7d TTL 掉线。additive 惠及 platform 层 + SPA(不认退回原重登行为);CORS 加 expose_headers
  • 07-17 / 0.58.38:修定时简报产物文件链接点开 404——推送端 _build_push_message 把产物写成完整 /v1/files/download?path= URL,撞前端相对路径拦截器致二次包装 404。A 拦截器识别 ^/?v1/files/ 抽真 rel 救 DB 历史存量 + B 推送端源头收敛为 user_root 相对 rel(企微 send_file 独立通道不碰此链接,不受影响)。
  • 07-17 / 0.58.37:修 task d9c74a5a 三处独立缺陷——① chip 提取 _TAIL_CLS 补排除 *(粗体路径尾 ** 被吞成 404 chip)② docx 加 EMOJI_RE + add_fonted_runs,emoji 段走 Segoe UI Emoji 补缺字(不破坏化学式下标)③ collect_md_files 让 docx 三 profile 认单文件,兑现 render.py 单文件承诺、不再被迫建 sections/。
  • 07-17 / 0.58.36:run_python 超时返回超时前的部分输出 + -u 无缓冲——19 次超时全是真慢批量 I/O(论文检索/多 PDF/大下载),超时分支原丢弃已捕获输出致模型整批重跑;format_timeout_result 回部分输出 + 续跑提示(据已完成部分续 / 大操作走 background),docker/host 两执行器共用。
  • 07-17 / 0.58.35:通用报告走平台渲染器 report profile——平台早有 rendering/ md→docx(+pdf)但没引导指向,烧 token 报告在裸手撸 python-docx;加 report profile(目录默认无 / 不强制分页)+ agent_builder 软引导。渲染器为首选加法不硬拦 run_python(定制版式照样自由写)。
  • 07-17 / 0.58.34:run_python 宿主 compile() 语法预检——模型手撸 python-docx 把中文正文拼进源码致 SyntaxError 反复重试(失败面板最大头,20 样本实证);新 core/pysyntax.py(不 import litellm、本机可跑)命中返锐化中文诊断早返、跳过 docker 往返,零误伤(compile 不过 = 运行必失败)。
  • 07-17 / 0.58.33:堵两条烧 token 裂缝——① _toolcalls_partial_args(部分必填在场、部分缺失 = 流式 wire 乱序吞键特征)走非流式重试 + 落 usage_events kind=tool_malformed 可观测;② _RepeatGuard 补连续同类错误 streak 判据(_norm_err 抹平路径/数字签名,跨 ≥2 args),SOFT 提示、HARD 拦一次重置留活口。
  • 07-15 / 0.58.32:空响应防御——provider 吐空 tool_calls + 空正文原被当"答完"静默 done(隐蔽卡死);_is_empty_response 接 attempt 循环走非流式重试,耗尽仍空发可见 warn「已重试仍空,回复继续可重试」+ toolfail 聚集留痕,不引入终态 error。刻意不做内容嗅探式重试(假阳性更糟)。
  • 07-15 / 0.58.31:撤回 §8.11 delegate(0.58.30 曾整体落地,revert + force-push 抹除)——机制没错但触发信号没坐实(motivating 案更像批量扇出而非探索检索);重建前先用 diag 确认是真探索(依赖前序结果、无法一次列全)才 delegate,是批量走批量工具。只留验证过的批量工具(0.58.28)。
  • 07-15 / 0.58.29:修对话正文文件锚点两回归——① media.js _TAIL_CLS 误排间隔号 ·(文件名合法分隔符)致含 · 的 pptx 丢 chip;② 正文相对路径链接点击整页 404,chat.js.msg .body a[href] 拦截(外链新标签 / 内部 openFilePreview)。
  • 07-15 / 0.58.28:mp_search_summary 加批量入参 formulas=[...](检索型烧 token 头号定点解)——pymatgen task 562 次逐式调用(91% 重复),批量化并成 1 次工具调用、复用单 MPRester 会话、中间数据落盘不进对话、只回紧凑摘要 + 路径;单查询路径字节不变向后兼容。"已知清单扇出"正解是工具批量化,非 delegate 子循环。
  • 07-15 / 0.58.27:对话卡片悬停「复制」按钮(仿 GPT/DeepSeek)——取正文 Markdown 原文(据 data-idxloadedMessages,不从渲染 HTML 反推),clipboard 主路径 + execCommand 降级;范围收敛只做复制(后端纯追加无重跑/截断语义,重生成/编辑留待后端支持)。
  • 07-15 / 0.58.26:用户停止后「已停止」持久提示(补 cancel 终态,与 error 对称)——cancel 提升为一等持久终态 run_status="cancelled"(Text 列无 migration),前端 renderPersistedRunTerminal 认 error/cancelled、刷新/切任务仍在;删被收尾 loadMessages 冲掉的 live badge。蓝绿旧实例读到当良性态优雅退化。
  • 07-15 / 0.58.25:skill 定向模型豁免——current profile family==unifyllm(已选国际旗舰)时不切走 pin 的国产档,尊重用户显式选择;判据放 DB 写入前无副作用。DESIGN §3.5 记。
  • 07-15 / 0.58.24:畸形 tool_call arguments 就地抢救(salvage)——char-0 前缀垃圾(provider-wire 脏,parse 成功故 salvage/malformed 都不命中)命中畸形后 core/salvage.py 左→右扫 { 试 parse-to-end + key⊆schema,全有或全无采纳、省一次非流式重试;记 tool_salvaged 区分真丢弃 vs 救回。纯函数单列(避 loop.py import litellm 本机卡死)。
  • 07-15 / 0.58.23:sandbox 补 OLE 老格式解析依赖 olefile/xlrd/extract-msg(建材院高频老 .doc/.xls/.msg 转发件,markitdown 盖不到);需重建镜像。
  • 07-13 / 0.58.22:run_python script_path 宿主预检 + 路径容错 + code 落盘回退——三形态(没写就跑 / user_root 相对双重拼接 / code+script_path 同给);_prepare_script 前台 + background 共用,docker/host 同语义,含越界防护。
  • 07-13 / 0.58.21:run 级错误前端持久提示 + 进失败聚集面板 + provider 致命错误即时告警——错误卡被收尾 loadMessages 冲掉,renderPersistedRunErrorrun_status=error 持久化;record_run_error 留痕 toolfail 加 run cluster;余额/配额/认证正则命中即邮件(签名 6h 冷却)。
  • 07-13 / 0.58.20:非流式重试期「思考中」指示恢复 + 停止即时生效——llm_start 挪进 attempt 循环每次重发,前端既有逻辑自动重建占位段;_nonstream_once 挪后台 daemon 线程,主线程 0.5s poll cancel(弃养线程跑完丢弃、语义同流式 cancel)。
  • 07-13 / 0.58.19:畸形 tool_call 首败即降级非流式 + 损坏原文留痕——v4-pro 也踩 delta 错位老病且同轮流式重 roll 强相关;_MAX_MALFORMED_ATTEMPTS(1 流式 + 2 非流式)首败即降级、修 off-by-one;_log_malformed_args 打首尾 300 字符 ascii 转义(畸形轮不入库,唯一取证)。
  • 07-13 / 0.58.17:历史消息丢图片预览/chip 两根因——① selectTask 并发化(0.12.16 引入)致 renderMessages 时 taskMeta 还是旧值/null → wd 算错、chip+inline 图全丢,loadMessages{render} 开关延后渲染到 meta 赋值后;② 中文语境正则漏挂,lead 边界改"行首或非 [A-Za-z0-9._-]"、tail 补中文标点。
  • 07-13 / 0.58.16:有 gpt_image 权限用户生图默认 GPT——_default_image_variant 档位集有 gpt_image 则默认它、否则 seedream;is_default 与 resolve 空串解析共用,保证下拉与实挂图像工具一致。可下拉切回豆包。
  • 07-13 / 0.58.15:结构图 mermaid vs 生图改 ask_user 让用户点选——mermaid 路径不触发 load_skill 看不到岔路,_MEDIA_DIAGRAM_FORK_SEG(挂图像 variant 时追加)先二选一(矢量可编辑 vs 生图有质感但中文标签易乱码);免问例外 = 已点名/已选过/paper·proposal 管线要 mermaid。纯 prompt。
  • 07-13 / 0.58.14:toolfail 聚集加时间分布——daily 按 24h 分桶 + count_24h + first_at,排序"近 24h 活跃在前",admin 页加"近24h"(>0 红)+ 趋势 mini 条形图,已安静行淡化;修好次日看板变灰 = 修好。API 只加字段向后兼容。
  • 07-13 / 0.58.13:look_at_image 引导改"慢、谨慎调"——原写"便宜"鼓励随手调,实际痛点是慢(几十秒);tool description + 媒体段改强调 SLOW / 一次问全 / 别反复看同图。纯 prompt。
  • 07-13 / 0.58.12:沙箱镜像补 file 命令(13 任务撞 file: command not found);同批 olefile/cairosvg 决定不装(量小可自愈 + cairo DLL 坑 Windows host,待巡检趋势)。
  • 07-13 / 0.58.11:工具失败聚集巡检(反 9dcae061"挂 90 天无人知")——新 core/toolfail.py 扫近 7 天 role=tool 错误按(工具 + 归一签名:路径/数字/uuid 抹平)聚合,≥5 次跨 ≥2 task 判聚集;三出口 = 周期任务发 ZCBOT_DEVELOPER_EMAIL + GET /v1/admin/tool-failures + admin 页表。无新表无 migration。
  • 07-12 / 0.58.10:mermaid 渲染真·终案——init.sh 127.0.0.0/8 DROP 掐死 puppeteer↔chromium 的 127.0.0.1 DevTools WebSocket(SYN DROP → TCP 重试打满,恒 ~2m15s 超时 + CPU 近 0),apply_blocklist 首条放行 -o lo 后大图 5.2s 出图,"1 vCPU 渲大图慢"亦误判。90 天 67 次 timeout 真凶是它;之前 probe 全走 --entrypoint bash 绕过 init.sh 误判三轮(复现线上必须默认 entrypoint)。生效需重建镜像 + 回收容器。详见 memory sandbox_chromium_crash_saga
  • 07-11 / 0.58.8:mermaid 必崩阶段性定案(后被 0.58.10 推翻)——07-08 镜像烤进的 chromium 点版本 150.0.7871.46 启动即崩(int3 自杀零日志),--only-upgrade 复活;Dockerfile 加 CHROMIUM_REFRESH cache-bust 旋钮 + build 末尾渲染 canary(坏则 build 当场失败)。0.58.9/0.58.7-0.58.4/0.58.5/0.58.6 = 排查过程中的 probe 迭代(bisect hardening 逐 flag / round-3 探针 / 下载源修正 / -i stdin 坑),结论沉淀进 memory,细节查 git log。
  • 07-11 / 0.58.3:admin 用量表默认时间范围 all→近 7 天(两表初始 range,API 默认不动)。
  • 07-11 / 0.58.2:sandbox pids_limit 256→1024(chromium headless ~150-200 线程 + shell 超时只杀 host 侧 docker CLI、容器内残留 → 打满 EAGAIN;彻底修法是 Step 3b PGID kill,未动);unifyllm 文本再加 gpt55/gpt54_mini 进 pro 档。
  • 07-10 / 0.58.0:第二图像后端 gpt_image(unifyllm 网关,pro 档)——媒体 provider 从豆包单家泛化为多家:config/media/unifyllm.yaml + tools/gpt_image.py(仅 prompt,不支持 i2i/尺寸);装配泛化(_choose_image_variant 跨 provider、_media_tools_block 按实挂工具拼装、web catalog 扫 config/media/*.yaml);豆包在前默认仍 seedream。
  • 07-10 / 0.57.0:unifyllm 网关接入(5 个国际旗舰进 pro 档)——config/models/unifyllm.yaml(fable5/opus48/sonnet46/gpt56_sol/gemini31_pro,litellm openai/ 前缀零代码改动)。坑记 yaml 头注释(gpt-5.x 硬拦 temp≠1、gemini temp=0.3 返空 → 两者 optimal_temperature: 1.0)。部署注意:服务器直连 unifyllm.ai TLS 握手失败需代理出口,价格字段暂 0。
  • 07-10 / 0.56.0:后台进程 bg proc(DESIGN §8.12)——解"长脚本被工具超时掐死 / 占死 run / 蓝绿切换陪葬":shell/run_pythonbackground=true + check_process 工具;状态协议纯文件(<user_root>/.zcbot_procs/…)无 DB 无队列;host 走独立 wrapper、docker 走专用容器(与 sandbox 生命周期解耦扛蓝绿);前端 [Background] 结果卡活化 + toast + 对话锁(轮询式,proc 完成往往无活跃 run)。同批带 seedance resume_task_id 续查 + LLM 超时显式化 600s(ZCBOT_LLM_TIMEOUT_S)。
  • 07-10 / 0.55.2:文件面板根目录隐藏系统工作目录(定时任务 / 渠道镜像目录,DB 回查判定);仅列表降噪非权限拦截,带 path 直接访问照常放行。
  • 07-10 / 0.55.1:per-user 磁盘配额 5GB→20GB(应用层软配额,OS 层 xfs prjquota 留待 §7.5 #4)。
  • 07-09 / 0.55.0:用户版更新日志——根 CHANGELOG.md(面向用户口径,回填至 0.30,与工程笔记 PROGRESS 分离)+ GET /v1/changelog(公开、mtime 缓存热改即生效、零 migration)+ 前端版本号可点弹层 + localStorage 记 last-seen 亮红点。CLAUDE.md 加维护约定。
  • 07-09 / 0.54.2:清理 deepseek-chat/reasoner 下线残留描述(照做会打不通)。
  • 07-09 / 0.54.1:对话头部压缩指示环(编辑器式)——头部改 N tok + 环形指示器(窗口体量/模型容量,三段色阶:绿未压缩 / 琥珀压缩区 / 红达折叠阈值),金额/缓存命中挪 hover。数据链:GET /v1/tasks/{id} 加 4 个 additive 字段 + 折叠计费 kind context_fold§8.8 Phase 2 长会话中段折叠摘要——run 起点窗口达 reliable_context×85%core/context_fold.py 把中段折叠为结构化摘要写 tasks.context_summary(0021)、推进 context_base_idx,Session.load 注入仅内存「[前情摘要]」;前缀缓存友好(复用会话 prepare 前缀 + 末尾追加),失败零阻塞。
  • 07-08 / 0.53.1:新增 rebuttal skill(审稿意见回复 / 修回)+ paper·review 增强——调研 GitHub nature skill 生态后移植:rebuttal(逐点回复 + 修改清单 + cover letter,零编造铁律 + 语气纪律 + 疑难案例库);paper 补 figure_discipline.md + submission_audit.md;review 补 sci_polish.md 英文 SCI 润色子模式。文献检索/paper2ppt 等未装(自有后端对不上 / 已有更强版)。
  • 07-08 / 0.53.0:录音文件转写工具 transcribe_audio——新 core/asr_lfasr.py(讯飞 raasr v2:签名 + 异步订单 + 说话人分离)+ host-side tool;选 LFASR 弃 IAT 分片(单文件 5h/500MB、服务端解码、roleType=1 自带说话人分离);全文落 .transcript.txt 只回预览 + 路径。凭据 XFYUN_LFASR_SECRET_KEY
  • 07-08 / 0.52.x:企微/个微语音接入收尾——个微 ClawBot 语音(SILK v3 → pilk 解码 + ffmpeg,core/audio.py 统一入口 transcribe_voice 按字节头分流,两渠道共用)+ 企微语音(AMR → ffmpeg)全链路用户实测跑通;沿途修 pilk 源码编译坑(需 build-essential)、requirements # [host-only] 标记 build 时过滤、npm 源重试、企微回调平台侧失效(后台重存配置恢复)、推送失败不再静默。服务器新增系统依赖 ffmpeg。ppt 验收改纯代码几何质检、撤 0.36.0 渲图 vision 闭环(DESIGN §8.10,SKILL 零提及渲图)。
  • 07-07 / 0.4x:web 端语音输入全链(讯飞 IAT)——POST /v1/asr/transcribe(整段 PCM)+ WS /v1/asr/stream(流式 wpgs 服务端合并动态修正,16.8s 音频 end→final 179ms)+ 前端手势(触屏按住说话 / 桌面点击开停 + Enter/Esc,按下时长判别两端统一,明确不做桌面 VAD 自动停)+ 录音面板实时波浪字幕;凭据 XFYUN_APPID/API_KEY/API_SECRET。踩坑:讯飞控制台 IP 白名单(握手 403)。企微会话冷启动改聊天优先布局(不配主页 + 菜单「工作台」按钮直进会话)+ 未绑定入站回绑定指引;撤除欢迎推送死重(0.46.1);移动端浮层菜单钳视口 + 对外品牌名 env ZCBOT_BRAND_NAME(zcbot 只是内部代号);企微应用主页免登(snsapi_base 静默授权进 embed);run 长耗时可视化(SSE reasoning 事件 + 每秒跳秒指示,修"静止被当卡死")。
  • 07-06 / 0.4x:蓝绿无感部署(RUN.md B 档落地)——zcbot@blue/green 双 systemd 实例 + nginx upstream 单行切流 + update_bluegreen.sh(轮询 DB 等旧色 run 清空再 stop);双实例并存三修(tasks.run_owner(0020)reaper 各收各色 / 容器名带实例色 / 微信长轮询 PG advisory lock 选主);broker 刻意不出进程(接受切换瞬间刷新看不到旧实例直播)。broker 外置 Redis(ZCBOT_REDIS_URL 开关,不设 = 进程内)——LocalRunBroker/RedisRunBroker 双实现,event 走 PUBLISH + done SETEX、cancel key poll 跨实例可达。沿途:nginx TLS/497 跳转示例修正 + 部署脚本 pip -q + wait_health unbound bug。
  • 07-03 / 0.38.x:任务列表运行态标识(run_status 快照 + liveRuns 叠加,7px 脉冲圆点、默认态静默、running 行自动挂 SSE 上限 4 条);ppt 反纯文字页 + 图表落地硬门(7aa49195 复盘:版式指纹 + spec 指派图表退化→error + CJK 互叠升 error + content_bottom 越界检测);web 直播流式文字按轮次分段(修工具刷屏把文字推出视口);seedream size 面积钳制;ppt 对齐网格锁 layout_grid(d1285247 复盘)。
  • 07-02 / 0.36.x:ppt 渲图验收闭环(139a59c5 复盘)+ check13 几何检测(压字/越界=error);二轮硬化(渲图验收不可 flag 豁免 / 图标门对 svg_output / 导出前内嵌质检 / 修 svg_final 嵌图失效)。[后于 0.52.x 撤除 vision 验收,改纯几何质检]
  • 07-01 / 0.3x:快捷指令(core/shortcuts.py 触发词→完整指令,入口层确定性替换非 memory);ppt 修多起零图标/伪导出(sys.exit(main()) 吞退出码 / 图标硬门 / cairosvg 兜底 / 页数升独立 🔒 gate);ppt 工作目录重构(可再生产物收进 .build/);look_at_image/seedream 接受容器绝对路径。

2026-06 下半月(渠道/ppt SVG-first/管控)

  • 06-30 / 0.33.5:ppt 加商务红品牌预设(business-red,#C00000 + 政企口吻,设为中文政企汇报默认配色候选);用户没给图时主动提议 ai 配图(提议免费,确认才花钱)。
  • 06-30 / 0.33.4:修「PPT 缺图形」:质检加扁平 deck gate(文字密集全 deck 0 图形图元→error)+ 策略层视觉下限(spec_lock 不许 page_charts 与 page_layouts 同时空)。prompt+gate 抬下限,执行模型设计功力是上限。
  • 06-30 / 0.33.3:修「PPT 缺图标」四层断点:references 里 23 处 ppt-master 残留路径修正 + 新建 icon_sync.py(strategist GATE 此前空转)、质检加"锁了图标却全 deck 0 图标→error"、执行层强制内容页 1-3 图标、导出预扫警告。附:svg_preview 认容器 chromium + 修 --screenshot 相对路径静默失败。
  • 06-30 / 0.33.2:look_at_image 偶发超时改 tool 内透明重试(新 ArkTimeoutError 子类,仅超时/网络抖动重试),vision timeout 60→120s;避免报错抛给主模型触发整调用重发烧 token。
  • 06-30 / 0.33.1:修 web 端 SVG 无法预览(前端按扩展名强制 blob mime + 后端 download 对 .svg 显式回 image/svg+xml,双保险)。
  • 06-29 / 0.33.0:ppt skill 清空重构为 SVG-first(移植 ppt-master 引擎+设计知识,弃 GUI):AI 逐页手写 SVG,纯 Python 转换器译成原生可编辑 DrawingML;templates 全量入仓(icons 30MB);Confirm UI 换聊天 BLOCKING 确认,配图走 imagegen;端到端 4 页 deck 验证过。
  • 06-29 / 0.32.5:system prompt 加全局 context 纪律铁律:大段工具输出会进历史每轮重发——中间数据落文件、只 read 用得上的片段。
  • 06-29 / 0.32.4:定时任务默认单次超时 0→1800s(DEFAULT_TIMEOUT_SECONDS 单一事实源,显式 0 仍=不限)。
  • 06-29 / 0.32.3:brief skill 加 context 纪律,堵"同一批 38 篇 abstract 反复 dump 进上下文烧 2.5M token"(弱模型放飞);更大杠杆(框架层截断超大 stdout)留待单议。
  • 06-29 / 0.32.2:修定时任务超时被误记成 ok:_execute_scheduled_job 超时分支置 timed_out,收尾按 error 记(计连续失败、不投半成品 notify)。
  • 06-29 / 0.32.0:channel 长会话软重置(Phase 1):tasks.context_base_idx(0019),Session.load 只装 base 之后的消息进 LLM 上下文,历史全量留表;自动 gap(默 6h)软重置 + 手动「新话题」硬重置。Phase 2 摘要 / Phase 3 检索延后。
  • 06-26 / 0.31.3:消息框支持拖拽文件;附件 chip 独立托盘 #chat-attach(与状态文字解耦),修多次粘贴互相顶掉。
  • 06-26 / 0.31.2:目录圆点错位再修:点选加跳转锁防平滑滚动途中被 scroll-spy 抢写;触底且无更新内容时直接判最后一轮(经典"不可达末项"bug)。
  • 06-26 / 0.31.1:admin 近 7 天用量表加合计行(纯前端 tfoot)。
  • 06-26 / 0.31.0:per-account 模型访问控制——档位制(复用休眠列 users.plan,「档位→模型集合」配 agent.yaml model_tiers,管理成本 O(档位)):list 端点按档过滤、resolve 显式选档外模型→403、老 task 存量模型出档→持久降级 flash;admin 加档位列+图例。
  • 06-26 / 0.30.0:新增豆包 Seed 2.1(turbo/pro/evolving)+ GLM 5.2 文本模型档案(纯 yaml 即上下拉);pro52 与 glm.pro(5.1)并存不动线上引用。
  • 06-26 / 0.29.0:定时任务执行历史:右栏改 Tab(详情/执行记录),新端点 GET /v1/schedules/{id}/tasks 分页;保留全部历史不剪枝。
  • 06-26 / 0.28.1:渠道绑定/对话/管理收进左栏卡片(未绑定/已绑无对话/已绑有对话三态),删 rail「微信」按钮。
  • 06-26 / 0.28.0:定时任务 task 归属(tasks.scheduled_job_id,0017,普通列表过滤掉)+ push 统一记录到渠道对话——记录下沉到 send_to_user,投递成功即写 assistant 摘要消息(messages.kind="push",0018,取回复时跳过),用户可基于推送追问。
  • 06-25 / 0.27.4-0.27.3:渠道镜像对话从任务列表置顶行改成左栏固定卡片(/v1/channel_tasks,列表查询排除渠道任务),两卡并排;企业微信对话同微信一样 web 端只读。
  • 06-25 / 0.27.2:企业微信入站支持图片/文件(media/get 下载→InboundAttachment,复用个人微信同一落盘/注入约定)。
  • 06-25 / 0.27.1:wechat_push 加可选 channel 参数定向投递,修"点名企微仍广播到个微";不静默回退到别的渠道。
  • 06-25 / 0.27.0:企业微信入站对话:回调 webhook(新 wecom_crypto.py 验签解密)+ 把个微会话核心抽成 _run_channel_conversation(channel) 两渠道共用、各一张会话 task;回复走主动推(agent 超 5s 被动窗口)。
  • 06-25 / 0.26.10:修企微扫码绑定——网页授权端点只能企微客户端内打开,换 wwlogin/sso/login 扫码授权端点(桌面浏览器出二维码)。
  • 06-25 / 0.26.9:修 wechat_push 漏挂企微:提取 service.active_channels() 作渠道清单唯一真相源,门槛与投递同源,根除两处各列各的漏判。
  • 06-25 / 0.26.3:企微加「手填 userid」绑定第二条路——推送是出站直连根本不需要域名,只有 OAuth 扫码要。
  • 06-25 / 0.26.2-0.26.1:监控页近 7 天按日期倒序;用户名展示统一兜底链 name→user_name→email→uid8(监控页 + dev 顶栏)。
  • 06-25 / 0.26.0:平台登录注入用户档案 name/user_name(0016 加两列;ensure_user_row 升 upsert,COALESCE 语义传空不覆盖);/v1/me 回带。
  • 06-25 / 0.25.2:登录失败提示修正——凭据错统一给「账号或密码错误」,不再回显被网关改写的状态码。
  • 06-24 / 0.25.1:微信 task 在 web 端改只读镜像(单一交互权威锚定微信;24h 窗口约束下"双向打通"只能有时同步,不做)。
  • 06-24 / 0.25.0:微信入站收图片/文件(此前静默丢弃):ilink 解析 image/file item + CDN 下载 AES-ECB 解密,落盘 inbound/ 并按 web 端粘贴图同一约定注入正文。
  • 06-24 / 0.24.3:微信绑定两表合一 channel_bindings(判别列+JSONB 多态,0015 搬数据+drop 旧表)——加渠道零 migration;service 公共 API 形状不变,调用方零改动。
  • 06-24 / 0.24.1:修 host-side 工具(send_email/wechat_push)发不出附件:tools/base.py 加共享 _resolve_user_file(容器路径翻译+越界校验),base_dir 从 cwd 改 working_dir。
  • 06-24 / 0.24.0:企业微信渠道 B:纯推送 + OAuth 扫码绑定(用户拍板"和邮箱似的"不做对话)——无条件主动推正补 ClawBot 24h 窗口短板,定时简报必达首选。
  • 06-24 / 0.23.2-0.23.0:配 QQ SMTP + 发件人显示名走 SMTP_FROM_NAME;tasks.channel 列(0013)微信 task 后端置顶 + 品牌绿徽章。
  • 06-24 / 0.22.2-0.22.1:微信绑定 UI 并入主 SPA(rail modal);修顶栏 token 计量栏回复后不刷新(fetchSse 收尾重拉 meta)。
  • 06-24 / 0.22.0:微信接入第一期 ClawBot 个人微信(官方个人号 Bot API,零封号):协议全程真机实测(client_id 每条必唯一、context_token 24h 复用→主动推送成立、文件走 AES-128-ECB+CDN);core/wechat/ 四模块 + 0012 + wechat_push 工具 + 定时 notify 加 wechat 通道;凭据加密列不进沙箱。
  • 06-23 / 0.21.0:平台渲染层 rendering/:渲染是平台能力非 skill 内容(共享库进 skill 会破坏自包含/可 fork),三 skill 重复的 render_docx 收敛成配置化 profile + chromium md→pdf(不用 weasyprint);重构前后 docx 字节一致零回归;需一次 deploy 原子激活。
  • 06-23 / 0.20.4:消息目录定位错位修:跳转改 block:"start" 与活跃判定同锚点,容差 80→24。
  • 06-22 / 0.20.3:crons modal 补 z-index;登录页 focus 引用错 id。
  • 06-21 / 0.20.2:发送期修复悬空 tool_calls——run 中断留下的 assistant.tool_calls 无对应 tool 结果会被 API 拒、task 卡 error;_repair_dangling_tool_calls 发送前补占位 tool 消息,不改库、存量坏数据自愈。
  • 06-18 / 0.20.0:brief 重定位「重要文献速览」(只描述不给建议,Elsevier 优先,web 动向单列),8 文件精简到 3。
  • 06-18 / 0.19.0:定时任务 v1(scheduled_jobs):job 本体=cron+一句 prompt+会话模式,"发邮件"是 agent 动作不是字段(加能力不改 schema);croniter 只当 next_run 计算器,调度是 plain-asyncio 守护循环不上框架;对话端完整 CRUD、前端只读+停用/删除;isolated/persistent 两模式。
  • 06-18 / 0.18.0:新增 brief skill(文献计量趋势型简报,documents/research/web 三路取数,六阶段);顺带抽化学式下标白名单补进三个 render_docx(CO2/C3S 平排数字老毛病)。
  • 06-17 / 0.17.0:任务软删除(deleted_at,0010):公测后对话轨迹是语料,硬删推翻;DELETE 改置位 + restore 端点,文件不动。
  • 06-17 / 0.16.2:用户操作说明书(详+精简两版,不出现产品代号);文献库库容口径 21W+→100W+ 全量 10 处改。
  • 06-17 / 0.16.1:新增 paper skill(期刊论文写作):调研 ARS 等开源不直接装(license/领域/引文格式不合),移植流程骨架、底座全换 zcbot 自有;中英双语×三类型用子 md 分流;微型 fixture 端到端 smoke 过。
  • 06-16 / 0.16.0:look_at_image 图像理解(Doubao Seed 2.0 Lite,一次读图 <¥0.01):主模型纯文本按需"借眼睛",否决换 vision 主模型(DeepSeek code/tool-calling 是核心);usage_events.kind=vision 免 migration;路径解析抽 tools/image_ref.py 共用。
  • 06-16 / 0.15.0:seedream i2i 改图(reference_images v1 单图,不传=文生图行为不变);前端发送时注入粘贴图路径 [用户上传的参考图](修既有缺口:粘贴的图路径根本到不了模型)。
  • 06-16 / 0.14.0:ask_user 方案确认选项卡(Claude 式):虚拟工具、调用即提前结束本轮,点选项=把 label 当新用户消息发,零额外 LLM 往返;严格收窄到"2-4 个互斥方向"防变爱问。
  • 06-16 / 0.13.0:消息目录:右侧悬浮圆点轨道(每点=一轮提问,hover 标题、点击定位),新 outline 端点只取 user 消息 idx+片段;消息列表支持双向分页。
  • 06-16 / 0.12.16:切 task 提速:meta 与 messages 改并发拉(此前串行 await 是真瓶颈,索引没问题),首屏窗口 60→30。

2026-06 上半月(前端打磨/记忆/admin/token 治理)

  • 06-15 / 0.12.15:plot_pub 吸收 nature-figure 投稿级复合图设计纪律(只迁设计 IP 不整包移植,示例改建材领域)。
  • 06-15 / 0.12.14:消息分页:尾部窗口 + 顶部 sentinel 向上滚动加载更早;不传 limit 保持旧行为。
  • 06-15 / 0.12.13-0.12.10:文件预览四连:滚动不穿透(overscroll-behavior+wheel 断冒泡)、图片 Ctrl+滚轮缩放(CSS zoom 被 max-width 夹回,改显式 px)、双击复位、放大后左键拖动平移。
  • 06-15 / 0.12.9:sandbox 镜像加 fonts-noto-color-emoji,修 mermaid 图 emoji 全豆腐块。
  • 06-15 / 0.12.8:左栏筛选区默认折叠(显式展开过才记住展开)。
  • 06-15 / 0.12.7:system prompt 按 backend 注入「运行环境」段——原写死 Windows/cmd,docker 下误导模型 Linux 里打 cmd 构文 + 不知渲图走本地。原则:全局环境事实归 system(高杠杆),可选方法归 skill。
  • 06-14 / 0.12.6:容器 mmdc 套 wrapper 自动注入 puppeteer config(--no-sandbox 等),裸调一次成;不开 first-class tool(mermaid 纯本地计算,专用 tool 只留给带 key 计费能力)。
  • 06-14 / 0.12.5:容器 docker run--shm-size 512m(默认 64MB 让 chromium 起不来,一次对话烧 120k token 才绕道)。
  • 06-13 / 0.12.4-0.12.1:模型选择瘦身(对话下拉常驻、生图/生视频收 ⚙ 弹层);筛选区可折叠;中栏 5 按钮收「完成+⋯」菜单 + 消息阅读限宽 + 色彩收敛(颜色=后果);移动端 task 列表可滚等四小修。
  • 06-12 / 0.12.0:双层记忆升级 agent 自管:memory_block 注「记忆维护契约+可写路径锚点」常驻(空记忆也注,解冷启动),agent 用已有 fs 工具自维护;召回升级 frontmatter description;前端只读记忆面板(看走 GUI、改全走对话——单一写入口不会写坏格式)。
  • 06-12 / 0.11.1:进入公测期:CLAUDE.md 兼容策略翻新为"对外契约必须向后兼容、纯内部实现仍最优重写"。
  • 06-12 / 0.11.0:admin 增强:TOC + 按模型/各用户用量独立端点(range/sort/分页,零用量用户条件放 JOIN ON)+ 存储分页 + 导出 PDF(客户端 window.print 零依赖)。
  • 06-12 / 0.10.1:修上下文压缩投毒:旧 assistant tool_call 参数被压成 {"_compacted":...} marker,模型照葫芦画瓢当真实参数吐出(DB 实测 83 次报错里 61 次是仿写)→ run_python 空转。修:参数一律原样保留,只压 tool 结果 + skill——模型看到的范本永远真实可执行。
  • 06-12 / 0.9.x:admin 管理后台:users.role 列(0009)+ require_admin(role 走 DB 查不进 JWT,改完即时生效)+ /v1/admin/overview 五段聚合 + 各用户用量分页 + 独立 admin.html(阈值热力色,10s 轮询);命名定 admin(既盖"看"又盖"管")。
  • 06-11:版本号机制(core/__init__.__version__ 单一事实源→FastAPI/healthz/前端左栏,改版本只动一行);显式 ThreadPoolExecutor 接管默认池 + [stats] 60s 采样日志(空闲静默);dev SPA「技能」查看 modal(纯查看+删除,编辑走对话);用户私有 skill(user_root/.skills/,多来源 registry user wins、覆盖显式标注、坏 skill 不崩扫描;写走 host-side save_skill/fork_skill——fs 工具跨 backend 够不到 user_root)。
  • 06-10:system prompt 瘦身 ~40 行 + 媒体段按需注入(有 ARK key 才发);上下文压缩加压力门槛(超阈值才压,护 DeepSeek 前缀缓存);单轮停机判据从步数解耦为进展信号(_RepeatGuard + run 级 _stall,max_iterations 降为纯 backstop);systemctl restart 优雅 drain in-flight run(先拒新再等收尾)。
  • 06-09:PPTX 前端在线预览(soffice→PDF 复用已有 iframe 路径,缓存+超时 kill);药3 幽灵路径不复现 + 回归测试钉死;ppt 补信息设计纪律件(takeaway/kpi/卡片组合件 + pptx_preview 渲 PNG 验观感)。
  • 06-08:loop 加病理性重复调用守卫(_RepeatGuard 按指纹累计"无产出重复",SOFT2 提示/HARD4 拦截);检索/抓取 host 工具批量化(单数改列表,一轮并发一批——高轮数烧 token 三股根因之一);ppt 视觉系统升级卡片式;system prompt 加「少来回」原则;ppt 工作流批量化(N 页 ~2N 轮降到 3-4 轮)。
  • 06-06:前端模块化 Step 2 收官(main.js 2719→75 行入口,拆 15 个零构建 ES module);修 flash 大参数 tool_call arguments 损坏——校验 json.loads 失败丢弃整轮重 roll(不入库,断投毒级联),最多 3 次后降级非流式。
  • 06-05:前端模块化 Step 1(抽 5 个叶子模块);run_python 过程脚本约定落 scripts/;新增 standard skill(GB/T 1.1—2020 自建,重点对接 CSTM 团标)。
  • 06-04:ppt 版式 helper 收进 pptx_helpers.py + 修中文字体(font.name 只写 latin 是根因,补 ea/cs);quality_check 加内容形状重叠检测 + 三色制判定(非灰阶 ≤3);前端存储进度条;容器 env 收编 _CONTAINER_ENV 三路共用。
  • 06-03:修 docker 下 system prompt 焊死宿主路径(容器注入 /workspace/<wd_rel>);顺扫清 SKILL.md 残留宿主路径;图标种子库降只读;镜像源改清华/腾讯;workspace 落数据盘改 bind mount(回退 env 覆盖——与相对存储锚点冲突)。
  • 06-01:一键部署 deploy/update.sh(pull→pip→migrate→build→restart→healthz,自更新重跑守卫);修 MP 工具全量下载致 IP 被封(补分页);sandbox 镜像加中文字体;documents/MP 改 host-side tools(key 不进 sandbox)。

2026-05(骨架→SaaS 化→dev SPA)

  • 05-29:Seedream i2i base64 通路 probe(内网无需对象存储)+ tool_call 标题改中文活动描述。
  • 05-28:新增 analyze skill(问题拆解协调器)+ 3 个科学计算 skill(pymatgen/stats_ml/plot_pub,服务无机非金属材料 R&D);config/models/local.yaml 接内网模型(涉密专用,thinking_mode=false);Python 3.10→3.12;LoadSkillTool 修 docker 返容器路径;review 加长文档分章深审。
  • 05-27:ppt 歧义先反问(升格 system prompt 通用原则)+ description 白名单收紧路由;skill 热更新每次现扫。
  • 05-25:前端 CDN 依赖本地化 vendor/;上传进度/布局拖拽打磨;接入博查 web_search + web_fetch(SSRF 内网屏蔽)。
  • 05-22:dev SPA iframe embed 模式(postMessage 握手,PLATFORM_KEY 不下发浏览器)+ task_id 定位;媒体生成每日配额(默 20 图/5 视频);产物路径协议刚性化(<wd_name>/<rel> 全形式);Seedance 视频生成接入 + videogen skill;移动端自适应。
  • 05-21:新增 imagegen skill(五步法 + BLOCKING 确认防白烧钱)+ documents skill(内部材料学科库);sandbox 阻塞地位写进 DESIGN(shell 黑名单是装饰品,正确防线在 OS 层);task 预选 skill 注入提示;SSE 客户端重连;research fetch_pdf 直链 + pg_trgm 索引;同 wd 并发软警告(Claude Code 同款信任+软警告);paper_server 收编为 research skill。
  • 05-20:LLM 调用切 streaming(cancel 秒退 + 打字机);豆包 Seedream 5.0 接入 + 0007 全表统一 CNY;artifact chip 演进 + seedream 透明性 banner;润色按钮;fs 输出 user_root 相对路径;clear 端点;CLAUDE.md 加「实施前先对方案」。
  • 05-19:0006 task 级模型切换 + usage_events v2(units jsonb 多态);登录撤邀请码复用邮箱密码;SENTINEL user 彻底撤;任务/文件 菜单;proposal mermaid 强制;文件预览弹框。
  • 05-18:入口归位(cli.py→main.py,删 CLI REPL);0004 schema 大瘦身(删 runs,run_status 合入 tasks);files API 升格唯一目录树 mutation 入口(DB-FS 一致性服务端内化);task 级协作式 cancel;单活 run 锁 + 孤儿 reaper;proposal 流程图管线;skill 机制改可选辅助;UI 中文化。
  • 05-17:0003 name+working_dir+skill 三件套(任务标识与目录解耦);tasks 分页+筛选;task=name-based 项目目录(废 UUID 派生,同 name 共享,memory 进 .memory/ dotfile)。
  • 05-15:§7 D /v1 JSON API 落地(Phase G Jinja2/HTMX 撤);D' 过渡 auth(PLATFORM_KEY→JWT)+ dev SPA;task_dir 改相对存储(core/paths.py);workspace 统一 per-user。
  • 05-14 → 05-12:§7.1 心智修正 Folder-centric→Task 一等公民;§7 B ORM 5 表 + alembic(state.json 全废入 PG);§7 改写 user-direct(多租户方案废弃)。

历史(2026-Q1 → 05-11)

  • Phase 1-4:骨架 / 三 skill / run_python / Model Profile + Probing;ppt v3 商务红 + apply_brand + Iconify;素材摄取改 markitdown CLI。
  • 05-06 → 05-11:Phase 6 部分(task + state.json + tokens 累计);TUI rich + /resume;DESIGN §7 初版(05-12 重写);cli.py export + core/export_docx.py;atomic_write_text + core/memory.py;loop 事件流化铺 SSE 路。
  • 06-04 token 优化启动(DESIGN §8.2):chat usage 记 cache hit/miss + cost 兜底;run_pythonscript_path 模式;core/context.py 压缩旧 tool / load_skill(不改持久化历史)。
  • 06-05 记账给缓存命中折价:缓存命中按全价记致成本虚高 2-3x,成本公式拆三段 + 历史 backfill。

关键决策与偏差

决策 备注
工具基目录 cwd(读)+ working_dir(写) system prompt 同时注入两者绝对路径
Workspace 布局 workspace/users/<user_id>/{.memory/, <name>/} per-user 隔离;memory dotfile 防撞;同 name 多 task 共享
Eval Suite 不做 个人工具 dogfooding
版本化 prompt 直接 general_v1.md 真要切再做
run_python 沙盒 subprocess + env 过滤 Docker 在 §7 C 阶段
兼容层 开发期不写 DB schema / 字段 / API 改动直接切,见 CLAUDE.md
/v1/files/* 与 DB files API 作目录树唯一 mutation 入口,DB-FS 一致性服务端内化 rename / delete 顶层目录 DB-aware
单活 run task 同时最多 1 个活 run gate 在 post_message 同事务 SELECT FOR UPDATE
LLM 调用走 streaming chat_stream + stream_chunk_builder 拼回;chunk 间 + tool_call 间 poll cancel cancel 延迟 100ms 级;content delta 即时 emit
上下文压缩 加压力门槛,超阈值才压 护前缀缓存 + 不丢旧细节(§8.2 / 06-10)
停机判据 max_iterations 降为 backstop,靠进展信号掐空转 _RepeatGuard + run 级 _stall(06-10)

文件清单

core/capabilities.py        75   ← 模型档案增加 CNY/Mtok 计费兜底字段
core/llm.py                151   ← litellm 离线 cost map env + chat_stream(stream + include_usage)
core/loop.py               812   ← ReAct 主循环:_RepeatGuard/stall 熔断/热切编排(传输健壮性层已析出)
core/llm_transport.py      438   ← wire 层健壮性:畸形/吐空检测+留痕+非流式降级重试(07-23 自 loop 析出)
core/tool_registry.py      264   ← 声明式工具注册表((组名,gate,factory);secret/host 工具按实际能力 gate)
core/context.py             95   ← LLM 调用前压缩旧 tool / load_skill 消息(带压力门槛),保 tool_call 协议字段
core/external_systems/*.py       ← 外部系统目录/用户授权/凭据加密 + Factory OpenAPI connector
core/sinks.py              101
core/paths.py               50   ← task_dir db form 归一
core/probe.py              243
core/session.py            153   ← ORM
core/task.py                82   ← PG-backed TaskState
core/skills.py             180   ← 多来源 registry(SkillSource)+ source 标记 + 覆盖感知(user wins)+ load_errors + container_dir
core/memory.py              81   ← per-user `.memory/` dotfile
core/kb.py                 ~260  ← per-user `.kb/` 个人知识库(状态/视图/kb_block 注入)
core/kb_ingest.py          ~280  ← kb 入库管线(markitdown→OCR 兜底→flash 摘要→INDEX)
core/task_title.py         ~135  ← 快速新对话首条消息自动命名(一次性竞态闸 + 独立记账)
core/export_docx.py        383
core/storage/{engine,models,usage,telemetry,usage_report,utils}.py  ← 计费写/失败埋点/聚合读三分(07-23)
core/ark_client.py         105   ← 火山方舟 HTTP 客户端
core/asr_xfyun.py          170   ← 讯飞语音听写 IAT wss 客户端(整段 PCM→文本;web 语音输入用,diag: scripts/diag_asr.py)
core/asr_lfasr.py          250   ← 讯飞录音文件转写 LFASR 客户端(异步订单 + 说话人分离;transcribe_audio 工具底座,diag: scripts/diag_lfasr.py)
core/agent_builder.py      649   ← 装配 lib:build_agent/system prompt(工具注册块已迁 tool_registry)
core/executor.py / sandbox/{network,pool}.py / executor_docker.py  ← Executor ABC + Docker per-user 容器池
tools/{base,output,fs,shell,run_python,skill_tool,skill_authoring,media_common,seedream,seedance,gpt_image,look_at_image,read_document,image_ref,web_search,web_fetch,documents,materials_project,transcribe_audio,office_to_pdf,external_systems}.py  ← media_common=媒体五工具共享原语;external_systems=host-side 外部系统元工具
main.py                    ~210  ← 入口:web / db / probe / user / sandbox check
db/migrations/versions/    0001-0026
web/app.py                 ~210  ← 工厂 + lifespan 编排(07-23 拆分;路由在 routers/,协程在 background 等)
web/routers/*.py           12 个 ← 含 external_systems 用户连接管理路由
web/{background,scheduler_runner,wechat_runner}.py ← lifespan 后台协程按域析出
web/{runs,common,schemas,model_gate,userfiles}.py  ← BG worker/共享 helper/请求体/档位门控/路径安全
web/auth.py                ~190  ← 邮箱密码 + platform_key → JWT
web/broker.py / sinks.py / pptx_render.py / admin.py
web/static/dev.html + ui.css + js/*.js ← dev SPA 零构建ui.css=轻量视觉基础层main.js=入口
web/static/vendor/        ~1 MB  ← jszip / docx-preview / xlsx
tests/                     360 项 ← golden/rendering 基线 + 路由两套(nodb/db)+ DB 套件(ZCBOT_TEST_DB_URL 门控)
─────────────────────────────────
Python 合计              ~5.5 万行(core+web+tools+rendering+tests+scripts;+ dev SPA + vendor 1MB)

下一步候选(性价比排序)

  1. CORS 收紧(~半小时,已接入真实用户应尽快做)—— allow_origins* 改读 env 域名 allowlist;与 OIDC 解耦。
    • 真 OIDC(~1 天,选做)—— /v1/auth/login 内部换 ID token 校验(路由层 Depends 不动);邮箱密码长期保留并存。platform_key 信任模型可接受则可延后,真要弃 PLATFORM_KEY 共享密钥时再做(延后无技术债)。
  2. §7 C Executor + sandbox 收尾(~3-5 天,按 §7.5 落地清单)—— 剩 Step 4 完整 egress proxy + Step 3b PGID kill 协议 + xfs project quota OS 层硬化。Stage C DoD = 6 条落地清单全完成 + 红队回归通过(metadata IP / PG IP block、残留进程清理、跨 user 网络隔离、egress allowlist)。多用户在线跑代码 hard prereq
  3. Phase 6 context 第二步 task summary(~1 天)—— 旧消息压成一条 summary(区分硬约束/计划/文件路径/关键事实),不直接塞回旧 tool 原文。

§7 B + D + D' + 单活 run 锁 + cancel + 0004 schema 瘦身 + 入口归位 + Stage C 主体已完工。剩余:真 OIDC → C 收尾 → F(deploy/billing)。§7 E CLI 双模式撤;Phase G Jinja2/HTMX 撤(详见 DESIGN §7.9)。