最近这48小时,一共169条提交。
密集,但不乱。主线非常清晰:工具调用正在从"可用"走向"可控"。
一、工具人工审批:从风险识别到单次授权
这是本轮最重的一条线。工具调用被分为直接放行、审计放行和人工审批三类,未登记的工具默认走最严格的路径------宁可多审一次,也不跳过。
完整链路是:风险识别 → 暂停执行 → 用户审批 → 单次授权 → 撤销授权。审批请求持久化到数据库,带组织隔离、状态和过期时间。审批决定以数据库记录为准,不再相信任何来自用户的绕过字段。跨组织查询统一返回403,避免审批ID泄露。
前端同步上线了审批卡片、批准/拒绝按钮和状态存储。系统侧的"执行审批需求"和真正需要人工审批的场景也被拆开处理,不再混为一谈。
危险工具的调用,不再是一个模型可以自行决定的事。

二、Scope Set:从数组上限到内容hash引用
这是权限模型的一次根本改造。
之前权限集合以JSON数组内嵌在委派记录中,随着权限数量增长,不断触碰数组长度上限。这一轮完成了P1建模、P2a历史数据回填和P2b主读切换三个阶段。
新方案新增了独立的权限集合存储表,按组织ID加内容hash存储规范化权限集合。读取时严格校验64位hash、内容排序去重、条目数一致、token格式合法,并有按字节计费、线程安全的LRU缓存,缓存键包含组织ID防止跨租户污染。
旧JSON格式暂时保留双写和影子比对,但不允许作为错误回退通道。修复了RLS环境下写入时组织上下文缺失的问题,以及任务身份audiences和数据库scope上限扩容,重复scope不再重复占用配额。
从不断提高数组长度上限,转向按内容hash引用的根治方案。

三、长任务与大结果可靠性:围栏不该让正文倒退
长任务和大结果处理的可靠性在这轮做了系统性加固。
长任务每达到时间和正文长度阈值后保存部分结果,滚动或Pod异常中断时不再丢失几十分钟的产出。最终结果使用更高版本覆盖部分结果,防止用户一直看到半成品。
围栏拦截时保留已生成的正文------之前围栏失败会导致已经显示的内容被清除或回退。大结果支持落盘、补丁引用和完整回读,并发写入、工作区快照、补丁冲突和超时回收竞态一并修复,大数据场景的工作区累计容量和脚本参数上限同步提高。
围栏可以拦住后续操作,但不能让用户已经看到的东西消失。

四、OpenAPI与OBO身份链路:任务能提交,也能查询和取消
之前OpenAPI任务提交后,查询、事件订阅和取消接口全部返回500。根因是组织上下文在多处缺失。
本轮修复了任务查询、SSE和取消操作的数据库组织上下文设置,确保SSE整个生成器生命周期保留上下文。OBO(代表执行)体系同步建立:外部凭据受控绑定代表主体,任务同时携带调用主体和被代表主体,变更保留完整审计链路。工具执行过程中主体信息向下传播的问题也一并修复。
新增自动测试防止新增路由再次漏设组织上下文。同时修复了SSE迭代期间组织上下文丢失的问题,以及任务身份audiences上限不足导致的展开失败。
任务能提交只是起点,能查询、能订阅、能取消、能审计,才是完整链路。

五、访客租户清理与安全加固
访客租户清理改用独立连接,不再受普通业务连接最小权限限制而卡死。同时暂停风险较高的物理级联删除,只保留可恢复的软退役。清理失败不再统一谎报"卡在外键依赖",修复了统计信息被错误冲成负值的问题。
RLS初始化、Scope Set写入的组织上下文、审计记录与物理删除之间的设计冲突也做了处理。
钉钉机器人现在可以直接发送会话中上传的原始图片,不压缩、不重新编码,同时限制图片格式、大小、上传人和所属企业,增加安全控制。

六、可观测性与运维
日志侧:Python异常堆栈不再被拆成大量碎片日志,配置更新能够真正触发进程滚动重启,定时任务统一转上海时区,创建会话失败时前端展示后端真实错误。
工具额度预警也在本轮上线:调用额度即将耗尽时提前通知模型,模型可以在真正触顶前整理结果、减少继续调用,避免任务因额度突然耗尽而无结果结束。

169条提交,主线只有一条:让系统里每一个"能做"的事,都变得"可控、可追踪、可恢复"。
这,是第八十一天。
**《从0到1:企业级AI项目迭代日记》**记录一个企业级 AI 项目从创意、架构到落地的真实过程。不讲神话,只记录进化。
如果你也在做企业 AI 落地,欢迎留言来聊。或者,把这篇转发给一个正在踩同样坑的朋友。