--- title: Checkpoint 2026-09-29 22:00:06 UTC [0a3e2dc9c1] type: checkpoint permalink: main/projects/25464650-ed5d-440e-b362-190f2852d451/checkpoint-2026-09-29-22-00-06-utc-0a3e2dc9c1 stable_id: ef3be336-00c6-40d7-ae47-77e7994e5e93 scope: project memory_type: checkpoint project_id: 25464650-ed5d-440e-b362-190f2852d451 usage_profile_id: 0c9feb46-d06e-43cd-9ef0-c5813c84a998 status: active revision: 1 request_id: nixmsg-t03-checkpoint-20260930-l created_at: '2026-09-29T22:00:06.111132+00:00' updated_at: '2026-09-29T22:00:06.111132+00:00' tags: - t03 - ready-to-merge - line-L - feat/t03-store --- ## T0.3 完成(线 L) - **任务**:T0.3 internal/store(迁移、建表、写入队列接口) - **分支**:feat/t03-store - **工作树**:E:/code/NixMsg-wt/t03(toplevel 确认不是主工作区) - **基于**:origin/main @ 86dc10a - **提交**:33db3e7 feat: 实现 SQLite 迁移备份、完整表结构与简单写入队列 - **已推送**:origin/feat/t03-store(普通推送,未推 main、未强推) ### 关键实现 - 保留 0001=SELECT 1;新增 0002_schema.sql(DEVELOPMENT 7.7 全部业务表/索引,含 api_tokens、settings、session_*) - Migrate:有 pending 且打开前已有 nixmsg.db 时 VACUUM INTO data_dir/backup/pre-migrate-.db;失败返回错误 - Open:写连接 DSN+_txlock=immediate MaxOpenConns(1);读池去掉 _txlock;Queue 简单互斥一操作一事务 - serve 改为 store.Open,保留 /healthz 与 listen.addr ### 验证 - task check 通过(web build、embeddist build、golangci-lint 0 issues、go test 全绿) - 单测:空目录建表、重复启动不重迁、旧库遇新版本有备份、Queue 写入可读 ### 偏差(docs/DEVIATIONS.md 总控 L / T0.3) 1. 表在 0002 不改 0001 2. Queue 互斥一事务,合并留给 P2 3. 空库不备份;失败不自动还原 ### 未做 - 写入合并(P2) - 7.8 启动恢复逻辑(属后续消息/平台任务,本任务未做) - 未改 go.mod(无新依赖) ### 给下个会话 - 复用工作树 E:/code/NixMsg-wt/t03 与分支 feat/t03-store - 总控审核后 ff-merge;勿在 e:/code/NixMsg 主工作区改 - schema_migrations 由执行器维护,不在 0002 内