9b4a25799f
Replace fixed ackText with a rule-based AckProvider that picks response templates by message type and intent (translate, summary, rewrite, poster, ppt, mindmap, code, search, schedule). Pure sync, zero I/O, auto-falls back to config.ackText on any error. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
6.3 KiB
6.3 KiB
103 与本地差异报告(2026-06-26)
目的
这份报告用于回答三个问题:
103当前运行代码与本地代码差异到底在哪里。- 哪些差异可以忽略,哪些必须回收到本地。
- 后续如何把生产发布收口到“只能本地打包发布”。
本次对比没有直接污染本地主开发目录,而是先从 103 拉出只读基线副本:
/Users/john/PycharmProjects/test/_103_baselines/Memind/Users/john/PycharmProjects/test/_103_baselines/memind_adm
总结结论
Memind
test-memind 当前代码内容与 103 拉下来的只读基线已经非常接近,重点业务文件基本一致。
可见差异主要是:
- 生产侧多了
.release-manifest.txt - 本地多了一些文档、审计脚本和历史备份文件
结论:
Memind不存在明显的“线上独有核心逻辑未回收”问题- 后续只需要继续坚持发布包流程,不应再直接改
103
memind_adm
test-memindadm 与 103 基线仍然存在一批结构性差异,暂时不能直接把“线上就是最新”或“本地可以无脑全量覆盖”当成事实。
这些差异集中在:
- 用户详情与空间额度字段
- 订阅计划同步接口
- LLM provider 加载方式
- 启动注入与路由装配
结论:
memind_adm需要一次明确的差异回收- 但回收动作应该发生在本地代码库中
- 生产只能作为对账依据,不能继续反向当开发主线
本次对比方法
只读基线
从 103 通过 SSH 22 拉取只读副本,并排除运行态内容:
.git.envnode_modulesdist- 日志
- pid 文件
.mindops
这样做的目的是:
- 保留真实源码结构
- 不把线上运行态垃圾带回本地
- 不覆盖本地主开发工作区
对比范围
优先比对高价值文件:
- 服务启动入口
- API 路由
- 用户与计费相关页面
- 类型定义
- 发布脚本
- 部署文档
Memind 对账结果
生产独有
.release-manifest.txt
这是正常的发布产物,不需要回收到源码仓库。
本地独有
docs/103-reconciliation-2026-06-26.mdscripts/audit-103-state.shscripts/g2-lb.Caddyfile.bak-20260616-204004scripts/g2-lb.Caddyfile.bak-20260619-162631server.mjs.bak-20260616-195243.gitignore
这些内容里:
- 文档与审计脚本应保留在本地仓库
- 备份文件需要后续择机清理
重点文件比对
以下关键文件对比结果为一致:
server.mjsuser-auth.mjsdb.mjsschema.sqlsrc/App.tsxsrc/api/client.tssrc/components/MindSpaceView.tsxpackage.jsonrsync_to_server.shscripts/release-prod.shdocs/release-deploy.md
判断:
Memind当前无需做额外的线上热修回收- 可以直接进入“只允许发布包上线”的治理阶段
memind_adm 对账结果
生产独有
server/llm-provider-loader.mjs
这说明当前线上仍保留一层 provider 加载包装逻辑,而本地已改成直接走共享实现。
这不是简单的“多一个文件”,它意味着本地与线上在启动装配方式上已经分叉。
本地独有
PRODUCTION_RELEASE_RULES.mdscripts/.releaseignore-prodscripts/release-prod.shserver/plan-sync.mjs
这里面:
- 发布规则与发布脚本属于这次治理新增,应保留
server/plan-sync.mjs是本地新增业务能力,需要确认是否就是想带到生产的新主线
双方都改了的重点文件
.env.exampledocs/DEPLOY.mdpackage.jsonscripts/rsync_to_server.shserver/app.mjsserver/bootstrap.mjsserver/index.mjssrc/admin/pages/BillingPage.tsxsrc/admin/pages/UserDetailPage.tsxsrc/admin/pages/UsersPage.tsxsrc/api/client.tssrc/types.ts
高价值差异解读
1. 用户详情与空间额度
本地版本新增了:
GET /users/:userIdspaceQuotaBytesspaceUsedBytesspaceReservedBytesspaceAvailableBytes
同时前端用户详情页和用户列表页也接入了这些字段。
这组改动和“后台可调空间、前台可购买空间”的需求方向一致,应视为本地主线能力,而不是线上应保留的旧逻辑。
2. 订阅计划同步
本地版本新增了计划同步服务与同步结果结构:
server/plan-sync.mjsPlanSyncResult- Billing 页面同步结果展示
这组改动属于本地主线增强能力,线上基线暂未完整具备。
3. LLM provider 装配方式
线上基线:
server/bootstrap.mjs通过./llm-provider-loader.mjs加载
本地版本:
- 直接从共享实现创建
createLlmProviderService
这是当前最需要审慎处理的一组差异,因为它影响服务启动边界,而不是单纯 UI 逻辑。
4. 启动与监听方式
本地 server/index.mjs 增加了:
createPlanSyncService- 显式绑定
127.0.0.1
这类差异需要和 103 现有反向代理、双 Goose、启动脚本一起确认,但不需要为了本地开发去复制生产双负载拓扑。
风险判断
可以接受的不一致
- 生产 Goose 是双实例负载,本地不是
- 生产目录里有发布清单和运行态资产,本地没有
- 本地为了开发保留文档、审计脚本和发布脚本
这些不一致属于“环境差异”,不是“源码真相冲突”。
必须收口的不一致
memind_adm启动装配路径分叉- 用户详情与空间字段相关接口分叉
- 订阅计划同步相关接口分叉
- 生产工作树仍然允许历史上留下的手改漂移存在
这些不一致会直接影响后续版本归属,必须在本地仓库中收口。
推荐收口顺序
- 以本地
test-memindadm为主线,明确保留“空间额度 + 用户详情 + 订阅同步”这组新能力。 - 单独审查
server/llm-provider-loader.mjs是否仍有线上必需逻辑。 - 如果该文件只是在做兼容装配,则把必需逻辑回收进本地主线,再删除这层分叉。
- 基于本地仓库走
scripts/release-prod.sh做第一次正式发布。 - 发布成功后,把
103只保留为运行目标与审计对象,不再作为源码修改点。
最终原则
103 是运行事实来源,但不是源码主线。
后续必须坚持:
- 本地仓库合并差异
- 本地提交生成发布包
- 生产只接收发布包
- 不再直接
rsync - 不再在线改源码