数据库与迁移规范
Managed Schema 从单一 descriptor 和 Catalog 派生当前物理清单:411 张受管表、备份 payload 410 张、ACCESS EXCLUSIVE 锁目标 411 张。迁移 Journal 当前包含 85 个不可变 SQL(0000_full_system 至 0084_relationship_radar_category_indexes),不是业务完成度指标。
0077、0078、0079、0080、0081、0083 的历史 SQL 保持原始字节不变;其中文用途由 apps/api/drizzle/meta/migration-documentation.json 旁注按迁移执行器相同的 LF 规范化规则绑定固定 SHA-256。旁注缺失、摘要变化或范围扩充均使门禁失败,新增迁移仍必须以中文文件用途头开头。字典编码迁移与人物别名历史进入完整备份和恢复锁集合,不得遗漏。
migration_ledger 进入 managed/锁定/指纹合同,payload 固定为空,恢复 preserve;auth_session payload 固定为空;backup_manifest 不递归进入 payload 且 preserve。Record Kernel 继续使用 record_core、record_revision、feature_execution;0010 只追加可空 revision module、memory_text_entry_v2、record_migration_operation 和 maintenance_state,不复制或切换业务数据。
Batch 004 的 0010 继续保持 Expand-only:只追加 record_revision.module_code 可空边界、memory_text_entry_v2、record_migration_operation 与 maintenance_state,不执行旧业务数据 UPDATE/DELETE/COPY/DROP,也不切换 MEM-001 或运行主链。
普通数据库写入通过持久化维护状态与 shared transaction advisory lock 失败关闭;维护激活把数据库操作互斥锁、active 状态、exclusive 排空锁和 operation 的 PostgreSQL 排空证据放在同一外层事务,超时、台账冲突或证据失败都会整体回滚。Capture 长流程使用 session shared lease,避免在 Provider 或长计算期间持有长数据库事务。
Batch 005R 已实现 Catalog 固定的 24 模块/72 来源表映射、版本化 canonical JSON、七类 reconciliation、Planning/Frozen Preflight、只复制 legacy_only 的 Copy、响应丢失精确重放和新事务独立 Verify。Frozen/Copy/Verify 会在数据库事务内复核 running operation、maintenance owner 与 PostgreSQL drain proof,并按固定顺序取得来源/目标表锁;台账只保存计数和 SHA-256,不保存业务正文。
迁移阶段仍固定为 preflight → maintenance → copy → verify → cutover → runtime_acceptance → completed。文档生成器不执行数据库迁移、Copy、Verify 或恢复演练;这些状态必须读取同一轮独立运行报告,不能从源码存在或本机工具可用性推导。
0074_system_feedback 只 CREATE 新表、索引、trigger 和权限,不 UPDATE/COPY/DELETE/DROP 既有业务数据;这只说明迁移形态,不自动证明任意旧 API 与新 schema 业务兼容。
备份窗口分为 pre-cutover、migration-window 和 post-cutover。pre-cutover 在迁移 operation 尚未开始时,按 migration_ledger 最后一条 passed 记录绑定历史 schema generation;因此待迁移数据库可以安全导出当时实际存在的表,而不会伪造当前 Journal 最新清单。migration-window/post-cutover 仍必须绑定当前完整 schema、running/passed operation 与 active/inactive maintenance。
0000_full_system 至 0084_relationship_radar_category_indexes 后列合同状态为 已验证(Two independently initialized PostgreSQL 16.15 instances, migrations 0000-0084, measured 2026-09-30; docs/验证报告/2026-09-30-第四轮PostgreSQL与性能修复.md)。备份创建与恢复会核对目标 PostgreSQL 的实际列指纹,不匹配即失败关闭;记录的列数 5318 不能冒充真实物理合同。payload v4 记录 schema generation、managed-schema 版本、列/约束 fingerprint 和 migration_ledger 的源物理 schema fingerprint,后者由三者共同重算绑定。
恢复仍依赖目标数据库中的 backup_manifest、SHA-256、不可变迁移前缀和历史 ledger target fingerprint;post-cutover 还依赖源迁移 operation 已在目标数据库中保留为 passed/completed。运维事实表不从 payload 恢复,历史 pre-cutover 恢复只把迁移后新增表保持为空;0035 前快照保留当前授权控制面并只补入无角色禁用用户。
恢复在 v4 Manifest、owner、迁移台账与窗口校验后,在既有排他锁内预检已知不支持的内容:传入的字典编码迁移或人物别名历史,以及已审阅无条件删除守护保护的非空目标,均在首个 DML 前拒绝。只核对启用、行级、无 WHEN 条件的实际 public DELETE 触发器,不扩大条件守护。其他 typed 域尚未证明可完整重放,仍可能被原约束拒绝并整体回滚;本次不引入新备份格式、离线灾难恢复、证明导出或数据库切换。
备份文件创建拒绝根目录本身的链接;可信祖先链接允许解析,但其最终物理根身份必须保持不变。创建使用 0600 权限的独占 no-follow 句柄写入并同步、关闭后再登记 Manifest;读取和列表同时复核文件 inode、根目录身份与物理包含关系,不能只凭文件 inode 接受移出目录后的同一文件。列表在空目录、元数据读取和成功审计事务中复核配置根;审计期间已检测到漂移则共同回滚。失败清理只删除本轮仍处于原物理根和路径的文件,无法证明身份时保留现场。若根恰在底层 open 期间被替换,可能留下未写内容的空文件;发现后不得写入备份字节、登记 Manifest 或通过不可信路径盲删。可移植 Node 路径复核不是内核级目录事务;备份根目录及其祖先必须由可信进程管理,不能授予不可信主体并发重命名权限,本次不宣称已消除任意操作系统级命名空间竞态。
迁移执行与 API 启动
显式 pnpm db:migrate 是生产 apply 入口;PostgreSQL API 默认且生产只允许 DATABASE_MIGRATION_MODE=validate-exact。启动校验使用 shared advisory lock 与合作式迁移命令瞬时互斥,验证台账与源码同代及当前表/列/约束 fingerprint;0074 还精确核对其 trigger(含 WHEN 条件)、trigger function body、普通/partial index 的访问方法与有效状态和默认反馈权限种子,随后释放锁。它不在 API 生命周期持续持锁;其他历史迁移尚未声明同等级的非表对象合同,不能把本项扩写成所有历史普通索引、function、grant 均已覆盖。
当前没有 validate-compatible。两槽只有在同一数据库迁移代际时才能共享数据库;含迁移发布不得把旧代码目录当作可直接回滚点。逐版本前向兼容必须另有不可变兼容清单、真实双版本读写/worker 测试和人工审批。
真实 PostgreSQL Runner 按 Journal 顺序、LF 归一化 SHA-256、managed 清单和 advisory lock 失败关闭;迁移 SQL 与 passed 在同一事务提交,既有库 baseline 必须通过表、列和约束 fingerprint。解锁失败会销毁连接,禁止持锁 session 回池。pg-mem 不伪造 PostgreSQL lock、排空证明或恢复合同。
历史 descriptor 中的 PostgreSQL 16 列合同只证明当次物理测量,不替代本轮 system-feedback owner/trigger/lifecycle 集成测试或登录态浏览器验收;本轮 focused PG16 与 PC/H5 登录验收未执行时必须分别记为 not_run。
2026-10-25 0085 Interview共享守护的隔离实证
0085只替换既有interview_current_revision_guard_0068(),先按实际表类型分支再读字段,保留owner/module、稳定ID、revision精确+1与适用时间不可变;turn使用实际asked_at。旧0068、旧journal前缀与managed descriptor不改,不新增表/列或搬迁数据。旧正文“85条”是截至0084的历史快照。
真实PG17.11新red库8个合法DML因跨表字段42703失败;新green库全41/41通过,含正式HTTP激活及审计后异常的current/history/audit/idempotency共同回滚。独立READ ONLY测量5318列及fingerprint与既有合同一致,0085passed/content hash与源码一致;不把PG17测试冒称历史PG16测量重跑。
根随后仅对指定disposable browser库用正式runner应用0085,before/after记录只有该迁移applied、列合同、8条trigger绑定和合成actors保持。业务运行库未迁移;测试库函数快照不代替运行目标schema-only备份。正式应用必须由迁移执行器管理事务/锁/台账,失败先独立核对,不删passed台账或改历史迁移;已提交缺陷应追加前向修复,恢复旧有42703缺陷函数不能称恢复业务。
未知PATCH结果先current/history/audit/idempotency独立读回,不借迁移重复原请求或补写业务事实。0085证据不证明AI主链全部通过;AI Agent的0086和CAP003的0087仍在开发,本节不宣称它们已修复、已部署或已验收。
2026-10-25 续记:0086/0087与当前5327列合同
前节0086/0087“开发中”为旧时点。0086仅替换Agent共享current守护:真实PG17.11新green库25/25通过,独立只读5318列/fingerprint保持、台账passed/hash一致;旧0070/0085和相关trigger不改。独立对账证实attempt03失败Agent PATCH未提交ACTIVE2,来自current/history/audit/idempotency证据,不能由500推断回滚。无模型守护测试不等于AIA生成完成。
0087新增capture_share_source后,当前managed合同已由同一个native PostgreSQL17.11实例上的两个独立初始化空库按两种正式算法实测:412表、5327列、88迁移,列fingerprint为56aca7924fc2c105b464c9ec00f7f6e14dde6affe4af22b638183c89ec4907b6,两库一致;恢复后独立READ ONLY再测matches=true。不是两个实例,也不是PG16重验。原PG16.15历史descriptor/source与5318/f043合同完整保留;原PG16 suite、版本上界及测量算法未改。
根指定disposable browser库随后正式应用0086/0087,台账证明、5327列指纹及actors保持,sourceRows=0、旧来源未回填。业务运行库仍只到0000–0084;测试库应用不能冒称业务库已升级、备份已完成或部署成功。
2026-10-25 已批准的本地开发库应用事实
用户明确批准的范围仅本地开发库与API。正式runner于12:11:59 UTC只应用0085/0086/0087,anenreo_development台账88项passed/hash验证、5327列及56aca7924fc2c105b464c9ec00f7f6e14dde6affe4af22b638183c89ec4907b6匹配;既有行数与11条trigger绑定保持,新来源表0行,没有旧来源回填。前节“待审批/未应用”为旧时点,原文保留。
目标schema-only及原函数/trigger备份继续保留;这是DDL备份,不是全量数据备份或离线DR。API含本地storage修复的round5构建exit0并恢复到127.0.0.1:4000、validate-exact,所有worker关闭。根健康记录8个GET均200,且根另通过CUA在正式settings/ai实际读到3连接;后者只证明该页面读取,不等于Provider真实消费或70项业务验收。
Web正式/隔离、H5与MP round4均exit0,预览恢复,但不含随后Web Reminder补丁,下一次Web构建仍必需。审批没有扩展为远端部署、投递或worker授权;18个具名测试库尚未清理验证,原失败库保留。
2026-10-25 r7只读schema与运行核对
根runtime-approved-round7-readback为实际READ ONLY:开发库88ledger/hash、5327列及56aca7924fc2c105b464c9ec00f7f6e14dde6affe4af22b638183c89ec4907b6指纹不变,未重复迁移,validate-exact、workers=false,API health与Web200。正式API4000为r7 PID37972,Web3000为r7formal PID45740;本地开发库既有批准已执行85–87,不再pending。
根CUA另实际读取正式settings三连接,不由HTTP200推断,也不代表Provider真实可用。最新postgres-ai-real04-leases为23具名测试库,未清理验证,旧失败库保留;无新迁移、远端部署、通知投递或worker启用。所有70项fullAcceptance继续false。
2026-10-25 API r8只读合同与24库租约
正式API4000已切换API r8,PID29452;Web3000仍r7,PID45740,没有前端重构建。runtime-approved-round8-readback于15:17:25 UTC实际READ ONLY确认开发库88ledger/hash、5327列及56aca7924fc2c105b464c9ec00f7f6e14dde6affe4af22b638183c89ec4907b6指纹保持,未再次迁移,validate-exact、workers=false,API live/ready与Web三GET200。
此前APIr8仅build0/正式仍r7的段落保留为旧时点,本节记录已启动的新事实。健康与schema只证明启动/合同,不能代替隔离real05业务验收或Web新控件实测。已批准的本地开发迁移85–87继续保持,无新迁移、远端部署、通知投递或worker启用。
最新postgres-dec-real05-leases为24具名测试库,未清理验证。Color43项/1017冻结只是候选源码证据,旧r8复开失败保留;r9 H5/MP仍等B11候选,构建与新浏览器未跑,不能预写通过。real05的真实后端通过不覆盖这些前端缺口。