返回正文目录

第十八章实操与复跑

2026-10-22。正文:业务日期、日历与可比期间。当前 Codex 会话实际编写模型并运行公开 CLI;不是模拟结果,也不是另开干净会话仅凭提示词的独立验收。

当前:教学环境 0.1.36,普通日期属性写法

用户授权后已将实际教学服务升级为 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 记录保留初轮语境,不代表当前教学服务或模型状态。

初轮环境与数据(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;正文金额显示两位小数,不改写保存的原始结果。日历规则、公式和覆盖状态由准备层/模型提供,不将查询成功表述为引擎自动确认了业务完整性。

发现与处理

  1. 普通属性时间角色未保留。 初稿在 properties 中配置 LoadedAt.timeRole='system_time',模型校验通过,但实时 JSON 与 Markdown 被回退成 business_date。源码 DbPropertyDef 未提供该配置字段。改为已支持的日期自维度,在 dimensions 中配置角色,并显式提供 recommendedUse、keyDescription。最终 Markdown 正确返回 loadedAt$id 的 system_time 和用途;结构化 JSON 的该维度字段仍未携带 timeRole,因此角色验收以实际 Markdown 为据,不声称两种格式都完整。
  2. 教学日历前缀编号修正。 初版从 12 月 26 日起递增工作日序,未包含该月前面的日期。已改为始终从月初计算,并修正独立教学库的五条前缀记录,加入 18—22 的固定断言后整套复跑通过;业务样例金额不变。

未修改引擎源码。角色问题没有改变已执行查询的金额,但可能影响 AI 选择日期,已保留初次元数据与源码快照,不能仅凭模型校验成功认为角色生效。2026-10-22 按用户要求提交 #155,远端正文已读回核对。

证据

未测试其他数据库方言、生产身份权限、跨时区换算、法定节假日、完整财务日历、相对 now 入口、部分期间 timeWindow 或 Console/FAP。已有14项通过结论只适用于本章固定样例。

时间角色问题提交(2026-10-22)

另建 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 独立复测(2026-10-22)

用户提供修复版后,已下载并校验 0.1.36 预发布包,在临时 18136 实例用 #155 原始模型复测通过:普通属性与自维度的 JSON/Markdown 均保留角色和用途,刷新后不变;非字符串注解明确拒绝。见复测报告。临时实例已停止,原 18067 / 0.1.35 和本章模型未改,不将新版本结论覆盖旧版失败证据。