游戏数值工具系统设计
独立数值工具保留确定性计算和输入隔离。旧 Run Action、Worker Profile、岗位编排、终态信封和运行手册退役,不继续通过 run_id 执行。当前服务接线必须由 owning 项目单独配置,不能从包存在推断自动执行就绪。
数值数据模型
game.numeric-model.v1 是工具间唯一计算合同:
- 参数:稳定 ID、数值、单位、可调性、上下界、来源定位;
- 公式:表达式、显式输入、输出 ID 和单位;
- 指标与硬约束:目标区间及 minimum/maximum/equal 规则;
- 经济流与容量:资源、source/sink、周期、流入/流出与容量;
- 成长与概率:离散成长点、成本、权重、价值和保底阈值;
- 来源:内容寻址
source_ref,模型自身再生成model_ref。
表达式引擎不执行 JavaScript。它只支持数字、已声明标识符、算术/比较/逻辑运算和受限函数
min/max/abs/floor/ceil/round/pow/log/exp/if。除零、非有限结果、未知标识符和依赖循环均为显式错误。
状态、并发与生命周期
- source/model store 是进程内、内容寻址、不可枚举的有界 LRU;最多保留 128 项。
- 相同内容复用相同 ref;ref 无更新操作,因此不存在并发覆盖。
- DSH 重启后 ref 失效。调用方必须从权威来源重新扫描和编译,不能将 ref 当长期存储。
- 单个场景有明确 horizon;候选最多 50 个,来源大小、单元格、行列数和 JSON 深度均有上限。
- 工具异常返回结构化失败,不修改输入模型,也不产生外部副作用。
Wire-level 合同
能力工具统一返回:
{
"schema_version": "game.numeric-tool-result.v1",
"tool": "game_numeric_scenario_run",
"ok": true
}
失败时 ok=false,并携带 {error:{code,message}};业务字段只在成功结果中出现。所有工具参数必须是
JSON 可表达值,拒绝 NaN、Infinity、负零、函数、二进制和路径。source_ref、model_ref 与
change_set_hash 分别采用 source:<64 hex>、model:<64 hex>、sha256:<64 hex>。
Schema 关键不变量
source_ref绑定规范化来源内容;相同内容必须得到相同哈希。model_ref只为ready模型创建;incomplete结果的引用为null。- formula 的
inputs必须与表达式标识符精确一致;未知标识符、循环和不可计算结果阻断模型。 - candidate 只能覆盖存在、可调且在上下界内的参数;不可行候选不进入 Pareto 前沿。
- change set 只列真实变化,且每项必须有
source_locator。调用方保持外层哈希与内嵌哈希一致。
安全与 NFR
- 来源上限 2 MB、20,000 单元格、10,000 行、256 列、JSON 深度 32;候选最多 50 个。
- 内容存储最多 128 项,进程重启自然失效;不提供枚举接口,避免跨任务浏览暂存数据。
- 表、Sheet、单元格地址和候选 ID 必须唯一,避免“取第一个”造成静默歧义。
- 计算是确定性的;month 固定为 30 天。需要日历月语义时必须由上游显式展开,不能隐式猜测。
- 所有外部修改通过 fresh-base/MR;无任意 shell;外部 CI 是唯一验证权威。
错误收敛
- 来源或映射错误:模型
incomplete,不创建可调用model_ref。 - 计算错误:场景/审计保留实体 ID 和错误原因,不转成零。
- 约束失败:候选标记不可行;变更集生成被拒绝。
- 引用过期:返回 ref unknown/expired,调用方重新从权威来源编译。
来源与外部写入
固定 DSP manifest 的 ADP-DEV-API-DSP-0001 提供能力工具源码位置。GitLab MR、配置表写入及 Symphony 委托由各自 owner 管理;数值包不承担自动调度或提交。
历史 Action 的 source、schema 与测试保留归档资产,但不可恢复成备用路径。错误必须保持结构化和可解释,不以默认零值或模型自述代替证据。