feat: prepare ARR for controlled public deployment
This commit is contained in:
144
database/APPLIED_MIGRATIONS.md
Normal file
144
database/APPLIED_MIGRATIONS.md
Normal file
@@ -0,0 +1,144 @@
|
||||
# ARR 测试数据库已执行记录
|
||||
|
||||
更新时间:2026-07-29
|
||||
状态:ARR 数据落库 MVP v1、OSS 取件授权与 MCP 直接结构化结果提交基础已迁移到远程测试库并验收。
|
||||
|
||||
## 目标与隔离
|
||||
|
||||
- PostgreSQL:`<ARR_DB_HOST>:5432`
|
||||
- 数据库:`booking_test`
|
||||
- 当前测试用户:`<TEST_DB_OWNER>`(数据库 owner、非超级用户;尚非生产最小权限账号)
|
||||
- schema:`ingestion`、`booking`、`finance`
|
||||
- `public` 用户对象:0
|
||||
- 共享维护数据库 `postgres`:未修改
|
||||
- 当前配置:`/path/to/private/booking-test-db.env`,权限 `0600`
|
||||
- 旧 LAN 源库:`<LEGACY_DB_HOST>:5433/booking_test`,只读保留作临时回退
|
||||
- 旧 LAN 配置:`/path/to/private/booking-test-lan-db.env`,权限 `0600`
|
||||
|
||||
应用和后续专项默认使用远程配置;只有明确执行回退核查时才使用 LAN 配置。本文不记录密码。
|
||||
|
||||
## 当前权威迁移
|
||||
|
||||
| 迁移 | SHA-256 | 状态 |
|
||||
|---|---|---|
|
||||
| `008_arr_mvp_v1_rebuild.sql` | `a29df928a2bcfca262216a9d53260528374b830266b3285f3687199cb802a530` | 已提交并验收 |
|
||||
| `009_source_read_grants.sql` | `69c1dcea29b5148f4bf4aab4bd7e606109547849f6722d59bffd1ac756ecd8f8` | 已提交并验收 |
|
||||
| `010_mcp_result_ingestion.sql` | `480a9d1c039d1b45aaa86e90470ef3f7057972be056731f0513a372588bffcf1` | 已提交并验收 |
|
||||
|
||||
`008` 在 `booking_test` 内仅重建 `ingestion`、`booking`、`finance` 三个 schema。它取代 001–007 所形成的旧 schema 状态;001–007 文件只保留为历史记录,不得再对当前库补跑。
|
||||
|
||||
执行门禁:
|
||||
|
||||
- `current_database()` 必须为 `booking_test`;
|
||||
- 执行前核对旧库表计数和备份 manifest;
|
||||
- 整个重建在一个事务内完成;
|
||||
- 不触碰 `public` 或其他数据库。
|
||||
|
||||
当前对象:17 张基础表(`ingestion=8`、`booking=5`、`finance=4`)、8 个视图、2 个约束触发器,未验证约束为 0。
|
||||
|
||||
## 009/010 增量迁移
|
||||
|
||||
`009` 新增 `ingestion.source_read_grants`,用于受控运行时的短时、单次源 XML 取件授权。表内不保存 OSS 密钥、URL 或 XML 内容。
|
||||
|
||||
`010` 按当前数据量收敛为单一 MCP 工具 `arr_submit_processing_result` 的入库账本:
|
||||
|
||||
- 新增 `ingestion.result_submission_grants` 和 `ingestion.result_submissions`;
|
||||
- 不创建 batch 表,也不保存明文 grant、数据库密码或 OSS 密钥;
|
||||
- 单次 structured payload 上限为 3 MiB,必须显式包含与 `record_count` 一致的 `records` 数组;
|
||||
- grant 最长 30 分钟,只能在有效期内消费,且绑定唯一 processing attempt;
|
||||
- `payload_sha256` 索引故意不唯一,允许同一份 XML 在不同 run/attempt 下反复联调;
|
||||
- 同一 attempt 仍由唯一 grant/submission 约束幂等,最终 Finance 事实继续使用现有版本身份去重;
|
||||
- 终态必须清除可能含住客字段的临时 `payload_json`,只保留哈希、计数、状态和最小回执;
|
||||
- `processing_runs` 与 `daily_versions` 新增 `result_delivery_mode`,旧行全部默认为 `artifact_callback`,新链路显式使用 `direct_mcp`。
|
||||
|
||||
`010` 正式提交前已完成未提交事务探针、已提交 up/down 演练和独立恢复验证。正式提交后两张新表均为空,旧表计数不变,batch 表不存在,所有约束均已验证。
|
||||
|
||||
`010_mcp_result_ingestion.down.sql` SHA-256:`ec937b7c046eaaaccc1e95466ef3e9367cab622cddceaecbab0e9570bbbc5c79`。回滚脚本只允许在新表无任何记录且无 `direct_mcp` 业务数据时使用。
|
||||
|
||||
## 远程完整迁移
|
||||
|
||||
2026-07-28 已把完整 MVP v1 结构、数据、identity sequence 状态和处理审计从旧 LAN 测试库迁移到当前远程测试库。
|
||||
|
||||
- 执行记录:`database/REMOTE_MIGRATION_20260728.md`
|
||||
- 迁移前备份:`<PRIVATE_BACKUP_ROOT>/booking_test_pre_remote_migration_20260728T180747+0800`
|
||||
- manifest SHA-256:`db8ca84fed52123d10151b475aca31659be237c6e7d513484e4f25b1d9a89c4d`
|
||||
- 双端结构 signature:`0d64002b919d439dbbbbf78d1f5c5fab86d8f815f80dc6225f17a91ab5455e38`
|
||||
- 双端 14 表内容 hash bundle:`42faf898d67b3015e85baf00bbd66a1fa4448d80daa7f5d9d0207a4004fad35c`
|
||||
- 迁移方式:完整事务回滚演练通过后正式提交;提交后再由独立只读连接复验
|
||||
- 源库:未修改、未删除,观察期内保留
|
||||
|
||||
## 重建前备份
|
||||
|
||||
- 目录:`<PRIVATE_BACKUP_ROOT>/booking_test_pre_mvp_v1_20260728T161638+0800`
|
||||
- manifest SHA-256:`af0e7bec364ccbfe342bbb20ea5e3d44a31ba8fe22134b91a3f79d4bac3c1a7c`
|
||||
- 内容:旧 20 张基础表的 gzip JSON 数据,以及列、约束、索引、视图和 sequence 元数据
|
||||
- 完整性:逐文件 SHA-256 与 gzip 校验均通过
|
||||
|
||||
该备份可用于人工恢复旧测试基线;未执行恢复。
|
||||
|
||||
## 已导入预订样本
|
||||
|
||||
来源:`outputs/res_comment_20260727/RES_COMMENT_TYPE_OF_ROOM.md`
|
||||
|
||||
- 文件 SHA-256:`ec2302170c5657d3e465691997e17f7694eb5a7f76feba7e43261632209b8c23`
|
||||
- source batch:1
|
||||
- source rows:867
|
||||
- accepted parse versions:867
|
||||
- current row parses:867
|
||||
- room items:867
|
||||
- 不同 Group Code:348
|
||||
- 重复 Group Code:122
|
||||
- 工作表:6
|
||||
|
||||
867 条来源行逐行保存,没有按 Group Code 合并;每条都保留工作表、行号、原文、数量和行哈希。重复导入返回 `already_applied_and_verified`,没有新增重复记录。
|
||||
|
||||
当前 MD 是用于跑通流程的预期结果样本,每行已经给出一个可查询房型,因此当前每行对应一个 room item。未来真实预订 Excel 仍由 Agent 输出行级 JSON 和一个或多个 room items。
|
||||
|
||||
## 已导入 Finance 合成日报
|
||||
|
||||
受控 fixture:`outputs/database_fixtures/2026-07-27`
|
||||
|
||||
- DeliveryEnvelope SHA-256:`dc227c099b15c559874a3612dbda398494962b4200a8af15c973f7e84850a2`
|
||||
- 业务日期:`2026-07-27`
|
||||
- source records:3
|
||||
- outcomes:`retained=1`、`duplicate=1`、`excluded_rate_code=1`
|
||||
- current daily version:1
|
||||
- 正式 retained 事实:1
|
||||
- 月报投影:1 行
|
||||
- 渠道明细投影:1 行
|
||||
- 公司报表源投影:1 行
|
||||
- Group Code:`LT260720GAA`
|
||||
- Booking Room 查询结果:`DBL × 1`
|
||||
- `total_price`:5400,且 `1800 × 1 × 3 = 5400`
|
||||
|
||||
该 fixture 只含合成字段,不含真实住客数据。它通过真实日报处理器、ARR 独立复验和正式 PostgreSQL repository 落库。幂等复跑计数不变。
|
||||
|
||||
## 最终验收
|
||||
|
||||
只读数据库验收结果:
|
||||
|
||||
- `booking`:867/867/867/867 source/parse/current/item;
|
||||
- `finance`:1 daily version、1 current pointer、3 all-outcome records;
|
||||
- 业务视图中非 retained 泄漏:0;
|
||||
- 总价公式违规:0;
|
||||
- 旧 `file_objects`、`processing_jobs`、`report_versions` 等关系:0;
|
||||
- 未验证约束:0;
|
||||
- `public` 用户对象:0。
|
||||
|
||||
应用只读验收结果:
|
||||
|
||||
- 渠道 BI:1 个渠道、1 条预订;
|
||||
- 渠道明细:1 行;
|
||||
- 月报生成源:1 行;
|
||||
- QBD 公司报表源:1 行,Booking Room 为 `【DBL】1`;
|
||||
- Web 日报列表:1 条;
|
||||
- Web 月度数据源投影:1 条。
|
||||
|
||||
完整自动化测试共 194 项:192 项通过,2 项仅因默认环境未配置可选 XLSX 渲染工具而跳过。最终代码同步后又执行了 65 项相关回归并全部通过,其中 Web 新 schema 契约与 Web 回归为 14 项。
|
||||
|
||||
## 当前模型的重要含义
|
||||
|
||||
- PostgreSQL 保存已验收的工件身份、预订事实、全部日报 outcome、current 指针和渠道指标。
|
||||
- 月报行、渠道明细行、公司 10 日报表行由普通程序查询当前事实生成,不再重复存储 `report_versions` 或 report 行表。
|
||||
- 生成的 XLSX/JSON 可以保存在私有 OSS 或受控输出目录,但不是重复的数据库业务事实。
|
||||
- 后续变更必须新增迁移,不得编辑已执行的 `008`。
|
||||
Reference in New Issue
Block a user