NestJS 后端架构
NestJS 模块化单体集中管理业务真实性、事务、权限、版本、审计和导出。Controller 只接入协议,Application 编排用例,Aggregate 维护公共生命周期不变量,Repository 负责 ownerId 隔离、乐观锁和事务。
RecordAggregate 不解释 payload;RecordKernelService 只依赖 SystemRecordPolicyPort;SystemRecordPolicyRegistry 在内核外精确覆盖 Catalog 24 个模块,并按“专用规范化、跨字段规则、Catalog 字段规则”的顺序失败关闭。Routine、Decision、Memory、Interview 保留既有专用规范化,未知模块不使用 fallback。
带幂等键的 cache miss 先在事务中取得数据库预占,再执行无副作用策略预检;策略拒绝会让预占、记录、revision、execution 和 audit 一并回滚。cache hit 先按最小引用恢复首次成功结果,不读取最新记录、不重复解释当前请求。真实 record-action 的 recordPatch 在写入副作用前再次经过同一策略。该行为等价层只防止普通记录绕过现有模块规则,不把 168 项 partial 升级为领域完成。
SystemRecordPolicyRegistry 是 Record Kernel 外部的 application adapter,不进入 Aggregate,也不拥有数据库、幂等、审计或网络副作用;cache miss 中策略位于幂等预占之后、业务写入之前,拒绝时整个事务回滚。
Batch 003 固定规范大写 ULID、标题 200/摘要 1000 字符合同、payload 顶层覆盖与 payloadRemove 删除语义、受控 JSON 资源上限、递归敏感字段治理、幂等最小引用和精确 revision/execution 回放。0009 只追加 summary CHECK 与 owner/module[/status] + id DESC 匹配索引。
revision 的 owner 由数据库复合外键保护,module 由父记录 join 与不可变 snapshot 一致性检查失败关闭;真实 PostgreSQL owner/module、并发乐观锁和历史回放测试只在一次性 Testcontainer 中执行。公共加固不改变功能状态,当前为 24 项 implemented_local 与 168 项 partial。
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 或恢复演练;这些状态必须读取同一轮独立运行报告,不能从源码存在或本机工具可用性推导。