Files
HomeAgent/docs/zh/prod-migration-checklist.md
JianFeeeee 4963d70215 docs: 逐篇核实全部文档的完成状态 —— 修正 6 处与代码不符的自述
## 上一轮的遗漏

上次只补了"缺状态行",但**32 篇正文里的状态声明基本没动**。而那些声明
大多是 1~2 周前写的,代码早已推进。本轮逐篇对代码核实。

## 逐篇核实结果(方法:读当前代码,不看文档的历史描述)

### 1. memory-usability-plan:待执行 → 已实施

文档写「状态:**待执行**(2026-10-22)」。三条根因实测**全部已修**:

| 根因 | 实测 |
|---|---|
| R1 向量化输入是 jieba 词袋 | ✅ `coldcontext.go` 的 `denseFor` 明写「用事件正文(原文),不用 Summary(jieba 词袋)」 |
| R2 媒体块无语义 | ✅ 块 union 化,媒体即块自带描述 |
| R3 提示词无引导 | ✅ `tooldefs.go` 明写 `coldcontext_query` 把历史**插回时序**,并下沉到 kernel-memory skill |

### 2. entities-retirement-plan:执行中 → 方案已定、执行未完成

写「三表全退,执行中」,容易被读成"快完成了"。实测生产库:
`entities 1292 / relations 978 / sentences 66` 行**仍在用**。
迁移工具就绪,但生产未切换 —— 这个区别对判断风险很关键。

### 3. scene-memory-fix-plan:部分落地 → 7 步里 5 步完成

逐条核实:步骤 1/2/3/5/6 已完成(含 SDK 的 `ScenePolicy`、
`scene_emerge.go` 已区分 `peer:group_*` 与 `peer:user_*`);
步骤 4(清现网垃圾场景)与 7(收口验证)属现场操作,未复核。

### 4. prod-migration-checklist:⚠️ 最危险的一处

写「**状态**:HologramAgent 已停机(inactive + disabled)」——
那是一次性迁移(2026-10-04)当场的真实状态,**不是现在的**。
照着它读会以为服务停着。改为明确归档说明 + 指向现行 runbook。

### 5. abstention-criterion:「拒答尚未接入生产路径」已不成立

实测拒答已下沉到图库层(`RecallBlocksGuarded`),生产路径
`toolcall.go:1312` 与端到端探针**走同一条路**。保留了下沉的理由
(第一版放上层,探针绕过它 ⇒ 判据测不到被测路径)。
剩余两项(泛指词检测、n=10 样本偏小)仍开放。

### 6. toolcall-parallel-execution-plan:阶段 0.5 起为待办 → 全部已完成

实测阶段 0/0.2/0.5/1/2/2.5 与 3/4 全部完成,遗留项也已解决。

## 顺带修正两处写法

- `memory-restructure-plan.md`:顶部有「执行结果摘要」但正文各步骤仍写
  `✗ 未开始`(原始计划快照,有意保留)。加一句读法说明,
  避免读者拿正文的快照当现状。
- `future-plan.md` §六:新增 5 条实测确认的待办并去掉 2 条重复项
  (遗留表退役、中断子系统原先各出现两次)。

## 核对

- docs/zh 32 篇全部有状态行,且与代码实测一致
- 代码块全部配平;文档间相对链接全部有效
- go build 通过(纯文档改动)
2026-10-31 08:20:47 +08:00

158 lines
5.3 KiB
Markdown
Raw 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.

# 生产迁移执行清单
**日期**:2026-10-04
**分支**:`feat/context-overflow-l4`(未 push)
**状态**:⚠️ **归档(2026-10-04 的一次性操作清单)**
> 本文记录的是那次停机迁移的**执行现场**。其中「已停机」是当时的真实状态,
> **不是现在的状态** —— 现在就别照着这份清单判断服务是否在跑。
>
> 现行部署操作见 [`deploy-runbook.md`](./deploy-runbook.md);
> 服务当前状态用 `systemctl status hologramagent` 查。
---
## 0. 前置条件(必须全部满足)
| 项 | 要求 | 实测 |
|---|---|---|
| 服务停机 | `homeagent.service` inactive | ✅ inactive + disabled |
| WAL 已 checkpoint | `PRAGMA wal_checkpoint(TRUNCATE)` 返回 0\|0\|0 | ⬜ 执行前重查 |
| 快照已存在 | 一致副本(非 `cp`,用 `.backup`) | ✅ `/var/tmp/ha-prod-migrate/before.db` |
| 快照基线 | 1294/980/66/98/97 | ✅ 已核对 |
| 副本验证 | 结构 7 项 + 召回 7/9 | ✅ 已通过 |
| 代码提交 | 43 包全绿 | ✅ |
| 磁盘空间 | 迁移后约 18MB(副本实测) | ⬜ 执行前确认 |
★ **副本用的就是生产快照**,所以"在副本验证"等价于"在生产数据形态上验证"。
---
## 1. 执行步骤
```bash
# ① 停机确认(已停,此处防呆)
systemctl is-active homeagent.service # 期望: inactive
systemctl is-enabled homeagent.service # 期望: disabled
# ② WAL checkpoint
sqlite3 ${HA_DATA}/memory/graph.db "PRAGMA wal_checkpoint(TRUNCATE)"
# 期望输出: 0|0|0
# ③ 生成新快照(.backup,不是 cp)
TS=$(date +%Y%m%d-%H%M%S)
sqlite3 ${HA_DATA}/memory/graph.db ".backup '/var/tmp/ha-prod-migrate/prod-$TS.db'"
# 核对副本基线与源库一致
sqlite3 /var/tmp/ha-prod-migrate/prod-$TS.db \
"SELECT COUNT(*) FROM entities; SELECT COUNT(*) FROM relations; SELECT COUNT(*) FROM sentences;"
# ④ 先报告(不写库)
go run -tags onnxruntime ./cmd/homed-graph-migrate \
-db ${HA_DATA}/memory/graph.db \
-embed-provider chineseclip \
-model-dir /var/tmp/ha-c/models/chinese-clip-vit-b16-onnx
# ★ 核对:实体 1294,关系 966,块 98,块边 97
# ★ 若数字对不上 → 停止,不要 -apply
# ⑤ 执行迁移(约 200s)
go run -tags onnxruntime ./cmd/homed-graph-migrate \
-db ${HA_DATA}/memory/graph.db -apply \
-embed-provider chineseclip \
-model-dir /var/tmp/ha-c/models/chinese-clip-vit-b16-onnx
# ⑥ 验证
bash scripts/verify-migration.sh ${HA_DATA}/memory/graph.db
# 期望:✅ 结构验证全部通过
# ⑦ 召回探针
PROD_SNAPSHOT=${HA_DATA}/memory/graph.db \
go test -count=1 -tags onnxruntime ./internal/memory/ \
-run 'TestProbe_生产规模召回' -v
# 期望:casual 3/4, confusable 1/1, abstention 3/3, 合计 7/9
```
★ 全程**串行**。迁移涉及 1294 个块的 embedding,
并行会导致资源争用与长时间卡死(此前实测过 600 秒卡死)。
★ **旧表不删**。迁移只写块与边,`entities/relations/sentences`
保持原样(验证脚本第 1 项逐表核对)。
---
## 2. 期望产出(副本实测值)
```
句子 +66,块 +1294,边 +980,scene_refs +718
块 2752(带向量 1391),边 2371
悬空端点 0
向量维度唯一 512,fingerprint 唯一
confidence 为 0 的关系边 0 条
deleted 状态关系边 14 条(对应旧表 14 条)
中心向量已重建(各向异性 detected,双边中心化启用)
耗时约 200s
```
---
## 3. 回滚
### 回滚条件
迁移后出现以下任一情况 ⇒ 立即回滚:
- 验证脚本报 `❌`
- 召回探针合计低于 4/9(迁移前基线)
- 启动后 `memory_recall` 报「检索失败」
- 健康检查异常
### 回滚方式
★ **旧表未被改动**,所以回滚很简单:
```bash
# ① 恢复代码到迁移前的提交
git checkout 75d4609 # 或 d4eda47 / 2fe4ca7 等任一已验证提交
# ② 恢复数据库(若需要)
TS=<迁移时的快照时间戳>
cp /var/tmp/ha-prod-migrate/prod-$TS.db ${HA_DATA}/memory/graph.db
# ★ 生产库必须用 .backup 恢复,不要直接 cp 源库
# ③ 重建二进制并重启(需你确认后才启服务)
go build -tags onnxruntime -o build/homed ./cmd/homed
systemctl enable homeagent.service && systemctl start homeagent.service
```
### 回滚安全性
| 保证 | 依据 |
|---|---|
| 旧表数据完好 | 迁移只 INSERT 块/边,验证脚本第 1 项核对 |
| 迁移单事务 | 任一步失败整体回滚 |
| 迁移自动快照 | 命令自身会生成 `.bak-<时间戳>` |
| 代码可回退 | 全部改动已提交,未 push |
---
## 4. 迁移后仍存在的问题(不阻塞迁移,但要记录)
| 问题 | 状态 | 补法 |
|---|---|---|
| `coexist` 泛指提问召不回端口号 | 0/1 | BFS 接入 `RecallBlocksFused` |
| 纯中文编造查询不拒答 | 契约外 | 需符号切分改进或换判定信号 |
| 旧表仍在增长 | 待停双写 | 读方已全切,可摘 `commit()` 里的 INSERT |
| `TestResidualKeepReturnsTasksToParent` | 既有 flake | 单独复验,勿误判 |
---
## 5. 与旧快照的关系
```
/var/tmp/ha-prod-migrate/before.db 本轮开始时的生产基线(1294/980/66/98/97)
/var/tmp/ha-prod-migrate/probe.db 副本,已完整迁移并验证
/var/tmp/ha-prod-migrate/base-copy.db 迁移前基线探针用
```
★ `before.db` 与 `probe.db` 是**同一份数据的迁移前后对照**,
两者都在,可随时重跑任何验证。