Files
memind/docs/103-local-drift-report-2026-06-26.md
john 9b4a25799f Add smart ACK provider for WeChat MP replies
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>
2026-06-26 15:19:03 +08:00

245 lines
6.3 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 103 与本地差异报告(2026-06-26
## 目的
这份报告用于回答三个问题:
1. `103` 当前运行代码与本地代码差异到底在哪里。
2. 哪些差异可以忽略,哪些必须回收到本地。
3. 后续如何把生产发布收口到“只能本地打包发布”。
本次对比没有直接污染本地主开发目录,而是先从 `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`
- `.env`
- `node_modules`
- `dist`
- 日志
- pid 文件
- `.mindops`
这样做的目的是:
- 保留真实源码结构
- 不把线上运行态垃圾带回本地
- 不覆盖本地主开发工作区
### 对比范围
优先比对高价值文件:
- 服务启动入口
- API 路由
- 用户与计费相关页面
- 类型定义
- 发布脚本
- 部署文档
## Memind 对账结果
### 生产独有
- `.release-manifest.txt`
这是正常的发布产物,不需要回收到源码仓库。
### 本地独有
- `docs/103-reconciliation-2026-06-26.md`
- `scripts/audit-103-state.sh`
- `scripts/g2-lb.Caddyfile.bak-20260616-204004`
- `scripts/g2-lb.Caddyfile.bak-20260619-162631`
- `server.mjs.bak-20260616-195243`
- `.gitignore`
这些内容里:
- 文档与审计脚本应保留在本地仓库
- 备份文件需要后续择机清理
### 重点文件比对
以下关键文件对比结果为一致:
- `server.mjs`
- `user-auth.mjs`
- `db.mjs`
- `schema.sql`
- `src/App.tsx`
- `src/api/client.ts`
- `src/components/MindSpaceView.tsx`
- `package.json`
- `rsync_to_server.sh`
- `scripts/release-prod.sh`
- `docs/release-deploy.md`
判断:
- `Memind` 当前无需做额外的线上热修回收
- 可以直接进入“只允许发布包上线”的治理阶段
## memind_adm 对账结果
### 生产独有
- `server/llm-provider-loader.mjs`
这说明当前线上仍保留一层 provider 加载包装逻辑,而本地已改成直接走共享实现。
这不是简单的“多一个文件”,它意味着本地与线上在启动装配方式上已经分叉。
### 本地独有
- `PRODUCTION_RELEASE_RULES.md`
- `scripts/.releaseignore-prod`
- `scripts/release-prod.sh`
- `server/plan-sync.mjs`
这里面:
- 发布规则与发布脚本属于这次治理新增,应保留
- `server/plan-sync.mjs` 是本地新增业务能力,需要确认是否就是想带到生产的新主线
### 双方都改了的重点文件
- `.env.example`
- `docs/DEPLOY.md`
- `package.json`
- `scripts/rsync_to_server.sh`
- `server/app.mjs`
- `server/bootstrap.mjs`
- `server/index.mjs`
- `src/admin/pages/BillingPage.tsx`
- `src/admin/pages/UserDetailPage.tsx`
- `src/admin/pages/UsersPage.tsx`
- `src/api/client.ts`
- `src/types.ts`
### 高价值差异解读
#### 1. 用户详情与空间额度
本地版本新增了:
- `GET /users/:userId`
- `spaceQuotaBytes`
- `spaceUsedBytes`
- `spaceReservedBytes`
- `spaceAvailableBytes`
同时前端用户详情页和用户列表页也接入了这些字段。
这组改动和“后台可调空间、前台可购买空间”的需求方向一致,应视为本地主线能力,而不是线上应保留的旧逻辑。
#### 2. 订阅计划同步
本地版本新增了计划同步服务与同步结果结构:
- `server/plan-sync.mjs`
- `PlanSyncResult`
- 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` 启动装配路径分叉
- 用户详情与空间字段相关接口分叉
- 订阅计划同步相关接口分叉
- 生产工作树仍然允许历史上留下的手改漂移存在
这些不一致会直接影响后续版本归属,必须在本地仓库中收口。
## 推荐收口顺序
1. 以本地 `test-memindadm` 为主线,明确保留“空间额度 + 用户详情 + 订阅同步”这组新能力。
2. 单独审查 `server/llm-provider-loader.mjs` 是否仍有线上必需逻辑。
3. 如果该文件只是在做兼容装配,则把必需逻辑回收进本地主线,再删除这层分叉。
4. 基于本地仓库走 `scripts/release-prod.sh` 做第一次正式发布。
5. 发布成功后,把 `103` 只保留为运行目标与审计对象,不再作为源码修改点。
## 最终原则
`103` 是运行事实来源,但不是源码主线。
后续必须坚持:
1. 本地仓库合并差异
2. 本地提交生成发布包
3. 生产只接收发布包
4. 不再直接 `rsync`
5. 不再在线改源码