数据规则 M3A 阶段验收总结
日期:2026-07-23
分支:codex/data-rule-execution-m3a-m5
实施范围:数据规则可信契约、服务端 Schema/数据集绑定、类型化表达式、SQLGlot 真实执行垂直链路。
1. 阶段结论
M3A 通过验收。平台已经具备“受限但真实可执行”的 SQL 规则能力:
- 自然语言生成的 RuleSpec 必须规范化为 V2,旧 V1 只允许读取迁移,不能作为新规则写入。
- 表达式使用平台自有闭合 AST,具备函数白名单、字段类型检查、复杂度限制和后端能力判断。
- Schema Snapshot 由服务端可信元数据目录生成并计算 Hash,发布接口不再接受客户端自报 Schema Hash。
- DataFlow 发布固定规则和 Schema 语义,但物理表、数据源和方言仍在 Data Factory 部署阶段绑定。
- PostgreSQL/MySQL SQL 由固定版本 SQLGlot 通过 AST 编译,参数值不通过字符串拼接进入 SQL。
- 绑定计划在 M3A 只保存为
compiled;生产仓储不存在通过调用方自报证据提升为 published 的接口。
- Runner 只执行
published 计划,并校验 RuleVersion、Schema Snapshot、DatasetBinding、编译器版本和计划 Hash。
- SQL 首期只开放经过证明的同源、精确唯一键
upsert;其它写入模式、整数除法、不可排序字段去重和无安全契约的质量读取均失败关闭。
2. 已落地能力
2.1 可信运行契约
SchemaSnapshot、DatasetBinding、ExecutionPlanV2 均为闭合 JSON。
- 拒绝凭据、连接串、内联查询、Python/序列化对象和未知后端操作。
- Schema Hash 必须与规范化字段内容一致。
- PostgreSQL/MySQL 标识符按 UTF-8 字节长度提前校验。
2.2 服务端 Schema 与物理绑定
- 默认 Schema 目录复用现有 Neo4j
BusinessDomain -> DataMeta 治理图。
- 稳定引用采用
bd:<stable-domain-key>:<revision>,缺失、歧义或版本不匹配时失败关闭。
- 物理 DatasetBinding 只保存数据源 UID、对象引用、方言、访问/写入模式和 Schema Snapshot ID,不保存凭据。
2.3 类型化规则表达式
- 支持受限字面量、字段、括号、白名单函数、比较、逻辑和有限算术。
- 新建规则只接受 RuleSpec V2;旧 V1 使用独立只读迁移入口。
- 非整数小数以精确十进制字面量保存,避免二进制浮点提前损失精度。
- 发布前依据规则自己的
input_schema_ref 对服务端字段执行类型检查。
- 编译器目标必须属于表达式能力交集;没有安全后端时拒绝发布。
2.4 SQL 编译与执行
- 固定依赖
sqlglot==30.13.0,MIT License。
- 支持 PostgreSQL/MySQL 严格方言编译和闭合 AST 校验。
- 编译、持久化和 Runner 三处共同验证规范 RuleVersion/Schema/Binding/Compiler Hash。
- MySQL upsert 要求配置键恰好对应单列主键/唯一键,并拒绝其它唯一索引可能触发的错误合并。
- 事务结果区分
committed、not_committed 和 unknown。
- 去重补充稳定字段排序;JSON、binary 等未证明可排序类型直接拒绝。
3. 验收证据
3.1 数据库迁移
本地 Docker PostgreSQL 从 20260723_120 升级至 20260723_130 成功。130 仅允许执行计划状态:
compiled
published
revoked
tested 和正式发布证据状态由 M4 Task 7 实现。
3.2 M3A 聚焦验收
覆盖执行契约、SchemaResolver、表达式、RuleSpec、发布服务、SQL 编译器、Runner、真实控制面 PostgreSQL 和 PostgreSQL/MySQL 规则执行:
148 passed in 1.41s
其中真实数据库验收包括:
- PostgreSQL 规则编译、写入、重复 upsert、篡改拒绝;
- MySQL 规则编译、写入、重复 upsert;
- MySQL 非唯一键和额外唯一索引目标拒绝,目标表零写入;
- PostgreSQL 控制面原子发布及
compiled 逻辑计划落库。
3.3 全量回归
501 passed, 26 skipped, 59 subtests passed in 4.19s
3.4 本地运行环境
验收时健康:
- backend
- frontend
- runner
- PostgreSQL
- source PostgreSQL
- source MySQL
- MinIO
- Neo4j
- n8n
Kestra 仍为 Exited (1),属于 M5 数据工厂投产阶段的明确待解决项,不影响 M3A 编译器/Runner 直接实库验收。
4. 阶段边界与遗留风险
- M3A 不提供生产计划发布接口;正式
compiled -> tested -> published 必须使用 M4 的服务器运行证据。
- SQL 质量检查仍失败关闭,待 M3B 证据模型和 M4 发布门禁完成后开放。
- SQL 当前只支持同源精确唯一键 upsert;跨源、多节点和 Parquet 制品由 M3B 实现。
- Neo4j 业务域必须具备稳定英文键和明确 revision/version;不满足时 Schema 解析拒绝。
- SQL 方言的 collation、timezone、regex、rounding 能力必须在部署绑定中由服务器证明。
5. 下一阶段
进入 M3B:
- 增加 Polars 闭合 Lazy Plan 编译与执行。
- 建立 MinIO/Parquet 摘要绑定制品。
- 完成跨 PostgreSQL/MySQL 的多节点数据交接。
- 写入规则运行、违规样本、隔离行和制品血缘证据。