Files
HomeAgent/scripts/e2e_prod_snapshot.sh
JianFeeeee b850feaef2 feat: 段页式记忆流转、coldcontext 重命名与安全治理
记忆层:
- MemoryBlock 承载 FrameTS/PageSeq/PageKind/BlockRole/CallID
- coldcontext 归档与回填按完整页传递,工具调用参数和配对键不丢失
- 召回先估算总 token,超预算时按全局页相似度标记 inactive
- inactive 仅是 context 渲染期状态,不落盘、不进入 coldcontext,Prune 后重置
- Peek/确认/Remove 两阶段召回,失败保留冷上下文副本
- stablemem 记录 last_recalled_at,删块连带清理边

命名:
- internal/memory/document → internal/memory/coldcontext
- Doc/DocEvent/DocHit → ColdDoc/ColdEvent/ColdHit
- ContextToColdContext/RecentColdContexts/FindColdContexts
- 保留既有 JSON 标签、doc_ 文件前缀与 doc_count 状态键,兼容存量数据

安全治理:
- 工具策略门禁、安全配置、事件总线发布者身份与入站脱敏
- 声明式 SecurityAPI 与 QQ owner/guest profile
- 日志保留策略与相关 e2e/回归判据

验证:go build ./...、go vet ./...、go test ./...(62 包);
生产副本 e2e:7013 块迁移后 ID/向量/指纹 0 变化、0 缺失。
2026-10-29 23:53:48 +08:00

82 lines
2.6 KiB
Bash
Executable File
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.

#!/usr/bin/env bash
# 段页式 e2e:从生产数据取隔离快照并跑判据。
#
# ## 为什么要取快照而不是直接跑生产库
#
# 判据会**写**(迁移补列、记录 last_recalled_at、删除块)。
# 直接对生产库跑等于把测试变成了数据损伤。
#
# ## 为什么用 sqlite3 .backup 而不是 cp
#
# 生产库在 WAL 模式下运行:graph.db 里只有已 checkpoint 的部分,
# 最近的写入还在 graph.db-wal 里。直接 cp 会拿到**缺尾部**的库
# (表现为「少了最近几十个块」或 integrity 失败)。
# .backup 走 SQLite 的备份 API,得到一致性快照。
#
# ## 用法
#
# ./scripts/e2e_prod_snapshot.sh # 取快照 + 跑判据
# ./scripts/e2e_prod_snapshot.sh --keep # 保留快照目录便于排查
#
# 快照落在 /tmp/_work/segpaging-e2e/(不污染仓库,也不进 $HOME)。
set -euo pipefail
REPO_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
DATA_DIR="${HOLOGRAM_DATA_DIR:-/home/hologramagent}"
WORK="${SEGPAGING_E2E_DIR:-/tmp/_work/segpaging-e2e}"
KEEP=0
[[ "${1:-}" == "--keep" ]] && KEEP=1
echo "==> 数据目录: $DATA_DIR"
echo "==> 快照目录: $WORK"
if [[ ! -f "$DATA_DIR/memory/graph.db" ]]; then
echo "!! 找不到 $DATA_DIR/memory/graph.db" >&2
exit 1
fi
rm -rf "$WORK"
mkdir -p "$WORK"
# ① L3:一致性快照(只读打开 + .backup,不碰 WAL)
echo "==> 备份 graph.db(WAL 安全)..."
sqlite3 "file:$DATA_DIR/memory/graph.db?mode=ro" ".backup '$WORK/graph-prod.db'"
# 校验:块数必须可读且非零
BLOCKS=$(sqlite3 "$WORK/graph-prod.db" "SELECT COUNT(*) FROM memory_blocks;")
echo " 块数 = $BLOCKS"
if [[ "$BLOCKS" -eq 0 ]]; then
echo "!! 快照里没有块,中止" >&2
exit 1
fi
INTEG=$(sqlite3 "$WORK/graph-prod.db" "PRAGMA integrity_check;")
echo " integrity = $INTEG"
[[ "$INTEG" == "ok" ]] || { echo "!! 快照完整性失败" >&2; exit 1; }
# ② L1:context.json
if [[ -f "$DATA_DIR/memory/context.json" ]]; then
cp "$DATA_DIR/memory/context.json" "$WORK/context-prod.json"
echo "==> context.json 已复制"
fi
# ③ L2:documents
if [[ -d "$DATA_DIR/memory/documents" ]]; then
cp -r "$DATA_DIR/memory/documents" "$WORK/documents-prod"
N=$(find "$WORK/documents-prod" -name '*.json' | wc -l)
echo "==> documents 已复制($N 篇)"
fi
echo
echo "==> 跑生产数据判据..."
cd "$REPO_DIR"
HA_PROD_DB="$WORK/graph-prod.db" \
HA_PROD_DOCS="$WORK/documents-prod" \
go test -count=1 ./internal/memory/ ./internal/memory/coldcontext/ -run 'TestProd'
echo
echo "==> 完成"
if [[ "$KEEP" -eq 0 ]]; then
echo " 快照保留在 $WORK(用 --keep 可抑制此提示;手动删除即可)"
fi