这段时间的提交记录翻完,发现一个规律:大部分 bug 不是因为代码写错了,是因为代码背后的假设变了。
单租户时,“用户只会碰自己的东西”是成立的。多租户时,同一句话变成了漏洞。不是代码变了,是运行环境变了,假设不成立了。
一、技能系统的边界:你以为隔离了,其实没有
技能系统上线有一阵了,用户开始往里存东西。直到有人跨租户看到了别人的技能,才发现隔离只在数据库层面做了,运行时的查询和展示没有真正拦住。
这次把技能按租户命名空间隔离落盘、读取、展示、注入,修复了跨租户技能泄漏、跨租户启用/删除、IDOR、路径穿越删除等一系列问题。同时加了写入前的安全扫描和名称白名单,修复了技能 GC 误删、并发双跑、手动技能被误回收的问题。
“用户只会访问自己的数据”这个假设,在多租户场景里是需要被代码明确保证的,不是默认成立的。

二、改了配置,不用再重启了
之前系统里有一个默认习惯:改了技能配置,要重启才能生效。这在单机时代不是问题,但在分布式生产环境里,重启意味着服务中断。
这次做了跨进程广播机制:技能变更之后,orchestrator 和 worker 进程能实时感知,不需要重启。技能沉淀、市场安装、GC 因为写到错误目录导致重启丢失的问题也一并修了。技能注入加了字符预算截断,防止 prompt 无限膨胀吃掉上下文。
“改配置需要重启”是单机时代留下的运维习惯,到了分布式环境,代价不可接受。

三、系统去找用户,不是用户来找系统
之前用户要调用系统能力,路径是:打开网页 → 找到功能入口 → 使用。这中间的每一步都会让使用频率自然衰减。
这轮补齐了两个触达通道:Electron 桌面客户端和浏览器插件,支持 Chrome、Edge、Firefox,macOS dmg 打包也补上了。
同时还做了一个更本质的改动:对话内自助接入能力。用户在聊天里就能触发企业系统探索和工具接入,不需要切到后台管理界面去配置。想用某个能力,直接跟 Agent 说,它在对话里完成发现、测试、审批、挂载一整条链路。
降低触达成本,比优化功能本身更值得投入。

四、生产环境打破了最后一批假设
飞书和钉钉的登录回调,在开发环境一切正常,上生产直接返回 500。原因是网络策略不同,代理配置在开发环境有效,生产环境的网络隔离让请求直接挂掉。修法是把代理调用改成直连。
类似的还有迁移脚本编号冲突——多个人并行开发时写出了相同编号的迁移文件,发版时直接失败。这次做了编号线性化,避免并行踩踏。
以及物流抓取链路——UPS、CTII、AAA Cooper 这些海外物流商,开发环境能通,生产环境因为网络策略不同全部超时,补了代理适配才跑通。
开发环境验证的,只是开发环境的假设。生产环境有自己的脾气,只有上线之后才会告诉你。

把这段时间的修复列在一起看:
| 用户只访问自己的数据 | 多租户越权 |
| 改配置可以随时重启 | 分布式生产进程 |
| 用户会主动来找系统 | 使用频率自然衰减 |
| 网络环境跟开发一样 | 生产登录失败 |
| 多人不会写出相同编号 | 并行发版踩踏 |
这批改动没有一个是新功能。但改完之后,之前做的功能才算真正能用了。
这,是第四十九天。
《从0到1:企业级AI项目迭代日记》记录一个企业级 AI 项目从创意、架构到落地的真实过程。不讲神话,只记录进化。
如果你也在做企业 AI 落地,欢迎留言来聊。或者,把这篇转发给一个正在踩同样坑的朋友。

![[特殊字符]DeepSeek‑Harness(DSH)小白保姆教程-171主机测评](https://www.171host.com/wp-content/uploads/2026/08/20260816085112-6a817a009aabf-220x150.png)
