{ "$schema": "https://json-schema.org/draft/2020-12/schema", "$id": "https://wanxiang.ai/tier2/fixtures/mini-fei-e/datatable.schema.json", "title": "MiniFeiEDataTable", "description": "mini-肥鹅(G2 靶子游戏)数据表 schema —— spike 第一段『便宜/中等模型自治能不能稳定填出富游戏数据表』的填值靶。【这份是什么】把 mini-肥鹅 三系统(资源/合成/订单)的可填数值表钉成机器可校验形状:items(12 物品)/ mergeChains(6 合成链)/ orders(5 订单)/ currencies(2 货币:coins 金币 + ingredients 食材库存)。platform 骨架(scaffold_init,A7)预建为留空模板(data/datatable.empty.json),LLM 自治循环往里填值;人工预建『金标』样例(data/datatable.gold.json)供 driver/门(D 三层校验 + A5 富游戏三门)做对照测试,不依赖 LLM。【与 A3 关系】本份是 fixture 内部的品类数据表 schema,不是 A3 源项目契约(那份认整个 Phaser 工程);这张表会作为 fileTree 里一个 role=config(平衡参数表)的工程内文件被 build 进 bundle。【三门判据来源】mergeChains 必须有向无环(dagAcyclic 门);order.requires 的物品必须落在 mergeChains 可产出集合里(requiresReachable 门);完单真调 addCoins、合成真调 consumeIngredient(F 门级真接线,本表不约束运行时调用、只约束数据自洽,真接线由探针在真玩时取证)。详见 tier2/contracts/mini-fei-e-fixture-spec.md。状态=建(待 0号 spike;directional v1,字段随 spike 实证收窄)。", "type": "object", "required": ["currencies", "items", "mergeChains", "orders", "winCondition", "loseCondition"], "additionalProperties": false, "properties": { "schemaVersion": { "description": "数据表版本(独立于 A3 源项目契约版本)。directional v1;spike 跑通后随实证收窄。", "const": "mini-fei-e-1.0" }, "_note": { "description": "内联文档字段(可选;留空模板/金标里写人读说明,不参与运行)。沿用仓内 manifest.json note 字段惯例。", "type": "string" }, "_filledByLlm": { "description": "可选标记位:LLM 自治填值后置 true(留空模板为 false/缺省)。供 build 前快检『模板是否还是空壳』。", "type": "boolean" }, "currencies": { "description": "系统一·资源系统:两种货币的开局/配置。coins=金币(单值,完单产出、解锁消耗);ingredients=食材库存(per-itemId 计数,合成消耗/产出)。命令式 API(addCoins/spendCoins/consumeIngredient/addIngredient)由 platform 骨架实现,本表只配开局数值。", "type": "object", "required": ["coins", "ingredients"], "additionalProperties": false, "properties": { "coins": { "description": "金币货币配置。", "type": "object", "required": ["initial"], "additionalProperties": false, "properties": { "id": { "description": "货币 id(恒 'coins',订单 reward / 解锁 cost 都按它结算)。", "const": "coins" }, "initial": { "description": "开局金币(fixture 钉死 20;赢线 = 攒到 100)。", "type": "integer", "minimum": 0 }, "label": { "description": "显示名(表现层 UI 用,如 '金币')。", "type": "string" } } }, "ingredients": { "description": "食材库存货币配置(per-itemId 计数表)。", "type": "object", "required": ["initial"], "additionalProperties": false, "properties": { "id": { "description": "货币 id(恒 'ingredients')。", "const": "ingredients" }, "initial": { "description": "开局各食材库存量映射 { itemId: 数量 };key 必须 ∈ items[].id。可空对象(全 0 起手)。", "type": "object", "additionalProperties": { "type": "integer", "minimum": 0 } }, "label": { "description": "显示名(如 '食材')。", "type": "string" } } } } }, "items": { "description": "12 个物品(钉死 minItems/maxItems=12)。每个物品参与合成链(作为 from 被消耗或作为 to 被产出)、被订单 requires 引用、有图标资产引用(接 query_asset 占位池)。id 全表唯一。", "type": "array", "minItems": 12, "maxItems": 12, "items": { "type": "object", "required": ["id", "name", "tier"], "additionalProperties": false, "properties": { "id": { "description": "物品 id(全表唯一,小写短横线 slug,如 'wheat'、'dough'。mergeChains.from/to、orders.requires、ingredients.initial 都按它引用)。", "type": "string", "pattern": "^[a-z][a-z0-9-]*$", "minLength": 1 }, "name": { "description": "物品显示名(中文,表现层棋盘格/订单面板渲染用)。", "type": "string", "minLength": 1 }, "tier": { "description": "合成层级(1=基础原料 / 2=半成品 / 3=成品)。供表现层分色与平衡校对;不参与门判定。", "type": "integer", "minimum": 1, "maximum": 3 }, "assetId": { "description": "图标资产 id(可选,接 query_asset 占位池 assets/placeholder-manifest.json 的 id;缺省走程序化回退方块)。", "type": "string" } } } }, "mergeChains": { "description": "系统二·合成系统:6 条合成链(钉死 minItems/maxItems=6,覆盖 12 物品)。点两个相同 from → 消耗(consumeIngredient)→ 产出上一级 to(addIngredient)。【门约束】① dagAcyclic:from→to 构成的有向图必须无环(judge 静态拓扑校验);② 覆盖:6 条链的 from/to 并集应覆盖全部 12 物品(spec 钉死『6 条覆盖 12 物品』)。from≠to。", "type": "array", "minItems": 6, "maxItems": 6, "items": { "type": "object", "required": ["from", "to", "cost"], "additionalProperties": false, "properties": { "from": { "description": "被合成的下级物品 id(消耗源;必须 ∈ items[].id)。点两个相同 from 触发本链。", "type": "string", "pattern": "^[a-z][a-z0-9-]*$", "minLength": 1 }, "to": { "description": "产出的上级物品 id(必须 ∈ items[].id,且 ≠ from;DAG 边 from→to)。", "type": "string", "pattern": "^[a-z][a-z0-9-]*$", "minLength": 1 }, "cost": { "description": "本次合成消耗的 from 数量(经营平衡参数;典型 2 = 两个相同合一个上级)。", "type": "integer", "minimum": 1 }, "unlockCoins": { "description": "金币门控解锁阈值(可选;>0 表示该高阶合成链要攒够金币 spendCoins 才解锁,对应耦合点5『金币门控解锁』)。", "type": "integer", "minimum": 0 } } } }, "orders": { "description": "系统三·订单系统:5 个订单模板(钉死 minItems/maxItems=5)。每单要一组物品(requires)给一笔金币(reward),耐心(patience)耗尽则流失。【门约束】requiresReachable:每个 order.requires 的 itemId 必须落在 mergeChains 可产出集合(to 并集 ∪ tier1 基础料)里 —— 证『订单要的东西合成系统造得出来』。完单 → consumeIngredient 扣物品 + addCoins 给金币(真接线由探针取证,非本表约束)。", "type": "array", "minItems": 5, "maxItems": 5, "items": { "type": "object", "required": ["id", "requires", "reward", "patience"], "additionalProperties": false, "properties": { "id": { "description": "订单 id(全表唯一,如 'order-1')。", "type": "string", "pattern": "^[a-z][a-z0-9-]*$", "minLength": 1 }, "requires": { "description": "完单需要的物品映射 { itemId: 数量 }(至少 1 项;key 必须 ∈ items[].id 且应可被合成系统产出 —— requiresReachable 门)。", "type": "object", "minProperties": 1, "additionalProperties": { "type": "integer", "minimum": 1 } }, "reward": { "description": "完单产出金币(addCoins;经济门:正循环靠它把金币从 20 推到 100)。", "type": "integer", "minimum": 1 }, "patience": { "description": "耐心(帧数或秒,平台骨架口径;耗尽则订单流失,计入连续流失计数 —— 输线 = 连续 3 流失)。", "type": "integer", "minimum": 1 }, "customerAssetId": { "description": "顾客头像资产 id(可选,接占位池)。", "type": "string" } } } }, "winCondition": { "description": "赢条件(经济门盈利路判据):金币攒到 target(fixture 钉死 100)→ readState().phase 焊 'win' latch。", "type": "object", "required": ["coinsTarget"], "additionalProperties": false, "properties": { "coinsTarget": { "description": "赢线金币阈值(fixture=100)。", "type": "integer", "minimum": 1 } } }, "loseCondition": { "description": "输条件(经济门破产路判据):连续 consecutiveOrderFails 个订单流失(fixture 钉死 3)→ phase 焊 'lose' latch。", "type": "object", "required": ["consecutiveOrderFails"], "additionalProperties": false, "properties": { "consecutiveOrderFails": { "description": "连续订单流失上限(fixture=3)。", "type": "integer", "minimum": 1 } } } } }