73 Commits

Author SHA1 Message Date
lili
8200aa08d0 feat(tier2): W-ASSET-SRC 源工程存储 manifest-first 落库 + 治理对账门 + 取回重建 harness + 孤儿清扫 job (SRC T1-T4)
Some checks failed
contract-gates / contract-gates (push) Has been cancelled
docs-gate / docs-gate (push) Has been cancelled
背景/目标:tier2 富游戏 BackendStore 真实现已写好却未通电,且 save 走 MinIO-first、半落库会留无 manifest
指向的隐形对象,manifest 表游离在治理外(in-code DDL + 留档 .sql 双源无机器门)。本切片按已拍板的
manifest-first 方案把 SRC 一面推到「接生产、schema 受治理、取回可重建、半落库孤儿有修法」。只碰富游戏这
一面,不动便宜档 Java 面、不做素材、不接 fetch 生产消费方。

改动(六件核心 + T1/T3/T4):
- T2① status 列(pending/committed):新建走 CREATE DDL、存量走受治理 ALTER;BackendStore._ensure_schema
  按 information_schema 探测缺列才补(每实例一次,跨 MySQL/MariaDB 稳)。
- T2② save 改写入序:MySQL 落 pending 行 → MinIO put → 翻 committed;命中 committed 幂等返回、命中
  pending 复用 versionId 续跑自愈(同前缀真覆盖)。半落库崩溃只留可见 pending 行、无隐形对象。
- T2③ fetch 两条分支(取最新 / 取指定版本)都补 AND status='committed',pending 半成品对取回不可见。
- T2④ 治理归属:.sql 留 tier2/config/schema/(owner=tier2、不走 huijing Flyway、无执行副本),
  contracts/README.md 加治理指针认领、明说不参与 Flyway 对账;不塞 db-schemas/ 根。
- T2⑤ 可跑对账机器门 test_store_ddl_reconcile.py:规范化比对 in-code(_DDL+_ALTER)与 .sql,改一处
  漏改另一处即红。
- T2⑥ 修 store.py 模块头 docstring 整块(占位/seam/绝不实连/forbidden-import 守着 的陈旧误述改为与真
  实现一致,并纠正守卫范围:check-forbidden-import.sh 只禁 wg1.*/SAA/L2,不禁 pymysql/minio)。
- T1 接线单点:TIER2_STORE=backend 激活配方 + 前置 checklist(CREATE DATABASE / status 列状态确认)落
  staging-ops §7(tier2 gen-worker 部署 env 单点);不改 default_store 工厂形态。
- T3 取回重建 harness store_roundtrip_harness.py:五条(确定性重建优先 bundle sha256 字节相等、非字节稳
  才退九门 verdict 逐项一致+无 missingContent、不拿近乎恒真 buildInputHash 承重;版本寻址;幂等;缺源
  显式失败;半落库两失败点),本地 LocalFsStore 自检覆盖 1-4、真库+bundle 字节相等标 follow-up 窗口。
- T4 孤儿清扫 store_cleanup_job.py + BackendStore.cleanup_orphans:乐观删(status=pending CAS 先删行
  再删对象)防与续 put 的 TOCTOU 竞态,幂等,owner=tier2,可追溯日志。

契约(contract-first):.sql DDL additive 加 status 列 + 首份受治理 ALTER;contracts/README.md 治理指针;
落库寻址 doc↔code 断言点(表名/双唯一键/「pending 对 fetch 不可见」)。不改 tier2-source-project.schema.json
addressing、不改 buildInputHash 字段、不改 GamePackage / 便宜档 source-project.schema。

验证:本地 14 个新单测真跑全绿(DDL 对账 3 + manifest-first 行为 8 + harness 本地 3);harness 脚本
LocalFsStore 自检 5/5;docs-gate 七检全绿;forbidden-import 守卫通过。真 MySQL+MinIO 往返 + bundle 字节
相等 = mini-infra 窗口 follow-up(worktree 无真库/无 esbuild,诚实未跑)。缺重依赖的既有测试(agentscope/
nacos)本极简 venv 未跑,均不 import store、与本改动无关。

计划锚点:docs/plans/2026-07-05-001-feat-asset-src-源工程存储-plan.md §4 T1-T4 / §5。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-05 18:03:28 -07:00
lili
d9def7d901 feat(cfg): 步骤4 收尾两针——两 Service 入口接热源工厂(旗默认关=字节不变)+ genconfig __main__ 自检块期望值随单源现值修正(50.0/60,阈值批 bfeaea2d 漏改自检块)
Some checks failed
contract-gates / contract-gates (push) Has been cancelled
docs-gate / docs-gate (push) Has been cancelled
入口接线:tier2 service/app.py:main 与 cheap_service_app.py:main 对称各调 build_and_attach_hot_source(tier=...),
工厂自带启用旗(TIER2_GENCONFIG_NACOS 默认关)+ best-effort,无条件调不再包旗;两档各订各 dataId 不串档。
验证:tier2 126 passed / cheap-worker 339 passed 1 skipped / genconfig 自检块全 OK / py_compile 两入口过。

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-04 09:23:20 -07:00
lili
3b6573941d feat(cfg): NacosHotConfig 接进 genconfig — HotConfig 单例工厂 + 取值链前端热源(配置控制面阶段二·步骤4)
件2 genconfig 接热源:get() 取值链最前端插进程级热源单例(attach/detach),优先级 Nacos 热源>env>YAML>内置默认>调用方 default;复合键 area.key 无歧义扁平化 (area,key) 二维;缺键/未 attach/异常一律回落原链,绝不引入第二默认值(坑④·tech-decisions §13);热源命中即返回不读 YAML,mtime 缓存无从盖住热值;middleware 等所有 genconfig.get 调用面一行不改。

件1 worker/genconfig_nacos.py 工厂:启用旗 TIER2_GENCONFIG_NACOS 默认关(=行为字节不变,兼作 §3.6/§6 回退开关);按档隔离 dataId(tier2=gen-hot-params-tier2 / cheap=gen-hot-params-cheap,env 可覆盖);建 client 前 NO_PROXY 内网旁路;真实 namespaceId 默认空串(勿写 public,沿前置任务口径);注入 NacosHotConfig 的 defaults 刻意空;全程 best-effort 失败不 attach 不抛,genconfig 回落纯本地。

cheap-worker 共享 worker.genconfig(from worker import genconfig),两档隔离靠各进程 attach 各自 dataId 的热源;缝在 cheap_service_app.py:main 对称调 build_and_attach_hot_source(tier=cheap),本单不动只说明。

验证:单测 19 条锁死四条回落路径(未 attach/Nacos 不可达/namespace 配错/YAML 回落)+ 两档各读各 dataId + Nacos>env 优先级 + 门阈值热读 + 工厂 best-effort/按档/NO_PROXY/namespace 空串;worktree 全量 126 passed 无回归;真 Nacos(mini-infra 100.64.0.8)演示脚本改演示 dataId → genconfig 0.5s 热读到新值不重启、清理不碰生产 dataId。

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-04 09:15:33 -07:00
lili
056433d5bb fix(nacos): namespace 口径统一 public→空串(默认公共空间 namespaceId=空串,非字面量 public)(配置控制面阶段二前置)
Nacos 默认公共空间的真实 namespaceId 是空串,"public" 只是显示名(namespaceShowName)。
现状代码写 namespace: public 会带 tenant=public 静默落进一个 id 为 public 的空间,
路 B 写读两侧不一致时配置永远推不到(阶段〇同款坑)。真取证:
GET /nacos/v1/console/namespaces 返 namespace:"" / namespaceShowName:"public";
nacos-sdk-python v1 client.py 逻辑 `if self.namespace: params["tenant"]=...`——空串不带 tenant=走默认空间。

改动(五处触点,均只动默认公共空间语义处):
- game-cloud huijing-server application.yaml:discovery/config 两处 namespace public→""(+中文注释)
- tier2 gen-worker service/nacos_registry.py:NACOS_NAMESPACE 默认值 public→""(+中文注释)
- tier2 gen-worker tests/test_nacos_registry.py:断言随改 == "public" → == ""
- docs/内网凭据与端点.md:Nacos 段补 namespaceId 口径行(空串非 public,写读两侧对齐)

不动:各模块 -dev/-local profile 的 namespace: dev(独立命名空间 dev,非默认公共空间语义);
docs/plans 历史留痕档的 public 字面量(留痕层不改)。

验证:nacos_registry 单测 6 passed;application.yaml YAML 语法有效(两处 namespace 落空串);
py_compile 通过;docs-gate 6/7 检绿(唯一 G3 死链为 pre-existing、与本改动无关)。

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-04 08:46:53 -07:00
lili
7c3792669e fix(tier2): 拆双源默认值影蔽——run_engine/batch_run 的 max_iters 旧 default=40 显式透传短路 genconfig,改 None 哨兵回归单源
Some checks failed
contract-gates / contract-gates (push) Has been cancelled
docs-gate / docs-gate (push) Has been cancelled
r3 生产实证:阈值批(bfeaea2d)把 writer_max_iters 提到 60,但 r3 日志仍打
「max iteration numbers 40」——middleware 系旋钮(step_cap>100/设计超时>420)
经 genconfig 直读全部生效,唯 writer 轮数被 batch_run.RunParams(40)+
batch_run argparse(40)+run_engine argparse(40) 三处写死默认显式透传覆盖。
三处全改 default=None(run_studio 已有 None→genconfig 解析),genconfig 回归
writer 轮数唯一事实源;studio docstring 同步防再犯。tier2 107/107。

含义:r3 的 writer 实际仍 40,创始人「提轮数」尚未真达 writer;F-3 同病但
两档同病=对照内部有效。F-3 收轮后部署此修,r4 才是 60 轮的真收敛测。

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-04 03:26:58 -07:00
lili
9a64b3a39c merge(工单c): 软停后 finish 逼近递进升压(N=3 提醒/2N 强制,finish 尝试复位;on_acting 注入贴脸催收,治 80011 软停仍烧到硬地板)· fable 终审过(middleware 亲审:阈值/finish 语义/stuck 签名零动,counter=0 逐字节等价)
Some checks failed
contract-gates / contract-gates (push) Has been cancelled
docs-gate / docs-gate (push) Has been cancelled
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-04 00:53:03 -07:00
lili
eb135a9041 feat(tier2): 软停后 finish 逼近递进升压(工单 c)——连续 N 轮不 finish 经 on_acting 注入升压收尾指令逼软着陆
软停(budget_soft_tripped)已有 on_system_prompt 强提醒 + on_acting 拦生成类工具,但那是被动系统提示,
M3 可能烧推理不理会(80011 实录:软停触发后仍烧到 step_cap/硬地板才停)。本次在共享 CircuitBreakerMiddleware
加「finish 逼近升压」:on_reply 用现有事件计数面数软停后连续无-finish 的 acting 轮(ToolCallStartEvent +1;
一推理轮无 tool call=finish 尝试则轮边界复位),达 N=3 轮升第一档(提醒收尾)、达 2N=6 轮升第二档(强制立即
finish、禁新增大额生成);升压指令经 on_acting 注入工具结果(拦截语并入 / 收尾类结果尾部附加),跨档只注一次。

只改观察/注入路径与状态跟踪:不动任何熔断阈值 / finish 语义 / 九门;无新增配置键(_softstop_rounds 派生);
_softstop_rounds=0 时 on_acting 与升压前逐字节等价(兼容既有 cheap 共享面)。cheap_budget 同源共享,不改 cheap 文件。

新增 tests/test_softstop_escalation.py(5 用例):升压逐档升级 / 透传附加 / finish 尝试复位 / 不足 N 轮零升压 / 硬地板仍兜底。
验证:tier2/gen-worker 102 passed;cheap-worker 共享软停面 29 passed(test_budget_two_stage 等)。

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-04 00:49:35 -07:00
lili
688f83fdc5 feat(tier2): 收敛环台账 infra 归因穿线(observe-only 第一迭代)——治 F-2 R1 设计团队超时降级被误判"分散"的生产盲区
把「设计团队超时降级 / writer 撞轮数墙 / step_cap 熔断 / ¥ 软预算软停 / 墙钟超时」这类
编排层事件从 studio 运行态穿到批跑台账,让退路树能一眼归因。此前两败局其实 100% 集中在
「设计团队超时降级路」,但台账 fail_system 空 → decide_n5 按 fail_system 看"分散"出
R3_conditional,主持人只能人工翻日志归因。

做法(不塞 fail_system,游戏系统桶语义不污染;decide_n5 的 R1/R2 分流逻辑一字不动):
- RunRecord 新增 infra_flags: list[str](field(default_factory=list);受控值集 INFRA_FLAGS
  五项常量 design_team_degraded/writer_iter_wall/step_cap_tripped/soft_budget_tripped/
  wall_timeout,注释写明可扩)+ 纯映射 infra_flags_from_runtime(信号→值集,去重稳定序);
- studio 运行态采集:设计团队降级点(捕获异常,.kind=='timeout' 归 wall_timeout)、外层
  resume 轮数墙、熔断返回 kind、¥ 软预算软停标记,经 _infra_flags_from_runtime 归一进 result;
  design_team.DesignTeamError 加 kind 区分墙钟超时;
- batch_run.result_to_record 从 result 抽 infra_flags 落台账(防御式复制);
- decide_n5 只把各轮 infra_flags 分布打进 reasons(如「r1 infra 分布={design_team_degraded:2,
  wall_timeout:2}」),不分支、不改任何出口。

向后兼容:旧 jsonl 行无 infra_flags → from_jsonl_line 读空列表不炸;r{N} 轮分组正则不动;
middleware.py 不动;退路树出口枚举与判定不动;decide_n5 签名不破坏。

验收:新增单测 5(纯映射/studio fake 运行态采集/batch 落账/旧行兼容/decide_n5 分布行+出口不变
含 --no-strong-baseline 语义原样);全套 102 passed(97 基线 + 5);run_record 与 fallback_tree
的 __main__ 自检、decide_n5_from_jsonl 新旧混合行端到端均通过。

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-04 00:37:16 -07:00
lili
bfeaea2d42 feat(tier2): 创始人令提生成预算阈值——writer 40→60 轮 / step_cap 60→100 / model_calls 80→120 / 墙钟 1800→2700s
Some checks failed
contract-gates / contract-gates (push) Has been cancelled
docs-gate / docs-gate (push) Has been cancelled
F-2 两轮实证 40/60 是预算墙非能力墙:美食类硬 brief R1 churn 到 step_cap、
R2 设计收敛后 writer 仍 40 轮被截,resume 续修窗只剩 ~20 步修不完。步顶 100
= writer 60 + 续修 ~40 headroom;失控保护交 ¥ 两段式(50/75)与墙钟 2700。
cheap Service 显式传 150 不受影响;cheap CLI 继承(纯兜底,¥10/15 是真闸)。
tier2 97/97 + cheap 329/329。

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-04 00:14:32 -07:00
lili
0a9504e400 fix(tier2): 设计团队墙钟 240→420s(F-2 R1 两败局实证,KTD2 定点修)
Some checks failed
contract-gates / contract-gates (push) Has been cancelled
docs-gate / docs-gate (push) Has been cancelled
R1=3/5:两败局(美食/糖水店)同构——3/4 专家已产出、末段调用/leader 撞 240s
墙钟→降级单 agent 设计→writer 40 轮不收敛→step_cap;三过门局设计团队全部
正常收敛(超时↔失败 5/5 完美相关,台账 fail_system 空导致退路树误判分散)。
M3 thinking 慢尾单调用可达 120-180s,420 给一次慢尾余量,与 step_timeout_s
同刻度。YAML(运行面)与 _BUILTIN_DEFAULTS(兜底)同改防漂移;tier2 97/97。

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-03 23:56:32 -07:00
lili
8d94128d7e fix(cheap): C6反馈驱动器族错配直指(selectionBasis回退+H零增量→先修targets/spec别改计分) (cutover S2 工单a)
工单a1(真修):build_cheap_feedback_obj 的 H_progress 分支——当判卷驱动器族是「回退」兜出来的
(staged play-spec.json 的 driver.selectionBasis 含「回退」二字)且 H 失败为零增量类(同源读 g.checks
的 before/after 判 after<=before,不 re-parse 字符串)时,把该门 fixDirection 从原「核对得分随真玩上升」
掉转为直指:先让运行态暴露 targets / 修 play-spec,而不是改计分逻辑;原 H 详情保留在 detail。
三条不命中支(driver 正常选中 / score 有真增即终局不可达 / 读不到 selectionBasis)一律保原门提示一字不变。
新增 _cheap_selection_basis(镜像 _cheap_driver_type 容错)、_h_zero_increment 两个 helper。
80007 盲修¥14.9(key-cycle 驱不动购销循环→真玩零得分→原文案指向改计分→M3 盲修烧到硬地板)实证。
单测 test_gate_judge_mismatch.py 7 用例全绿;既有 gate_judge/feedback 32 用例零回归;tier2 路未碰。

工单a2(实证无需改):前提「_template-shop 漏 targets 契约」经端到端真跑证伪。
_template-shop 自建档提交 9ddd173c(2026-06-30)起,_forensicsView().state() 就暴露 targets 键,与参考
模板 _template-feiyi 结构一致;A2 批(34923812)只加「起局按钮解耦 render + targets 键名约定进 prompt」、
未动 targets 暴露本身。全管线 scaffold→build→stage→smoke→ensure_play_spec 真跑,shop 得
driver.type=tap-targets(selectionBasis=可点目标类,非 key-cycle 回退),与 feiyi 正对照行为一致。
模板已满足契约,按最小改动不造多余改动。

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-03 19:21:55 -07:00
lili
5afb9823cd fix(tier2): stuck 熔断签名富化=工具名+状态+归一化错误头,对齐设计意图「同错反复」——异类4连败不再误熔断(交step_cap/¥闸兜底)+工具失败即时打印观测(80009 生产事故:签名恒为裸error且无从归因) (cutover S2 观测修)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-03 18:53:09 -07:00
lili
b78a8dfa4f merge: A1 核心修复批——单①驱动器约定收敛(C5接线:startRitual起局仪式+driver显式selectionBasis+sourceHash陈旧重生+金标held-constant不误杀)+单③反馈补厚(C6结构化单一来源:latch双支phaseNow+driverType+game-log摘要+CLI九门回喂对齐+tier2 sidecar富文本不变)+预算两段式(软停¥10/¥50只许收尾·on_acting拦生成面+硬地板×1.5 fail-closed,CLI/Service同源,W-ARCH②)+genre最小路由(五类词表·特异性降序)+Service壳合成终结事件+压缩崩fail-open补丁(SummarySchema全required根因坐实)。T7复现:fx4c-3 9/9·fx4c-1起局成功8/9;T8真M3 smoke:C6回喂环真转·软停真触发·硬地板真fail-closed(¥3.0158)
Some checks failed
contract-gates / contract-gates (push) Has been cancelled
docs-gate / docs-gate (push) Has been cancelled
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-03 14:43:31 -07:00
lili
714d0adebc fix(cheap): judge_cheap_verdict 全绿路 feedback 文案改准(「九门全绿,放行」取代误导的「未定位到未过门」;passed=True 时 feedback 本不回喂,仅日志/trace 用) (T7 fx4c-3 复跑发现)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-03 14:32:57 -07:00
lili
9e1e943503 feat(budget): T3 预算两段式统一(软停线 ¥10/¥50 只许收尾+RMB 硬地板 ×1.5 fail-closed 封上界+CLI/Service 同源工厂) (W-ARCH②,创始人 2026-07-03 裁决)
- middleware:soft 档升两段式——越软停线置软停+on_acting 拦新增生成面工具(write_file/write_source/scaffold_init,
  收尾类 finish/check/build/跑门/只读恒放行);越硬地板(软停线×rmb_hard_floor_ratio=1.5)fail-closed 抛熔断,
  spent>floor 后 est≥0 使下次调用必拦 → 整局 ¥ ≤ floor+单笔,上界数学可证明;hard 档单段语义逐字不变
- genconfig+generation.yaml:rmb_hard_limit 3.0(spike 占位)→50.0(富档软停线裁决值)、新增 rmb_hard_floor_ratio=1.5
  / cheap_rmb_hard_limit=10.0 登内置默认,带裁决出处中文注释
- cheap_budget.build_cheap_breaker:便宜档 breaker 唯一装配点——CLI(cheap_studio,原 hard 单段 ¥10 改两段)与
  生产 Service(cheap_service_app,原 soft 无地板补地板)同源读 genconfig,档位参数不可被 overrides 改
- 测试:两段式 11 用例(软停区间放行/生成工具拒·收尾放行/硬地板到线即停/spent>floor 次调必拦/工厂同源 env 同变);
  test_budget_soft_stop 旧「soft 无界」口径按裁决更新为两段式并补越地板用例;既有 hard 档测试全量不动全绿

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-03 14:15:59 -07:00
lili
6ef0b5d75e 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>
2026-07-03 14:10:56 -07:00
lili
93cdffa33e feat(cheap): T2 续修反馈补厚·C6 判卷契约接线(latch 双支 phaseNow+driverType+game-log 摘要+CLI 九门回喂对齐+tier2 结构化 sidecar) (W-S1 修复三单·单③)
- gate_judge:反馈先构造 C6 结构化对象(build_cheap_feedback_obj)再渲染中文(单一来源,拼串丢字段结构上不可能);
  latch advisory 支(phaseNow)与驻留支(after)都读;每条逐门带 driverType(staged play-spec 取数);
  game-log.json 告警/报错摘要进反馈(截断保护);C6 对象落 evidence/verdict-feedback.json 证据留痕
- cheap_studio:CLI 收敛判据升「九门绿」——finish 后 _closeout_gates 跑门,未绿且轮数/预算有余带 C6 反馈
  resume 续修(与生产 RepairMiddleware finish 点拦截行为同型);软停后只收尾不回喂;收口复用最后一轮门结果;
  对照路 run_gates=False 零改动
- tier2 对齐(有界零行为变更):verdict_feedback 富文本逐字不动,新增 verdict_feedback_obj+write_feedback_sidecar
  结构化 sidecar 落 evidence/(judge_tier2_verdict 未过时 best-effort)
- Service _cheap_check / driver _build_summary 传 game_id+staged_dir 解锁完整反馈口径
- tests/test_feedback_c6.py:phaseNow 两支/负样本被 validate.py 拦/driverType/game-log 截断/sidecar/富文本不变 14 用例

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-03 14:08:44 -07:00
zizi
96de98b345 feat(prompts): 打磨不降档包——创始人定调「质量bar单一:档位切scope不切polish」落地(cheap v1.6.0:删spike能跑即可残留+hitstop出禁项改结算标配+设计块强制落盘+finish前收尾自查+新增⑩难度曲线;tier2 player v1.1.0:fun=5须记忆点/fun≥4才pass,scoreOnly焊死零行为影响;⑨经营决策模式清单落sim-business §1;双审收口:fable+真codex同判top10=筛选+精修尾部/金标最大杠杆,ⓓ落定、新待拍ⓔ手感轨;test_roles 12/12+双parity逐字节+registry 17条+docs-gate全绿)
Some checks failed
docs-gate / docs-gate (push) Has been cancelled
2026-07-04 03:19:37 +08:00
zizi
0e66fc953e feat(prompts): 策划知识包v2——cheap主prompt v1.5.0(⑨否决项判定句式+计数口径统一,test_roles 12/12逐字节绿)+剧情/经营rubric fixture补全接线(skill表改指针消双写)+tier2四专家v1.1.0加策划判据(内置↔md parity×4,registry 17条对齐)+prompt.mjs冻结为A/B史料;真LLM金标复验挂窗;3待拍(⑨升底座第12条/prompt.mjs退役/品类适配) 2026-07-04 02:25:55 +08:00
lili
4517941b95 feat(tier2): F-1 富三门 verdict 反馈补厚到便宜档水平(护城河反馈契约·质量SoT§3.7裁定3/5)
每个失败子检查透传 harness 实测 detail + 一句为什么(_RICH_CHECK_WHY,对齐便宜档
_CHEAP_GATE_HINTS 范式);经济门失败暴露三个数(实测 coins 终值/游戏内赢线 coinsTarget/
验收外生 winThreshold),游戏内赢线低于验收地板直接指出结构性错配;静态 economyConsistent
差额折进反馈(静态可达而真玩挂→指向耐心/时序/节奏;静态死局→先修数值);H_progress 失败
喂回本局 play-spec 真玩断言清单(path/op/why)。run_gates 返回加性携带 gameId 供反馈组装
读盘;判定逻辑(passed/failed_gates/decision)与 harness 零变化;便宜档不动。
单测 9 新增 + 全套 70 绿。

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-02 20:27:15 -07:00
lili
24e558a4ed fix(cost): 成本子系统改用 per-POST 凭据取价(不再依赖 Service 进程 env NEWAPI_KEY)+ Service 注 key 兜底 + requirements 补 app-runtime extras (阶段一② cutover 接缝)
Some checks failed
docs-gate / docs-gate (push) Has been cancelled
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-02 18:39:32 -07:00
lili
e9e7006cb3 feat(cheap): 便宜档九门判据 judge_cheap_verdict + run_cheap_gates 同步门跑(端口透传) (切片一 阶段一②/T1)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-02 11:51:39 -07:00
lili
f4384dc3f3 fix(tier2): 封陈旧 verdict 假绿(run_gates 起跑前清 verdict)+ 补软停实测置位回归护栏 (切片一 阶段一①/终审fix)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-02 04:07:30 -07:00
lili
2e698566df feat(tier2): Service 工厂注入续修 middleware + drive_generation single_post 单回合(老 resume 留 fallback) (切片一 阶段一①/T4)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-02 03:23:12 -07:00
lili
c26617192a feat(tier2): 软预算 ¥ 闸从 fail-closed 改优雅收尾软停(交尽力产物·不断链) (切片一 阶段一①/T3)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-02 03:04:24 -07:00
lili
e9c7a3bb47 feat(tier2): 续修 RepairMiddleware 提升进 middleware.py + GateJudgment 真契约 + budget_exhausted 联动 (切片一 阶段一①/T2)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-02 02:37:16 -07:00
lili
55162341ca feat(tier2): 统一门判据 GateJudgment + tier2 verdict 适配器 (切片一 阶段一①/T1)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-02 02:24:22 -07:00
lili
2fac985bbf feat(gen-worker): middleware 热参经 Nacos v1 同步 watcher 热读(快照兜底)(切片一 阶段〇 D2)
NacosHotConfig 线程安全 store(RLock)+ get_config 三级兜底 + v1 add_config_watcher 同步热更(免 event-loop),
消灭自建薄读接口。回调 dict 键逐字对齐已核验 v1 源(data_id/group/namespace/raw_content/content)。
6 单测绿(初读/热更/不可达回落/默认保留/脏内容保旧值/并发线程安全)。真连烟测随后端窗口。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-01 17:40:40 -07:00
lili
ab6791cf34 feat(gen-worker): AgentScope Service 注册进 Nacos discovery(替硬编码@8200)(切片一 阶段〇 D1)
nacos_registry 注册实例+心跳+优雅注销,advertise_ip 指 mini-desktop Tailscale;代理旁路;
NACOS_REGISTER=1 才开、best-effort 失败不中断 Service。单测 mock client 锁注册+旁路+best-effort。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-01 17:40:40 -07:00
lili
f4cea4677a feat(tier2): 统一 trace 落库 sink + SAA schema + 生成控制面只读后端(切片一 C1/C3a)
JsonlFileSink 把五字段 trace 落 workdir/trace.jsonl(非阻塞·写失败不阻断生成);studio.py sink 接线;SAA 扩展段 schema(接口对称五核心+内容不对称 ext);管理面 3 只读端点 roles/traces/cost(惰性 import 保住「仅 import service.app 不牵 fastapi」红线)。测试 test_jsonl_sink 3 / test_admin_routes 6 全绿。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-30 01:39:06 -07:00
lili
8d4654ab63 fix(tier2): serve-and-play chrome cleanup 杀整树(治泄漏)+ 切片二 U5 执行发现
chrome 泄漏根因:cleanup() 只 kill $CHROME_PID(父)→ renderer/gpu 子进程 reparent 给 init 成孤儿、
跨款累积(实测 U5 Round1 撞 wall_timeout、杀批组仍残留)。修=cleanup 加 pkill -f "$USER_DATA_DIR"
杀本实例整棵 chrome 树(user-data-dir mktemp 唯一、不误伤别的 chrome/live worker)。

plan 执行发现:① env 闸缺口(fresh worktree 无 node_modules/esbuild → build 失败 → M3 假性不收敛,
已补 U1 S0 + Risks);② M3 已证能收敛(smoke 面包+水果 clean accept、九门全过);
③ U5 Round1 被 confound(chrome 泄漏 + live worker:9501/@8200 争 4 核)、需隔离干净重跑。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-28 16:54:17 -07:00
lili
eed34d0a32 feat(tier2): 切片二 U2/U3/U4 本机 TDD 全绿(护栏/退路树 n=5/play-scene 门结构化)
U2 batch_run:BatchConfig 批级 ¥/墙钟/token 上限 + assert_under_round_cap 跨轮闸 +
  main() catch 非0退出(fail-closed,已跑款不丢)。
U3 fallback_tree:decide_n5(覆写 decide() 非包装——decide() 无 deepseek 强便宜档即 Q1 早退吞 M3;
  收敛需末轮≤1 且≥2轮压首轮裸运气;R1/R2 复用 _system_concentrated/_bucket_share;R3_conditional 无强档;
  len>4 拒裁)+ --n5 CLI 入口。
U4 run.py:validate_play_scene 公开签名不变,抽 validate_play_scene_src(src) 在剥注释+字符串的 skel 上判
  bindInput/tick/handleNormalizedInput,挡注释/字符串规避假过。
测试:fallback_tree 自测 +9 / test_batch_guardrails 3 / test_validate_play_scene 4,全绿。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-28 08:59:29 -07:00
lili
4e801d5e8a docs(reframe收口): 生成引擎 reframe 全层 doc-sync + 统一执行 plan + 上线主计划 SoT + §6.8 双评审
双查一致性(Codex+Opus)→ 修问题 → 出 plan 全链收口。

修问题(reframe 全活层 doc-sync · 框架统一 AgentScope / 三档按 AI 深度 / 去超休闲 /
A-model 写真 src/ / tier2 spike accept · n=5 收敛环 / 预算闸 <¥10·<¥50):
knowledge 三件套 + 顶层图说 00/01/02/05 + 6 域 README + 5 mvp 账本 + skill·workflow +
agent-specs(_index / 演进路线降留痕);系统性死链 自治富游戏引擎.md → 运行时 SoT repoint(7 档)。

AGENTS.md:§2 收敛上线主计划 SoT、§3.1 入口自审 reframe 对齐。

出 plan:① 生成引擎统一执行计划(新建 · 统一三档 · 吸收退役 06-18-001/06-19-001/003);
② 4 份重复 plan 退役/并入/去两线 banner;③ 可行性方案16周 就地升格为项目上线主计划 SoT(canonical)。

§6.8 双评审(Codex+Opus)6 必修已修:WU-A 真实拓扑+JS留+迁移契约 / A11 孤儿接缝(①WU-B↔③阶段三)
/ 三档拆清 / ③ 过度表述 / 人办清单 n≥30→n=5 / 死链。

tier2/HANDOFF.md:n≥30→n=5 + agentscope-runtime→2.0.2 Workspace doc-sync banner。

①③ status=草稿·双评审已过·待创始人确认 F1(WU-A 迁移归属)后转正式。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-25 12:14:25 -07:00
zizi
fdc9ecd50b fix(tier2): 控制面 SSE 等待防永久卡死(read 超时;008 实证)
cp-smoke-008 实证:控制面在 attempt 0 卡死 60min。根因 = _wait_for_turn_end 的总/空闲超时检查写在
aiter_lines 的 line 循环【体内】,而 httpx read=None;当 SSE 流【完全静默】(008:服务端 3 次 redis
超时打断了事件发布 → 既无 data 也无心跳)时 aiter_lines 永久 await,没 line 进来 → 超时检查永不触发 →
控制面无限挂。修:read=idle_timeout_s(300s),静默超它即 ReadTimeout → except 兜住 → 据 on-disk 评门继续。
不误杀正常回合(agent 内部 run_gates chrome ~60s << 300s)。

注:008 的不收敛是【基建+本 bug】所致,非生成质量——收敛修复(driver)已由 007 现成游戏重跑独立坐实
(accept/九门+富游戏三门全绿)。008 另暴露:工作室设计团队 >240s 超时 degrade 回单 agent(仍产出
design_text);redis 偶发超时(mini-desktop→mini-infra 链路抖动)。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-24 13:53:04 +00:00
zizi
c1bf28f15b fix(tier2): C1 trace 加 workdir 存在守卫(免 scaffold 前刷 FileNotFoundError)
008 实证:首轮 scaffold_init 之前会有早期 SSE 事件,此时工程 workdir 还没建 → trace 追加写刷
FileNotFoundError(best-effort 已吞、但刷屏)。加守卫:dirname 不存在即静默跳过(不抢先建目录、
免干扰 scaffold 的"已存在不覆盖"逻辑)。scaffold 后正常落 trace。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-24 12:57:14 +00:00
zizi
3156a2a9db fix(tier2): C1 trace 抓对工具名字段(tool_call_name/tool_call_id/state)
008 真跑实证:C1 trace 工作(119 行/28 工具调用捕获),但 TOOL_CALL 事件没记到工具名——
_compact_sse_event 误取 tool_name/name/id,而 2.0.2 真实字段是 tool_call_name(START 带)+
tool_call_id + state(TOOL_RESULT_END 的结果态)。修正取这三个真字段:trace 现在能看清
「agent 调了 scaffold_init→write_source→build→run_gates… 哪一步、成没成」——这才是"看见卡在哪"。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-24 12:54:11 +00:00
zizi
21472811be fix(tier2): run_gates 缺 driver 时默认 business-sim play_spec(修服务态假性不收敛根因)
★ 收敛根因实证(cp-smoke-006/007 真跑 + 007 现成游戏带 driver 重跑):服务态 play_spec=None →
游戏永不被真玩 → F_wiring(calls=0 expected=[])挂 + 富游戏三门拿不到观测=None(不是 False=没法评估)→
agent 看到 verdict=fix 却在"修一个不存在的问题"→ 反复 thrash 到 budget_exhausted。**游戏本身是好的**
(007 boot/render/live 全绿、暴露 resource.addCoins/consumeIngredient call-ID、latch 终态、bindInput 路由)。

铁证:用默认 business-sim play_spec 对 007 现成游戏重跑门 → decision=accept / L1.passed=True /
九门全绿 / 富游戏三门(tripleLink/economy/latch)全绿。即 M3 单写 + 设计阶段【已经】产出过门富游戏,
"不收敛"纯是控制面没传 driver 的假象。

修:run_gates 在 play_spec 缺 driver 时 setdefault DEFAULT_BUSINESS_SIM_PLAY_SPEC(driver 按参数驱动、
不靠逐像素坐标,对任何契约合规 business-sim 游戏通用;bakery feie-005 / coffee 007 同款过门),显式
play_spec 仍优先。一处修复同时惠及 agent 自己的 run_gates 工具(thrash 根)与控制面评门。richGame 仍据数据表自派生。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-24 12:43:27 +00:00
zizi
ffd22f22c2 feat(tier2): C1 trace 中间件接 with_studio(开 Studio 即旁路推 OTLP span)
C1 此前建了 observability.with_studio + studio_sink(OTLP→Studio),但没 wire 进真正跑的
Tier2TraceMiddleware(它在 worker/middleware.py、C1 没动)。本提交把中间件新建 adapter 的路径从
TraceAdapter(...) 换成 with_studio(...):drop-in——TIER2_STUDIO_URL/infra_config[studio] 取不到时
studio sink 自动 no-op,行为与原 TraceAdapter 完全一致(CLI/服务两线不开 Studio 即无感);取到地址则
每步在原 sink 外旁路推一份 OTLP span 给 AgentScope Studio(observe-only,best-effort,不阻塞主链)。
存 _studio_sink 句柄供收口 flush。配合 mini-desktop 起 Studio(创始人:now)即得真跑可视化。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-24 11:49:03 +00:00
zizi
b1217301c8 feat(tier2): C1 轻量观测——控制面把 SSE 事件记成每局可读 trace
C1 观测的轻量兑现(创始人:没有完整的 C,B 迭代很慢)。不起 Node Studio(它在 6c6g 非 mini-desktop、
是 Node monorepo,重)——而是在控制面客户端侧顺手把逐帧消费的 SSE 结构性事件(跳过 *_DELTA 逐 token 噪声)
记成 per-run JSONL 时间线:模型调用/工具调用(带工具名)/工具结果/推理/reply 边界/卡死信号
(REQUIRE_USER_CONFIRM/REQUIRE_EXTERNAL_EXECUTION)。落工程 workdir/control-plane-trace.jsonl,跨 attempt
追加=整局多轮时间线。零服务改动、零 Studio 依赖、best-effort(写失败只告警不中断)。

迭代时一眼看清「agent 调了哪些工具、按什么序、卡在哪」——这正是这轮 debug 反复要的可见性。
observability/studio_sink.py 的 OTLP/Studio 全量 UI 路仍在、是将来可选(待 mini-desktop 起 Studio)。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-24 11:01:06 +00:00
zizi
34336d3204 feat(tier2): C3 证路基线接 deepseek-v4-pro 跨族 cross-check(创始人 2026-06-24 裁定)
网关现实(实测):new-api 只有 MiniMax + deepseek-v4-pro,无 Opus/Fable/Claude/GPT;
build_baseline_model('Opus') 真调返 503 model_not_found。创始人裁定证路当前用 deepseek-v4-pro
跨族 cross-check(不比 M3 明显强、证路力偏弱,但能跑;真强模型证路待网关开 Opus/Fable 渠道、
改 generation.yaml 即接,代码已就绪)。

加 BASELINE_CROSSCHECK + _BASELINE_NAME_BY_KEY 的 crosscheck/deepseek 聚合 key + generation.yaml
model.baseline_crosscheck=deepseek-v4-pro。实测 deepseek-v4-pro 在 new-api 上 Anthropic 原生路可用,
build_baseline_model('deepseek-v4-pro') 真调返「跨族已通」——证路走 Anthropic 路与 M3 同协议同线对照。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-24 10:56:55 +00:00
zizi
d0b30ddace feat(tier2): 设计阶段接进服务路径(修服务态不收敛根因)
006 真跑实证:服务态 writer 拿空 design_text → 富游戏三门(tripleLink/economy/latch)全挂、
4 次 resume 不收敛(产物结构合法能渲染,但三系统联动没接对)。CLI 线 run_studio 先跑工作室设计
阶段再写、故更易过门;服务路径此前整段跳过设计(app.py 文件头标的 followup)。

修:bootstrap 加 _run_design_phase——在控制面进程内(有 agentscope+模型)复用 studio._design_stage
(工作室星形多 agent 团队 + 失败 degrade 回单 agent)产出 design_text,喂进 AgentRecord.system_prompt
(roles.writer_system 第二参)。每局建 agent 时跑一次,不随 resume 重跑。best-effort:设计失败返 ""
不阻断生成。do_design 经 drive_generation 透传(control_plane --no-design 可关,对照用)。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-24 10:53:38 +00:00
zizi
34b9ce3be0 fix(tier2): BYPASS PATCH 须带 query agent_id(修 422 missing agent_id)
上一修的 PATCH /sessions/{id} 设 BYPASS 返 422:missing query agent_id——该端点与 SSE stream
一样要 query 参数 agent_id。修:_patch 支持 params,_set_permission_bypass 把 agent_id 作 query 传。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-24 08:55:51 +00:00
zizi
9630c1ece7 fix(tier2): 服务态会话设 BYPASS 权限(修工具调用卡死 ASK)
toolkit 抠取修好后,agent 能调工具了,但每个 chat run 抛「Agent is waiting for 1 tool calls...
but received no event」(agent/_agent.py:931):tier2 九工具默认 check_permissions 返回 ASK
(_adapters.py:99),服务态无人确认 → 工具调用进 ToolCallState.ASKING 等永不来的确认事件 →
生成零产出(workdir 只有 play-spec.json,九工具一个没执行)。

CLI 线靠 studio.py 的 _bypass_state()(AgentState permission=BYPASS)解决;服务态此前没设。
修:bootstrap 建 session 后 PATCH /sessions/{id} permission_mode=bypass
(app/_router/_session.py:334 更新 AgentState.permission_context.mode;PermissionMode.BYPASS="bypass"),
start_new_game / iterate_existing_project 都设;resume_session 复用同 session 自动继承。加 _patch helper。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-24 08:52:29 +00:00
zizi
e06ddc887a fix(tier2): thinking 关时 budget 归一为 None(修基线模型 Parameters 校验)
C3 Opus 基线探针实证:build_baseline_model('Opus') thinking 关时传 thinking_budget=0,被
AnthropicChatModel.Parameters 的 thinking_budget>0 约束拒(ValidationError),基线根本构不出。
C3 代码落地时假设 budget=0 可行,但从没真跑过基线、未暴露。

修 build_model:thinking_enable=False → thinking_budget 归一为 None(Parameters 字段 int|None,
Anthropic 仅 thinking_enable 时才用它)+ 跳过 max_tokens>budget 校验(该约束只在 thinking 开有意义)。
M3 路(thinking 开、budget=8000)行为不变,硬校验保留。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-24 08:46:07 +00:00
zizi
01a3229a9e fix(tier2): 服务态从 Toolkit.tool_groups 抠九工具(修 chat run 起手即崩)
B1 控制面真驱 :8200 暴露:每个 chat run 起手即抛 RuntimeError「无法从 Toolkit 抠出
FunctionTool 列表」→ 服务态生成零产出(M3 没写任何文件、SSE 只有心跳、4 次 attempt 全 null
verdict)。P4 只验了服务能启 + BackendStore 往返,从没真跑过一回合 chat,故此 bug 一直潜伏。

根因:_extract_function_tools 按 tools/_tools/function_tools 扁平探测,但 2.0.2 Toolkit 把工具按组
存 self.tool_groups(构造传入的 tools 被包进 "basic" 组,group.tools 是 list[ToolBase];源码
tool/_toolkit.py:127-135 + :515)。修:先从所有 tool_groups 收 .tools(得九个 FunctionTool),
旧扁平探测降为兜底。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-24 08:39:19 +00:00
zizi
76aab8d703 fix(tier2): bootstrap /chat input.content 须为内容块列表(控制面 smoke 实证)
credential/agent/session 已通后,POST /chat/ 返 422:body.input.content「Input should be a
valid list」。根因 = Msg.content 经 REST 传 JSON 必须是内容块列表,而 bootstrap 发了裸字符串
(Python 端 UserMsg(content=str) 的字符串自动包块只在构造器内发生,不经 REST JSON 校验那条)。

修:加 _user_input(text) helper 统一组 input = {name,role,content:[TextBlock]},三处 chat
调用(start_new_game/resume_session/iterate_existing_project)改用它。TextBlock JSON 形状
{type:"text",text:...} 据源码 message/_block.py:11 核实。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-24 07:57:39 +00:00
zizi
295f232d20 fix(tier2): bootstrap 凭据注册体对齐活服务 schema(控制面 smoke 实证)
B1 控制面真驱 :8200 时 POST /credential/ 返 422:Field required body.data。根因 = bootstrap
的 _resolve_m3_credential_payload 发了扁平 {type,base_url,api_key,model},而 create_app 的
CreateCredentialRequest 要 {data: dict}(凭据载荷嵌 data 下),且 model 不是凭据字段。

据活服务 GET /credential/schemas 的 Anthropic schema + 源码 app/_service/_model.py:get_model
(模型类由 CredentialFactory.from_dict(data).get_chat_model_class() 据 data.type 决定)定稿:
data = {type: "anthropic_credential", api_key, base_url};模型名仍在 session.chat_model_config.model。
agent/session/chat 体经源码核对结构一致(CreateAgentRequest/CreateSessionRequest/ChatModelConfig/
ChatRequest),无需改;X-User-Id 头通(返 422 而非 401 证明已过鉴权进 handler)。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-24 07:55:34 +00:00
zizi
bd8b2c80a6 feat(tier2): B门重机器并行落地——控制面有界resume + Studio观测 + MCP工具面 + 基线client/Prompt门
B 门(AgentScope 重机器)四单元并行建设,文件不相交,均过 6c6g 静态校验(py_compile +
惰性 import 安全 + 机器门)。真跑收敛/Studio/门验证属 mini-desktop,作为下一步 e2e。

B1 控制面有界 resume(service/control_plane.py · 皇冠):
  补上 service/app.py 与 bootstrap.py 文件头标的 followup——CLI run_studio:404-458 的外层有界
  resume(M3 看一次 verdict 就停 → 带反馈踹回去续修)此前在服务态(create_app :8200)缺失。
  drive_generation() 复用 bootstrap REST 原语 + run 纯代码门:每回合消费 SSE(REPLY_END/
  EXCEED_MAX_ITERS)等 chat run 结束 → 独立跑 run.run_gates 机器判门 → 门绿据 on-disk 源工程
  重建七要素 + persist 落库 / 否则 verdict_feedback 续修,直到门绿/预算耗尽/熔断。不靠内存
  session 判收敛(服务态九工具每回合工厂新建 Tier2Session),贴合「门机器判、控制面绝不自评翻绿」。

C1 AgentScope Studio 观测(observability/studio_sink.py + trace.py):
  把统一 trace 事件按 OTLP(经核实 Studio = OpenTelemetry,非私有 REST;HTTP 3000 /v1/traces)
  映射成 span 推 Studio,traceId→gen_ai.conversation.id 聚成一条 run。私有 TracerProvider 避免
  抢 otel 全局单例。默认关闭(无 TIER2_STUDIO_URL 即 no-op)、observe-only、绝不改 decision。

C2 MCP 工具面(worker/mcp_tools.py + toolkit.py 加性挂点):
  图说 E 族——build_toolkit 末尾加配置门控挂点,默认关闭时 build_mcp_clients() 返回 []、
  Toolkit(tools, mcps=[]) 与原构造等价,九工具(spike 已验证主链)行为零改。Toolkit 接受 mcps=
  形参已对源码核实(tool/_toolkit.py:93)。

C3 基线 client + Prompt 一致性机器门(config.py + genconfig.py + generation.yaml + ci/):
  build_baseline_model(Opus 经 new-api Anthropic 原生)供 A 门「证路」,build_model M3 路零回归;
  check-prompt-registry.sh 文件级三向一致 + import 级命中 registry,6c6g 实跑 exit 0。

修复 design_team 配置外置兑现(design_team.py):
  leader_max_iters/per_expert_cap/timeout_s 改 None→genconfig.get('design_team',...),此前硬编码
  默认 240 导致改 generation.yaml 的 timeout 不生效;已验 genconfig 真读到 YAML 值。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-24 07:46:59 +00:00
zizi
ce491314c8 feat(tier2): P4 服务化核心——Agent Service(create_app)+ 第二装载真落库(MySQL+MinIO)
【U1 Agent Service】service/{app,infra_config,bootstrap}.py + config/infra.yaml:
经 agentscope 2.0.2 官方 create_app 把 tier2 引擎接成 Agent Service 壳——复用 studio 的 agent 装配零件
(roles/九工具/四熔断+trace/BYPASS/历史压缩)接到 create_app 扩展点(extra_agent_tools/extra_agent_middlewares),
不重写生成逻辑。Redis(mini-infra)做 storage(db0)+MessageBus(db1)。session 三路(新建/续接/加载工程迭代)经 REST(bootstrap.py)。
诚实差距:有界resume/工作室多agent/L2-L3/落库=循环外编排,服务态由控制面承接(已标 followup)。

【U2 真落库】store.py BackendStore 真实现(替 P3 NotImplementedError)+ schema SQL:
manifest→MySQL(幂等键 game_id+source_hash)+源文件全文→MinIO(bucket tier2-src);fetch 回填重建。
pymysql+minio 惰性 import;TIER2_STORE=backend 切换。

全 tier2/ 内、零碰 Tier0/1、py_compile+惰性import实证+forbidden-import 通过。真部署(连基建+uvicorn+smoke)待 mini-desktop。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-24 06:37:37 +00:00
zizi
c9dbd50d80 feat(tier2): B门-配置外置——生成器旋钮 + prompt 全部数据驱动(调生成=改数据重跑、不改码)
让"调生成"从改代码变成改数据,直接给"优化 20% 过门率"的迭代提速。默认值=现有硬编码值、行为字节不变,改外部数据才生效。

【生成配置层】genconfig.py + tier2/config/generation.yaml:
把硬编码旋钮(model 选择 / 熔断·预算 rmb_hard_limit=3.0 / 迭代 writer_max_iters=40 / 工作室 Team leader_max_iters=12·per_expert_cap=2 / 品类参数)
抽成中央 YAML、运行时读(env TIER2_GENCONFIG 覆盖 + 缺省回落内置默认);config/middleware/studio/design_team 改读 genconfig。
回归:4 关键旋钮默认取值 == 改造前硬编码值;整 worker 包编译过。
(未externalize:fallback_tree ★阈值 + harness HUMAN_MIN_PATIENCE 门阈值——门阈值次要、gates 现 advisory,留后续。)

【Prompt 外置】prompts.py + contracts/prompts/09-tier2-richgame/(8 .md)+ registry.yaml:
tier2 的 8 条 system prompt(writer/design-leader/4 专家/player/design-system)外置到 Prompt Registry(契约#8),
运行时按 id 读 + 三级回落(env > registry .md > 内置原文)+ best-effort 不中断;{{input.*}} 字符串替换(避开裸 JSON 花括号噎 format)。
roles.py 改读 registry 但对外接口字节不变(studio/design_team call site 零改)。
回归:13/13 产物逐字节 == 改造前(含带参 design_leader/writer 四种入参组合);registry 缺失回落内置原文。Tier0/1 既有 8 条 prompt 零改动(red line)。

全 tier2/+contracts/prompts/ 内、零碰 Tier0/1、compileall + forbidden-import 通过。注:两 workflow 中 U1(genconfig)结构化报告解析失败(基建层),代码已落盘且主会话直接复核(编译+默认值回归过)。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-24 05:32:37 +00:00