{
  "body": "## Summary\r\n\r\nLauncher **0.1.29** 中，嵌套维度 `InvoiceLine → Track → Album → Artist` 的专用 `members list` 返回错误对象或 500：查询艺术家目录却返回 Track 数据；使用已公开的艺术家 ID 字段会触发 `query model slot/name mismatch`。CLI 还收到旧式 code/data 或 code/msg 信封，成功形状未符合 Runtime CLI success 合同。\r\n\r\n归属：Java Runtime / synthetic member-QM、维度来源绑定与 Runtime API 响应。不能只修改 CLI 退出码，因为数据对象本身已错。与 #145 的 DISTINCT 排序、#146 的具体列命名问题分开；这两项在同一 0.1.29 已复测通过。#75 是前端 memberSelect 选择字段问题，当前证据是直接 CLI 调用，不依赖该前端。\r\n\r\n## Environment / 发行身份\r\n\r\n- Windows 11 Pro x64；Java 17.0.12；Python 3.11.5；PowerShell 7.6.5；公开 CLI **0.1.24**。\r\n- [Launcher 0.1.29 Release](https://github.com/foggy-projects/foggy-data-mcp-bridge/releases/tag/foggy-runtime-launcher-v0.1.29)，使用该 Release 的 README、原版 PowerShell 启动脚本及 JAR，未从源码构建。Release 标记为 prerelease。\r\n- source commit：`a3693d0a812129f51966ef9c18247b0094a4f7f7`；内部 Java project version：`9.3.0-SNAPSHOT`。\r\n- JAR SHA256：`f02ee6fabced558543b7da11c7b97da0469aaab5b0a32ff23d03a42b1eaf8595`。六项 GitHub asset digest 与 SHA256SUMS 五项全部匹配，实际 JAR/进程命令行/监听 PID 已核对。\r\n- 独立 WorkDir、registry 和数据副本，loopback `http://127.0.0.1:18068`；Namespace `chinook`，named datasource `chinook-sqlite`，`none-dev-test-only`；匿名本地开发查询。\r\n- Runtime API：`foggy-runtime-api/v1`，schema `2026-06-06`，engine `java`。相关 capabilities 声明 supported。\r\n- [公开 Chinook v1.4.5 SQLite](https://github.com/lerocha/chinook-database/releases/download/v1.4.5/Chinook_Sqlite.sqlite)，副本 SHA256：`bdf635be69850bd3be09c9a2dbeef7ddfb80036bd3ef3381383cd03b61e4a61a`。\r\n- Skill 使用本机现有 foggy-ai-analysis / foggy-semantic-query，未宣称某个全新原版 Skill Release；复现依赖下列模型与公开 CLI，不依赖 Skill 推理。Maven 不参与。\r\n- 首轮为默认 lite（Console/FAP 关闭）；重启轮仅显式开启内嵌 Console，FAP 未配置。两轮失败证据均保留。\r\n\r\n## 基础准备\r\n\r\n将发行启动脚本及 JAR 放在同一目录。下载公开 SQLite 为当前目录的 `Chinook.sqlite`，将下文源码按文件名保存到 `./models/model/` 与 `./models/query/`。以下目录均为调用者自己的练习目录。\r\n\r\n```powershell\r\n.\\start-foggy-runtime.ps1 -Port 18068 -WorkDir \"$PWD/work\"\r\nfoggy-runtime --base-url http://127.0.0.1:18068 --namespace chinook wait-ready --timeout-seconds 45\r\nfoggy-runtime --base-url http://127.0.0.1:18068 --namespace chinook capabilities\r\n$dbPath = (Resolve-Path ./Chinook.sqlite).Path -replace '\\\\', '/'\r\nfoggy-runtime --base-url http://127.0.0.1:18068 --namespace chinook datasources add --name chinook-sqlite --type sqlite --jdbc-url \"jdbc:sqlite:$dbPath\"\r\nfoggy-runtime --base-url http://127.0.0.1:18068 --namespace chinook datasources bind --namespace chinook --data-source chinook-sqlite\r\nfoggy-runtime --base-url http://127.0.0.1:18068 --namespace chinook datasources test chinook-sqlite\r\n```\r\n\r\n后续每条 `foggy-runtime` 均在命令名前附加全局参数 `--base-url http://127.0.0.1:18068 --namespace chinook`。\r\n\r\n\r\n## Reproduction\r\n\r\n本轮实际先使用旧字段 QM（源码见下文），六文件校验通过，再登记 Bundle、刷新并 describe。下方提供实际涉及的明细 TM/QM，供后续缩减复现；**尚未额外执行仅此两文件的新进程缩减复现**，实际证据来自六文件教学 Bundle。\r\n\r\n```text\r\nfoggy-runtime models validate --models-dir ./models\r\nfoggy-runtime bundles add --name chinook-members-repro --path ./models\r\nfoggy-runtime models refresh\r\nfoggy-runtime models describe ChinookInvoiceLineQueryModel\r\nfoggy-runtime members list ChinookInvoiceLineQueryModel artist\r\nfoggy-runtime members list ChinookInvoiceLineQueryModel artist$id\r\n```\r\n\r\n公开元数据包含 `artist$id`、`artist$caption`。先调用 artist，返回 code=200、total=3503、前十条曲目；随后 artist$id 报 slot/name mismatch。album$id 同样返回曲目，完整点路径/下划线路径也另有 synthetic member-QM 解析错误。\r\n\r\n后续已将该**隔离测试副本** QM 改为具体列 name/alias（见第二份 QM），使用同 WorkDir/registry 重启 0.1.29，再按 artist$id → albumArtistId → artist 的顺序调用。下面是重启后保留的响应；三个 CLI 退出码均为 2：\r\n\r\n```json\r\n[\r\n  {\r\n    \"field\": \"artist$id\",\r\n    \"cliExitCode\": 2,\r\n    \"response\": {\r\n      \"code\": 500,\r\n      \"exCode\": \"B500\",\r\n      \"msg\": \"服务器内部错误: query model slot/name mismatch: ChinookInvoiceLineQueryModel#album\"\r\n    }\r\n  },\r\n  {\r\n    \"field\": \"albumArtistId\",\r\n    \"cliExitCode\": 2,\r\n    \"response\": {\r\n      \"code\": 500,\r\n      \"exCode\": \"B500\",\r\n      \"msg\": \"服务器内部错误: cannot resolve synthetic member-QM from fieldName: albumArtistId\"\r\n    }\r\n  },\r\n  {\r\n    \"field\": \"artist\",\r\n    \"cliExitCode\": 2,\r\n    \"response\": {\r\n      \"code\": 200,\r\n      \"data\": {\r\n        \"empty\": false,\r\n        \"hasNext\": false,\r\n        \"items\": [\r\n          {\r\n            \"caption\": \"For Those About To Rock (We Salute You)\",\r\n            \"id\": 1\r\n          },\r\n          {\r\n            \"caption\": \"Balls to the Wall\",\r\n            \"id\": 2\r\n          },\r\n          {\r\n            \"caption\": \"Fast As a Shark\",\r\n            \"id\": 3\r\n          },\r\n          {\r\n            \"caption\": \"Restless and Wild\",\r\n            \"id\": 4\r\n          },\r\n          {\r\n            \"caption\": \"Princess of the Dawn\",\r\n            \"id\": 5\r\n          },\r\n          {\r\n            \"caption\": \"Put The Finger On You\",\r\n            \"id\": 6\r\n          },\r\n          {\r\n            \"caption\": \"Let's Get It Up\",\r\n            \"id\": 7\r\n          },\r\n          {\r\n            \"caption\": \"Inject The Venom\",\r\n            \"id\": 8\r\n          },\r\n          {\r\n            \"caption\": \"Snowballed\",\r\n            \"id\": 9\r\n          },\r\n          {\r\n            \"caption\": \"Evil Walks\",\r\n            \"id\": 10\r\n          }\r\n        ],\r\n        \"limit\": 10,\r\n        \"pageNumber\": 1,\r\n        \"pageSize\": 10,\r\n        \"start\": 0,\r\n        \"total\": 3503,\r\n        \"totalData\": {\r\n          \"total\": 3503\r\n        },\r\n        \"totalPage\": 350\r\n      }\r\n    }\r\n  }\r\n]\r\n```\r\n\r\n这说明 slot/name mismatch 不仅发生在先调用 artist 后。重启后的别名 QM 是补充条件，不能冒称是未改 QM 的完全同请求新进程复现。\r\n\r\n## Expected\r\n\r\n- 已支持的艺术家维度/ID 查询应绑定到 Artist 的主键与名称。当前公开样例中 Artist 全目录 **275** 项，ID=1 是 **AC/DC**；Track 则有 **3503** 项。\r\n- 目录查询若未施加成交日期筛选，不应把 2012 年有成交的 **119 位**艺术家当作完整目录。\r\n- 参数不支持时，应在解析/校验阶段给出明确字段用法和结构化错误；不能成功返回另一张表的成员，也不应暴露内部 slot/name mismatch 作为唯一解释。\r\n- Runtime API 应提供与 CLI 一致的成功/失败信封；真正成功的请求 CLI 退出 0，失败保留可定位的 code/phase/diagnostics。\r\n\r\n## Actual / Runtime log excerpts\r\n\r\n实际错误对象首项是 Track ID=1 的 `For Those About To Rock (We Salute You)`，不是 Artist ID=1 的 AC/DC；total=3503 也与 Track 数量吻合。本轮通过只读原表计数与 ID/name 核对，不以 success 或 HTTP 状态推断业务正确。\r\n\r\n默认 lite 进程日志（脱敏路径，保留原行号）：\r\n\r\n```text\r\n167: 2026-10-21 10:01:12.843 [http-nio-127.0.0.1-18068-exec-3] ERROR c.f.d.m.c.FoggyDatasetExceptionHandler - 系统异常: \r\n168: java.lang.IllegalArgumentException: query model slot/name mismatch: ChinookInvoiceLineQueryModel#album\r\n169: \tat com.foggyframework.dataset.model.lifecycle.catalog.CatalogSnapshot.validateQueryModelSlot(CatalogSnapshot.java:216)\r\n170: \tat com.foggyframework.dataset.model.lifecycle.catalog.CatalogSnapshot.lambda$validateCatalogIntegrity$3(CatalogSnapshot.java:126)\r\n171: \tat java.base/java.util.LinkedHashMap.forEach(LinkedHashMap.java:721)\r\n172: \tat java.base/java.util.Collections$UnmodifiableMap.forEach(Collections.java:1553)\r\n173: \tat com.foggyframework.dataset.model.lifecycle.catalog.CatalogSnapshot.validateCatalogIntegrity(CatalogSnapshot.java:125)\r\n174: \tat com.foggyframework.dataset.model.lifecycle.catalog.CatalogSnapshot.<init>(CatalogSnapshot.java:44)\r\n175: \tat com.foggyframework.dataset.model.lifecycle.catalog.CatalogCandidate.freeze(CatalogCandidate.java:582)\r\n176: \tat com.foggyframework.dataset.model.lifecycle.catalog.CatalogSnapshotStore.lambda$publishAdditive$2(CatalogSnapshotStore.java:456)\r\n177: \tat com.foggyframework.fsscript.lifecycle.CommittedSourceRevisionRegistry.publishIfCurrent(CommittedSourceRevisionRegistry.java:106)\r\n178: \tat com.foggyframework.dataset.model.DbModelAutoConfiguration$1.publishIfCurrent(DbModelAutoConfiguration.java:157)\r\n179: \tat com.foggyframework.dataset.model.lifecycle.catalog.CatalogSnapshotStore.publishIfSourceCurrent(CatalogSnapshotStore.java:525)\r\n180: \tat com.foggyframework.dataset.model.lifecycle.catalog.CatalogSnapshotStore.publishAdditive(CatalogSnapshotStore.java:433)\r\n181: \tat com.foggyframework.dataset.model.lifecycle.catalog.CatalogSnapshotStore$CandidateScope.commitAdditive(CatalogSnapshotStore.java:625)\r\n182: \tat com.foggyframework.runtime.api.service.RuntimeNamedDataSourceResolver.publishGuarded(RuntimeNamedDataSourceResolver.java:284)\r\n183: \tat com.foggyframework.runtime.api.service.RuntimeNamedDataSourceResolver.lambda$publishGuarded$22(RuntimeNamedDataSourceResolver.java:288)\r\n184: \tat com.foggyframework.runtime.api.service.RuntimeNamedDataSourceResolver.continueComposite(RuntimeNamedDataSourceResolver.java:330)\r\n185: \tat com.foggyframework.runtime.api.service.RuntimeNamedDataSourceResolver.lambda$publishGuarded$23(RuntimeNamedDataSourceResolver.java:287)\r\n186: \tat com.foggyframework.runtime.api.service.RuntimeDatasourceRegistryService.publishIfCurrent(RuntimeDatasourceRegistryService.java:497)\r\n187: \tat com.foggyframework.runtime.api.service.RuntimeNamedDataSourceResolver.publishGuarded(RuntimeNamedDataSourceResolver.java:290)\r\n188: \tat com.foggyframework.runtime.api.service.RuntimeNamedDataSourceResolver.publishIfCurrent(RuntimeNamedDataSourceResolver.java:125)\r\n189: \tat com.foggyframework.dataset.model.engine.query_model.QueryModelLoaderImpl.commitIfBindingsCurrent(QueryModelLoaderImpl.java:542)\r\n190: \tat com.foggyframework.dataset.model.engine.query_model.QueryModelLoaderImpl.buildAndPublish(QueryModelLoaderImpl.java:423)\r\n191: \tat com.foggyframework.dataset.model.engine.query_model.QueryModelLoaderImpl.lambda$resolveWithSingleFlight$1(QueryModelLoaderImpl.java:214)\r\n192: \tat com.foggyframework.dataset.model.lifecycle.concurrent.ModelBuildSingleFlight.execute(ModelBuildSingleFlight.java:58)\r\n193: \tat com.foggyframework.dataset.model.engine.query_model.QueryModelLoaderImpl.resolveWithSingleFlight(QueryModelLoaderImpl.java:212)\r\n194: \tat com.foggyframework.dataset.model.engine.query_model.QueryModelLoaderImpl.resolveJdbcQueryModel(QueryModelLoaderImpl.java:164)\r\n195: \tat com.foggyframework.dataset.model.service.impl.QueryFacadeImpl.resolveAndPin(QueryFacadeImpl.java:314)\r\n196: \tat com.foggyframework.dataset.model.service.impl.QueryFacadeImpl.doQuery(QueryFacadeImpl.java:153)\r\n```\r\n\r\n重启后日志节选：\r\n\r\n```text\r\n91: 2026-10-21 10:05:39.936 [http-nio-127.0.0.1-18068-exec-9] ERROR c.f.d.m.c.FoggyDatasetExceptionHandler - 系统异常: \r\n92: java.lang.IllegalArgumentException: query model slot/name mismatch: ChinookInvoiceLineQueryModel#album\r\n93: \tat com.foggyframework.dataset.model.lifecycle.catalog.CatalogSnapshot.validateQueryModelSlot(CatalogSnapshot.java:216)\r\n94: \tat com.foggyframework.dataset.model.lifecycle.catalog.CatalogSnapshot.lambda$validateCatalogIntegrity$3(CatalogSnapshot.java:126)\r\n95: \tat java.base/java.util.LinkedHashMap.forEach(LinkedHashMap.java:721)\r\n96: \tat java.base/java.util.Collections$UnmodifiableMap.forEach(Collections.java:1553)\r\n97: \tat com.foggyframework.dataset.model.lifecycle.catalog.CatalogSnapshot.validateCatalogIntegrity(CatalogSnapshot.java:125)\r\n98: \tat com.foggyframework.dataset.model.lifecycle.catalog.CatalogSnapshot.<init>(CatalogSnapshot.java:44)\r\n99: \tat com.foggyframework.dataset.model.lifecycle.catalog.CatalogCandidate.freeze(CatalogCandidate.java:582)\r\n100: \tat com.foggyframework.dataset.model.lifecycle.catalog.CatalogSnapshotStore.lambda$publishAdditive$2(CatalogSnapshotStore.java:456)\r\n101: \tat com.foggyframework.fsscript.lifecycle.CommittedSourceRevisionRegistry.publishIfCurrent(CommittedSourceRevisionRegistry.java:106)\r\n102: \tat com.foggyframework.dataset.model.DbModelAutoConfiguration$1.publishIfCurrent(DbModelAutoConfiguration.java:157)\r\n103: \tat com.foggyframework.dataset.model.lifecycle.catalog.CatalogSnapshotStore.publishIfSourceCurrent(CatalogSnapshotStore.java:525)\r\n104: \tat com.foggyframework.dataset.model.lifecycle.catalog.CatalogSnapshotStore.publishAdditive(CatalogSnapshotStore.java:433)\r\n105: \tat com.foggyframework.dataset.model.lifecycle.catalog.CatalogSnapshotStore$CandidateScope.commitAdditive(CatalogSnapshotStore.java:625)\r\n106: \tat com.foggyframework.runtime.api.service.RuntimeNamedDataSourceResolver.publishGuarded(RuntimeNamedDataSourceResolver.java:284)\r\n107: \tat com.foggyframework.runtime.api.service.RuntimeNamedDataSourceResolver.lambda$publishGuarded$22(RuntimeNamedDataSourceResolver.java:288)\r\n108: \tat com.foggyframework.runtime.api.service.RuntimeNamedDataSourceResolver.continueComposite(RuntimeNamedDataSourceResolver.java:330)\r\n```\r\n\r\n## Governed control\r\n\r\n同 QM 的语义查询校验和执行通过：按日期筛选、按艺术家 ID/名称分组，得到 **119** 位 2012 年有成交记录的艺术家。它只作为字段/关联查询可用的对照，不作为完整目录，也不算 members 接口修复：\r\n\r\n```json\r\n{\r\n  \"columns\": [\r\n    \"artist$id\",\r\n    \"artist$caption\",\r\n    \"count(invoiceLineId) as lineCount\"\r\n  ],\r\n  \"slice\": [\r\n    {\r\n      \"field\": \"invoice$invoiceDate\",\r\n      \"op\": \"[)\",\r\n      \"value\": [\r\n        \"2012-01-01\",\r\n        \"2013-01-01\"\r\n      ]\r\n    }\r\n  ],\r\n  \"groupBy\": [\r\n    \"artist$id\",\r\n    \"artist$caption\"\r\n  ],\r\n  \"orderBy\": [\r\n    \"artist$id\"\r\n  ],\r\n  \"limit\": 500,\r\n  \"returnTotal\": true\r\n}\r\n```\r\n\r\n## Model sources\r\n\r\n<details>\r\n<summary>ChinookInvoiceLineModel.tm — 实际完整 TM</summary>\r\n\r\n```javascript\r\nexport const model = {\r\n    name: 'ChinookInvoiceLineModel',\r\n    caption: 'Chinook 账单明细',\r\n    description: '一行是一条账单明细。分类分析累计交易明细金额，不累计账单总金额，不改用目录单价。',\r\n    tableName: 'InvoiceLine',\r\n    idColumn: 'InvoiceLineId',\r\n    properties: [\r\n        { column: 'InvoiceLineId', name: 'invoiceLineId', caption: '明细 ID', type: 'INTEGER' },\r\n        { column: 'InvoiceId', name: 'invoiceId', caption: '账单 ID', type: 'INTEGER' },\r\n        { column: 'TrackId', name: 'trackId', caption: '曲目或媒体 ID', type: 'INTEGER' },\r\n        { column: 'UnitPrice', name: 'unitPrice', caption: '交易单价', type: 'MONEY',\r\n          description: '账单明细上的交易单价，不是 Track 目录单价。样例原始单位，币种未指定。' }\r\n    ],\r\n    dimensions: [\r\n        {\r\n            name: 'invoice', caption: '账单', tableName: 'Invoice',\r\n            foreignKey: 'InvoiceId', primaryKey: 'InvoiceId', captionColumn: 'InvoiceId',\r\n            properties: [\r\n                { column: 'InvoiceDate', name: 'invoiceDate', caption: '账单日期', type: 'DATETIME',\r\n                  description: '按账单记录日期统计，不自行做时区转换。' },\r\n                { column: 'BillingCountry', name: 'billingCountry', caption: '账单国家', type: 'STRING' },\r\n                { column: 'CustomerId', name: 'customerId', caption: '客户 ID', type: 'INTEGER' }\r\n            ],\r\n            dimensions: [\r\n                {\r\n                    name: 'customer', caption: '客户', tableName: 'Customer',\r\n                    foreignKey: 'CustomerId', primaryKey: 'CustomerId', captionColumn: 'LastName',\r\n                    properties: [\r\n                        { column: 'FirstName', name: 'fullName', caption: '客户姓名', type: 'STRING',\r\n                          description: 'FirstName 与 LastName 拼接；与客户 ID 一起使用。',\r\n                          formulaDef: { builder: (alias) => `${alias}.FirstName || ' ' || ${alias}.LastName` } }\r\n                    ]\r\n                }\r\n            ]\r\n        },\r\n        {\r\n            name: 'track', caption: '曲目或媒体', tableName: 'Track',\r\n            foreignKey: 'TrackId', primaryKey: 'TrackId', captionColumn: 'Name',\r\n            properties: [\r\n                { column: 'Name', name: 'title', caption: '曲目或媒体名称', type: 'STRING' }\r\n            ],\r\n            dimensions: [\r\n                {\r\n                    name: 'genre', caption: '内容分类', tableName: 'Genre',\r\n                    foreignKey: 'GenreId', primaryKey: 'GenreId', captionColumn: 'Name',\r\n                    description: '包含音乐和影视内容；分类缺失不应丢弃交易金额。',\r\n                    properties: [\r\n                        { column: 'GenreId', name: 'genreId', caption: '分类 ID', type: 'INTEGER' },\r\n                        { column: 'Name', name: 'genreName', caption: '内容分类名称', type: 'STRING' }\r\n                    ]\r\n                },\r\n                {\r\n                    name: 'album', caption: '专辑', tableName: 'Album',\r\n                    foreignKey: 'AlbumId', primaryKey: 'AlbumId', captionColumn: 'Title',\r\n                    description: '曲目所属专辑，包含音乐及影视专辑；用 ID 区分同名专辑。',\r\n                    dimensions: [\r\n                        {\r\n                            name: 'artist', caption: '艺术家', tableName: 'Artist',\r\n                            foreignKey: 'ArtistId', primaryKey: 'ArtistId', captionColumn: 'Name',\r\n                            description: '以专辑所属艺术家归属交易金额，不等同于 Track.Composer 作曲者；用 ID 区分同名。'\r\n                        }\r\n                    ]\r\n                }\r\n            ]\r\n        }\r\n    ],\r\n    measures: [\r\n        { column: 'UnitPrice', name: 'lineAmount', caption: '明细金额', type: 'MONEY', aggregation: 'sum',\r\n          description: '交易单价乘数量，沿用样例原始单位，不除以 100，不指定币种。',\r\n          formulaDef: { builder: (alias) => `${alias}.UnitPrice * ${alias}.Quantity` } },\r\n        { column: 'Quantity', name: 'salesQuantity', caption: '销售数量', type: 'INTEGER', aggregation: 'sum',\r\n          description: '累计 Quantity；本样例全部为 1，也不能将数量定义成明细条数。' }\r\n    ]\r\n};\r\n```\r\n\r\n</details>\r\n\r\n<details>\r\n<summary>ChinookInvoiceLineQueryModel.qm — 首轮实际旧字段 QM</summary>\r\n\r\n```javascript\r\nconst line = loadTableModel('ChinookInvoiceLineModel');\r\n\r\nexport const queryModel = {\r\n    name: 'ChinookInvoiceLineQueryModel',\r\n    caption: 'Chinook 明细分析',\r\n    description: '按账单日期、客户、曲目或媒体、内容分类、专辑及其所属艺术家分析明细金额和销售数量。每行是一条明细，不提供可累计的账单总金额。艺术家按 Album.ArtistId 归属，不使用 Track.Composer。金额沿用样例原始单位，不指定币种、不做分元换算，不代表利润、回款或退款。',\r\n    loader: 'v2',\r\n    model: line,\r\n    columnGroups: [\r\n        { caption: '交易明细', items: [\r\n            { ref: line.invoiceLineId },\r\n            { ref: line.invoiceId },\r\n            { ref: line.trackId },\r\n            { ref: line.unitPrice },\r\n            { ref: line.invoice$invoiceDate },\r\n            { ref: line.invoice$billingCountry },\r\n            { ref: line.invoice$customerId },\r\n            { ref: line.invoice.customer$fullName },\r\n            { ref: line.track$title },\r\n            { ref: line.track.genre$genreId },\r\n            { ref: line.track.genre$genreName }\r\n        ] },\r\n        { caption: '专辑与艺术家', items: [\r\n            { ref: line.track.album },\r\n            { ref: line.track.album.artist }\r\n        ] },\r\n        { caption: '明细指标', items: [\r\n            { ref: line.lineAmount },\r\n            { ref: line.salesQuantity }\r\n        ] }\r\n    ],\r\n    accesses: []\r\n};\r\n```\r\n\r\n</details>\r\n\r\n<details>\r\n<summary>ChinookInvoiceLineQueryModel.qm — 重启轮实际 name/alias QM</summary>\r\n\r\n```javascript\r\nconst line = loadTableModel('ChinookInvoiceLineModel');\r\n\r\nexport const queryModel = {\r\n    name: 'ChinookInvoiceLineQueryModel',\r\n    caption: 'Chinook 明细分析',\r\n    description: '按账单日期、客户、曲目或媒体、内容分类、专辑及其所属艺术家分析明细金额和销售数量。每行是一条明细，不提供可累计的账单总金额。艺术家按 Album.ArtistId 归属，不使用 Track.Composer。金额沿用样例原始单位，不指定币种、不做分元换算，不代表利润、回款或退款。',\r\n    loader: 'v2',\r\n    model: line,\r\n    columnGroups: [\r\n        { caption: '交易明细', items: [\r\n            { ref: line.invoiceLineId },\r\n            { ref: line.invoiceId },\r\n            { ref: line.trackId },\r\n            { ref: line.unitPrice },\r\n            { ref: line.invoice$invoiceDate },\r\n            { ref: line.invoice$billingCountry },\r\n            { ref: line.invoice$customerId },\r\n            { ref: line.invoice.customer$fullName },\r\n            { ref: line.track$title },\r\n            { ref: line.track.genre$genreId },\r\n            { ref: line.track.genre$genreName }\r\n        ] },\r\n        { caption: '专辑与艺术家', items: [\r\n            { ref: line.track.album$id, name: 'albumId', alias: 'albumId' },\r\n            { ref: line.track.album$caption, name: 'albumName', alias: 'albumName' },\r\n            { ref: line.track.album.artist$id, name: 'albumArtistId', alias: 'albumArtistId' },\r\n            { ref: line.track.album.artist$caption, name: 'albumArtistName', alias: 'albumArtistName' }\r\n        ] },\r\n        { caption: '明细指标', items: [\r\n            { ref: line.lineAmount },\r\n            { ref: line.salesQuantity }\r\n        ] }\r\n    ],\r\n    accesses: []\r\n};\r\n```\r\n\r\n</details>\r\n\r\n## Scope / suggested regression\r\n\r\n覆盖嵌套 Artist/Album 与直接 Track 的来源绑定、当前公开字段/维度参数、别名投影、调用次序、fresh process、信封与 CLI 退出码。修复还应对成员范围与主查询权限保持一致；本轮为匿名本地开发测试，未把生产权限标为已验收。\r\n\r\n原始 CLI JSON、精确命令及完整 stdout/stderr 均在本地留档；上述是可公开的精确响应与必要日志，未上传整份本机日志。测试实例已停止，无数据库写入、无产品代码改动。\r\n",
  "number": 148,
  "state": "OPEN",
  "title": "[Bug] 嵌套维度 members 返回曲目或 slot/name mismatch，且响应信封异常（Launcher 0.1.29）",
  "url": "https://github.com/foggy-projects/foggy-data-mcp-bridge/issues/148"
}