2026-10-21 主题更正:本文对应已迁高级篇的 Compose 旧稿,不是当前基础第十四章。当前建模 JOIN 见 新实操记录。以下旧验证事实保留。
2026-10-21。当前 Codex 会话实际调用项目内 Foggy CLI 完成;没有另开干净 Codex 会话仅凭正文短提示词做独立复现。正文见第十四章。
http://127.0.0.1:18067,Namespace chinook,命名数据源 chinook-sqlite,SQLite 副本 lab/data/Chinook_Sqlite.sqlite。foggy-runtime-api/v1,schema 2026-06-06,none-dev-test-only。环境记录只保存非敏感信息,见 environment.json。chinook-teaching 目录;原六个建模文件及数据 SHA256 前后未变。模型总计八文件校验与加载通过,BUNDLE_ALREADY_REGISTERED 是已注册目录新鲜候选校验的提示,不是重复定义错误。capabilities 确认 Compose validate/preview/execute;检查绑定、Customer 结构与现有两个 QM 的实时字段。models validate --models-dir lab/models 后刷新,再 describe 三个输入 QM。models describe ... --format markdown 实时获得客户查询说明,保存阅读样本,不作为预生成的查询依赖。| 脚本编号 | 预期与实际核对 |
|---|---|
| 01 客户 LEFT JOIN 当年账单 | 95 行=83 张账单+12 位未匹配客户,金额 477.53 |
| 02 同一输入 INNER JOIN | 83 行、47 位客户;逐张账单核对 |
| 03 客户 LEFT JOIN 按客户汇总账单 | 59 行,其中 47 位有金额、12 位指标缺失;477.53、83 张 |
| 04 同一聚合输入 INNER JOIN | 47 行,金额与左连接中的匹配客户逐一相同 |
| 05 两侧都按客户聚合再 JOIN | 47 行,账单/明细金额逐客户相等;各合计 477.53,数量 447 |
| 06 错误粒度对照 | 原始账单与原始明细按客户关联产生 946 个组合,账单累计放大为 6818.09;本例故意展示错误业务写法,不是引擎计算出错 |
| 07/08 最终结果分页 | 按金额降序、客户 ID 升序,前两页各 5 行与完整结果对应位置一致 |
| 09 无账单期间 | 1990 年账单输入为空,LEFT JOIN 仍有 59 位客户,账单指标未返回 |
| 12 固定 USA 权限输入 | 客户目录仍为 59 位,右侧仅 13 位有金额,合计 127.98;21 张账单 |
| 13/14 拒绝模型、隐藏输入字段 | COMPOSE_SCRIPT_INVALID,阶段 compose.validate,未执行;详细消息保留具体来源错误 |
| 10/11 校验缺口、输入 limit | 两项限制已复现,单独记录,不计为预期通过 |
10 项 Compose 用例完成独立核对(含错误粒度演示),2 项权限预期拒绝;另有 2 项未满足预期的边界。三个旧查询回归通过。金额在 SQLite 浮点 SUM 后可能有极小误差,独立基线使用 Decimal,对比误差小于 1e-9,正文展示两位小数。
结果字段为空时,当前序列化可能省略该键,核对时区分缺失键/NULL 与数值 0。没有把未匹配行计作零金额账单。
客户模型创建与查询分开。现有客户文件准备好后,在资料根目录执行:
python -u .\lab\checks\run-chapter-14.py
这是完整自动复跑:包含模型校验刷新、临时权限模型登记、查询、负例核对、清理与旧查询回归,不是正文第一步的“先不查询”。它依赖前章已接入的同一个本地服务,不会启动或重启服务。
只核对已保存响应与独立原行,可运行:
python .\lab\checks\verify-chapter-14.py
查询脚本目录、验收摘要、回归、清理记录。每个脚本保留独立 validate/preview/execute 响应,失败请求没有 execute 文件。
两项引擎边界的输入、阶段、预期与实际见Compose 边界记录,已提交 #150 和 #151,均附 0.1.30 复现、预期/实际及关键返回。权限模型第一次校验使用了返回对象的简写箭头函数,FSScript 解析失败;改为 resolver: (context) => { return {...}; } 后通过。保留原失败响应,不将它算作引擎权限失败。
验证仅覆盖同源 SQLite、等值 INNER/LEFT、有限分页、固定权限测试模型;未验证其他数据库、跨源 JOIN、RIGHT/FULL、真实身份服务或完整 Compose。受限模型失败不能换公共模型绕过;返回的 safeToAutoRepair 等通用建议不构成改变权限的授权。
正文中的连接类型、先聚合与最终分页均有实际数据证据;未知 JOIN 键校验缺口和输入 limit 未生效明确保留,未伪装全量通过。