docs(gen-engine): 运行时图说 doc-sync 回写实现对账 12 项(W-DSGN)

以 2026-07-03《生成引擎实现与图说一致性对账》§5 八条 + 重推演 Δ6/Δ9① +
预算两段式裁决为据,把掉队约两周的运行时图说追回现实,写前逐条重核工作树代码。

图说本体(主对象):
- 配置口径反转:ADR-4/A13/§5.2/§5.8/对标表/五列/§二补④ 从「Langfuse 式热取 + GitOps
  四闸」改为「yudao 配置中心版本化(MySQL 版本行)⊕ Nacos 下发 ⊕ AgentScope per-POST
  热重载」,阶段〇+一① 已代码落地;Langfuse 式退历史备选、原表保留作决策留痕。
- §4.2 收敛环:前瞻「go(留观微调)」改为真跑 conditional 结论,补 agent 层 win-balance
  瓶颈(约 1-2/5 thrash)、网关无强档记 conditional no-go、F-1 反馈补厚已落。
- §4.1 便宜档:补运行时载体已 Python 化(cheap-worker 双入口 CLI+Service、复用 tier2
  worker 包;Node 拆两半:gen.mjs 退对照、tools.mjs/serve-and-play.sh/play.cdp.cjs
  九门执行层 shell-out 仍活);「十一插件」核正为十二(8 基元+4 编排)。
- §5.3 续修:回同续修原语迁入 on_reasoning 的 RepairMiddleware(单 POST 内 finish 点
  续修=生产主路,外层 resume 为本地 runner 并存 fallback);预算两段式(软停线 ¥10/¥50
  + 硬地板 ×1.5=¥15/¥75、与轮数/墙钟任一先到即停),§5.2/§5.7 同步。
- §5.1 checkpoint 降准(每外层 resume 落本地 JSON;Redis durable 已编码未真跑);服务壳
  已编码真跑未验证、阶段一 Agent Team 已提前落地默认开启。
- §5.4 删 DockerWorkspace 前置阻断句(06-28 已裁 in-process);A2.5 表行改现·部分;
  补引质量 canonical(D11 权重管辖已移交、四层塔与三层校验共用 L1-L3 但异轴防混)。
- §一 Δ6:第一原则改述为「接缝按变更频率设」(模型月换>品类周扩>引擎季增>框架可能永不换;
  协议脊柱与 judge 独立两资产保留;框架适配验证明确为远期非投入项)。
- §三 Δ9①:A8–A13 加「单实现期不冻、第二消费者出现才抬升」注记(不删行);C5/C6 判分
  闭环两契约入表(PlaySpec 考卷/VerdictFeedback 判卷反馈,已立 schema+校验器、生产接线
  在途,指 contracts/play-loop/)。
- A11(工单第 10 条)复核:图说 §六已是完整 A11 章节,无需重复补——系对账/工单误判。

配套一处:contracts/trace/README.md 廉价线口径 SAA→cheap-worker(便宜档已 Python 化复用
tier2 TraceAdapter/schema,saa-trace-event schema 保留作 SAA 远期轨立位)。
代码触点一处:tier2 agent_loop/studio.py 头注释纠正(「不再外层 repair」与同文件外层
resume 相左)。
收尾:两份配置设计档 sot-impact「收口时回写」翻「已回写」;plan① §11 TODO ⑤⑥ 勾状态。

docs-gate 七检全绿;studio.py 语法校验通过。

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
lili 2026-07-03 14:10:56 -07:00
parent 96de98b345
commit 6ef0b5d75e
6 changed files with 48 additions and 29 deletions

View File

@ -2,6 +2,8 @@
这一目录登记 tier2 富游戏自治生成线的统一 trace 事件契约。它是契约组的新一类 additive 立位:只新增、不改动也不破坏任何现有契约(events / game-package / tier2-verdict 等),随 0号 spike 或控制面 phase-1 才真接代码。当前状态是「建」——设计已出、schema 已立,tier2 这条线本身整体待 spike 验证。
> **廉价线口径更新(2026-07-03)**:本目录 schema 设计时,"廉价线"指 SAA 的 16 节点 Java 编排。2026-06-26 起便宜档核心已整条 Python 化(cheap-worker,复用 tier2 的 `TraceAdapter``tier2-trace-event.schema.json`),所以**当前生产的便宜档 trace 走 tier2 那份 schema、不是 `saa-trace-event.schema.json`**。SAA 16 节点那条线已按生成运行时图说 §一降为最低优先级的远期适配目标;`saa-trace-event.schema.json` 与下文对它的描述保留作那条远期轨的立位、不删——等 SAA 真适配进来时它就是现成的 adapter 契约。下文凡以"SAA 16 节点廉价线"指代廉价线处,当前现实读作"cheap-worker Python 线、复用 tier2 schema"。
## 这是什么
`tier2-trace-event.schema.json` 定义一条 trace 记录的形状。一条记录 = 一次生成轨迹里的一步,由公共核心五字段(`traceId` / `step` / `cost` / `verdict` / `timestamp`)加一个 tier2 私有的 `ext` 扩展段构成。核心五字段是两条生成线(tier2 ReAct 多轮、SAA 16 节点廉价线)都必须老老实实填上的对称子集;`ext` 是 tier2 这一轨各写各的不对称段,塞它独有的 ReAct 三段——推理、动作、观察。

View File

@ -2,7 +2,7 @@
date: 2026-06-30
topic: 配置控制面
status: 草稿 · 生态原生架构重写(经多轮源码核查)· Opus 复评已过(承重墙 W1/W2/W3 + 第3处 SoT 偏离 + 次要 S1-S6 已在文内修掉)· 生产基建 build-vs-buy 尽调采纳(§3.7:Nacos/RocketMQ/Sentinel,AGENTS.md §3.1 同步反转)· 待创始人评审 → writing-plans
sot-impact: 修订 生成引擎运行时(SoT §5.2/§5.8/ADR-4 按本设计修正,收口时回写)
sot-impact: 修订 生成引擎运行时(SoT §5.2/§5.8/ADR-4 按本设计修正,已回写(2026-07-03,W-DSGN doc-sync 回写图说 §5.2/§5.8/ADR-4/A13/§二补④))
上级: docs/plans/2026-06-25-生成引擎统一执行计划-AgentScope三档-plan.md
关联:
- agentscope==2.0.2:app/_service/_chat.py(每 POST 从存储现装配 agent+model=per-POST 热重载)· app/_router/_agent.py(/agent CRUD:name/system_prompt/ContextConfig/ReActConfig)· app/_router/_session.py(/session:ChatModelConfig=model/type/credential/parameters)· agent/_agent.py(reply 循环 :595-620 finish 点)· types/_hook.py + middleware(reply/reasoning/acting/model-call 钩点,可 intercept+modify)· observability/studio_sink.py(Studio 桥)

View File

@ -2,7 +2,7 @@
date: 2026-07-02
topic: 配置控制面-阶段二
status: 草稿 · 创始人已拍方向 B(维持 yudao⊕Nacos;prompt 移出 Nacos→MySQL 版本行,2026-07-02)· 待 Codex+Opus 双评审 → 创始人评审
sot-impact: 修订 生成引擎运行时(SoT §5.2 管理面配置管理 / §5.8 配置三类"受治理发版" / ADR-4 配置热取 / A13 配置注册表:把 GitOps/Langfuse 式口径收敛为 yudao 配置中心版本化(版本账本落 MySQL 版本行)+ 双路激活,与上级设计 §6 pending 同一收口面,收口时回写;对上级设计四处口径 + SoT 回写的回调挂账见本档 §7)
sot-impact: 修订 生成引擎运行时(SoT §5.2 管理面配置管理 / §5.8 配置三类"受治理发版" / ADR-4 配置热取 / A13 配置注册表:把 GitOps/Langfuse 式口径收敛为 yudao 配置中心版本化(版本账本落 MySQL 版本行)+ 双路激活,与上级设计 §6 pending 同一收口面,已回写(2026-07-03,W-DSGN doc-sync);对上级设计四处口径 + SoT 回写的回调挂账见本档 §7)
上级: docs/agent-specs/2026-06-30-配置控制面一次性按序实现-设计.md
关联:
- 阶段前置(已落地):阶段〇 生产基建(Nacos 2.4.3 / RocketMQ 5.3.1 / Sentinel 自托管 mini-infra + game-cloud 接入,`docs/plans/2026-07-01-配置控制面-spike与阶段生产基建-plan.md`)· 阶段一① 护城河 middleware(实施 plan 档 `07100eef`;代码落地 = feat 提交 `55162341`/`e9c7a3bb`/`c2661719`,统一门判 GateJudgment + 续修 RepairMiddleware + 软预算软停)· 阶段一② cheap-worker 归并 Service `/chat`(实施 plan 档 `526e9b3d`;代码落地 = feat 提交 `e9e7006c`/`1662eb0d`,九门判据 run_cheap_gates + 独立 Service 壳 build_cheap_app)

View File

@ -1,6 +1,6 @@
---
title: agentic 生成运行时架构 — 可插拔 agent 平台
status: 架构演进中 · tier2 核心已落 + 0 号 spike feie-005 accept(首跑;下一步收敛环 n=5、有错再追加 5)· §4.2/§5.x 已按 2026-06-24 HANDOFF doc-sync(2026-06-25)· "采标准"方向 §6.8 双评审已过(采纳但修),已收口定稿:成熟度五列(§二补二)+ 6 条 build-vs-buy ADR(§二补三)已补、§三 定级已冻 · **2026-06-25 核心 reframe(创始人)**:框架收敛 AgentScope(SAA/dify 降最低优先级、留作远期适配验证可插拔)+ 三档按 AI 参与深度(去超休闲、全模板化非从零)+ per-gen 预算闸 <¥10/<¥50(图音另算)
status: 架构演进中 · tier2 核心已落 + 0 号 spike feie-005 accept(首跑;收敛环 n=5 真跑判 conditional)· §4.2/§5.x 已按 2026-06-24 HANDOFF doc-sync(2026-06-25)· "采标准"方向 §6.8 双评审已过(采纳但修),已收口定稿:成熟度五列(§二补二)+ 6 条 build-vs-buy ADR(§二补三)已补、§三 定级已冻 · **2026-06-25 核心 reframe(创始人)**:框架收敛 AgentScope(SAA/dify 降最低优先级、留作远期适配验证可插拔)+ 三档按 AI 参与深度(去超休闲、全模板化非从零)+ per-gen 预算闸 <¥10/<¥50(图音另算)· **2026-07-03 doc-sync(实现对账回写)**:配置口径反转为 yudao 配置中心版本化 ⊕ Nacos 下发 ⊕ AgentScope per-POST 热重载(Langfuse 式退历史备选)、便宜档核心已 Python 化(cheap-worker)、tier2 收敛环真跑判 conditional(瓶颈在 agent 层 win-balance)、续修原语迁入 RepairMiddleware finish 点续修、预算两段式已裁(软停线 ¥10/¥50 + 硬地板 ×1.5)、C5/C6 判分契约已立位——详见各面「现 / 建」
canonical: true # 生成运行时架构唯一 SoT,收敛原 16 份图说/详设/接口协议草案
topic: 生成引擎运行时
date: 2026-06-24
@ -22,7 +22,7 @@ date: 2026-06-24
生产编排现阶段只押 AgentScope 一套;SAA(Spring AI Alibaba)、dify、coze 等别的框架降到最低优先级,留作后期"验证框架可插拔"的适配目标——等 AgentScope 这条做扎实,再把它们一一适配进来,用这件事证明下面这条可插拔原则不是空话,而不是现在并行养两套编排。
如果每换一次引擎或框架,就要改一遍业务侧调用、改一遍验收门、改一遍落库,这套东西就废了。所以平台的第一原则是划一条线:哪些是**系统内固定的接口协议**,任何人换引擎换框架都不许动;哪些是**可插拔的实现模块**,换引擎换框架就是换它们。换框架等于接一个新 adapter,而不是动契约。这就是"可插拔 agent 平台"的全部含义——平台拥有协议,框架只租用、不拥有。一旦某个框架的私有结构悄悄渗进固定协议(轨迹格式被某框架的 span 绑死、任务协议泄漏框架内部状态),那就是锁死的开始,要立刻在协议层把它隔离回去。
如果每换一次引擎或框架,就要改一遍业务侧调用、改一遍验收门、改一遍落库,这套东西就废了。所以平台的第一原则是划一条线:哪些是**系统内固定的接口协议**,任何人换引擎换框架都不许动;哪些是**可插拔的实现模块**,换引擎换框架就是换它们。但这条线该划在哪、投资先砸哪一段,判据不是"将来也许要换框架"这种对称性想象,而是**接缝按真实变更频率来设**。这套系统里真正月月在换的是模型与 prompt,周周在扩的是品类,引擎按季度增补,而编排框架大概率永远不换。投资顺序照这个频率排:模型与 prompt 做成可热配的数据,品类做成纯数据的资产包,引擎做成能力包加探针实现,框架适配器排在最后——有一套能跑的就够,第二套等真需要再花钱。换框架等于接一个新 adapter、而不是动契约,这个能力要保留,但它兑现的是后期把 SAA、dify 适配进来这件事本身的验证价值,**是远期目标、不是 MVP 当下的投入项**,别按旧叙事把钱花在还没有第二个消费者的框架适配上。这条原则真正沉淀下来的是两个资产:它逼出来的协议脊柱(任务、状态、trace、工具、验收这套固定接缝)和 judge 的独立(出题的与被考的不同源)。这两样与"要不要换框架"无关,是平台的工程纵深、原样保留。一旦某个框架的私有结构悄悄渗进固定协议(轨迹格式被某框架的 span 绑死、任务协议泄漏框架内部状态),那就是锁死的开始,要立刻在协议层把它隔离回去。
这条原则不是空谈"将来好换",它有具体落点:后期把 SAA、dify 适配进来时,固定协议钉在那里,适配就只是给它们各接一个被治理的 adapter、各包一个执行后端,而不是推倒重来——把它们适配进来这件事本身,就是对这条可插拔原则的验证。
@ -45,7 +45,7 @@ date: 2026-06-24
| skill(自定义 / 框架私有) | agent 专长包 | **SKILL.md**(agentskills.io 开放标准) | 采开放标准 frontmatter |
| 沙箱(固定端口 CDP) | 隔离的 build + run 环境 | **microVM 抽象**(E2B Firecracker / 阿里云 AgentRun·AIO Sandbox) | **抽象为 SandboxDriver,近期只承诺 Local/Docker/薄沙箱**(现状 = Local workdir + 端口段错开、已 accept,**非"采 microVM"**);microVM 云端多租户才需,CDP/成本/数据主权待验、AgentRun 厂商锁死(见 §二补③) |
| 水平扩容(K-槽 Semaphore + 进程内端口槽) | 长跑 agent 并发 | **durable-execution**(范式:Temporal / DB queue+lock / MessageBus) | **现状非反模式**:K-槽已参数化(线程池+Semaphore(K)+K 错开端口槽+单测守);durable-execution 跨机扩容才需——独立选型(≥3 候选)、先旁路 tier2、不动在产 SAA(见 §二补③) |
| prompt / model 配置 | 配置注册 + 热改 | **Langfuse 式**(registry + 运行时热取 + 缓存 TTL + config-as-data) | 采(分 read/write):运行时只拉**已批准版本**;prompt 与生成门阈值的版本切换走 GitOps 审批+eval+灰度+回滚,不 DB 热改(见 §二补④) |
| prompt / model 配置 | 配置注册 + 热改 | ~~**Langfuse 式**(registry + 运行时热取 + 缓存 TTL + config-as-data)~~ | **2026-07-01 反转**:改采 yudao 配置中心版本化 ⊕ Nacos 下发 ⊕ AgentScope per-POST 热重载(Langfuse 式退历史备选,详见 ADR-4);受治理配置走 yudao 审批发版、运营开关热改 |
| 验收门(judge 纯代码、禁 LLM 自评、出题≠被考) | 确定性验收 | **无主流对等** | **自研 —— 护城河,必须自建** |
| checkpoint / 续跑 | 生成专属续跑 | **无跨框架标准** | **自研合理** |
@ -81,7 +81,7 @@ date: 2026-06-24
**③ 扩容与沙箱降为 future-state + 独立选型**:K-槽**已参数化非反模式**(线程池+Semaphore(K)+K 错开端口槽+单测守);durable-execution 第 2 步独立选型(Temporal / DB queue+Redis lock / AgentScope MessageBus 等 **≥3 具名候选 + 排除理由**,按 [`.agents/rules/build-vs-buy.md`](../../../../.agents/rules/build-vs-buy.md) 硬门),先旁路 tier2、不动在产 SAA。沙箱抽象改名 **SandboxDriver**,先做能力矩阵(CDP/Chrome、文件 I/O、网络封锁、冷启动、并发、成本、数据主权),近期只承诺 Local/Docker/薄沙箱;microVM(E2B/AgentRun)云端多租户才需、AgentRun 厂商锁死。
**④ 慢门 / cancel / trace / 配置的精修**:A7 先冻 MCP Tool input/output schema,慢门第一版用平台 job handle+poll(MCP Tasks 只进 spike);A1 补 cancel contract(best-effort/hard、取消点、Chrome/子进程/模型中断、checkpoint、费用结算、D12 释放、幂等);A2.5 拆两层 = OTel GenAI span 映射 + 自研 **TraceLedger**(固定 cost/verdict/artifact/gate/schemaVersion,强关联 new-api quota 行);A13/Langfuse 分 read/write——运行时只拉**已批准版本**,prompt 与生成门阈值的版本切换走 GitOps 审批+eval+灰度+回滚(不 DB 热改),只运营开关 DB 热改
**④ 慢门 / cancel / trace / 配置的精修**:A7 先冻 MCP Tool input/output schema,慢门第一版用平台 job handle+poll(MCP Tasks 只进 spike);A1 补 cancel contract(best-effort/hard、取消点、Chrome/子进程/模型中断、checkpoint、费用结算、D12 释放、幂等);A2.5 拆两层 = OTel GenAI span 映射 + 自研 **TraceLedger**(固定 cost/verdict/artifact/gate/schemaVersion,强关联 new-api quota 行);A13 配置分 read/write——运行时只拉**已批准版本**,prompt 与生成门阈值的版本切换走审批+eval+灰度+回滚(不随手热改)、只运营开关热改;载体口径 **2026-07-01 反转**为 yudao 配置中心版本化 ⊕ Nacos 下发 ⊕ AgentScope per-POST 热重载(原 Langfuse 式 read 热取 + GitOps write 门退历史备选,详见 ADR-4)
**⑤ 自研面别低估**:adapter 的**护城河核心**只两块(checkpoint/续跑 + 验收门),但平台域契约 A3/A4/A4.5/A8/A9/A11/A12 + A13 落地仍是自研或待建(见 §三)——排期按真实自研清单,不按"只剩两块"。
@ -96,7 +96,7 @@ date: 2026-06-24
| MCP Tasks | SEP-1686 · 2025-11 引入 | experimental(无毕业表;缺 retry/expiry) | A7 慢门(仅 spike) | 自补幂等 + TTL;spike 对比平台 job-handle+poll |
| OTel GenAI semconv | OpenTelemetry 独立 semconv-genai 仓 · 1.40.0 | Development(span 语义稳定、整组非 stable) | A2.5 | 钉版本 + 隔离;**无 cost 属性 → TraceLedger 自研**;补 Anthropic 路成本录制 |
| SKILL.md | agentskills.io 开放标准 | 可即采 | A10 / 能力面 | — |
| Langfuse 热取 | OSS MIT 自托管 | 须隔离(调和 GitOps) | A13 | EE 锁 protected labels → 验 OSS label+GitOps 等效;先补一致性 CI |
| ~~Langfuse 热取~~(2026-07-01 反转退历史备选) | OSS MIT 自托管 | 不采(生态原生 yudao⊕Nacos 覆盖) | ~~A13~~ | 已由 yudao 配置中心版本化 ⊕ Nacos 下发 ⊕ per-POST 热重载取代,详见 ADR-4 |
| Agent Service / Workspace / MessageBus | agentscope 2.0.2 内置(源码实证;吸收自已归档 agentscope-runtime) | 可即采(已落 `mini-desktop:8200`) | 扩容(A1)/ 沙箱(A6) | DockerWorkspace 能否托管 CDP 九门 harness;跨机是否需独立 durable-engine |
| durable-execution(跨机) | Temporal(MIT)/ DBOS(OSS) | 范式 · future-state(跨机才需) | 扩容 | 跨机 run 调度/续跑是否真超出 Agent Service durable session |
| microVM 沙箱(远期) | E2B(via E2BWorkspace)/ 阿里云 AgentRun | future-state | 沙箱 | E2B 数据出境 / AgentRun 数据不出境·FC 锁·定价;Chrome+CDP under gVisor |
@ -140,17 +140,20 @@ date: 2026-06-24
位置 A2.5。关键:OTel `gen_ai.usage` 只有 token 数、**无 cost 属性** → 成本钉 new-api 计费行的自研口径必留。待验证:Development 非 stable → 钉版本 + 隔离;补 Anthropic 路(M3)成本录制变体。
**ADR-4 · 配置热取 → 采 Langfuse 式(自托管 OSS)**(read 运行时热取 / write 走 GitOps)
**ADR-4 · 配置热取 →(2026-07-01 反转)采 yudao 配置中心版本化 ⊕ Nacos 下发 ⊕ AgentScope per-POST 热重载**(原采 Langfuse 式,已退历史备选)
> **2026-07-01 创始人反转**:原判定(2026-06-24 双评审)是"采 Langfuse 式自托管 OSS 做 read 运行时热取、write 走 GitOps"。经生产基建 build-vs-buy 尽调(生产稳定优先于开发期省事)与配置控制面按 AgentScope 生态原生重推,配置口径收敛为三段协同:**game-cloud yudao 做治理与版本账本**——版本行落 MySQL,`huijing-module-infra` 作配置中心宿主、`huijing-module-bpm` 走审批;**Nacos 做运行时下发**——配置中心加服务发现,已随 RocketMQ、Sentinel 一并进 MVP 生产 runtime;**AgentScope 做 per-POST 热重载**——生成走 Service `/chat`,每次 POST 从存储现装配 agent 与 model,改完下一次生成即生效、零重启。Langfuse 式运行时热取退为历史备选、不在 MVP runtime。反转依据是配置控制面在飞的两档设计(`docs/agent-specs/` 下 2026-06-30「一次性按序实现」与 2026-07-02「阶段二 yudao 配置中心」,两档 sot-impact 均申报回写本 SoT);阶段〇 生产基建(Nacos/RocketMQ/Sentinel 自托管 mini-infra)与阶段一 护城河 middleware 已代码落地。下面这张 2026-06-24 的候选评估表保留作决策留痕。
| 候选 | 判定 |
|---|---|
| Langfuse 自托管(核心 MIT;prompt 版本不可变 + label 指针全 OSS) | 采 |
| yudao 配置中心(`huijing-module-infra` + `huijing-module-bpm`)⊕ Nacos ⊕ AgentScope per-POST | **2026-07-01 采**(现货优先、生态原生、生产稳定;版本账本落 MySQL 版本行 + 双路激活) |
| Langfuse 自托管(核心 MIT;prompt 版本不可变 + label 指针全 OSS) | ~~采~~**退历史备选**(生态原生 yudao⊕Nacos 已覆盖,不再引第三方热取件) |
| LangSmith | 排除(数据主权 + 许可) |
| 自研 GitOps 快照(现状) | 部分采纳(write 侧 GitOps);read 侧"改一条发版"反模式须叠热取 |
| 自研 GitOps 快照(现状) | ~~部分采纳~~ → GitOps 退为 config-as-code 可选,治理主路改 yudao 审批 |
| Spring Cloud Config | 排除(集成成本:无 prompt 版本/label/eval/灰度) |
| LaunchDarkly | 排除(数据主权 + 集成成本:SaaS、面向 flag 非 prompt) |
位置 A13。待验证:EE 锁 protected prompt labels → 验纯 OSS label + 外部 GitOps 门等效防误推 production;先补一致性 CI 再推广。**write 路细化(后期阶段)**:重要配置(关键 agent / 玩法模板 / 质量·安全)的发布走 **yudao 配置发布流程审批**(`huijing-module-bpm` + `huijing-module-infra` 现货、build-vs-buy 现货优先)= 受治理发版;GitOps 退为 config-as-code 可选,二者择一或并存留后期定
位置 A13。write 路(重要配置发布)走 yudao 配置发布流程审批(`huijing-module-bpm` + `huijing-module-infra` 现货、build-vs-buy 现货优先)= 受治理发版;read 路的运行时热配由 Nacos 下发加 AgentScope per-POST 现装配承担,不再依赖 Langfuse 的 label 指针机制。原 Langfuse 待验证项(EE 锁 protected labels、纯 OSS label 等效性)随该方案退历史备选一并作罢
**ADR-5 · 水平扩容 → 近期 2.0.2 Agent Service,跨机 durable-execution future-state**
@ -208,7 +211,7 @@ agentscope 2.0.2 内置 Workspace 三后端(源码实证 `LocalWorkspace` / `Doc
|---|---|---|---|---|
| **A1** | 生成任务协议 | `GenerationDispatcher.dispatch(job)->bool` 投递握手 + 回调边;`GenerationRequest{ brief, confirmedGoal, assetContext, tier(0/1/2), idempotencyKey }`;待建 `cancel(taskId)` / `progress(taskId)->status` | 现(dispatch 单方法 + 回调)+ 建(cancel / progress) | 采 A2A |
| **A2** | 生成状态 + checkpoint | `GenerationState{ traceId, phase/step, cur_iter, tasks_context, cost, checkpointId }`;续跑按 traceId 取 checkpoint,须显式传 checkpointId(saved_at 无 tiebreaker) | 现(SAA 侧)+ 建(显式 GenerationState v1) | 状态枚举采 A2A TaskState;**checkpoint / 续跑自研** |
| **A2.5** | 统一 trace 契约 | 平台 trace 信封`{ traceId, step, cost, verdict, ts + 扩展段:推理/动作/观察 }`;成本权威钉 new-api 计费行,trace 只携关联键、不让 agent 自报金额成账 | 建(不存在,反锁死链上最该先立) | 采 OTel GenAI semconv |
| **A2.5** | 统一 trace 契约 | 平台 trace 信封`{ traceId, step, cost, verdict, ts + 扩展段:推理/动作/观察 }`;成本权威钉 new-api 计费行,trace 只携关联键、不让 agent 自报金额成账 | 现·部分(`contracts/trace/` 两 schema 已立、tier2 `TraceAdapter` 真跑 647 事件 dropped=0;SAA 侧 adapter 待后端接线)——**便宜档已 Python 化后复用同一 adapter 落同一 schema** | 采 OTel GenAI semconv |
| **A3** | 源项目契约(tier2) | `tier2-source-project.schema{ projectType:'tier2-engine', fileTree, entry, buildProfile, depLock, contentHash(sha256), addressing }`;最小 keystone = projectType + contentHash + fetchById | 建(新立 schema,keystone 先行) | 自研(沿用 sha256 落库范式) |
| **A3.5** | 源项目版本寻址 | sourceHash 寻址 + versionId 版本化;改源重建产新版本、旧版本仍可取回 | 建(不存在) | 自研 |
| **A4** | 装载协议 | `game-host.d.ts`:`GameHostBootContext{ ctx, mainContext, canvas, seed, assets? }``GameInstance{ init, update(dt), render(g), onInput?, destroy }``GameHostFactory`;终态焊成可轮询 latch、宿主每帧轮询读 | 现(ECS-lite 左支)+ 建(tier2 右支) | 自研 |
@ -221,10 +224,16 @@ agentscope 2.0.2 内置 Workspace 三后端(源码实证 `LocalWorkspace` / `Doc
| **A10** | 玩法模板协议 | templateId 白名单(generic / business-sim / narrative / puzzle / trpg / heritage)+ prompt md + bundle 校验 schema;`getTemplateList()->TemplateRespVO`;模板 schema 与 A5 的 structureOk 耦合 | 现·部分(编译期常量)+ 建(结构 schema) | skill 采 SKILL.md;注册迁 A13 |
| **A11** | 试玩 / HITL 迭代 | 装载复用 A4;`StudioModify{ baseVersionId, mode:deterministic/regenerate-module, target, payload }`;判意图两段式(`/modify/plan` 判 → 前端确认 → `/modify` 执行)+ 两档执行 + 三断言(见 **§六**) | 现·便宜档代码完成(切片三,本机逐段真验)+ 建(受计费 e2e 待部署 / 复杂档随 tier2 / 整体重设计后期) | 自研 |
| **A12** | 通用检查门协议 | 提交侧(prompt 内容安全,fail-closed)+ 产物侧(体积门 / 逻辑扫描 / CSP),两时相、共用一道引擎无关门外壳 | 现·散三处 + 建(收成一门) | 自研 |
| **A13** | 配置注册表协议 | model / prompt / skill / mcp 四类统一注册;分流判据 = 影响生成质量/安全(prompt、生成门阈值)走 GitOps 四闸不可热改,运营降级开关/阈值走 DB 热改 | 建(代码侧零落地) | 采 Langfuse 式运行时热取 |
| **A13** | 配置注册表协议 | model / prompt / skill / mcp 四类统一注册;分流判据 = 影响生成质量/安全(prompt、生成门阈值)走受治理发版(yudao 审批)不可随手热改,运营降级开关/阈值走热改 | 建·部分(阶段〇+一① 已落地:Nacos/RocketMQ/Sentinel + 护城河 middleware;阶段二 yudao 版本层在飞) | (2026-07-01 反转)采 yudao 配置中心版本化 ⊕ Nacos 下发 ⊕ per-POST 热重载(见 ADR-4) |
| **C5** | PlaySpec 考卷契约(判分闭环 · 2026-07-03 Δ1 新立) | 游戏声明"怎么玩我以便判我":起局仪式、驱动器族、输入指令表、赢/输可观测量;`derivedFrom.sourceHash` 把考卷绑到源工程内容,源变即算陈旧、必须重生 | 现·schema + 校验器 + 负样本已立(`contracts/play-loop/play-spec.schema.json`)· 生产接线在途 | 自研(附机器校验器,Δ5 立宪) |
| **C6** | VerdictFeedback 判卷反馈契约(判分闭环 · 2026-07-03 Δ1 新立) | 每次未过门必带:哪道门 / 卡在哪个 phase(phaseNow)/ 判卷用哪个 driver / 证据指针(console·log·截图)/ 疑似失败面 / 修复方向类 | 现·schema + 校验器 + 负样本已立(`contracts/play-loop/verdict-feedback.schema.json`)· 生产接线在途 | 自研(附机器校验器) |
A8A13 这六面的共同状况:低档在生产里已把它们大多兑现,但都硬编码在单条 publish 链路上,从没抽成"各档生成 + 各发行渠道共用"的固定接缝。这一轮不是从零造协议,而是把已长出来、却埋在单线实现里的接缝形状抬出来固定,并诚实标出哪几段已兑现、哪几段还空白。
> **编号时机(2026-07-03 Δ9① 裁定 · 采注记、不删行)**:A8A13 这六面眼下多埋在单条 publish 的单线实现里、只有一个消费者。按 §3.1 原则五的 rule-of-three,单实现期它们不冻结为固定协议——现在把编号与形状抬出来是为了让接缝显形、可对账,但真正抬升为固定协议要等各自出现第二个消费者(第二档生成、第二条发行渠道、第二个合规实现……)才逐条来。在那之前,这六行是"方向性接缝"而非"已冻协议":行不删、形状可被第二实现反向修正。这条与 A6/A7 的 v1 directional 定级同理,是把"接缝按变更频率设"落到协议表层面。
表尾的 **C5/C6 是 2026-07-03 一次性裁决(Δ1)新立的判分闭环两契约**,编号沿用重推演差量档的 C 序、以别于既有 A 序。它们把此前埋在 harness 里的两处隐形约定钉成显式契约。考卷(C5)此前靠"取证 state 里有没有 `targets` 键"隐式选驱动器,又用"play-spec 已存在就不覆盖"兜底——源工程一旦改过,旧考卷还在,就拿上一版的卷子判新工程,要么假绿、要么错判。反馈(C6)此前是一整段中文字符串拼出来的,拼装里丢字段无声无息:最典型的是 latch 失败只读了 `after`、丢了 advisory 失败支才带的 `phaseNow`,续修 agent 于是不知道游戏卡在哪个阶段、只能盲修——这正是便宜档过门率一度卡低的根因之一。C5 把驱动器族、起局仪式、赢/输可观测量升为显式字段,并用 `derivedFrom.sourceHash` 把考卷绑到源工程内容,陈旧从此可判定;C6 把"卡在哪个阶段"升为一等字段、规定"报 latch 失败必带 phaseNow",从结构上堵死丢字段。两份都配零依赖机器校验器与正负样本(`contracts/play-loop/`,遵 Δ5"无校验器不算契约"),消费方是便宜档 `gate_judge` 与 tier2 的 `verdict_feedback`(F-1 反馈补厚对齐同一份 C6),生产接线随 W-S1 修复三单收口。两份 schema 都不编码 `tier` 枚举,档位差异靠"能力字段在不在"与 `ext` 扩展段表达(Δ9③),与 `contracts/trace/` 同纪律。
### 3.3 B 类:可插拔实现模块
B 类对接上面某几条 A 协议,换引擎 / 换框架 / 换渠道时被换掉。按四条轴组织。
@ -266,7 +275,9 @@ B 类对接上面某几条 A 协议,换引擎 / 换框架 / 换渠道时被换
**废弃路线 = gameDefinition(错误路线,已删)**:低档最初走的是 gameDefinition——便宜模型吐一份声明式结构化 JSON、运行时用 `new Function` 解释执行。2026-06-20 对抗式裁决揭穿了它名实不符:顶着"声明式结构化源"的名号,内核却是"声明式数据壳 + 一坨未受契约约束的自由 JS"(承载全部玩法逻辑的 `behavior.code` 根本没进契约),表达力被运行时焊死在四类几何色块玩具上、好玩好看无下限托底。**这条路已于 2026-06-21 判为错误路线、删除废弃**——不是"坚持做 Tier0",而是整条路被 A-model(写真 `src/`)取代。它的天花板正是 A-model 转向的由来。
**A-model 怎么补上天花板**:A-model 让 LLM 直接写真 `src/` 多文件、调 L2 十一插件(juice / gamefeel / palettePost 给手感卖相),逻辑与表现都不再被声明式数据壳焊死。所以 tier1 高质轻游戏的载体是 **L2 能力库 + L3 自由写**,产物就是真 `src/` 工程——与 tier2 同范式(LLM 写真 src/),只是引擎(LittleJS vs Phaser)与表现层复杂度档不同。这条把"轻量≠简单"落到工程上:轻量是用公共素材、玩法模板、工程模板低成本生成相对不复杂、又不易同质化的高质小游戏,不是产没人会玩的简单玩具。
**A-model 怎么补上天花板**:A-model 让 LLM 直接写真 `src/` 多文件、调 L2 十二插件(8 基元 + 4 编排:scene-fsm / hud-ui / session-score / timer-scheduler 编排,collision / physics-lite / particles-juice / gamefeel / palette-post / audio-music / save-progress / runtime-probe 基元,给手感卖相),逻辑与表现都不再被声明式数据壳焊死。所以 tier1 高质轻游戏的载体是 **L2 能力库 + L3 自由写**,产物就是真 `src/` 工程——与 tier2 同范式(LLM 写真 src/),只是引擎(LittleJS vs Phaser)与表现层复杂度档不同。这条把"轻量≠简单"落到工程上:轻量是用公共素材、玩法模板、工程模板低成本生成相对不复杂、又不易同质化的高质小游戏,不是产没人会玩的简单玩具。
**运行时载体(2026-07-03 更新):这一档的生成核心已整条 Python 化。** 早期便宜档编排跑在 Node 上(amodel-gen 的 `gen.mjs` ReAct 循环);2026-06-26 起核心重写进 Python、与富档共用同一套 AgentScope 编排——`cheap_studio.py` 是命令行入口(lab 工具、单机直跑),`cheap_service_app.py` 建独立的 AgentScope Agent Service 壳(`build_cheap_app`,生产入口,已归并进 Service `/chat`),两者大面积复用 tier2 的 `worker` 包:配置门面、三道中间件、门判 `gate_judge`、观测 trace 全是同一份。所以"三档同构跑 AgentScope"不是口号——便宜档与富档在框架层是同一块地基,差别只在引擎、写白名单宽窄与预算档。"Node 退役"要拆两半说清、别照旧文找错承重墙:**Node 的 ReAct 编排层(`gen.mjs`)已退为 A/B 对照基线**(`compare_node` 拿它对照 Python 路是否等价、非生产路);但 **Node 的工具与九门执行层仍是活地基**——`tools.mjs`(node --check、静态门与两条形状门、build)、`serve-and-play.sh``play.cdp.cjs`(九门 CDP 真玩)都由 Python 经 shell-out 调用。九门真玩判定这套引擎无关的确定性资产仍跑在 Node/CDP 上,Python 只换了编排的脑子、没换判卷的手,"Node 已验过不误伤的形状门便宜档自动继承、零口径漂移"。
![图 · 廉价线端到端闭环](assets/09-廉价线端到端.svg)
@ -280,7 +291,7 @@ B 类对接上面某几条 A 协议,换引擎 / 换框架 / 换渠道时被换
**运行时真实结构**:核心是 **Agent——无状态 ReAct 引擎**,构造参数持有 model(M3)/ toolkit / middlewares / state。**Workspace 是执行环境,沿两轴注入 Agent**:工具 / MCP / skills 经 Toolkit 注入,本身作 offloader。所以 Agent 持有 Workspace 引用、不嵌在里面;真正"跑在 Workspace 里"的是 MCP 进程、skills、文件。**Agent 实例非常驻**——每 run 现组装、跑完即弃,状态全在可持久化 `AgentState{ context, cur_iter, tasks_context }`
**这条线的核心已落、0 号 spike 已 accept(2026-06-24)。** M3 自治写出的面包店经营合成富游戏 `feie-005` 跑到 `decision=accept`——9 道 L1 门 + 富游戏三门(三联动/经济/latch)全过、`finished=True`、无熔断,约 20K/36K tokens(+508K 缓存)、墙钟约 610s,服务化已部署到 `mini-desktop:8200`。但这是 **首次机制验证(跑通一款)、不是结论**下一步用**收敛环**验证更多款:并发跑 5 个,有错误(>1)就读日志、分析、修复,再并发追加一次 5 个,收敛即止——**不做 n≥30 统计批跑**。批跑底座(便宜档 client + RunRecord 采集 + 退路树判定器 + 批跑矩阵)已就位,跑的就是这个 n=5 收敛环。判断 = **go(留观微调)**:M3 一旦被机器门挡在正确契约上,有能力自治写出过全门的多系统富游戏、还能据 verdict 反馈自调平衡;但收敛**强依赖机器门把每类契约违规变成响亮可修反馈**——spike 靠拆掉四个真问题、每个补成机器门才收敛(详见 §5.3/§5.4),纯放开 ReAct + 软约束 prompt 不行。spike 只跑了阶段 2 单写;阶段 1 工作室 Agent Team 按 plan 决策⑤ 留 Phase B(下文 §5.5)。锁 AgentScope 2.0.2。
**这条线的核心已落、0 号 spike 已 accept(2026-06-24)。** M3 自治写出的面包店经营合成富游戏 `feie-005` 跑到 `decision=accept`——9 道 L1 门 + 富游戏三门(三联动/经济/latch)全过、`finished=True`、无熔断,约 20K/36K tokens(+508K 缓存)、墙钟约 610s,服务化已部署到 `mini-desktop:8200`。但这是 **首次机制验证(跑通一款)、不是结论****收敛环已于 2026-06-28/29 真跑,结论是 conditional——不是早稿预期的 go。** 它按"一批 5 款/轮"跑 M3-only(不做 n≥30 统计批跑),末轮失败 ≤1 即判收敛,不收敛就读日志、补机器门或收窄可写面、再追加一轮。真跑坐实了半个好消息:M3 一旦被机器门挡在正确契约上,确实有能力自治写出过大多数门的多系统富游戏。但它**自调"赢的条件"与"经济平衡"不稳**——约 1-2/5 会在这一面反复试错、thrash 到步数上限。创始人据此裁定:**瓶颈在 agent 层的 win-balance、不在工具层**,卡住时的退路(换强模型)也定在 agent 层、而非批级整线换档。又因为网关当前没有可对照的强档(Opus/Fable/GLM 调用返 503),M3 全线不收敛这一支只能记 conditional no-go、待强档上线复测,不算工具层被证伪。所以这条线准确的成熟度是"机制成立、收敛待定",别据早稿"go(留观微调)"的措辞误判为已 go。收敛**强依赖机器门把每类契约违规变成响亮可修反馈**——spike 靠拆掉四个真问题、每个补成机器门才收敛(详见 §5.3/§5.4),纯放开 ReAct + 软约束 prompt 不行;真跑之后又落了 **F-1 反馈补厚**——经济门失败时把两条路的三个数值证据与结构性错配直接写进反馈、H 门附断言清单,把"响亮可修"再加厚一层(记在质量 canonical,见 §5.4 末)。批跑底座(便宜档 client + RunRecord 采集 + 退路树判定器 + 批跑矩阵)已就位。spike 与收敛环都只跑了阶段 2 单写;阶段 1 工作室 Agent Team 按 plan 决策⑤ 留 Phase B(下文 §5.5)。锁 AgentScope 2.0.2。
tier2 这条线另有一套总览图,与 §5 各 facet 的细化图互补:
@ -300,7 +311,7 @@ tier2 这条线另有一套总览图,与 §5 各 facet 的细化图互补:
## 五、运行时八面(facet)
> 八个 facet 是 §四 生成实例的逐面放大,把各档在每一面的设计讲到可照着实现的颗粒度。最高深度档(tier2 富游戏)的内容偏多——**它的核心已落、0 号 spike 已 accept**(各面"现/建"按 2026-06-24 `tier2/HANDOFF.md` 真相标注:多数已落,留后的是更多款的收敛环验证(n=5、有错追加 5)、阶段 1 Agent Team、控制面/管理面);低档在每一面以现行已落的对照锚出现。各面引用的 svg 大图在 `assets/`——**已按 2026-06-25 reframe 重绘**(tier2 核心已落标实线、框架统一 AgentScope、旧「两线 / SAA 廉价线 / 超休闲」口径已清),与各面散文的「现 / 建」口径一致。
> 八个 facet 是 §四 生成实例的逐面放大,把各档在每一面的设计讲到可照着实现的颗粒度。最高深度档(tier2 富游戏)的内容偏多——**它的核心已落、0 号 spike 已 accept**(各面"现/建"多数已落;收敛环已 2026-06-28/29 真跑判 **conditional**——瓶颈在 agent 层 win-balance,见 §4.2;留后的是 win-balance 攻坚、Redis durable session 跑通、控制面/管理面完整接入,阶段 1 Agent Team 已提前落地);低档在每一面以现行已落的对照锚出现。各面引用的 svg 大图在 `assets/`——**已按 2026-06-25 reframe 重绘**(tier2 核心已落标实线、框架统一 AgentScope、旧「两线 / SAA 廉价线 / 超休闲」口径已清),与各面散文的「现 / 建」口径一致。
### 5.1 运行时形态
@ -316,7 +327,7 @@ tier2(最高深度档)的运行时按 AgentScope 2.0.2 的真实对象结构落
多 agent 协作走部署态的 **Agent Team** 星形(leader 用 `TeamCreate` / `AgentCreate` / `TeamSay` 调度 worker),不是进程内 pipeline——2.0.2 已删掉进程内的 MsgHub / pipeline 那套同步编排原语。任务目标与进度的承载也对齐这套结构:目标 = 输入(brief / play_spec / GDD),进度 = `AgentState.tasks_context` 逐项用 `TaskCreate` / `TaskUpdate` 追踪,像一份 todo 清单,没有预先画死的 workflow DAG。
> **现 / 建(2026-06-24 spike 后)**:Agent Service、MessageBus、AgentState + StorageBase、Workspace 三实现是 2.0.2 现成件(已逐条核源码)。tier2 的非常驻装配、本地 runner、注入工具集、自建硬熔断、`Tier2TraceMiddleware`**已落并经 feie-005 accept**,服务化已部署 `mini-desktop:8200`。**两处早稿错已纠**:① "官方预算软刹 `ReplyBudgetControlMiddleware`"——2.0.2 源码核验该类不存在,tier2 用自建 `on_system_prompt` + 硬熔断替代;② 多轮不是"搬进 Agent 内部"——纯内部 ReAct 过早放弃,实际是内部单轮 + 有界外层 resume 续修(见 §5.3)。待:每轮 checkpoint 落 Redis 的完整 durable session(决策②起步只本地 runner)、阶段 1 Agent Team(留 Phase B)、SandboxDriver 选型。
> **现 / 建(2026-07-03 更新)**:Agent Service、MessageBus、AgentState + StorageBase、Workspace 三实现是 2.0.2 现成件(已逐条核源码)。tier2 的非常驻装配、本地 runner、注入工具集、自建硬熔断、`Tier2TraceMiddleware`**已落并经 feie-005 accept**,服务化已部署 `mini-desktop:8200`。**两处早稿错已纠**:① "官方预算软刹 `ReplyBudgetControlMiddleware`"——2.0.2 源码核验该类不存在,tier2 用自建 `on_system_prompt` + 硬熔断替代;② 多轮不是"搬进 Agent 内部"——纯内部 ReAct 过早放弃,实际是内部单轮 + 有界外层 resume 续修(见 §5.3)。**三处状态按真跑核准降准**:checkpoint 的落地形态是**每次外层 resume 快照三字段工作记忆到本地 JSON**(`work_memory`),不是设计意图里的"每轮落 Redis durable session"——后者已编码、真跑未验证(收敛环显式走本地 runner);Agent Service 的**服务壳已编码**(`create_app` 建 FastAPI app + RedisStorage/MessageBus + admin 只读三路由 `/control/roles`·`/traces`·`/cost`,正是 §5.2 phase-1 的最小切片),但服务态的生成主链尚未完整落位、真跑未验证——准确状态是"已编码、真跑未验证",既非"待"、也不写"已落";**阶段 1 工作室 Agent Team 已从 Phase B 提前落地**——`design_team` 以 worker-as-tool 摆出四专家星形,studio 与批跑**默认开启**(`use_team=True` / `do_design=True`)。仍待:Redis durable session 完整跑通、SandboxDriver 选型。
![图 A1 · Agent Service 与 session 三路径](assets/t2-A-01-AgentService与session三路.svg)
![图 A2 · Agent 非常驻与 AgentState](assets/t2-A-02-Agent非常驻与AgentState.svg)
@ -329,15 +340,15 @@ tier2(最高深度档)的运行时按 AgentScope 2.0.2 的真实对象结构落
各档生成共用一层治理面——让 agent 自治生成游戏还不够,平台还得能配置它(改 prompt、换模型、调 skill 不发版)、看见它(每次生成到底发生了什么)、审计它(谁改了哪条配置)、在入口拦住它(配额、并发、降级)。这就是创始人最早提的"像 Dify 一样可视化、可追踪、可审计地管 agent 平台"。控制面四个组件对各档暴露同一套契约(读配置、写轨迹、过门),生成线只照契约办事、不感知管理面长什么样。
**配置注册表**是配置的唯一事实源,回应"改 prompt、模型、skill、mcp 还要重新部署"那句话:凡是现在"要改就得发版"的东西,都搬进一个版本化、可回滚的注册表,节点是 prompt、model、skill、tool、mcp 五类。这里有一处必须诚实的现状——今天的 prompt 注册表**不是热加载地基**,而是构建期被 maven 插件复制进 classpath 的快照,改一条 prompt 等于改原文件、升版本号、过四道闸,下次构建部署才带新版。这正是 §二对标判定的反模式。**目标态是采 Langfuse 式的运行时热取**:注册表按 `id@label` 在运行时取、带缓存 TTL 与后台刷新、取不到回落内置默认,配置当数据热改、不重新构建部署。tier2 那条 Python 线的 genconfig 已经是这个思路的雏形,要把它推广到后端主线。但推广前有一条硬纪律:别在裂的地基上盖更大的注册表——先补一道一致性 CI(注册表里每条配置都有对应文件、每个硬编码加载的 id 都登记、占位条目要么补正要么标为不可上线),地基自洽了推广才有意义。prompt 这一类的完整治理(第 8 契约、四道闸、HITL、热取加载)是独立 SoT,见 [`prompt治理.md`](prompt治理.md)。
**配置注册表**是配置的唯一事实源,回应"改 prompt、模型、skill、mcp 还要重新部署"那句话:凡是现在"要改就得发版"的东西,都搬进一个版本化、可回滚的注册表,节点是 prompt、model、skill、tool、mcp 五类。这里有一处必须诚实的现状——今天的 prompt 注册表**不是热加载地基**,而是构建期被 maven 插件复制进 classpath 的快照,改一条 prompt 等于改原文件、升版本号、过四道闸,下次构建部署才带新版。这正是 §二对标判定的反模式。**目标态(2026-07-01 反转后)是生态原生的三段配置面**:治理与版本账本落 game-cloud 的 yudao 配置中心(版本行进 MySQL、`huijing-module-infra` 作宿主、`huijing-module-bpm` 走审批),运行时下发交 Nacos(已随 RocketMQ、Sentinel 进 MVP 生产 runtime),生成侧的 prompt 与 model 参数由 AgentScope 的 per-POST 热重载现装配——生成走 Service `/chat`,每次 POST 从存储取当前已激活版本、现装配 agent 与 model,改完下一次生成即生效、零重启。这取代了早稿"采 Langfuse 式按 `id@label` 运行时热取"的口径(退为历史备选、不在 MVP runtime)。tier2 那条 Python 线的 genconfig 已是热配雏形,阶段二把它的读取后端从本地 yaml 提升到 Nacos。但推广前有一条硬纪律不变:别在裂的地基上盖更大的注册表——先补一道一致性 CI(每条配置都有对应文件、每个硬编码加载的 id 都登记、占位条目要么补正要么标为不可上线),地基自洽了推广才有意义。prompt 这一类的完整治理(第 8 契约、四道闸、HITL、热取加载)是独立 SoT,见 [`prompt治理.md`](prompt治理.md)。
**观测 / 审计仓**回答两个独立问题:运行轨迹(每步推理、每次工具调用、每道门裁决、每次成本,落统一 trace 契约,详见 §5.7)和配置审计日志(谁、何时、改了哪条配置、前后 diff——这条线现在完全没有、是全新建的)。配置改动按性质分流:prompt、models 这类版本化资产走 GitOps(改配置就是建 PR,审计天然、可回滚),运营开关类(降级、配额数值)走 DB 直写、即时生效、复用现成通路。这条分流判据正是 A13 配置注册表最该先定的核心——影响生成质量与安全的配置走 GitOps 四闸不可热改,运营降级开关与阈值走 DB 热改
**观测 / 审计仓**回答两个独立问题:运行轨迹(每步推理、每次工具调用、每道门裁决、每次成本,落统一 trace 契约,详见 §5.7)和配置审计日志(谁、何时、改了哪条配置、前后 diff——这条线现在完全没有、是全新建的)。配置改动按性质分流:prompt、model 参数这类影响生成质量与安全的版本化资产走**受治理发版**(yudao 配置中心的版本行加审批流,改配置提交变更、审批通过才激活,审计天然、可回滚),运营开关类(降级、配额数值)走热改、即时生效、复用现成通路。这条分流判据正是 A13 配置注册表最该先定的核心——影响生成质量与安全的配置走受治理发版、不可随手热改,运营降级开关与阈值走热改。早稿此处写"走 GitOps 四闸",2026-07-01 反转后治理主路改 yudao 审批发版,GitOps 退为 config-as-code 可选
**D12 运行治理门**把配额、并发、背压、降级、记账骨架焊在生成任务入口前,是已存在的件,本设计只复用、默认关闭、零行为变更进主干。它现在只覆盖廉价线,tier2 接进来的入口、预算扣减、并发释放、失败补偿还要补。它接上的是引擎那道"花到上限就拒绝执行"的预算闸,而成本强制是三层纵向叠、任一道先到上限即拦:worker 本地预测闸(动手前先估这一步要花多少,越本局预算就不发起调用,最便宜、调模型之前就拦)、网关配额闸(就是 D12)、任务 deadline 闸(超墙钟时间盒即停,兜住 token 没烧穿但卡在长循环的纯耗时失控)。**预算闸的硬上限按 AI 参与深度分档钉死**:低深度档一次生成 < ¥10、最高深度档 < ¥50,图像与音乐生成各走独立预算线、不计入这两个上限(初期"拉高、给足探索空间"的口径——对比 tier2 富游戏 spike 实测仅 ¥1.29;数字红线来源=创始人 2026-06-25,失效=单位经济或模型单价大变即复审)。取价通路不可达时要显式定一条策略——直接失败、宁停不超支,或降级到纯 token 上限兜底,不留模糊。这套三层强制落地之前,tier2 只在严格时间盒的实验里跑、绝不规模化。
**D12 运行治理门**把配额、并发、背压、降级、记账骨架焊在生成任务入口前,是已存在的件,本设计只复用、默认关闭、零行为变更进主干。它现在只覆盖廉价线,tier2 接进来的入口、预算扣减、并发释放、失败补偿还要补。它接上的是引擎那道"花到上限就拒绝执行"的预算闸,而成本强制是三层纵向叠、任一道先到上限即拦:worker 本地预测闸(动手前先估这一步要花多少,越本局预算就不发起调用,最便宜、调模型之前就拦)、网关配额闸(就是 D12)、任务 deadline 闸(超墙钟时间盒即停,兜住 token 没烧穿但卡在长循环的纯耗时失控)。**预算闸按 AI 参与深度分档、且是两段式(2026-07-02/03 创始人裁定)**:软停线 = 低深度档一次生成 ¥10、最高深度档 ¥50——越线不断链、只许收尾类动作(finish / 构建 / 跑门)、交尽力产物;硬地板 = 软停线 ×1.5(¥15 / ¥75)——与轮数、墙钟任一先到即停,保证软停之后 ¥ 上界数学上封死。图像与音乐生成各走独立预算线、不计入这两个上限(初期"拉高、给足探索空间"的口径——对比 tier2 富游戏 spike 实测仅 ¥1.29;数字红线来源=创始人 2026-06-25,两段式 2026-07-03 裁定,失效=单位经济或模型单价大变即复审)。取价通路不可达时要显式定一条策略——直接失败、宁停不超支,或降级到纯 token 上限兜底,不留模糊。这套三层强制落地之前,tier2 只在严格时间盒的实验里跑、绝不规模化。
**管理面 UI** 是注册表与观测仓的视图与编辑器,不是真相本身——配置才是真相。它不从零造一个 Dify 式可视化建图器,因为裸图的节点是 Java 代码、ReAct 的工具也是代码,真相在代码与配置里,靠 UI 拖拽生成代码是另一套不可靠的范式。但"配置驱动地建并部署一个 agent"这件事 **AgentScope Service 原生就给**:`/agent` 全 CRUD + `GET /agent/schema`(返回 agent 配置表单的 JSON Schema、专给配置 UI 用)——填表单(身份 / 模型 / 上下文 / 选哪些已注册的 skill·tool)→ `POST /agent` → Service 注册上线该 agent。管理面 phase-1 的配置管理直接建在它上、不用自造,这是统一到 AgentScope 的一个红利(SAA 裸图无此能力、只能配置值热取);但能配的永远是"选已注册的能力",新工具 / 新拓扑两边都得写代码、不拖拽生成。还要分清两种"发布":**非关键配置**(运营开关、非关键 agent 装配)经 `/agent` CRUD 或热取即时生效、**不重新部署服务代码**;但**重要配置**(关键 agent、关键玩法模板、质量与安全配置如 prompt 正文与生成门阈值)的发布**必须走配置发布流程审批**——它影响生产环境的稳定与质量,所以即便不重新部署服务代码,也是一次**受治理的「发版」**:提交变更 → 审批 → 通过才发布。这道审批发布**复用 game-cloud 现成的 yudao 能力**(`huijing-module-bpm` 工作流 + `huijing-module-infra` 配置管理),不自研(build-vs-buy 现货优先),**后期阶段做**。但"配置是真相、UI 是视图"不等于第一期什么都不做,管理面按三档诚实命名地落:phase-1 是配置管理加运行可观测(含一个纯只读、不依赖任何前置、立刻能给创始人看见的最小切片——看各角色当前用什么模型、回放任意一次生成的全轨迹、按 new-api 口径对账成本;其上再加配置编辑,改完落 Git 加审计、不直接热生效),phase-2 是限定范围的图编辑(节点启停、参数、版本 diff、轨迹回放,但渲染的拓扑来自运行时自报、不让用户拖拽改结构),phase-3 是完整可视化建图(拖拽改拓扑,远期不投)。一条贯穿约束:管理面对拓扑只渲染框架运行时自报的结构,绝不在管理面这侧另持一份拓扑模型——廉价线是静态图、tier2 的 ReAct 没有静态图,两套异构范式用同一个管理面,只能靠"渲染运行时自报"这个共同口径,而硬编码的拓扑模型在换框架时反而成为阻力。这也是反锁死(§一)在管理面的落点。
> **现 / 建(2026-06-24)**:D12 现行已落(默认关闭,在 SAA Java 后端);配置注册表是"现·部分"(prompt 构建期快照),热取、推广到 skill/tool/mcp、配置审计日志、管理面三 phase 待建。tier2 侧 `genconfig` 热配已落(雏形);控制面/管理面对 tier2 的接入(D12 入口、管理面 UI)按 plan 决策⑤ 留 Phase B
> **现 / 建(2026-07-03 更新)**:D12 现行已落(默认关闭,在 game-cloud 后端);配置口径 2026-07-01 反转为 yudao 配置中心版本化 ⊕ Nacos 下发 ⊕ AgentScope per-POST 热重载(取代早稿的 Langfuse 式热取 + GitOps 四闸)。**已代码落地**:阶段〇 生产基建(Nacos / RocketMQ / Sentinel 自托管 mini-infra、game-cloud 已接入)、阶段一 护城河 middleware(统一门判 GateJudgment + 续修 RepairMiddleware + 软预算软停)、cheap-worker 归并 Service `/chat`;AgentScope 原生 per-POST 现装配是生成侧热配的现成机制。**在飞 / 待建**:阶段二把 `genconfig` 读取后端从本地 yaml 提升到 Nacos、yudao 配置中心版本层与双路激活、配置审计日志、管理面三 phase。控制面/管理面对 tier2 的完整接入(D12 入口、管理面 UI)按 plan 决策⑤ 仍在推进
![图 B1 · 控制面四组件](assets/t2-B-01-控制面四组件.svg)
![图 B2 · 反锁死五协议](assets/t2-B-02-反锁死五协议.svg)
@ -354,11 +365,13 @@ tier2(最高深度档)的运行时按 AgentScope 2.0.2 的真实对象结构落
**为什么把多轮放进 Agent 内、而不是外层**:tier2 与低档 WG1 的真正差别不在 prompt、不在生成域,而在"多轮自治放在哪一层"。WG1 是 `ReActConfig(max_iters=1)` 单轮加外层 repair 重试——单写、单轮、靠外层喂错重跑;它故意单轮,是早期为压便宜档单价的做法——当时怕 AgentScope 框架的 token 膨胀吃掉便宜档薄利润。但单次预算抬到低深度档 < ¥10 后这条约束放松了,三档已统一改用 AgentScope 编排;WG1 单轮省 token 的优势退为 SAA 远期适配时的备选,不再是"不引 AgentScope"的理由(见 §一、§5.2 预算闸)。tier2 原打算把多轮搬进 Agent 内部 ReAct(放开 max_iters),但 **0 号 spike 实测推翻了"纯内部多轮"**:AgentScope 2.0.2 原生 ReAct 一旦模型产出"无 tool_call 的纯文本回合"就退出,M3 调一次 run_gates 看到 fix 就收尾、根本没续修——纯自治 ReAct 会过早放弃。**修法是回归 wg1 的"有界外层 resume"范式**:编排层(`studio.py`)在 agent 停下后,若没真 finish、门没绿、还有预算,就带 verdict 失败反馈再 reply(跨 reply 保留 memory = 原地续修),上限 6 次,外加 finish 门(门没绿不许 finish)。所以"多轮放哪一层"的最终答案不是"搬进 Agent 内部",而是"内部 ReAct 单轮 reason→act + 有界外层 resume 续修",即 wg1 外层 repair 范式从单轮放到多轮。参照系是 WG1 单轮加外层 repair(现行已落)与 A-model 在 M3 上跑通的多轮 ReAct。从 A-model 复用三件成熟范式——agent 自己 reason 判"够了"才终止的 done 门(不靠外层固定轮数,finish 工具收尾吐出 `src/` 源工程)、每轮先跑便宜检查再决定下一步的快反馈、以及把历史压缩了喂下一轮的长程一致性(多文件富游戏轮数多、上下文长,压缩才不撑爆窗口)。fork 起步、独立演进:它复用的框架接缝在 2.0.2 全兼容、零签名改,但拖的 validate / run / prompt / roles 是 LittleJS 专属,按 Phaser 重写近乎全新写——真功夫在重写面加 net-new 的多轮循环、Workspace、Service。
**四道熔断加预算闸**叠在中间件洋葱上,任一先触发即停本局:步数硬顶(给每系统的构建-修复定上限、给整局定 max_iters,防模型靠多轮反复试错把门擦边混过去)、预算闸、卡死探测(语义层判 agent 是否原地打转、空转换汤不换药,而非单纯计步;还要防 agent 改 driver 来绕过它)、双层超时(单步钉死一次工具调用、整局钉死本局总时长)。这套熔断 tier2 是**自建的、且实际比"软刹"强**——要纠一处早稿错:早稿把"官方 `ReplyBudgetControlMiddleware` 软刹"当现成件,但 2.0.2 源码核验**该类根本不存在**;tier2 用自建的 `on_system_prompt` 变换钩子 + 中间件洋葱上订阅模型调用结束事件的硬熔断替代,把 token 按 new-api 计费口径折成 ¥ 累进、越过硬上限就 fail-closed 直接终止本次生成(spike 实测 60/80 轮硬熔断兜底已落,比"软刹优雅收尾"强)。这道硬闸的三层强制架构见 §5.2。
**续修原语的落点在 2026-07-01/02 又前进了一步(护城河 middleware 线)。** 上面讲的"有界外层 resume"是 spike 期的形态——编排层(`studio.py`)在 agent 停下后,判断没真 finish、门没绿、还有预算,就带 verdict 失败反馈再 reply 一次。护城河续修把它从编排层外挂**迁进了 `on_reasoning` 的 RepairMiddleware**:整局在**单次 POST 内**于 finish 点拦截——agent 想 finish 时,middleware 独立重跑门,没绿就压制这次 finish、把结构化反馈注入同一会话让它接着修,不再每轮重开 POST。这条是**生产主路**,便宜档 Service 与富档共用同一份 RepairMiddleware。tier2 本地 runner 的 `studio.py` 外层 resume 仍然并存(收敛环就走它),作为 fallback 形态——两套语义一致(都是"门没绿加有预算就带反馈续修、门始终是 judge 纯代码判"),差别只在拦截点:一个在 POST 内的 finish 处,一个在 POST 外的编排层。同文件头注释曾写"不再外层 repair",与它自己 400 行开外的外层 resume 代码相左,随本轮一并纠正。
**四道熔断加预算闸**叠在中间件洋葱上,任一先触发即停本局:步数硬顶(给每系统的构建-修复定上限、给整局定 max_iters,防模型靠多轮反复试错把门擦边混过去)、预算闸、卡死探测(语义层判 agent 是否原地打转、空转换汤不换药,而非单纯计步;还要防 agent 改 driver 来绕过它)、双层超时(单步钉死一次工具调用、整局钉死本局总时长)。这套熔断 tier2 是**自建的、且实际比"软刹"强**——要纠一处早稿错:早稿把"官方 `ReplyBudgetControlMiddleware` 软刹"当现成件,但 2.0.2 源码核验**该类根本不存在**;tier2 用自建的 `on_system_prompt` 变换钩子 + 中间件洋葱上订阅模型调用结束事件的硬熔断替代,把 token 按 new-api 计费口径折成 ¥ 累进。**¥ 越限的行为在 2026-07-02/03 定为两段式(创始人裁定,起因是护城河续修不该被预算硬闸旁路)**:先是**软停线**(便宜档 ¥10 / 富档 ¥50)——越线不断链,设软停标记、经 `on_system_prompt` 强提醒 agent 基于当前工程状态尽快 finish 交尽力产物,只许收尾类动作(finish、构建、跑门),禁新增大额生成调用,给续修留活路;再是**硬地板**(软停线 ×1.5 = 便宜档 ¥15 / 富档 ¥75)——它与轮数、墙钟两道闸任一先到即停,保证软停之后 ¥ 上界数学上仍封得死("软停不等于无界")。**档位行为分叉**:soft 档(tier2 与便宜档 Service 路)走上面这套软停;hard 档(便宜档 CLI 及默认)仍是越限即 fail-closed 抛熔断、守 ¥ 硬地板(spike 实测 60/80 轮硬熔断兜底已落)。生产 Service、CLI、本图说三处取值统一。这道预算闸的三层强制架构见 §5.2。
**M3 的接法**是这条线能不能成的根因之一。tier2 agent 经官方 `AnthropicChatModel``AnthropicCredential.base_url`(指向 new-api 的 Anthropic 端点),到 MiniMax-M3,计费统一从 new-api 一个平面走。"用对 M3"是三件事:走 Anthropic 原生协议加 agentic 工具循环(循环调工具写源 / build / 跑门 / 读 verdict / 改,而不是 OpenAI 式单次 JSON 填空);thinking 分离(开 thinking,且 max_tokens 须严格大于 thinking_budget);完整 response 与历史保留(每轮的 thinking / text / tool_use 块原样回传入历史,否则 M3 的交错思维失效)。旧用法 60% 失败的最深根因正是反着来——关 thinking、单次 JSON 填空、失败从头重生成,是用法错、不是模型天花板。
> **现 / 建(2026-06-24 spike 后)**:本面核心**已落并经 feie-005 accept**——M3 Anthropic 接法链路、有界外层 resume + finish 门、自建硬熔断(非官方软刹,该类 2.0.2 不存在)、写源/改/快检/跑门内循环都已跑通;`max_tokens > thinking_budget` 启动校验、`RecordingChatModel(Anthropic)` 成本取证已落。待:更多款收敛环验证(n=5、有错追加 5)、把偏脆的文本契约检查(play-scene 工厂结构)做成更稳的结构化校验。
> **现 / 建(2026-07-03 更新)**:本面核心**已落并经 feie-005 accept**——M3 Anthropic 接法链路、有界外层 resume + finish 门、自建硬熔断(非官方软刹,该类 2.0.2 不存在)、写源/改/快检/跑门内循环都已跑通;`max_tokens > thinking_budget` 启动校验、`RecordingChatModel(Anthropic)` 成本取证已落。**续修原语已迁进 `RepairMiddleware`**(护城河 middleware 线,2026-07-01/02 已代码落地,单 POST 内 finish 点拦截续修,便宜档 Service 与富档共用),外层 resume 在本地 runner 路并存。**预算两段式**:软停(`soft_budget` 档,tier2 与便宜档 Service 走)已落;硬地板 ×1.5 的显式公式为 2026-07-03 裁定、待实施(W-ARCH②);便宜档 CLI 仍走 hard fail-closed。**收敛环已真跑判 conditional**(见 §4.2)。待:agent 层 win-balance 攻坚、把偏脆的文本契约检查(play-scene 工厂结构)做成更稳的结构化校验。
![图 C1 · 单写 ReAct 循环](assets/t2-C-01-单写ReAct循环.svg)
![图 C2 · M3 原生接法](assets/t2-C-02-M3原生接法.svg)
@ -373,7 +386,7 @@ tier2(最高深度档)的运行时按 AgentScope 2.0.2 的真实对象结构落
L1 的主体是九门,每门在真浏览器里真玩一局取确定性证据:A_boot(能否 boot,轮询 boot 信号)、B_uncaught(有无未捕获异常,监听 console 与 CDP 错误)、C_frame(帧在不在推进,前后取帧号差大于零)、D_render(画面有无真实内容,截图回读亮像素阈值)、E_live(画面在不在变,对多帧取哈希去重)、F_wiring(逻辑真调引擎还是空桩,查引擎 API 调用有没有出现)、G_input(注入输入后状态有无变化)、H_progress(核心机制有无真进展,driver 驱动加玩后断言、含 latch 终态)、I_control(控制响应跟不跟手,输入到反应的时序在阈值内)。九门里只有 H_progress 落 L2,其余落 L1;E_live 与 H_progress 是条件门(没有 driver 时降为 advisory),其余是硬门。九门全绿等于机制地板通过、可发——把"做完了"钉在客观证据上,绝不让模型自评。
现有九门是为低档的 LittleJS 建的,探针钩子硬编码了 LittleJS 专属取法。tier2 复用的是"真玩判定加零自评"这套哲学、**不是**这套代码,探针要为 Phaser 整套重写——canvas 选择器、帧源、boot 信号、输入注入与 state 读取四条钩子各自重写,不是参数化一键切。沙箱底座是 spike 的前置阻断项:agentscope-runtime 独立仓已归档、能力并入 2.0.2,所以先小验 agentscope 2.0.2 内置 Workspace 的 Docker 后端能否托管这套 CDP 探针(它是 MCP-gateway 工具沙箱、不直接暴露 CDP),够就用、不够回落自建 Docker 薄沙箱复用现有 harness——这个结论必须在生成迭代开跑前出来,出不来整个 spike 跑不起来
现有九门是为低档的 LittleJS 建的,探针钩子硬编码了 LittleJS 专属取法。tier2 复用的是"真玩判定加零自评"这套哲学、**不是**这套代码,探针要为 Phaser 整套重写——canvas 选择器、帧源、boot 信号、输入注入与 state 读取四条钩子各自重写,不是参数化一键切。沙箱底座曾被列为 spike 的前置阻断项:agentscope-runtime 独立仓已归档、能力并入 2.0.2,原打算先小验 agentscope 2.0.2 内置 Workspace 的 Docker 后端能否托管这套 CDP 探针(它是 MCP-gateway 工具沙箱、不直接暴露 CDP),够就用、不够回落自建 Docker 薄沙箱复用现有 harness。**但 2026-06-28 收敛环 runbook 已解除这道前置**:实测证明 harness 能在 in-process(本地 runner)直接跑起来,收敛环就走本地 runner、不再卡等 DockerWorkspace 托管结论;跨机 / Docker 沙箱选型降为 go/no-go 之后的 Phase B 项、不阻塞收敛。原"这个结论必须在生成迭代开跑前出来、否则 spike 跑不起来"的判断已被证伪
九门是超休闲单局的机制地板,不查跨系统接线;富游戏的难点恰在跨系统,所以在九门之上补三道 tier2 专属的确定性门。**三联动门**证三个系统真耦合而非孤岛:订单要的物品必须能被合成系统产出(从合成链静态推到订单的跨表可达性检查)、合成链必须是有向无环图(拓扑检查不许成环)、完成订单时必须真调资源系统加金币、合成消耗时必须真调扣食材。**经济门**用真输入把两条路驱动到终态:可盈利路径(金币从开局攒到目标判赢)、可破产路径(连续若干订单流失判输),关键约束是两条路都得被 harness 的真输入序列驱动跑到终态——能在数据表里算出来和能被真玩到是两回事。**latch 门**管终态落定不回弹、宿主能读到终局,承接的是"游戏无 emit 通道、终态焊成可轮询 latch、宿主轮询读"这条现行装载约束。九门加这三门合起来全绿,才算 tier2 的富游戏机制地板通过。
@ -382,6 +395,7 @@ L1 的主体是九门,每门在真浏览器里真玩一局取确定性证据:A_b
spike 第二段放开让 agent 自产或扩展 driver 时,会撞上一个 Goodhart 雷:**写者不能写判自己游戏的那张卷子**——agent 既造游戏又造判它的 driver,会把 driver 写成只走它走过的路、只读不暴露真实力的字段,然后全绿假绿。隔离办法是拆开写卷人与判卷人,走三层:平台先按 schema 加白名单编译(非白名单或越界字段直接拒)、再交一个不向着被评对象、专找漏洞的独立 adversarial 评审(查它是否覆盖真实玩家路径、是否读了作弊字段)、三层全过才入验收。配套采两个指标:自产 driver 被独立评审打回的比例、driver 被修改的次数(防靠反复改 driver 逃避卡死探测)。
> **本节是运行时视角的九门与三层校验,确定性验收的护城河命题(机器判、禁自评、出题≠被考、per-tier verdict 元协议)即落在此节与 §三 A5**;另有一层"对外开闸放行"的 6 道门(D12 控制平面、GP9 合规先行、落库观测三门、首局体验门、G0/G1 前置)坐在九门机制地板之上,是独立 SoT,见 [`验收门.md`](验收门.md),其基准靶集见 [`WG1基准.md`](WG1基准.md)。
> **与质量四层塔的轴区分(2026-07-02 质量 canonical 接管,防混)**:本节的"三层校验"(L1 硬约束 / L2 设计符合 / L3 效果)按**处置力度**分层——必须解决 / 尽量解决 / 只评分不阻塞;它与 [`游戏质量与爆火能力.md`](游戏质量与爆火能力.md) canonical 的**四层质量塔**(L1 机制可玩 / L2 内容丰富 / L3 留存结构 / L4 传播钩子)**共用 L1L3 字母、但轴完全不同**——后者按**质量维度**分层。两者别对齐字母:三层校验的 L1(机器硬门)确实约等于质量塔的 L1(机制可玩,唯一拒发权),但三层校验的 L3(效果视觉软检)对应的是质量塔的 L2(内容丰富,LLM 评)。质量塔是品类 rubric、tier2 反馈契约、数据飞轮留存口径的共同上位标准,九门 / 富三门 / 首局门的**判据 SoT 仍是本节与 [`验收门.md`](验收门.md),质量 canonical 只裁消费口径**;开闸六门里与质量相关的 **D11 就绪分,权重管辖已移交质量轨**
> **现 / 建(2026-06-24 spike 后)**:低档九门现行已落。tier2 侧——三层校验框架、Phaser 探针(九门 + 富游戏三门:三联动/经济/latch)、L3 视觉软检 observe-only 接线**已落并在 feie-005 全过**;spike 收敛补的四道契约机器门(`validate_datatable` 数据表 schema+DAG+可达性、`LOCKED_PLATFORM_FILES` 锁平台文件、`validate_play_scene` 表现层契约、finish 门)也已落。待:自产 driver 三层隔离(spike 第二段)、偏脆的文本契约门做成结构化校验。
![图 D1 · 三层校验全景](assets/t2-D-01-三层校验全景.svg)
@ -439,7 +453,7 @@ SAA 那一侧的能力面是另一套形态,但它现已降为最低优先级、
采集机制采 **OpenTelemetry GenAI 这套标准**,而且 tier2 这条线几乎不必自己埋点——AgentScope 2.0.2 自带一套完整的强类型 Event System,agent 每跑一步就吐出强类型事件流,经官方 TracingMiddleware 直接调真 OTel SDK 转成 span、汇进 AgentScope Studio 可视化。七类事件里,文本、思考、工具调用各带起始/增量/结束三相,工具结果一类,模型调用用一对起止事件圈住——**结束那一下带这次调用的 token 用量**,成本台账的 token 正是从这里抓;回复事件圈住一轮完整的 reason→act→observe。所以 tier2 写轨迹的活只是"订阅加映射",不是"埋点加采集":订阅 Event System、走官方 TracingMiddleware→OTel 管道,再加一层 adapter 按核心子集加扩展段映射进统一表。SAA 那条 Java 线远期适配进来时,则按自己的节点裁决埋点、走同一份契约的另一个 adapter。各 adapter 机制各异、契约一致,正是"接口对称、内容不对称"在可观测面的落点。存储复用已部署的 MySQL 加对象存储,不上重型可观测中间件——观测早建是为 spike 调试和对账当下就用得上,不等于现在就铺独立基建。
成本不是估的,从 new-api 的 quota 权威口径折出每款多少人民币——每次调用的 quota 就是真实的倍率成本,比按公开单价估更准。OTel 的语义约定里没有成本属性,所以"成本钉 new-api 计费行"这条自研口径要保留,经 traceId 关联进 trace。这里有一个红线缺口:M3 那一档走 Anthropic 原生端点,而现有成本记录只覆盖 OpenAI 路,抓不到它,于是 M3 这档的 token 用量采不到、单款成本对它直接缺、全矩阵成本没法对比。接点是补一个包住 Anthropic 模型调用的录制变体,抓每次按模型分列的 token 用量,把 Anthropic 路补齐。计费平面的纪律是"协议自由、计费收口"——M3 走 Anthropic 端点、便宜档走各自端点,协议与 SDK 不锁死、每档走各自最优端点,但所有路最终都收口到 new-api 的 quota 按模型折 ¥ 这一个计费平面。成本台账按 AI 深度档对账硬上限:低深度档一次生成 < ¥10、最高深度档 < ¥50,图像与音乐生成各走独立预算线、不计入这两个上限(数字红线来源=创始人 2026-06-25,失效条件=单位经济或模型单价大变即复审)。
成本不是估的,从 new-api 的 quota 权威口径折出每款多少人民币——每次调用的 quota 就是真实的倍率成本,比按公开单价估更准。OTel 的语义约定里没有成本属性,所以"成本钉 new-api 计费行"这条自研口径要保留,经 traceId 关联进 trace。这里有一个红线缺口:M3 那一档走 Anthropic 原生端点,而现有成本记录只覆盖 OpenAI 路,抓不到它,于是 M3 这档的 token 用量采不到、单款成本对它直接缺、全矩阵成本没法对比。接点是补一个包住 Anthropic 模型调用的录制变体,抓每次按模型分列的 token 用量,把 Anthropic 路补齐。计费平面的纪律是"协议自由、计费收口"——M3 走 Anthropic 端点、便宜档走各自端点,协议与 SDK 不锁死、每档走各自最优端点,但所有路最终都收口到 new-api 的 quota 按模型折 ¥ 这一个计费平面。成本台账按 AI 深度档对账两段式预算:软停线 = 低深度档一次生成 ¥10、最高深度档 ¥50(越线只许收尾、交尽力产物),硬地板 = 软停线 ×1.5(¥15 / ¥75,与轮数/墙钟任一先到即停、封死 ¥ 上界),图像与音乐生成各走独立预算线、不计入这两个上限(数字红线来源=创始人 2026-06-25,两段式 2026-07-03 裁定,失效条件=单位经济或模型单价大变即复审)。
> **现 / 建(2026-06-24 spike 后)**:tier2 侧全部已落并真跑验证——`Tier2TraceMiddleware` 挂 writer agent 最外层洋葱、ReAct 全事件旁路 ingest 进 TraceAdapter(真跑 647 事件 dropped=0);`RecordingChatModel.records``newapi_pricing.py`(活读 new-api /api/pricing 倍率,取不到回落显式参数并告警、不中断主链)折 ¥(真跑 cost_rmb=1.29);`contracts/trace/` 已立 additive 事件契约位(忠实 trace.py 真实 sink 形状)。待(远期):SAA 适配进来时补它那侧的 adapter 映射,与 ReAct 共用同一份 trace 契约。NEWAPI_KEY、端点、机器见 `docs/内网凭据与端点.md`
![图 H1 · trace 统一契约](assets/t2-H-01-trace统一契约.svg)

View File

@ -313,4 +313,4 @@ reframe 的七条口径(创始人 2026-06-25),换轴不改其一字,逐切片执
**换轴依据(2026-06-26)**:本次重构把执行主轴从关注面横切(WU-A..F)换成成果纵切(三切片),依据是 §3 的三个返工点——关注面横切下,一个交付成果的目标与实现手段被切到不同 WU,串行执行必返工。换轴遵守 canonical 唯一性门:不新建第二份同 topic canonical,在 plan① 原地重构,WU-A..F 内容全部保留为 §7 设计面对账,文件名不变(8 个活档引用其路径不死链)。WU 横切作设计落地结构仍有效,只是不再充当执行序列。换轴核查:被压缩的 WU 内容分两类——设计 HOW(八面 5.x / 三档矩阵 / A2A·cancel·幂等协议 / 6 ADR)归位设计 SoT、§7 对账可下钻,执行 plan 不重复;执行契约(WU-A 便宜档灰度迁移 11 项:链路 / 灰度 flag / 对照 / 幂等 / 在途 / 切换门槛 / 回滚等)是按计划执行必须遵守的约束、不是设计,已补回切片一,不随设计细节一起移交。
**收口 TODO**:① `assets/00-生成引擎执行总览.svg` 待 redraw 成纵切切片序列图(当前是横切 WU 版);② `tier2/HANDOFF.md` 的 n≥30 字面改 n=5(随切片二);③ ✅ [`MVP进度总账.md`](../mvp/MVP进度总账.md) 回填执行序列三切片现状(2026-07-02 账本对真已回填);④ 换轴版已过 Codex + Opus 双评审(Opus 四维度专项 + Codex 四维度专项末轮重连完整产出),两评必修与发现项已在档内修(2026-06-26);⑤ 设计 SoT §269「十一插件」与代码实际 12 个(8 基元 + 4 编排)不符,交横切一致性主人核正;⑥ A11 在设计 SoT 仅 §三协议表一行、无 §5.x facet 专节,切片三细化前请横切一致性主人补 A11 设计面
**收口 TODO**:① `assets/00-生成引擎执行总览.svg` 待 redraw 成纵切切片序列图(当前是横切 WU 版);② `tier2/HANDOFF.md` 的 n≥30 字面改 n=5(随切片二);③ ✅ [`MVP进度总账.md`](../mvp/MVP进度总账.md) 回填执行序列三切片现状(2026-07-02 账本对真已回填);④ 换轴版已过 Codex + Opus 双评审(Opus 四维度专项 + Codex 四维度专项末轮重连完整产出),两评必修与发现项已在档内修(2026-06-26);⑤ 设计 SoT §269「十一插件」与代码实际 12 个(8 基元 + 4 编排)不符——**2026-07-03 W-DSGN doc-sync 已核正为「十二插件」并列全 12 名**;⑥ ✅ A11 在设计 SoT 曾只 §三协议表一行——**§六「调整回路(试玩后纠错 · A11)」专节已补**(现/建 2026-06-29),2026-07-03 W-DSGN doc-sync 复核确认已覆盖两段式判意图 / 三断言 / 工程规范性(assets.js·core.js)/ 代码完成状态,无需重复补

View File

@ -1,9 +1,12 @@
"""agent_loop/studio.py —— tier2 富游戏单写 ReAct 编排(on AgentScope v2.0.2)。
闭环(对照 wg1 studio.py 单轮 + 外层 Python for repair,tier2 改成Agent 内多轮 ReAct 自治):
阶段 1:设计 agent(单轮)把题面 富游戏设计稿(承袭 wg1 design 范式,换富游戏多系统语义)
闭环(对照 wg1 studio.py 单轮 + 外层 Python for repair,tier2 沿用内层 ReAct + 有界外层 resume 续修范式
spike 实测推翻了 Agent 内多轮自治:原生 ReAct 一见 decision=fix 就产空文本收尾过早放弃):
阶段 1:设计 agent(默认走工作室 Agent Team 星形,use_team=True)把题面 富游戏设计稿(承袭 wg1 design 范式)
阶段 2:单写 agent 一个 Agent 配九工具 Toolkit + 放开 max_iters, ReAct 循环内自调
scaffold_init/write_source/build/run_gates/finish 自治收敛,**不再外层 Python for repair**
scaffold_init/write_source/build/run_gates/finish;门没绿 + 有预算时由本文件的**有界外层 resume** verdict
反馈踹回续修(见下方 400 行开外的自纠循环):护城河生产路的续修已迁进 on_reasoning RepairMiddleware
( POST finish 点拦截取代 control_plane 外层循环);本文件外层 resume 为本地 runner 的并存 fallback
框架接缝(2.0.2, wg1 种子平移 + 升级):
- L32/33 平移:`from agentscope.agent import Agent, ReActConfig` / `from agentscope.message import UserMsg`