日期:2026-10-18。正文:第八章。第七章按用户要求暂定,本章沿用其中的教学定义,不视作真实企业口径审批。
http://127.0.0.1:18067;CLI / Launcher 均为 0.1.24;engine=java、runtimeApiVersion=foggy-runtime-api/v1、schemaVersion=2026-06-06、securityMode=none-dev-test-only。chinook;命名数据源:chinook-sqlite;副本:lab/data/Chinook_Sqlite.sqlite。本轮重新查询能力、绑定、连接和五张表结构,均成功;没有重启或升级服务,没有写源数据。练习目录\lab\models;Bundle:chinook-teaching,本轮创建,只在该教学命名空间登记,未开启 watch。foggy-ai-analysis 指导建模,foggy-semantic-query 指导查询。没有覆盖安装全局 Skill。没有把固定请求执行成功记成独立自然语言提示词验收通过。正文简单提示词是交给读者的任务表达,具体输出可以不同。
| 查询面 | TM | QM |
|---|---|---|
| 账单 | ChinookInvoiceModel.tm | ChinookInvoiceQueryModel.qm |
| 明细 | ChinookInvoiceLineModel.tm | ChinookInvoiceLineQueryModel.qm |
账单 TM 主表为 Invoice,客户为多对一维度;姓名用 SQLite FirstName || ' ' || LastName 在模型中拼接。账单金额映射 Total,默认 SUM;账单数映射 InvoiceId,默认 COUNT。客户 ID 明确公开为 customerId。
明细 TM 主表为 InvoiceLine,沿 Invoice → Customer 和 Track → Genre 声明嵌套维度;金额为交易单价乘数量,数量累计 Quantity。没有把 Invoice.Total 放到明细 QM 里。当前 describe 的嵌套字段包括:
| 含义 | 明细 QM 公开字段 |
|---|---|
| 账单日期 / 国家 / 客户 ID | invoice$invoiceDate / invoice$billingCountry / invoice$customerId |
| 客户姓名 | invoice_customer$fullName |
| 曲目或媒体名称 | track$title |
| 分类 ID / 名称 | track_genre$genreId / track_genre$genreName |
| 明细金额 / 数量 | lineAmount / salesQuantity |
两个 QM 的描述中注明原始金额单位、币种未指定、不做分元换算,以及不代表利润、回款、退款。未增加数据库没有的状态过滤。平均账单金额及空分母处理留到后续常见分析实际验证,本轮没有交付平均值字段。
所有响应、退出码和参数见commands.json。失败响应也保留,不删除后重写为成功。
models validate 返回 MODEL_VALIDATE_FAILED,诊断为 Cannot invoke String.toUpperCase() because name is null。仅给 captionDef 补 type 未解决。改为普通维度属性 fullName 的公式定义后,2 个文件校验通过。本轮只确认这一路径可用,未定位为引擎源码缺陷或推广成所有 captionDef 都不可用。customer$id,因此没有拿它直接查询。改为在账单 TM/QM 显式公开物理 CustomerId 对应的 customerId,后续 describe 与查询均通过。models validate 出现 duplicate query model resource in namespace,增加 --clear-existing 也没有消除。本轮确认该命名空间只有自己刚创建的 chinook-teaching,临时解除这个教学 Bundle 登记,校验通过后重新登记、刷新;本地模型文件和数据不删除。不将解除 Bundle 推广为生产更新步骤。customer$fullName$id。改用完整引用 line.invoice.customer$fullName、line.track.genre$genreId / $genreName 后,4 个文件校验通过。调用端使用 describe 返回的下划线字段名。limit: 1,当前运行版本将满页标成 hasNext: true,容易被误解为还有汇总行。请求改为 limit: 2,实际仍只返回 1 行,分页提示为 false;八个总计请求重新校验和执行后通过。没有修改或抹掉旧响应。clientName,仅做校验,得到 FIELD_NOT_FOUND,phase=query.validate、safeToAutoRepair=true。重新 describe、改回真实字段,再校验与执行,排名一致。该错误为主动构造,不能写成 LLM 自然发生的错误。22-final-models-validate.json、25-final-describe-*.json 和 26-final-*-execute.json。没有调用私有接口、绕过校验、修改产品源码或启用 Console/FAP。Runtime 的开发测试模式提示保留在证据中。
请求目录保存 Top 5、四个期间的两种总计、分类汇总、账单 252 明细、错误字段与修正请求。query-manifest.json将每个请求对应到实际响应。
独立校验脚本以只读方式取原始表,用字典追踪关系,Decimal 累计金额,不用语义查询结果生成预期。原件与副本均仍匹配 Chinook 固定 SHA256。
部分 SQLite SUM 结果带浮点尾数,例如 Rock 返回 162.35999999999999,独立结果为 162.36。原始响应保留,按两位小数比较与展示;这不证明引擎将所有金额计算变成了十进制定点数。
结果:独立基线、验收摘要。通过范围为当前教学模型、固定 DSL 及其数值结果;不包含独立干净会话的提示词、完整自然语言题库、权限、重启恢复或在线问数。
教学说明(2026-10-19):Markdown 是引擎依据当前已加载 TM/QM 自动生成、在调用 describe 时获取的查询说明,不是读者需要预先准备的文件。这里保存一份调用结果仅作证据与阅读对照;修改模型后需先完成校验、刷新,才能读取更新后的元数据。
本轮复查 capabilities 后,分别通过公开 CLI 的 models describe <QM> --format markdown 导出两个查询模型,均成功。没有刷新或修改模型,也没有重复执行查询。响应见 28-markdown-invoice.json、28-markdown-line.json;提取 data.content 原样保存为 账单 QM Markdown 和 明细 QM Markdown。正文摘录“使用提示”之前的内容,未手写替换引擎输出。
当前 Markdown 渲染器将 INTEGER 类型的部分字段显示为“文本”;结构化 describe 中 customerId、invoiceCount 等仍返回 type=INTEGER。正文已注明这一显示差异,没有将 Markdown 的展示标签作为真实数据库或字段类型。完整输出末尾的通用使用提示也不代表每个提示中提到的字段或层级操作都已在本模型公开或测试。
账单 TM 的完整源码在正文只出现一次。QM 中的 loadTableModel('ChinookInvoiceModel') 是引用,不是第二份 TM 定义;正文已补充解释。
当前模型已加载。只复跑已有查询时,在 lab 目录执行:
python -X utf8 .\checks\collect-chapter-08.py
python -X utf8 .\checks\verify-chapter-08.py
修改模型后,先核对当前命名空间和 Bundle 清单。本环境已有目录登记时需按上述重复资源问题处理,再完成校验、重新登记和刷新:
.\foggy.ps1 bundles list
# 仅对本教学环境自己创建的 chinook-teaching;首次没有该 Bundle 时跳过移除。
.\foggy.ps1 bundles remove chinook-teaching
.\foggy.ps1 models validate --models-dir .\models
# 只有校验通过才继续。
.\foggy.ps1 bundles add --name chinook-teaching --path "$PWD\models" --replace
.\foggy.ps1 models refresh
.\foggy.ps1 models describe ChinookInvoiceQueryModel
.\foggy.ps1 models describe ChinookInvoiceLineQueryModel
每条命令需检查退出码和 success,错误时停止并定位。复跑查询不需要重新登记数据源或重新下载样例。