games-development-ai/docs/plans/2026-06-28-003-feat-studio-A11-对话式调整回路-plan.md
lili 9a6feddfee feat(studio): A11 切片三 M5 三结构断言机器门(改对了没/有没有误伤/血缘可查)
九门只验"仍能玩",验不出"改对了没、有没有误伤";三断言补这层(plan① 线 154)。

cheap_assert.py:
- ① change_applied:改动真生效非 no-op(deterministic=manifest found 且 old≠new / regenerate=changed)
- ② nontarget_stable:base→new 真比对算内容差,非目标文件变=误伤——不信执行器自报标记,
  防执行器 bug 自证(兑现 Opus 评审 P1-2)
- ③ lineage_queryable:baseVersionId 在(worker 侧验必要条件,DB 真可查由 M1 回填 + 后端 e2e)
- three_assertions 合并 verdict

集成进 execute_*:两档加 base_version_id 参 + 附 assertions verdict + 收紧 status
(succeeded ⟺ 九门 ∧ ① ∧ ②;regenerate 原漏判 ①changed 已补);worker 透传 modify.baseVersionId。

测试:test_a11_m5_assertions 12/12 + 全 85 测试独立复跑全绿(含 M3/M4 桩接 kwarg)。
集成端到端 smoke(真九门):ROUND_MS 30000→19000 + baseVersionId=4096
→ status=succeeded、a1/a2/a3 全 true、allPass=true、落盘 19000。

受计费真后端 e2e(经 studio→aigc→worker→回调→新版本+D12计费+血缘)待 mini-desktop 全栈。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-29 02:34:06 -07:00

42 KiB
Raw Blame History

title, status, date, topic, canonical, 承接, 关联代码, 图清单
title status date topic canonical 承接 关联代码 图清单
A11 对话式调整回路(试玩后纠错)细化执行 plan 已批(创始人 2026-06-29· 执行中M1 M2 M3 M4 → M5 2026-06-28 studio-A11-调整回路 false
docs/plans/2026-06-25-生成引擎统一执行计划-AgentScope三档-plan.md
docs/architecture/架构/生成引擎/agentic运行时架构图说.md
contracts/api-schemas/studio.yaml
contracts/agent-loop/source-project.schema.json
game-cloud/game-module-studio/.../service/studio/StudioServiceImpl.java
game-cloud/.../db/migration/V18.0.0__create_game_source_project.sql
game-cloud/.../aigc/saa/SaaStudioGraph.java
game-cloud/.../aigc/service/callback/DifyCallbackServiceImpl.java
cheap-worker/{worker_service,cheap_studio,cheap_run,result_out}.py
图1 问题框定已建vs缺口
图2 两段式回路时序
图3 执行任务态机
图4 里程碑依赖

A11 对话式调整回路(试玩后纠错)细化执行 plan

本档覆盖 plan① 切片三 A11 的完整交付定义,过 §6.8 双评审 + 创始人批后展开 TDD 实施。真跑chrome 九门、真后端 e2e只在 mini-desktop。

Summary结论先行

用户试玩生成的游戏后,会用自然语言回头提调整("主角颜色太暗""加快下落""把它做成赛车游戏"。这条回路缺位产品阶段三承诺的对话式创作出口就是个无入口的孤儿——首次生成成了终点。A11 给它工程承接。

逐文件核完代码A11 的图景与"切片三要从零建调整机制"的预期相反:契约、后端 /modify 执行编排、源工程落库表、修改血缘列、配额门都已落地,可直接复用。缺口集中在切片三所坐的便宜档 Python 线cheap-worker——它完全不认 modify后端 job 里带了 modify 字段worker 读都不读,会把一次调整静默做成整局重新生成。

调整回路的形态由创始人2026-06-28定死A11 是 LLM 驱动的纠错回路、不是零-LLM 静态覆写。流程是"用户提改 → LLM 判意图 → 确认修改范围与用户输入 → 分类执行(替换资产 / 调整数值 / 大改动反问用户)",改动过大或危险操作要回问用户确认、不擅自重写。

可改性的根基是生成出来的工程本身规范——资产统一管理、数值集中,使一次修改落到一处(一个变量 / 一个文件 / 一个 CDN 地址)。便宜档现状已大体具备:资产由 assets.js 统一管理、核心数值集中在 core.js二者都是可写文件A11 判意图后把改落到这一处即可。这是生成质量、不是 A11 的静态门(判意图仍 LLM 驱动)。复杂档同此要求——设计跨档,实现随 tier2 go 跟进(创始人 2026-06-28 定 A

这条流程怎么落进系统,是本档评审收敛出的关键架构(创始人定 A 两段式):判意图与执行分离成两次请求。第一段是新增的判意图入口——收用户原话 + baseVersionId由便宜档 worker 取 base 源、LLM 判出建议的结构化改动 + 风险等级,返回前端。前端展示建议供用户确认或编辑(危险/大改必须确认),确认后才调用已落地的结构化 /modify 执行。HITL 落在两次调用之间的前端确认,不动 aigc 内部状态机。这绕开了"NL 进不了已结构化的 /modify 入口"和"input-required 暂停态无承载"两处阻断A2A 原生 input-required 暂停态留后期。

五个里程碑M1 打前置基座(补 derive_profile 让源工程带回传 + 后端注入 base 源到 job + 回调落源回填 base_version_id无源可改则一切免谈M2 立判意图入口与前端确认(新端点 + 风险分级 + 危险回问M3、M4 落两类执行(确定性类:换资产/调数值改规范工程那一处模块重生成有界单文件重写改玩法M5 合验收闭环(三结构断言 + 接配额 + 跑通一次受计费的真实调整任务)。整体重设计、便宜档 extend 落点均留后期,不计入本切片。

Problem Frame问题框定

flowchart TB
  user["用户试玩后提改<br/>自然语言原话"] --> plan_ep["判意图入口<br/>【本切片新建】"]
  plan_ep --> confirm["前端展示建议 + 风险<br/>用户确认/编辑【本切片】"]
  confirm --> modify["studio /modify 执行入口<br/>已结构化【已落地·复用】"]
  modify --> orch["取 base 源 → submitGenerate<br/>带 modify 字段 → 过 D12 配额门<br/>【已落地·复用】"]
  orch --> route{"D3 dispatcher<br/>便宜档路由"}
  route -->|"SAA Java 路"| saa["SAA modify 节点regenerate 可达<br/>deterministic 因 build 未闭合 fail-loud<br/>【非完整复用证据】"]
  route -->|"便宜档 Python 路<br/>(切片三所坐)"| cheap["cheap-worker<br/>❌ 不认 modify<br/>❌ derive_profile 恒 None→源不带回传<br/>❌ 无判意图/分类执行"]
  cheap -.->|"本切片补"| fix["认 modify job + 读 job.base 源<br/>分类执行 + 改动清单回传<br/>三结构断言"]

  classDef built fill:#dcfce7,stroke:#16a34a,color:#0f172a;
  classDef gap fill:#fee2e2,stroke:#dc2626,color:#0f172a;
  classDef todo fill:#ede9fe,stroke:#7c3aed,color:#0f172a;
  class modify,orch built;
  class saa,cheap gap;
  class plan_ep,confirm,fix todo;

绿块(结构化 /modify 编排 + 配额)已建、复用;红块(便宜档不认 modify、SAA deterministic 未闭合)是缺口;紫块(判意图入口 + 前端确认 + 便宜档分类执行)本切片建。

起点与边界

起点(已落地、复用、不重建) —— 数字代码事实核验(双评审逐文件确认):

  • 执行契约全有studio.yamlStudioModifyReqVO{baseVersionId, mode, target, payload}required + 枚举),mode×target.kind 锁定映射deterministic ⇔ {asset,config,level} + value / regenerate-module ⇔ behavior + intent违例 1-112-003-*** 拒;反映在 Java VO。这是执行入口,入参已结构化。
  • 后端执行编排全有AppStudioController POST /modifyStudioServiceImpl.modify()(方法体 308-333校验锁定映射 → 取 base 源归属校验 → 建会话 + 落任务链 → aigcApi.submitGenerate 带 modify 字段)。
  • 生成路落库与透传AigcTaskDO 持久化 modify_mode/base_version_id/modify_patchV19AigcGenerateExecutor tick 认领时把这三个字段放进 job——但当前不放 base 源(执行器明确不带 sourceProject
  • 源工程落库表与血缘列game_source_projectV18 + V20 uksourceJson/sourceHash/status/base_version_id;回调落源 landSourceQuietly通用写入路径(入口只看 sourceProject 非空、与来源无关),便宜档 HTTP 回调只要带 sourceProject 就会落库——但当前不回填 base_version_id
  • 源回传管道大体已通result_out.build_source_project 已实现、build_result_out 已支持 sourceProject 字段、process_job 已接线;唯一断点是 derive_profile 恒返 None导致 sourceProject 永不被带上。
  • 产物工程规范性大体具备:便宜档产物的资产已统一管理(assets.jsIMAGE_FILES 一处声明、按键间接引用、baseUrl 可指 CDN核心数值集中在 core.jsROUND_MS/COLOR_PALETTE 等);二者都是可写 L3不在 _L1_FIXED)。换资产/调数值落到这一处即可差最后的数值集中纪律M3 轻量收紧)。
  • 配额门现成D12 enqueueWithControlPlaneper-creator×level 日配额 + 并发 + 背压 + fail-closedmodify 走 submitGenerate 自动过门——"一次调整 = 一次受计费受配额任务"是现成语义。
  • 九门 + 三层校验链现成cheap_run 的 scaffold/stage/smoke/ensure_play_spec/play九门+ check静态门 + 形状门)+ buildesbuild可复用。

SAA Java 路的准确状态(评审纠正)SAA 有 modify 节点、regenerate-module 路径可达;但 deterministic modify 因 sourceProject→build 未闭合而 fail-loud显式失败。所以 SAA 路不能当作"A11 便宜档 deterministic 执行已有实现"的复用证据——deterministic 执行在两条线上都需本切片建。

in scope

  • 判意图入口(新端点):收用户 NL 原话 + baseVersionIdworker 取 base 源 + LLM 判出建议 {mode, target, payload} + 风险等级,返回前端。
  • 前端范围确认:展示建议供用户确认或编辑;危险或改动过大必须用户确认,可取消。
  • 便宜档 worker 认 modify job读 job 里的 modify 字段 + base 源(后端注入),分类执行。
  • 源回传落库补全:补 derive_profile 让 sourceProject 带上回传;后端注入 base 源到便宜档 job回调落源回填 base_version_id。
  • 分类执行两档:① 确定性类纠错(换资产 = 改 assets.js 资产清单那一处 / baseUrl 指 CDN调数值 = 改 core.js 集中常量那一处;改关卡 = 改对应布局处);② 模块重生成(改玩法 = 有界单文件 LLM 重写,复用 resume + 三层校验)。
  • 轻量收紧便宜档生成纪律:可调数值都进 core.js让"改一处"可靠),落 _template + 生成 prompt + soft check。
  • 三结构断言验收(含改动清单语义校验)+ 跑通一次受计费的真实调整任务 e2e。

不做out of scope

  • 不重建已落地的 /modify 执行编排 / 契约 / 任务链 / 血缘表 / 配额门(复用)。
  • 不交付 A2A 原生 input-required 暂停态(创始人定 A 两段式HITL 走前端两次调用之间的确认aigc 内部状态机不动A2A 原生暂停留后期想要 agent 多轮交互时再补)。
  • 不固定强结构化 config seam 当 A11 的静态门(创始人定:规范性靠生成产出规范工程、不靠工具层加门;详见 KTD2
  • 不做整体重设计档plan① 明定留后期)。
  • 不接便宜档 extend 路(契约/StudioServiceImpl/SAA 已落 extend但便宜档同样不认A11 只接 deterministic + regenerate-module 两档extend 便宜档落点留后期/另议,避免又一个悬空)。
  • 复杂档 tier2 A11 的实现不在本切片(随切片二 tier2 go 后用同一回路跟进);但设计跨档——工程规范性(资产统一 + 数值集中)对 tier2 产物(tier2-source-project.schema.json)同样要求,已写进本档(创始人 2026-06-28 定 A
  • 不在工具层做经济 / 数值平衡静态判断(切片二教训:数值平衡是 agent 玩法职责)。
  • 不真存二进制资产;资产替换 = 改资产清单(assets.js)的一处地址(后期 CDN 挂载游戏资产即替换它,创始人 2026-06-28

执行决策(创始人 2026-06-28

  • A11 = LLM 驱动纠错、并非零-LLM 静态覆写:流程"用户提改 → 判意图 → 确认修改范围与用户输入 → 分类执行",不需要完全静态的编码替换。
  • 分类执行三类:替换游戏资产(改资产清单的一处地址,后期 CDN 挂载即替换它)/ 调整数值(改集中数值的一处常量)/ 需要大改动(反问用户:改动过大需重写、危险操作需确认)。
  • 工程规范性是关键、跨档A11 的可改性建立在生成出来的工程本身规范上——游戏资产统一管理、数值集中,使一次修改落到一处(一个变量 / 一个文件 / 一个 CDN 地址)。这是生成质量、不是 A11 的静态门(判意图仍 LLM 驱动);便宜档与复杂档同此要求。
  • 不固定 config seam:不在工具层把覆写靶点硬约束成静态校验门;规范性靠生成产出规范工程,不靠工具层加门。
  • 链路架构 = A 两段式(评审收敛、创始人 2026-06-28 定判意图与执行分离成两次请求HITL 走前端确认,不上 A2A 原生暂停态。
  • 范围 = 便宜档优先、设计跨档、复杂档随 tier2(创始人 2026-06-28 定):本切片实现便宜档 A11设计文档把工程规范性写成跨档要求复杂档 A11 用同一回路、等切片二 tier2 go 后跟进。

Key Technical Decisions

  • KTD1判意图独立于执行 · 在 /modify 之前):契约 /modify 入参已结构化,校验在前;故"NL → {mode,target,payload}"必发生在调 /modify 之前。判意图做成独立的前置入口(收 NL 原话 → worker 取 base 源 + LLM 判建议结构化改动 + 风险),与执行解耦;前端确认后才走现成的结构化 /modify。取舍:相较把判意图塞进 worker 执行内部(与已结构化契约倒置、且要改契约放宽必填),两段式弥合了 NL 与结构化执行入口的缝。
  • KTD2执行落到规范工程的一处 · 资产统一管理 + 数值集中 · 跨档 · 创始人 2026-06-28A11 的可改性建立在生成侧工程规范性上——资产统一管理、数值集中,使一次修改落到一处,而非 LLM 在散落代码里定位。便宜档现状已大体具备:资产由 assets.js 统一管理(IMAGE_FILES 键→文件名一处声明、按键间接引用、baseUrl 可指 CDN且 assets.js 是可写 L3换资产 = 改那一处;核心数值在 core.jsROUND_MS/COLOR_PALETTE 等,可写 L3调数值 = 改那个常量,差最后的纪律(个别数值散在别处)。本切片轻量收紧"可调数值都进 core.js"的生成纪律。这不是给 A11 加静态覆写门(那个不做、判意图仍 LLM 驱动而是要求生成产出规范工程规范性在生成侧A11 判意图后把改落到规范工程的那一处。跨档:复杂档 tier2 产物(tier2-source-project.schema.json)同样要求资产统一 + 数值集中A11 复杂档用同一回路、随 tier2 go 跟进。残余误伤由 M5 改动清单语义校验兜底(见 KTD6
  • KTD3危险/大改走前端确认 · 创始人定 · A 两段式)判意图评出风险高或改动过大时前端必须让用户确认或编辑后才提交执行不擅自重写用户可取消。HITL 落在判意图与执行两次请求之间,不需 aigc 暂停态。取舍:相较 A2A 原生 input-required 任务内暂停(要补等待态 + 超时 + 回问落库 + confirm/resume API + worker→后端暂停通道两评审都点名 P0 级工作量),两段式以前端持有建议态换掉整套暂停机制。
  • KTD4模块重生成起步 = 文件级)便宜档产物只有文件级写边界game-logic.js 等 L3 文件),无语义 behavior 拆分。模块重生成把契约 target.kind=behavior 在便宜档映射到玩法逻辑文件整文件有界重写,不动 core/render/assets/host-config。取舍先复用现有边界落地behavior 细粒度留后期。
  • KTD5源回传落库是硬前置 · 钉死注入路径)modify 一切建立在"能按 base 版本取回源工程"上。便宜档 worker 是 Python、无 DB 访问,不主动反查;路径钉死为后端派发前经 SourceProjectApi.fetchByVersionId 注入 base 源到 jobworker 只消费 job.sourceProject。改 result_out 回传契约时按切片一 M3b 同款 parity 护栏防回退。
  • KTD6三断言①升级为改动清单语义校验:纯文件 diff 验不出"LLM 改对了那个值/那个位置"——目标文件本就允许变、文件内顺手改坏抓不到。故要求 worker 回传结构化"改动清单"(改了哪些位置/常量、改成什么),断言①校验清单真实命中目标且不溢出非目标;调数值类再叠一次改后行为采样(如改下落速度 → smoke 抓到的速度量真变)。取舍:在不固定 config seam 的前提下,用改动清单 + 行为采样替代结构锚点来兜误伤。

High-Level Design里程碑与依赖

flowchart LR
  M1["M1 前置基座<br/>derive_profile + 后端注入base源 + 血缘回填"] --> M2["M2 判意图入口 + 前端确认<br/>NL→建议结构化+风险 · 危险回问"]
  M2 --> M3["M3 确定性类纠错<br/>换资产/调数值改规范工程一处 · 改动清单"]
  M2 --> M4["M4 模块重生成<br/>有界单文件重写改玩法"]
  M3 --> M5["M5 验收闭环<br/>三结构断言 + 受计费 e2e"]
  M4 --> M5
  classDef m fill:#eff6ff,stroke:#2563eb,color:#0f172a;
  class M1,M2,M3,M4,M5 m;

两段式回路时序(一次调整请求的端到端走向):

sequenceDiagram
  participant U as 用户(试玩后)
  participant F as 前端
  participant PE as 判意图入口【本切片新建】
  participant W as cheap-worker
  participant S as studio /modify【已落·复用】
  participant A as aigc submitGenerate + D12门【已落】
  participant P as game_source_project

  U->>F: 自然语言改话
  F->>PE: 第一段:判意图(rawText + baseVersionId)
  PE->>W: 取 base 源 + LLM 判意图
  W->>P: 读 base 源工程
  W-->>PE: 建议{mode,target,payload} + 风险等级
  PE-->>F: 返回建议 + 风险
  F-->>U: 展示建议(危险/大改 高亮需确认)
  U->>F: 确认 / 编辑 / 取消
  F->>S: 第二段:/modify(已结构化, 用户确认后, 受计费)
  S->>A: 取 base 源 + 提交 modify 任务(过配额门)
  A->>W: dispatch job(modify 字段 + 后端注入的 base 源)
  W->>W: 分类执行(换资产/调数值改规范工程一处 / 模块重生成) + 出改动清单
  W->>W: esbuild 重建 → 九门 + 三层校验 + 三结构断言
  W->>P: 回传新源工程(新 sourceHash, base_version_id=被改版)
  W-->>S: 新预览版(走发布审核, 不动 currentVersion)

执行任务态机(判意图是独立请求-响应、不入任务态机;只有第二段 /modify 执行是任务):

stateDiagram-v2
  [*] --> 初始: 用户确认后提交 /modify
  初始 --> 生成中: worker 认领(读 job.base源 + modify 字段)
  生成中 --> 完成: 九门+三层校验+三断言全过(回填新 version_id + base_version_id 血缘)
  生成中 --> 失败: 任一门挂(不建新版·base 不动)
  完成 --> [*]
  失败 --> [*]

M1 · 前置基座:源回传补全 + worker 认 modify job

交付物:① 补 derive_profile(派生 profile 三枚举),让便宜档每次生成把源工程带上回传、落 game_source_project(回传/落库链已通,只接这一个断点);② 后端派发到便宜档 job 时注入 base 源(经 SourceProjectApi.fetchByVersionIdworker 只消费 job.sourceProject、不主动反查;③ 回调落源 landSourceQuietlyAigcTaskDO.baseVersionId 回填 SourceProjectLandReqDTO.baseVersionId,让血缘列写上;④ worker parse_job 读 job 里的 modify 字段modify_mode / modify_patch / base 源)。

接入点cheap-worker/worker_service.pyderive_profile / parse_jobgame-cloudAigcGenerateExecutor(注入 base 源到 jobDifyCallbackServiceImpl.landSourceQuietly(回填 base_version_id

验证:单测——便宜档生成产物经 derive_profile 后带 sourceProject构造带 modify 字段 + base 源的 job断言 worker 取全。真后端 e2emini-desktop——便宜档生成一款后 game_source_project 有行、sourceHash 非空;一次 modify 回调后该版本 base_version_id 非空。

依赖:切片一便宜档线。

风险:① 改 result_out 回传契约牵动下游消费(参照切片一 M3b 翻车)——加 parity 护栏(回传前后过同一组形状断言)。② base 源是多文件全文 JSON经 HTTP body 传便宜档 worker体积/超时未评估——M1 先量体积上限超标再议worker 无 DB seam凭 id 回拉更重,非首选)。

M2 · 判意图入口 + 前端范围确认A11 主干)

交付物:① 新增判意图入口(收 rawText + baseVersionId),由便宜档 worker 取 base 源 + LLM 判出建议 {mode, target, payload} + 风险等级 + 是否需强制确认,返回前端——不执行、不落新版本;② 前端展示建议供用户确认或编辑,危险或改动过大强制确认,可取消;③ 确认后前端调用已落地的结构化 /modify 执行(受计费)。判意图入口是 contract-first 新增additive不动 /modify 既有契约)。

接入点新判意图端点studio 侧)+ worker 判意图职责cheap-worker复用其模型接入 + base 源消费);前端确认交互。

验证:单测——"把主角颜色调暗"判为 deterministic·asset·低风险·可直接确认"把它做成 3D 赛车"判为大改·高风险·强制确认;分类与风险判据可单测(喂固定改话 + base 上下文,断言判出的 mode×target×risk。e2e——判意图入口返回建议、前端确认后 /modify 收到结构化入参执行;判意图本身不产新版本、不计费(计费在执行段)。

依赖M1要有 base 源 + worker 认 job 才能判意图、才能执行)。

风险判意图准确率LLM 判错类型/风险)——缓解:风险存疑一律升级为强制确认(宁可多问);判据留可观测日志校准。

M3 · 确定性类纠错执行(换资产 / 调数值 / 改关卡)

交付物:执行段判为 deterministictarget.kind∈{asset,config,level})时,改动落到规范工程的一处——换资产 = 改 assets.jsIMAGE_FILES 那一项(或 baseUrl 指 CDN后期 CDN 挂载即替换它);调数值 = 改 core.js 里那个常量;改关卡 = 改对应布局处三者落点assets.js / core.js / render 等)都是可写 L3不撞 L1_FIXED 写禁。取 base 源 → 改那一处 → 产出改动清单(改了哪个文件的哪个键/常量、改成什么)→ esbuild 重建 → 过九门。不重生成玩法逻辑。配套轻量收紧生成纪律:可调数值都进 core.js生成 prompt / _template + soft check让"改一处"可靠。

接入点worker 确定性类执行分支(取 base 源 → 改规范工程那一处 + 记清单 → cheap_run 的 build + stage + smoke + play 轻链);需一个"在既有产物上只重建 + 重过九门"的轻入口(现有 cheap_run 入口都假定整局 scaffold 起步);生成纪律收紧(数值归 core.js落 _template + 生成 prompt。

验证:单测 + e2e——换 sprite 占位 → 产物引用确实变、改动清单命中该占位、九门过、非目标文件 hash 稳;调下落速度 → 对应数值变、清单命中、改后 smoke 抓到速度真变、九门过、非目标稳。

依赖M1、M2。

风险LLM 定位常量改错位置(改串/改溢出)——缓解:改动清单 + 行为采样KTD6抓"改对没";定位失败回退到强制确认或转模块重生成。

M4 · 模块重生成执行(改玩法)

交付物:执行段判为 regenerate-moduletarget.kind=behavior时——把 behavior 在便宜档映射到玩法逻辑文件game-logic.js取 base 源 → 据用户意图有界重写该单文件 → 复用既有外层 resume 与三层校验 → 不动 core/render/assets/host-config → 过九门。

接入点worker 模块重生成分支(复用 cheap_studio 的 ReAct 写单文件 + cheap_run resume + 三层校验);写边界收窄到玩法逻辑文件。

验证e2e——"陨石下落改成会左右摇摆" → game-logic 文件变、core/render/assets hash 稳、九门过、改后仍能玩。

依赖M1、M2。

风险:玩法文件与其他文件耦合导致单文件重写不自洽——缓解:复用切片一 resume 熔断 + 三层校验抓不自洽;牵连过深时由判意图升级为大改 → 强制确认。

M5 · 验收闭环 + 受计费 e2e

交付物:三结构断言机器门 + 接 D12 配额 + 跑通一次受计费的真实调整任务。三结构断言plan① 线 154结合 KTD6——① 请求的结构化改动可断言真实生效worker 改动清单命中目标且不溢出非目标(非纯文件 hash调数值类叠改后行为采样② 非目标模块的 hash / 白名单 diff 稳定(没顺手改坏别的模块);③ 新版本与 baseVersionId 血缘可查(复用 M1 回填的 game_source_project.base_version_id 反查链)。三断言 + 九门 + 三层校验全过才算"改成"。

接入点:三断言机器门(纯逻辑、可单测:清单命中校验 + 非目标 diff + 血缘字段链);血缘可查复用 M1 写上的 base_version_idgame_version 产物表无 parent 列,用源工程表 base_version_id 反查链;给版本产物表加 parent 列列为可选、非本切片必做,避免动 project 模块版本权威);受计费走现成 D12 enqueueWithControlPlane

验证:真后端 e2emini-desktop——判意图 → 前端确认 → /modify 执行 → 九门 + 三层校验 + 三断言全过 → 落新预览版(不动 currentVersion、走发布审核→ 计费落账 → 血缘可查。

依赖M1M4。

风险:三断言只验"改了对的东西、没误伤",不直接证"改得好不好"(玩法质量归 agent / WU-B非本门职责——已知边界、不在工具层加码玩法质量门。

Verification验证计划

  • 单测优先:判意图分类与风险判据、资产/数值一处改写、改动清单与三断言判据、parse_job modify 字段、derive_profile、parity 护栏、base_version_id 回填。
  • 真后端 e2emini-desktop绕系统代理直连内网两段式全链路 + 前端确认 + 三断言 + 受计费落账 + 血缘可查。
  • 九门 + 三层校验复用 cheap_run不另造。
  • 完成判据 = plan① 交付定义:两类执行落地、改后过九门 + 三结构断言、接 D12 配额、跑通一次受计费真实调整任务(整体重设计、便宜档 extend 不计入)。

风险与回滚

  • 判意图错判:风险存疑升级强制确认兜底;判据留可观测日志校准。
  • 模块重生成不收敛:复用切片一 resume 熔断 + 三层校验;牵连过深升级为大改强制确认。
  • 源回传契约改动回退parity 护栏(切片一 M3b 同款)。
  • 回滚里程碑独立可回退modify 失败 = 不建新版、base 不动契约已定天然安全M1 源回传若出问题可单独关闭、不影响首次生成线;判意图入口是 additive 新端点,不影响既有 /modify。

迁移对账(跨设计面归属 · 防越位/揽活)

  • 复用(已建、不重建)StudioServiceImpl.modify 执行编排、taskchain 任务链、game_source_project V18 落库与血缘列、D12 配额门、cheap_run 九门 + 三层校验、源回传/落库管道(除 derive_profile 断点)。
  • 自建(本切片 A11:判意图入口(新端点 + worker 判意图)、前端范围确认、便宜档 worker 的 modify 执行两档、derive_profile 补全、后端注入 base 源、base_version_id 血缘回填、改动清单 + 三结构断言机器门。
  • 跨设计面plan① 线 158WU-B 的 A11 反馈回路(生成/玩法质量、WU-C 5.4(覆写/重生成后的三层校验与九门、WU-F 配额数值。本档不揽生成质量职责、不替 WU-F 定配额数值(占位待创始人拍)。
  • 收口 TODO
    • ① 回写 plan① 切片三 行 148——"确定性覆写"不再是零-LLM、改为 LLM 判意图后改规范工程一处(本档 KTD2守 canonical 唯一性,交横切一致性主人对账。
    • ② 本 plan 兼充 A11 设计面plan① 收口 TODO⑥A11 在设计 SoT 仅协议表一行);评审通过后蒸馏回 docs/architecture/架构/生成引擎/.agents/knowledge/
    • ③ 便宜档 extend 落点、A2A 原生 input-required 暂停态:均留后期,需要时另立切片/plan避免悬空。

Sources事实来源

  • plan① 切片三 A11docs/plans/2026-06-25-…-plan.md 行 142-160、298
  • 运行时 SoT §三 A3/A3.5/A4/A5/A11docs/architecture/架构/生成引擎/agentic运行时架构图说.md)。
  • 契约 studio.yamlStudioModifyReqVO + mode×kind 锁定映射)、source-project.schema.jsonconfig 字段 / sourceHash 寻址)。
  • 数字代码事实 digest + Codex/Opus 双评审逐文件核验(后端执行编排已落 + 便宜档缺口 + SAA deterministic fail-loud + 源回传管道断点 = derive_profile + 血缘回填漏接)。

双评审发现与处置

并行双评审Codex codex-rescue + Opus 对抗式文档评审,互不通气);两评审在两条主干上咬合。逐条处置:

  • P0-A 入口顺序倒置(两评审一致)/modify 入参已结构化NL→结构化必在其之前原稿把判意图放 worker 内部、与契约倒置。处置:改 A 两段式(创始人定)——新增判意图入口(/modify 之前),执行复用结构化 /modifyKTD1 重写、M2 重构、时序图改。已修。
  • P0-B input-required 无承载(两评审一致)aigc 六态无暂停态、回调只认 succeeded/failed、无 resume API。处置A 两段式绕开——HITL 走前端两次调用间确认aigc 状态机不动A2A 原生暂停态列收口 TODO③ 留后期。已修。
  • P1 血缘写链漏接CodexlandSourceQuietly 未从 AigcTaskDO.baseVersionId 回填,断言③会查空。**处置M1 交付物③ 补回填 + 单测断言。**已纳。
  • P1 M1 缺口高估 + 路径矛盾(两评审):回传/落库链已通,真缺口仅 derive_profile"后端注入"与"worker 反查"措辞冲突。**处置M1 缩到真缺口、KTD5 钉死后端注入·worker 只消费。**已修。
  • P1 SAA modify 全通不准CodexSAA deterministic 实为 fail-loud、build 未闭合。**处置:起点段改正、不作复用证据。**已修。
  • P1 三断言对改错位置盲区Opus:纯文件 diff 验不出改对。**处置KTD6 + M5 断言① 升级为改动清单语义校验 + 行为采样。**已修。
  • P1 plan① 定义漂移Opus:确定性覆写从零-LLM 改为 LLM 判意图后改规范工程一处,未回写 plan①。**处置:收口 TODO① 回写 plan① 行 148。**已列。
  • P2两评审extend 悬空(→ 边界显式 scope-out + TODO③、占位撞写禁→ 已核 assets.js/core.js 均可写 L3、不在 _L1_FIXED,换资产/调数值落点干净、HTTP body 体积(→ M1 风险②)、散文元叙述/"房式"笔误/"639 行"措辞/"modify 四件套"术语(→ 全文清理:删执行者须知元叙述、改"方法体 308-333"、统一"modify 字段 + base 源单独注入")。已处置。

评审后创始人追加指令2026-06-28已整合:① 链路架构定 A 两段式(解 P0-A/B判意图入口在 /modify 之前、HITL 走前端确认、不上 A2A 暂停态);② 工程规范性是关键、跨档——资产统一管理 + 数值集中使"改一处",便宜档现状已大体具备(assets.js 统一资产、core.js 集中数值、均可写 L3复杂档同此要求、实现随 tier2定 A。已落入执行决策 + KTD2 + M3 + 起点 + 边界 + Summary。

执行发现

M1 前置基座执行中2026-06-29

  • Python 侧M1① derive_profile + M1④ parse_modify完成、绿derive_profile 兑现返便宜档基线 {realtime, discrete-choice, metric}tap-targets 本就这三维、非伪造),解锁 build_source_project → sourceProject 随 result-out 回传;parse_modify 提取 modify 区mode/baseVersionId/modifyPatch/sourceProject无 modifyMode 返 Nonecreate 路零副作用)。tests/test_a11_m1.py 5/5 + 回归 test_worker_service 15/15 + test_result_out 18/18零回退。
  • 对账与偏差:① 评审所言属实——源回传/落库管道已通,唯一断点是 derive_profile 恒返 None兑现它即打开全便宜档生成的 sourceProject 回传(每 gen 多带 src/ 全文,实测约 6 文件几 KB 量级HTTP body 体积无虞,消解 M1 风险②的体积顾虑)。② 便宜档 base 源注入 job 的键名钉死为 sourceProject(对齐 SAA K_SOURCE_PROJECT + worker parse_modify 读取侧)。
  • Java 侧M1② executor 注入 base 源 + M1③ 回调回填 base_version_id完成、绿AigcGenerateExecutor.injectBaseSourceProject(据 baseVersionId 反查 SourceProjectApi.fetchByVersionIdjob.put("sourceProject", data.getSourceJson()),镜像 SaaGraphDispatcher.resolveBaseSourceProjectbest-effort 非阻断、create 路零变,经 AigcExecutorConfiguration 软注入 SourceProjectApiDifyCallbackServiceImpl.landSourceQuietlylandReq.setBaseVersionId(task.getBaseVersionId())(落库服务 SourceProjectServiceImpl.land L105 已持久化该列,无需改)。子代理本地 maven 全绿98 测试:执行器/回调/SAA 回归/源服务);主会话独立复跑 AigcGenerateExecutorTest+DifyCallbackServiceImplTest = 46/46 绿、BUILD SUCCESS(一手验证非口头)。
  • M1 收口:源回传落库链端到端通——便宜档生成 → derive_profile 兑现 → sourceProject 回传 → landSourceQuietly 落库(带 base_version_id 血缘modify 路 → executor 注入 base 源 → worker parse_modify 读到。改动未提交(在工作树)。

M2 判意图入口 + 前端确认执行中2026-06-29

  • Worker 侧(判意图 classify + /classify 端点)完成、绿cheap_classify.pybuild_classify_prompt(把 base 源可改面——assets.js 资产清单 / core.js 集中数值 / game-logic.js 玩法 + 用户原话喂进 prompt+ parse_classify_response(落 mode×category 锁定 + 风险/确认规则 + 坏 JSON 安全兜底worker POST /classify 同步端点(注入式 classify_fn,不入生成队列、不起 Chrometests/test_a11_m2_classify.py 9/9 + 回归 test_worker_service 15/15、test_a11_m1 5/5。
  • 判意图契约{category(asset|config|level|behavior|big-change|unclear), mode(deterministic|regenerate-module|null), target, payload, riskLevel, needsConfirm, rationale, clarify}。可信边界 = LLM 给的 mode 不采信、一律按 category 落 modeneedsConfirm 由 worker 定(只低风险确定性改免确认,改玩法/大改/意图不明/中高风险一律回问,兑现创始人"危险回问")。真 LLM 调用(_default_complete openai 直调 M3 + 框架代理旁路为集成路、M5 e2e 真验。
  • Java 侧studio /modify/plan → aigc classifyModify → worker /classify 同步对接)完成、绿契约先行studio.yaml +/modify/plan + ReqVO/RespVOAppStudioController.planModifyStudioServiceImpl.planModifyvalidateCreator 白名单门[核实与既有 createDraft/generate/modify L99/139/313 一致] + resolveBaseVersionGameWithOwnership 归属校验防越权 + 委托 aigc + 兜底);AigcApi.classifyModifyWorkerClassifyClient(据 baseVersionId 反查 base 源 → NO_PROXY JDK HttpClient POST worker /classify → best-effort 兜底 unclear+needsConfirm软注入 ObjectProvider<WorkerClassifyClient>executor 关闭时 Bean 缺席→兜底、不致启动失败,镜像 WorkerDispatchClient。子代理本地 maven 43 测试全绿;主会话独立复跑 WorkerClassifyClient/StudioServiceImpl/AigcApiImpl = 43/43 绿、BUILD SUCCESS
  • M2 收口:两段式第一段全链路通——前端 → studio /modify/plan → aigc 反查 base 源 + 同步 worker /classify → 判意图建议 + 风险回前端needsConfirm=true危险/大改/改玩法/意图不明)待用户确认后调 /modifyM3/M4 执行)。真连 worker 的判意图 e2e 待 M5mini-desktop。前端 Vue 确认 UI = 前端 lane消费 /modify/plan,本切片 backend 承接已就位、非孤儿。worker URL 派生 = getWorkerUrl() 尾段 /generate/classify;判意图同步 HTTP 超时 30s 常量极端慢→兜底降级MVP 可接受)。

M3 确定性类执行完成、绿2026-06-29· 零 LLM

  • cheap_modify.pyapply_deterministic_modify改规范工程那一处——config/level→core.js 等 L3 的 export const NAME= 值替换 / asset→assets.js IMAGE_FILES 键值或 baseUrlno-op 检测=无任一条 found 且 old≠newok=false,是 M5 断言①地基);materialize_source_project(系统级落盘全 files 含 L1、绕 write_file 的 L1 守卫);execute_deterministic_modifyapply→缺 plumbing 才 scaffold→materialize→cheap_run build/stage/smoke/play 九门,零另造)。
  • worker 接线process_job 最前 modify 分流(_process_modify_jobdeterministic 走执行 + manifest 进 trace.modifyManifest + best-effort 带新版 sourceProject链式改regenerate-module 显式 failed 留 M4不静默吞create/生成路一字未动
  • 测试test_a11_m3_deterministic 18/18 + 回归a11_m1 5/5、a11_m2_classify 9/9、worker_service 15/15全绿。
  • 九门 smoke主会话独立复跑本机 Chrome 免 LLM:取 amgen-bake-click-score-0 base 源 → config 改 ROUND_MS 30000→19000status=succeeded、stage=play、verdictPass=true、manifest found=true、落盘 core.js=19000、运行时 remainMs=19000(改的那一处真在游戏里生效并过九门)。坐实"改规范工程一处→重建→过九门"全链路。
  • M3 收口:确定性类执行端到端通(零 LLM改动清单为 M5 断言①就位。

M4 模块重生成执行完成、绿2026-06-29· 有界单文件 LLM 重写

  • 复用机制(参数化、不复制 resume/熔断/收口)cheap_studio.run_studio 加 4 个默认 None 可选参system_prompt/initial_kick/write_whitelist/prepare切到 modify 态,create 路零行为变化(核 diff 确认 params=None 等价原逻辑、仅日志串变);cheap_toolkit.build_toolkit 加 write_whitelist非白名单 basename 写直接拒);cheap_roles.build_modify_system_prompt(复用 create 红线契约块)。
  • execute_regenerate_modify:取 intent空→failed→ materialize base 源 → 重写前后对非目标文件算 hash → 有界重写(写边界收窄到只 game-logic.jsagent 可读其余取上下文)→ 九门status=succeeded ⟺ 九门过 ∧ 非目标稳manifest {file:game-logic.js, kind:behavior, intent, changed, untouchedStable}(断言②地基)。
  • worker 接线_process_regenerate_jobregen_fn把 M3 的 regenerate-module 显式 failed 占位换成真执行deterministic/create/生成路一字未动。
  • 测试test_a11_m4_regenerate 10/10全注入桩零真 LLM含"篡改非目标→断言②抓+判 failed"+ 全回归m1/m2/m3/worker_service/toolkit/roles主会话独立复跑 73 测试全绿
  • 一次真 LLM smoke子代理单跑本机 Chrome + new-api M3base=amgen-bake-click-score-0、intent="把命中加分从固定改成连击递增" → status=succeeded、untouchedStable=True、九门 verdict.pass=True、attempts=1、¥0.31、137s、无熔断;独立 diff 佐证 5 个非目标文件字节相同、仅 game-logic.js 变且真实现连击递增。M4 plumbing 通(重写发生 + 写边界守住 + 非目标稳 + 九门跑到 verdict此次质量也恰好达标质量归 agent 层、不在 M4 判据)。
  • M4 收口两档执行deterministic + regenerate-module全落地断言②地基非目标 hash 稳)就位。

M5 验收闭环 · 三断言机器门完成、绿2026-06-29· 受计费 e2e 评估中

  • cheap_assert.py 三结构断言:① change_applied改动真生效非 no-opdeterministic=manifest 有 found 且 old≠new / regenerate=changed② nontarget_stablebase→new 真比对算内容差,非目标文件变=误伤——不信执行器自报标记,防执行器 bug 自证,兑现 Opus P1-2③ lineage_queryablebaseVersionId 在worker 侧验必要条件DB 真可查由后端 e2e + M1 回填)。three_assertions 合并 verdict。test_a11_m5_assertions 12/12。
  • 集成进 execute_*:两档执行加 base_version_id 参 + 计算并附 assertions verdict + 收紧 status 判据succeeded ⟺ 九门 ∧ ① ∧ ②regenerate 原漏判 ①changed 已补no-op 重写不再算成功worker _process_*_job 透传 modify.baseVersionId。全 85 测试独立复跑全绿(含 M3/M4 注入桩接 kwarg 修)。
  • 集成端到端 smoke主会话独立、真九门ROUND_MS 30000→19000 + base_version_id=4096 → status=succeeded、a1/a2/a3 全 true、allPass=true、落盘 core.js=19000。三断言真接进执行器、清洁改动全过。
  • 受计费真后端 e2emini-desktopA11 全链路代码已完成 + 本机端到端逐段验证(判意图链路 / 两档执行 + 真九门 / 三断言 / 血缘回填均已一手坐实)。剩最终集成证 = 经真后端studio /modify/plan+/modify → aigc → worker → 回调 → 新预览版 + D12 计费 + base_version_id 可查)跑通一次受计费调整任务,需 mini-desktop 全栈起。

状态

双评审已过(发现全处置)→ 待创始人批 → 执行M1→M5 顺序M1 为 plan① 所称"首个里程碑")。