2026-10-22。正文:业务日期、日历与可比期间。当前 Codex 会话实际编写模型并运行公开 CLI;不是模拟结果,也不是另开干净会话仅凭提示词的独立验收。
用户授权后已将实际教学服务升级为 18067 / PID 149972 / Launcher 0.1.36 预发布版,CLI 仍为 0.1.25,沿用原工作目录和注册表,Console/FAP 关闭。invoiceDate、loadedAt 均为普通 DATETIME 属性,角色及用途在 JSON/Markdown 中一致;正文与查询不再使用 loadedAt$id。
本章在新教学服务上执行 setup → collect → verify,14 项执行、1 项预期拒绝通过。只有账单日期 TM 有预期变动,两个教学数据库、其他十三份模型文件保持不变;另有五项原有时间/明细查询回归通过。见升级及复验报告、本轮证据。日常复跑仍用下列三个脚本;其当前版本已采用修复后的普通属性写法。
下面的 0.1.35 记录保留初轮语境,不代表当前教学服务或模型状态。
| 项目 | 实际值 |
|---|---|
| Launcher / CLI | 0.1.35 / 0.1.25;沿用 Java 17、Python 3.11.5 |
| Runtime | http://127.0.0.1:18067,原 PID 150796;没有重启服务 |
| Namespace / datasource | chinook-calendar / chinook-calendar-sqlite |
| Bundle | chinook-calendar-teaching,lab/chapter-18/models;4 个 TM/QM 文件 |
| 数据库 | lab/chapter-18/data/calendar-teaching.sqlite,独立生成 |
| 权限与在线入口 | 本机匿名开发模式 none-dev-test-only;Console/FAP 未启用 |
PID、实际命令中的 JAR 路径与校验值已核对。JAR SHA256 为 893d753005ed7fc824fefc40519855325baecedda27f405b24faab1944373834。新数据源、绑定和 Bundle 保留以供审阅复跑;原 chinook 的绑定、数据库和十个模型文件未修改。
样例清单记录源文件与副本摘要。原始 412 张账单只复制 ID、时间和金额;入库时间、日历、报告完整性为显式教学扩展。378 个连续日期覆盖 2011-12-26 至 2013-01-06,包含完整 2012 年。工作日仅按周一至周五,不代表法定节假日或音乐商店实际营业日。
完整性是报告范围声明,不是回放真实系统入库过程:统计到 2012-11-15,报告生成时刻未设定。全量样本的入库日期对照与此声明分开,不据此推断 Chinook 的真实更新延迟。
先确认第六章环境可用。进入资料根目录,创建/加载模型与执行查询分开:
python .\lab\checks\setup-chapter-18.py
# 到这里仅准备数据、校验、登记和读取元数据,尚未执行业务查询。
python .\lab\checks\collect-chapter-18.py
python .\lab\checks\verify-chapter-18.py
本轮已实际连贯复跑上述三个脚本。setup 通过独立的准备脚本生成数据,已有数据库只核对摘要,不删除或覆盖;新一轮证据放独立时间戳目录。collect 对同一 payload 先 validate 再 execute;错误字段只校验,不执行。verify 从原始 SQLite 行出发,用 Python Decimal 独立计算并核对完整行键与数值。
新机器需要第六章的源数据库、CLI 与运行服务;本脚本不会代装运行环境。需要变更样例时先另建副本,不强制覆盖已登记数据库。原始 SQLite 仅只读访问。
14 项执行通过、1 项预期校验拒绝。 其中第 15 个编号是旧 Namespace 的回归,编号 14 是拒绝用例。
| 用例 | 预期与实际 |
|---|---|
| 01 日历连续性、零与空 | 11 月 1—17 日 17 行;2 日已确认且无账单为零,16 日起未确认为空 |
| 02—04 日期选择与跨月记录 | 十一月账单 37.62/7 张;模拟入库 31.68/6 张;325 号 5.94 从 11 月 29 日移动到 12 月 1 日 |
| 05—06 同期与差额 | 十月前十五天 28.76,十一月 23.76;差额 −5.00,变化 −17.385257…% |
| 07—08 覆盖天数 | 十月整月 31/31 天已确认,十一月 15/30;两段前十五天均为 15/15 |
| 09 工作日口径 | 两个月各 11 个工作日;只统计这些日期的账单,为 10.91 与 23.76 |
| 10—11 日历边界 | 保留 2 月 29 日;2012-12-31 的 ISO 周年为 2013、周号为 1 |
| 12 未确认但有记录 | 11 月 27—29 日 rawAmount 有值,reportedAmount 仍为空 |
| 13 日历全年对账 | 366 行、83 张账单、477.53,聚合 JOIN 未重复累计 |
| 14 错误付款字段 | FIELD_NOT_FOUND,阶段 query.validate,未执行 |
| 15 原账单回归 | 原 chinook Namespace 仍为 83 张、477.53 |
SQLite 返回的少数浮点数形如 23.759999999999998,独立对账容差为 1e-8;正文金额显示两位小数,不改写保存的原始结果。日历规则、公式和覆盖状态由准备层/模型提供,不将查询成功表述为引擎自动确认了业务完整性。
properties 中配置 LoadedAt.timeRole='system_time',模型校验通过,但实时 JSON 与 Markdown 被回退成 business_date。源码 DbPropertyDef 未提供该配置字段。改为已支持的日期自维度,在 dimensions 中配置角色,并显式提供 recommendedUse、keyDescription。最终 Markdown 正确返回 loadedAt$id 的 system_time 和用途;结构化 JSON 的该维度字段仍未携带 timeRole,因此角色验收以实际 Markdown 为据,不声称两种格式都完整。未修改引擎源码。角色问题没有改变已执行查询的金额,但可能影响 AI 选择日期,已保留初次元数据与源码快照,不能仅凭模型校验成功认为角色生效。2026-10-22 按用户要求提交 #155,远端正文已读回核对。
lab/evidence/chapter-18/runs/20261022-113823-438801,保存 capabilities、数据源/表结构、模型校验、实时 JSON/Markdown、payload、validate/execute 与前后摘要。未测试其他数据库方言、生产身份权限、跨时区换算、法定节假日、完整财务日历、相对 now 入口、部分期间 timeWindow 或 Console/FAP。已有14项通过结论只适用于本章固定样例。
另建 time-role-repro-035 Namespace、一行人工 SQLite 与两个模型,独立复现普通属性的角色和用途丢失:loadedAt=system_time 实际变为 business_date,createdAt=business_date 实际变为 system_time。所有校验与 describe 退出码为 0、success=true;日期自维度在 Markdown 保留角色,JSON 缺少角色/用途的差异一并附入同一 issue。
#155包含 0.1.35 的实际进程/JAR SHA256、最小建表与 TM/QM、公开 CLI 命令、预期/实际元数据、校验响应、Runtime 日志及源码定位线索。证据、正文和远端读回位于 issues/time-role-0.1.35,最小复现脚本可复跑。复现专用资源保留供后续发行包复测,没有重启服务或修改原教学模型/数据。
用户提供修复版后,已下载并校验 0.1.36 预发布包,在临时 18136 实例用 #155 原始模型复测通过:普通属性与自维度的 JSON/Markdown 均保留角色和用途,刷新后不变;非字符串注解明确拒绝。见复测报告。临时实例已停止,原 18067 / 0.1.35 和本章模型未改,不将新版本结论覆盖旧版失败证据。