30 Commits

Author SHA1 Message Date
lili
061cf22c87 feat(cheap-worker): 续修 middleware 机制 spike 坐实(拦 finish+注入+续跑)(切片一 阶段一前置)
on_reasoning 洋葱拦 finish Msg + 独立跑 fake check + 没过压制+注入 UserMsg 续跑,
4/4 确定性单测绿(stub 模型、零 LLM/chrome)。机制成立,阶段一接真 run_gates。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-01 05:22:49 -07:00
lili
e6525aaa3d feat(cheap-worker): 便宜档生成丰富度 + M1 达标门富化重验(切片一 A/B)
接 sim-business 设计指导到生成 agent(cheap_roles+prompt.mjs 双源,先设计后写码+MVP-first);新建纯 LLM 丰富度验证 agent cheap_verify(非阻塞·不进 verdict·零 code-presence 断言,红线落地);bake_off 加 richness 列;cheap_roles 三级回落配置热取(C2a 加载器);cheap_studio trace 接线(C1b)。富游戏 M1 三品类各 5/5=100% 过九门达标。测试 test_roles 12 / test_cheap_verify 11 / test_bake_off 17 / test_cheap_trace 4 全绿。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-30 01:39:06 -07:00
lili
47d6394347 feat(cheap-worker): per-genre 脚手架路由接入 scaffold_template/scaffold_desc(扩模板数据点)
扩模板需让难品类 AI 从预置品类骨架起步、少写。接入(全缺省回落 _template、create 路零改):
- tools.mjs scaffoldSaa(gameId, templateName='_template'):clone 指定模板;CLI 加第 3 参;模板缺失 warn 回落。
- cheap_run.scaffold(game_id, template=None):shell-out 透传模板名。
- cheap_studio.run_studio(scaffold_template, scaffold_desc):线程到 prep + build_system_prompt。
- cheap_roles:system prompt 脚手架描述参数化(⟦SCAFFOLD_DESC⟧),让 AI 知道起点已是该品类完整游戏、换皮而非重写。

管线 routing 单测 27/27、prompt 参数化 8/8。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-30 01:39:05 -07:00
lili
619351052d feat(cheap-gen): 阶段一B #1 ctx.random/ctx.time 改可调用(双 API·向母语直觉,最高频)
附A #1(最高频·每游戏用):ctx.random/ctx.time 原是对象、须 .next()/.nowMs(),AI 直觉 ctx.random()/
ctx.time() 当函数调会抛错——prompt/形状门都教"是对象不是函数"当幻觉拦。改成双 API:既可直接调用
(ctx.time()=毫秒、ctx.random()=[0,1))又保留全部方法(.nowMs()/.elapsedMs()、.next()/.range()/.reseed()),
向后兼容(框架/插件内部仍用方法形态)。

单点实现:boot-game-host 复用 createHostDevContext(单一 context 源),故 buildContext 一处包装即覆盖
host-dev + 真游戏。加 _callableTime/_callableRandom 双 API 包装器,ctx 装配处 time/random 包装。

全链路同改:plugin.js(包装器+装配)+ tools.mjs(CTX_METHODS 加 time/random、API 门错误文案翻转)
+ prompt.mjs/cheap_roles.py 双源(调用形态翻转:两形态都对、但 ctx.nowMs() 漏 .time 仍错)+ skill:144。
验证:core plugin 31/31(核心不破)+ 确定性(ctx.random()/time() 可调用 + .next()/.range()/.reseed()/
.nowMs()/.elapsedMs() 双 API)+ 形状门 11/11 + [check] PASS(双形态同段)+ cheap-worker 16/16 + 双源一致。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-30 01:39:05 -07:00
lili
ea229edf78 docs(cheap-gen): 阶段一B #7+#11 timer 单位钉死 + juice.render 每帧手调钉死
附A #7(文档钉死类·timer 是 ms 时钟、改秒是破坏性重构,取显式标注):timerScheduler.after/every
收毫秒、与 update(dt) 的 dt=秒相反——AI 易混(3 秒误写 after(3))。skill:129 + prompt.mjs/cheap_roles.py
双源钉死"3 秒=after(3000)、别 after(3)、与 dt 秒相反"。
附A #11(文档钉死/自动化·自动化不可行=render 需游戏侧 g):juice.render(g) 须每帧在游戏 render 里手调,
忘了粒子/打击感不显示。skill:116 强化(原已钉死、补 #11 标记 + 后果)。

均 doc-only(timer 本就标 ms、juice.render 本就钉死),本次显式化 + 双源对齐。验证:prompt node --check
+ cheap_roles py_compile 绿、双源一致。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-30 01:39:05 -07:00
lili
c6d31c0d81 docs(cheap-gen): 阶段一B #15 scene 回调签名钉死(防臆造首参)
附A #15(文档钉死类、非 API 改):scene-fsm 回调表里 update 只收 (dt)、render 只收 (g)
(api.d.ts:38 本就如此),但 prompt/skill 未明示防臆造首参。加钉死:别写 update(scene, dt)
这类场景名/state 首参、与五法同形。prompt.mjs + cheap_roles.py 双源 + skill define footgun 同改。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-30 01:39:05 -07:00
lili
bdcd7d472c feat(cheap-gen): 阶段一B #10 juice 加 burst(x,y) 便利方法(向母语直觉)
附A #10:AI 母语直觉是 juice.burst(x,y),旧 API 只有 spawnEmitter('burst',x,y)、burst 仅预设名
——prompt 原本教"particles-juice 没有 burst"当幻觉拦。加 burst(x,y,overrides?) 便利方法委托
spawnEmitter('burst',...) 后,直觉名直接可用。全链路同改:
- particles-juice/impl.js:加 burst(x,y,overrides) 委托 plugin.spawnEmitter('burst',...)(引 plugin 自身不依赖 this)
- particles-juice/api.d.ts:实例接口加 burst 声明
- prompt.mjs + cheap_roles.py 双源:删"particles-juice 没有 burst"(它现在有了)
- skill line116:spawnEmitter 旁注 burst(x,y) 母语别名
验证:particles-juice 18/18(含 burst 别名 spec 等价测试)+ 确定性 burst≡spawnEmitter('burst')
+ [check] PASS(juice.burst 被 API 门认可)+ 双源一致。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-30 01:39:05 -07:00
lili
dc49f5f866 feat(cheap-gen): 阶段一B #5 drawButton 改返命中矩形(黄金首件·治 #1 翻车点根因)
降AI参与·阶段一B 改签名第一处(附A #5)。逐插件改逐插件回归的黄金样板。
drawButton 由返 void 改为回吐它绘制的归一化命中矩形 {x,y,w,h}——AI 的直觉写法
const btn = hudUi.drawButton(g,{x,y,w,h},{label}); if (hudUi.pointInRect(px,py,btn)) 现在就对,
治了 #1 翻车点(drawButton 返 void 误用→变量恒 undefined→命中短路→卡菜单)的根因,而非教绕路。

全链路同改(漏一个造新脏数据):
- hud-ui/impl.js:drawButton 模块函数 + 实例方法回吐归一化矩形 r(g=null 也回吐、绝不 undefined)
- hud-ui/api.d.ts:模块函数 + 实例方法 两处 :void → :Rect + JSDoc
- tools.mjs 形状门:删 drawButton 特例分支(api.d.ts 改后自然掉出 void 名集),
  泛化判据留给仍真返 void 的方法(drawText/drawPanel/drawBar/play/flashScreen)
- prompt.mjs/cheap_roles.py(双源)/skill:指引由"返void绝不接"翻为"回吐命中矩形可直接 pointInRect"
- check.test.mjs:drawButton 测试反转(赋值不再拦)+ 链式测改 drawText
- test_roles.py/test_toolkit.py:footgun 断言 + 形状门 drawButton 测试随签名更新

验证(逐插件回归矩阵):
- 形状门单测 11/11(amodel-gen)+ cheap-worker test_roles/test_toolkit 16/16 + hud-ui 19/19
- 确定性 impl 铁证:drawButton 回吐 {x,y,w,h}、g=null 不 undefined、回吐矩形直接 pointInRect 闭环
- 真生成代码(菜单+按钮游戏)用了 drawButton、check 未拦 drawButton,证明 #5 不破坏生成
- 双源 drawButton 文案一致;prompt.mjs node --check + cheap_roles.py py_compile 绿

正交发现(非 #5):该局九门 gen 栽在 save.get() 方法名幻觉(save 插件无 get)——
是另一处方法名摩擦,记为阶段一B 后续/补密度候选,不在 #5 范围。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-30 01:39:05 -07:00
lili
74a7135746 feat(cheap-gen): 便宜档降AI参与 设计落仓 + 阶段一A 清脏数据(治传导断裂)
探索会话诊断+设计(Codex+Opus 双评审、证据驱动重定位),认领进 plan① 切片一里程碑。

落仓产物:
- 动因 evidence(母语vs方言:M3 不弱、便宜档现状方言产同款要 ~26× token)
- 方向设计(降AI参与=减摩擦[小头]+扩模板覆盖[大头未验];附A 22处摩擦/15可改签名清单)
- tech-decisions §5.1 + agent-specs/_index 蒸馏

阶段一A 清脏数据 + 文档治理锚(prompt.mjs + cheap_roles.py 双源 + skill 三文件):
- 治"传导断裂"根因:植入定位锚——便宜档=AI参与深度低的高质游戏(轻量≠简单),
  复杂度靠工程脚手架+L2 插件库、少写多调;"极小/最小游戏「点圆得分」"重框成
  "脚手架起点、借插件能力改造成高质游戏"
- collision.pointInRect(不存在)收敛 hudUi、删干净
- 漂移范例 catch-fruit/wanglanmei(旧 opts 签名)→ _template(唯一匹配现契约)
- 插件数口径统一"注入 11 + runtime-probe 取证不注入"

验证:prompt.mjs node --check + cheap_roles.py py_compile 绿;九门复验跑一局打地鼠
(历史翻车品类)attempts=1、verdict.pass、failedGates=[]、¥0.95——清脏数据未破坏生成。

核心结论(创始人确认):便宜档≠简单游戏;L2 插件库是降AI参与核心载体非税;
"换母语扔插件"=升参与、与策略相反,已推翻。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-30 01:39:05 -07:00
lili
0465471ef4 fix(cheap-worker): 真后端 gameId int→str 归一化(治便宜档经真后端全失败的阻断 bug)
A11 受计费真后端 e2e(mini-desktop 隔离实例)抓到的阻断性 seam bug:
后端 gameId 是 Java Long → JSON number → Python int;worker 直传 cheap_run 的
subprocess shell-out(scaffold/build/stage/smoke/play 要求 str)→ TypeError(expected str, not int)
→ scaffold 失败 → 静默归 llm_error → 便宜档经真后端 generate/modify 全部失败。

本机单测用 str gameId 没暴露;真后端 Java int gameId 才触发(e2e 的价值)。
修:_default_run_fn / _process_modify_job / _process_regenerate_job 三处 job 消费边界
归一 game_id=str(...)(str("x")=no-op,既有零影响)。e2e 重跑后全链路成功。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-30 01:39:05 -07:00
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
lili
14c79dbfdd feat(studio): A11 切片三 M4 模块重生成执行(有界单文件 LLM 重写 game-logic.js)
两段式第二段的 regenerate-module 类:改玩法 = 据 intent 有界重写 game-logic.js,不动其余。

复用机制(参数化、不复制 resume/熔断/收口):
- cheap_studio.run_studio 加 4 个默认 None 可选参(system_prompt/initial_kick/write_whitelist/prepare)
  切到 modify 态,create 路零行为变化(params=None 等价原逻辑)
- cheap_toolkit.build_toolkit 加 write_whitelist(非白名单 basename 写直接拒)
- cheap_roles.build_modify_system_prompt(复用 create 红线契约块)

cheap_modify.execute_regenerate_modify:
- 取 intent(空→failed)→ materialize base 源 → 重写前后对非目标文件算 hash
- 有界重写(写边界收窄到只 game-logic.js)→ 九门
- status=succeeded ⟺ 九门过 ∧ 非目标稳;manifest{file,kind:behavior,intent,changed,untouchedStable}(断言②地基)

worker_service._process_regenerate_job(regen_fn):把 M3 的 regenerate-module 显式 failed 占位换成真执行;
deterministic/create/生成路一字未动。

测试:test_a11_m4_regenerate 10/10(全注入桩零 LLM)+ 全回归独立复跑 73 测试全绿。
一次真 LLM smoke(单跑):intent=连击递增 → status=succeeded、untouchedStable=True、九门 pass、
attempts=1、¥0.31、137s;独立 diff 佐证 5 非目标文件字节相同、仅 game-logic.js 变。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-29 02:16:22 -07:00
lili
51230f1347 feat(studio): A11 切片三 M3 确定性类执行(零 LLM 改规范工程一处→重建→九门)
两段式第二段的 deterministic 类:用户确认后的改动落到规范工程那一处,零 LLM。

cheap_modify.py:
- apply_deterministic_modify:config/level→core.js 等 L3 的 export const 值替换;
  asset→assets.js IMAGE_FILES 键值或 baseUrl;no-op 检测(无 found&&old≠new→ok=false,M5 断言①地基)
- materialize_source_project:系统级落盘全 files(含 L1,绕 write_file 的 L1 守卫)
- execute_deterministic_modify:apply→(缺 plumbing 才 scaffold)→materialize→cheap_run build/stage/smoke/play 九门

worker_service.py:
- process_job 最前 modify 分流(_process_modify_job);deterministic 走执行 + manifest 进 trace.modifyManifest
  + best-effort 带新版 sourceProject(链式改);regenerate-module 显式 failed 留 M4;create/生成路一字未动

测试:test_a11_m3_deterministic 18/18 + 回归全绿。
九门 smoke(独立复跑,本机 Chrome 免 LLM):amgen-bake-click-score-0 base 源 → ROUND_MS 30000→19000
→ status=succeeded、verdictPass=true、manifest found=true、落盘 core.js=19000、运行时 remainMs=19000
(改的那一处真在游戏里生效并过九门)。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-29 01:49:10 -07:00
lili
fc782db08b feat(studio): A11 切片三 M1 前置基座 + M2 worker 判意图
M1 前置基座(便宜档源回传落库链 + base 源注入 + 血缘):
- derive_profile 兑现(便宜档基线 profile{realtime,discrete-choice,metric})解锁 sourceProject 回传
- worker parse_modify 提取 modify 区(mode/baseVersionId/modifyPatch/sourceProject)
- executor 据 baseVersionId 反查注入 base 源到 HTTP job(镜像 SaaGraphDispatcher.resolveBaseSourceProject)
- 回调落源回填 base_version_id 血缘(landSourceQuietly)

M2 worker 判意图(两段式第一段,NL→建议改动+风险):
- cheap_classify 把用户原话 + base 源可改面(assets.js 资产清单/core.js 集中数值/game-logic 玩法)
  判成 {category,mode,target,payload,riskLevel,needsConfirm,clarify}
- mode×category 锁定(LLM 给的 mode 不采信)+ 危险回问硬编进 needsConfirm(只低风险确定性改免确认)
- worker /classify 同步端点(不入生成队列、不起 Chrome)

测试:Python test_a11_m1 5/5 + test_a11_m2_classify 9/9 + 回归全绿;
Java 执行器/回调/源服务 + SAA 回归(本地 maven 独立复跑 46 + 子代理 98)全绿。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-29 01:04:55 -07:00
lili
d00938ccbd feat(cheap-worker): M3b 本机 U1-U3 — 9d trace parity 救活 D11 + D9 vendored + 跨语言反假绿门(切片一 M3b)
便宜档生成切到 cheap-worker 新路后,result_out 只产 trace.cost、缺 9d trace 七项,致后端 D11 ReadinessScorer 三维恒中性、退化成 45/55 双峰近恒定分,D9 反同质失效。

U1 cheap_studio 富化:build_trace_source + _furthest_stage,additive 捕获 verdictFull/driverType/models/stage。U2 result_out._build_trace:七项(repairs=max(0,attempts-1))+ sevenGateVerdict{pass,guards} + gatespec{driver} + cost + similarity,camelCase 镜像 _extract_trace、None 容错。U3 D9 dedup vendored 进 cheap-worker/dedup.py(registry 指自己 results/)、worker_service 接线非阻断。

Java 跨语言切片测加逐维反假绿门(反射调真 ReadinessScorer:三维脱离中性 + 合成分 100 vs 退化 ≤55 拉开 ≥35)。顺带修预存 M3a 红测:worker 异常兜底 failureReason 改传真枚举 llm_error。

验证:cheap-worker 全 16 测绿 + Java 切片 5/5 绿 BUILD SUCCESS。范围仅 cheap-worker/ + 2 fixture + 1 Java 测 + plan,零 live 触碰。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-28 02:17:41 -07:00
lili
a327c9913e fix(m3a): result-out failureReason 对齐后端 FailureReasonEnum 真七值(catch-all=llm_error)
mini-desktop 真 e2e 部署收口抓到的契约 bug:result_out 七值集用了 content_violation/
budget_exceeded/generation_failed 三个不在 FailureReasonEnum 内的值、catch-all 用无效的
generation_failed → worker 失败回调被后端 DifyCallbackTxService.isValidFailureReason 拒
(「failureReason 不在契约#6 七值枚举内」)、回调事务回滚、任务未转终态。

修:七值集对齐 FailureReasonEnum(unsafe_prompt/intent_unclear/no_template_match/
config_invalid/llm_error/timeout/asset_gen_failed);catch-all=llm_error(SaaGraphDispatcher 同口径)。

Java slice test 原只测成功路 validateSucceededPayload、漏测失败路 failureReason 校验故没抓到 →
改为反射调后端真 isValidFailureReason(就是它拒了 generation_failed),本地即可守此 bug 类。

验证:Python result_out 13/13 + Java slice 4/4 本地绿;待 mini-desktop 重部署真 e2e 复验。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-27 22:06:50 -07:00
lili
847089b541 feat(m3a): 便宜档 Node 退役机制 U1-U4 本机交付(Python §6.1 worker + 后端路由契约/A2A/幂等)
M3a 退役机制 plan 经 Codex+Opus 双评审(needs-rework)→ 按创始人 A(全局 dispatcher
flag 整体翻转、不做 per-request 灰度)重写 → Opus 复审 minor-fixes → 发现项全数修复。

U1 Python §6.1 HTTP worker(cheap-worker/worker_service.py + result_out.py):
  202 投递握手 + 有界串行队列(治串行 worker 忙 409 误判)+ 三字段 result-out
  (gameConfig 占位 / engineBundle 承重含 __GameBundle / sourceProject best-effort 2.0)
  + HMAC 回调。27 单测 + 真生成 e2e 过九门 + 真网络回调。

U2 跨语言契约 slice test(CheapWorkerResultOutContractTest):反射调真
  validateSucceededPayload 过薄校验 + 真 CallbackSignatureVerifier HMAC。

U3 A2A 状态(additive):AigcTaskStatusEnum.toA2aStatus + app VO/RPC DTO a2aStatus
  字段(保留数字 status 不破坏调用方)+ Convert/ApiImpl backfill + 契约 aigc.yaml。

U4 创作请求级幂等(行业标准 idempotency):DO idempotencyKey + Flyway V26
  (列+唯一索引,NULL 多值=不去重)+ Mapper selectByIdempotency + submitGenerate dedup。

真验证抓到并修 2 个真 bug:① worker 回调走系统代理被 fake-ip 拦 502 → 禁代理 opener;
② result-out 顶层 costRmb 不在 DifyCallbackReqVO 字段内、后端严格拒未知 → 落 trace.cost。

验证:Python 27 测 + Java 21 测全绿(mvn BUILD SUCCESS)。
剩余 U2 真派发 / U4 真 DB / U5 待 mini-desktop 真部署。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-27 21:18:28 -07:00
lili
ffe3a5c993 fix(WU-C 5.4): tap-targets harness 认单数/可空 target — 解 M2 Node 退役阻塞
M2 auto-vs-golden 门抓到的生成契约漂移修复(Codex 实现 + 主代理诊断/受控验证)。
根因:~20% click-score 款 _forensicsView 暴露单数 target(对象、菜单态为 null)
而非复数 targets(数组),tap-targets harness 只认复数数组:① _build_play_spec
推断漏判→误推 key-cycle;② 驱动器 targetsPath 找不到单数 target。

两处修(认两种合法形态、既有数组行为零变):
- cheap_run.py:_build_play_spec 以【键存在性】判 tap-targets(targets/target 键
  在即可,菜单态 null/空数组仍归 tap-targets)——非值类型(空数组过/null 不过的
  非对称是漏判根因)。
- play.cdp.cjs:runTapTargets 取值非数组时回退读单数 target、包成 1 元素数组。

验证:退化款 avg-click-score-14 auto 路 E_live/G_input/H_progress 0.667→1.0
(3/3 确定性复现);test_ensure_play_spec 8→13 绿。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-27 10:41:16 -07:00
lili
8038109ce8 feat(cheap-worker): 同游戏双驱动 play 编排 + auto-vs-golden 批跑(M2 U2)
run_pair_dual_sync:同一份 staged src/ 上先自动 spec(ensure_play_spec)、后金标
(inject_golden)各 play 一次,取两组逐门 verdict——隔离生成方差、只暴露驱动器差。
编排序 gen-only→smoke→断言 staged 无残留 spec→ensure→play(auto)→inject→play
(golden);auto_gates 在金标注入前捕获。run_batch 端口池+线程前台有界并发(≤15
夹取、复用 bake_off._clamp_conc)、报告 auto-vs-golden-<idx>.json 不覆盖。
mock 编排单测(调用序 + auto 先于 golden + no-spec 守卫)20/20 全绿。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-27 08:47:13 -07:00
lili
dd0d1cc224 feat(cheap-worker): Node 退役授权三条齐判定 retire_authorization(M2 U3)
读三份既有落盘报告聚合:① M1 达标(bake-off-M1-final.json overallMeets)
② 002 对照等价(compare-multi-002-final.json summary.equivalentGenres ⊇ 三品类)
③ M2 auto-vs-golden(meets)。三条全绿→authorized;任一 False/报告缺失/字段类型
不符→未授权并列明欠项(不静默当通过)。纯函数零 LLM 零真跑。单测 17/17。
真切路由/D12 扣退在 M3。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-27 08:43:58 -07:00
lili
423b0b6df3 feat(cheap-worker): auto-vs-golden 逐门 delta 判据 + double-low 守卫(M2 U1)
按品类逐门比 auto 过门率 vs golden 过门率,关键门 {E_live,H_progress,G_input}
容差 0(delta≥0)、其余门容差 -1/N。方向单边查「自动不比金标驱得差」(delta<0
退化),非查更松。double-low 守卫:关键门两路都 <0.5 → inconclusive(红),防
delta=0 假象(承 compare_node.doubleLowRed 同源风险)。aggregate_delta 三品类
全 aligned 才整体 meets、卡死品类不被平均掩盖。纯逻辑零 LLM。单测 11/11。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-27 08:41:46 -07:00
lili
aaa9461bd9 feat(cheap-worker): bake-off 达标门改质量口径 + 编排未收敛单列(M1 U3 收口)
创始人 2026-06-27 定:达标门只衡量九门质量地板,编排未收敛(M3 撞
timeout/step_cap、无 verdict)剔出达标率分母、单列 unconvergedTotal 归 M2
编排硬化。judge_genre 分母改 converged 款,rawPassRate 并报(贴近生产真实
交付率、不作判据);converged==0 → insufficient。

实测合并 14 款 click-score(batch2 满21 + batch3 补7 offset7):质量
11/12=0.917 达标(原始 0.786,2 款未收敛=timeout+step_cap),whack-mole
7/7=1.0、shop-serve 6/7=0.857 → M1 三品类全过 ≥0.8、达标门绿。

bake_off 单测 12→14(加未收敛剔除 + unconvergedTotal 汇总);全套件 86 绿。
M1 合并收口报告 → cheap-worker/results/bake-off-M1-final.json(results gitignored)。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-27 07:30:53 -07:00
lili
452d2f2642 feat(cheap-worker): bake-off 加 --offset 支持补跑不覆盖既有批(M1 U3)
补跑 click-score(确认满批 5/7 是否抖动)需 gid 从 offset 起、不覆盖 bake-<key>-0..6;
run_bakeoff 加 offset 参数,gid=bake-<key>-<offset+k>。单测 11/11 仍绿。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-27 07:00:01 -07:00
lili
0d582b2956 feat(cheap-worker): ≥80% 达标门 bake-off 骨架 + 聚合判定单测(M1 U3)
新建 bake_off.py:tap-targets 三品类各 n 款 run_studio(run_gates=True)生成→自动 spec
驱动九门→取 verdict.pass,按品类聚合 pass_count/total、逐品类 ≥0.8 判达标;任一品类缺样本
报覆盖不足、任一 <0.8 整体未达标(绝不总体平均掩盖卡死品类)。判定纯走确定性九门 verdict.pass、
零 LLM。真跑复用 compare_node 端口池+线程前台有界并发(conc≤15)、gameId 品类前缀隔离、报告不覆盖。

验证:test_bake_off.py 11/11(判定 meets/below/insufficient/边界0.8 + 假绿防护不被平均 +
覆盖不足 + 上限夹取 + 零LLM确定性)。20 款 M3 达标门真跑(收口硬判据)待执行。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-27 04:47:14 -07:00
lili
6f69167d97 feat(cheap-worker): 自动 play-spec 加厚到金标同质 + 防自证(M1 U2)
ensure_play_spec 的 tap-targets occupied 族补 expectedEngineCallPrefixes,让生产自动
spec 的 F_wiring 从「宽松过(只验有调用)」升到「验调了正确 L2 插件」、达金标同质。期望取
自预置常量 _TAP_TARGETS_CALL_PREFIXES(外生 held 期望,对齐三份金标 fixtures),绝不从
该局实际 __engineCalls 反推——否则 F_wiring 退化自证、必过、假绿。key-cycle 族保持薄版
(待输入键契约 WU-C 5.4)。spec 构造抽 _build_play_spec 纯函数便于单测。

验证:test_ensure_play_spec.py 8/8(与三份金标逐字段一致 + 防自证外生恒定 + key-cycle
薄版 + 已存在不覆盖);auto-vs-golden 真跑 delta=0(打地鼠自动 spec 驱动 vs 金标 9 门全
一致,F_wiring 在自动 spec 下真验语义期望仍过)。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-27 04:40:04 -07:00
lili
7dffe6b2c1 feat(cheap-worker): 便宜档预算闸 <¥10 fail-closed 接线 + 成本落盘(M1 U4)
开 CircuitBreakerMiddleware 的 ¥ 累进硬闸(enable_rmb_gate=True)+ 设便宜档专属 ¥10 硬
上限(区别 tier2 ¥3);on_model_call 发起前预估、越线 fail-closed 抛 Tier2CircuitBreak
(budget);取价不可达由 _ensure_pricing 降级次数闸(既有行为,不静默超支/阻断)。run-summary
补 costRmb(breaker.spent_rmb 同 new-api quota 折价口径)/ rmbGate(active|degraded)/
tokens(usage_sum)。

验证:test_budget_gate.py 6/6(¥10 fail-closed / 正常不拦 / 边界 / 降级放行 / 开关旁路 /
¥10 与 tier2 隔离);真跑一款打地鼠成本落盘 costRmb=1.1373<¥10、rmbGate=active、tokens 462642。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-27 02:01:20 -07:00
lili
04dbd0608b feat(cheap-worker): compare_node 加有界并发(端口池+线程,可选)
并发的真正约束=九门 play/smoke 固定端口+Chrome 实例(gameId 前缀已隔离产物)。
查清整条链端口可参数化:gen.mjs --port/--cdp(done 门 smoke 用)、play.mjs
每次独立 spawn server+Chrome+userDataDir。据此:
- _port_pool:每并发槽一对独立 (server_port,cdp_port),段不重叠。
- run_pair_sync:同步整对跑(线程内 run_studio 自带 loop)。
- run_multi 加 conc:端口池(size=conc 天然限并发)+ asyncio.to_thread 每对一线程
  + gather。conc=1 串行;conc>1 有界并发。前台进程内有界并发,非后台子代理 task。
- _gen_node 传 --port/--cdp 给 gen.mjs(并发防 smoke 撞端口)。
CLI 加 --conc。test_compare_multi 14/14(+端口池不撞)。
2026-06-26 11:00:00 -07:00
lili
3a117c1ac4 feat(cheap-worker): U2 compare_node 三品类对照 + 金标 spec 注入(生成/play 拆步)
cheap_studio.run_studio 加 run_gates 开关:gen-only(=False)跳过内部
ensure_play_spec+九门 play,让对照方在生成与 play 之间注入金标 spec。

compare_node 扩三品类×n:两路各 generation-only → 强制覆写金标 spec 到
staged _wg1-gen/<id>/play-spec.json(play.cdp.cjs 真实读取处,非 evidence)
→ 各自单独 play,把驱动器从对照变量摘掉(对照公平)。judge_genre 两层判据
+ 逐品类绝对地板 + 双低标红;按品类聚合产框架等价证据(金标 spec 下);
前缀隔离串行;报告分批次不覆盖。

修双评审:金标注入 staged 真路径(Codex C1/C4)、判据绝对地板防双低假等价
(Opus O4/F2)。test_compare_multi 13/13;回归 test_compare 8/8 零破。
2026-06-26 10:49:47 -07:00
lili
369d5bad9b feat(cheap-worker): U1 三品类金标 play-spec fixtures
点击得分/打地鼠/经营点客三份金标 play-spec(均 tap-targets occupied +
score 递增门 + expectLatch),formalize base1/base2/base4 验证过的 occupied
spec,作对照实验的恒定驱动器。只依赖 forensics 契约、不绑定具体游戏坐标。
test_golden_specs 6/6:schema/品类对位/契约依赖/无放置族-keycycle-safeOnly。
2026-06-26 10:43:39 -07:00
lili
675a8e688b feat(cheap-worker): 便宜档 Node→Python 重写进 AgentScope spike — 范式可移植坐实
WU-A 迁移面 spike:便宜档生成核心(多轮 ReAct + 五工具沙箱 + done 门)用 Python 在新建 cheap-worker/
重写成 AgentScope agent,import 复用 tier2 框架层(model client/四道熔断/历史压缩/observability),
check/build/九门 shell-out 现有 node/cjs(不重写 esbuild/CDP/形状门)。

- U1 地基:跨包 sys.path import tier2 worker + 代理旁路 + key 从内网文档注入 env + M3 装配
- U2 五工具:read/list/write Python 实现 + check/build shell-out(形状门三态与 Node 一致)
- U3 LittleJS system prompt:prompt.mjs Python 化(两条 footgun 正反例 + 输入契约)
- U4 scaffold/stage/play 薄壳 + ensure_play_spec(据 state 形态产 play-spec 治链路假绿)
- U5 ReAct 主编排:内置 Agent+ReActConfig+外层有界 resume + done 门 + 收口 stage/smoke/九门
- U6 对照 Node:产物形态 + 九门逐门 + 过门率对比

验收:同 brief Python 新路 vs Node 旧路,产物都真 src/ 6 文件、九门都 9/9 全 PASS、过门率 1.0=1.0
→ spikePass=True。端到端单局 attempt 1 一次收敛、148s。落点 cheap-worker/ 对 tier2/amodel-gen
零改动(结构性零回归)。测试 38/38 全绿。

origin: docs/plans/2026-06-26-001-feat-cheap-worker-python-spike-plan.md

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-26 02:42:14 -07:00