lili 8d851ea716
Some checks failed
contract-gates / contract-gates (push) Has been cancelled
docs-gate / docs-gate (push) Has been cancelled
feat(cheap-gen): W-AXIS-V2 波2——取证契约退役+提示全加载链清洗,四门∧测试员为唯一验收链
opus 执行位交付、主会话四步验收过(三套测试亲跑/红线 diff 亲读/冒烟截图亲眼):

- 验收消费:check 新增源码级插件调用存在断言(_pluginCallPresenceErrors 词法层,
  接替 F_wiring 真接线护栏);_forensicsView「必须实现」拦截摘除,降级为可选调试
  接口(handleTap 输入契约与 ctx.log 日志纪律保留);gate_judge 放行措辞对齐四门
- play-spec/驱动器退役(逐件裁定 10 件):gen.mjs done 门自动产 play-spec 摘除、
  cheap_gates/cheap_studio/cheap_modify/service_driver 调用摘除、_read_driver_type
  改读 evidence/playtest/playtest.json;golden-spec 三工具(auto_vs_golden/bake_off/
  compare_node)显式封存;ensure_play_spec 两实现保留一个版本窗口(只摘调用不删码)
- prompt 全加载链清洗:cheap-system.md v1.6.3→1.7.0(删 _forensicsView 自动验收
  契约红线与全部 targets/occupied 语义,五法句/品类指路同步),cheap_roles 内置
  回退逐字节同步(test_roles 12/12 证 parity),modify 切片经运行时切块自动同步;
  5 品类 skills+littlejs 手册+recipes×2+模板 8 件+README 6 件教学清洗,真设计
  价值(单击 casual/可解性质/双层反馈/latch)保留
- 批账:hard_genre_batch/xtheme 行加 playtest 段,_row_total_cost 修 shadow 下
  测试员成本漏算(v2 取 max 防双计)

验收(主会话亲验):pytest cheap-worker 512 绿 + tier2 141 绿 + node 49/49;
25 局基线新旧口径重放对照——真坏 5 局全拦(floor 拦 2/测试员拦 3)、无一例旧拦
新放,翻案 2 局均为破案坐实的仪器误杀;n=3 冒烟(mode=v2)全链绿:w2v2-sim
harness verdict.pass=True 而测试员 reject(机械放行测试员逮住,盘上双证)、
w2v2-sim-fix 现象反馈两轮回喂→fix2 收敛(配方显示修成,局内截图亲眼);
rg 零残留(模板残留均为「验收不读它」的降级调试接口合规形态);真跑 ¥8.4。

已知余项:repairFeedback 有产地、Service 续修环消费者未接(测试员 reject 不入
RepairMiddleware,续修判据仍四门)——是否接入随波3 校准数据一并裁;v1 配置级
回退窗口关闭为创始人知悉项,genconfig 默认 mode 仍 shadow、切 v2 归创始人。

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-10 09:21:04 -07:00
..

_template — A-model 游戏克隆起点(3 层架构)

一个可玩的最小游戏「点圆得分」(menu→play→over)。克隆它、只改 src/game-logic.js(按需拆 core.js/render.js),改成 brief 要的游戏。别从零搭骨架,在 game-logic.js 起点上改最省事。

3 层 + 你只碰 L3

文件
L1 固定 plumbing(write 会被拒) index.html · entry-bundle.js · src/host-config.js(已注入全 11 插件 + viewport 390×844 + wiring) · src/game.js(薄 wrapper:摊平 opts.runtime → 交 game-logic) 不碰
L3 你写的游戏本体 src/game-logic.js(必写) · src/core.js(推荐:纯逻辑,可内联) · src/render.js(推荐:画面) · src/balance.js(可选:数值) · src/assets.js(可选:资产) 只写这些

入口契约(钉死)

// src/game-logic.js —— 你写这个
export function createGame({ plugins, bundle, viewport }) {
  // 插件已扁平注入(全 11 件,用到才解构):
  const { sceneFsm, sessionScore, hudUi, timerScheduler } = plugins;
  // 可用键:sceneFsm sessionScore hudUi timerScheduler save gamefeel juice palettePost audioMusic collision physics
  return {
    async init(boot) { const ctx = boot.ctx; /* 装资产→定义场景→start;输入不订阅(L1 派发到 handleTap) */ },
    update(dt) { bundle.tick(dt); /* ★必调;再推进玩法 */ },
    render(g) { /* 画在 g;读 viewport.w/h */ },
    handleTap(x, y) { /* ★输入入口:各 phase 点击逻辑;L1 在 pointerdown 时直达调用(别自己订阅输入) */ },
    destroy() {},
    // 可选·建议:_forensicsView(){ return { state(){…}, measures(){…} }; }
  };
}

铁律(check 会拦)

  • 入参扁平 {plugins, bundle, viewport} —— 没有 opts、没有 opts.runtime、没有 ctx(L1 已摊平)。受控面 ctx 只在 init(boot).boot.ctx(时间/随机/输入/引擎)。
  • 插件直接 const {…} = plugins —— 别写 opts.runtime.plugins(L1 内部的,你见不到)。游戏只用、不 new、不 register。
  • update(dt) 必调 bundle.tick(dt) —— 否则 timer-scheduler/gamefeel 等 onFrame 不推进、timer 永不到期、一局不结束。
  • 零引擎 import(引擎经 boot.ctx.getEngine());游戏源零裸 Math.random/Date.now/setTimeout/new AudioContext/addEventListener —— 时间随机经 boot.ctx,定时经 timer-scheduler,音效经 plugins.audioMusic;输入不调 ctx.getInput——写实例方法 handleTap(x,y)(点击)/handleKey(key)(键盘),L1 的 game.js wrapper 在 pointerdown/keydown 时直达调用(根治"点击消费时机错→启动不了")。
  • 插件方法名一律以 src/plugins/<name>/api.d.ts 为准,别臆测(scene-fsm 是 define 不是 defineScenes;particles-juice 没有 burst)。
  • 画面读 viewport.w/h,别硬编码 390×844。

你写什么 vs 调什么

  • 你写(玩法身份):规则/胜负/计分逻辑(core)、画面与命中区(render)、数值(balance)、资产声明(assets)、把它们接到五法(game-logic)。
  • 你调(通用机制):计分 sessionScore · 场景机 sceneFsm · UI 原语 hudUi · 受控定时 timerScheduler · 持久 save · 手感 gamefeel · 粒子 juice · 后处理 palettePost · 音频 audioMusic · 碰撞/物理 collision/physics(全已注入,用到才取)。
  • 手感:全局氛围(palettePost/gamefeel)自动生效;事件特效(命中/死亡/过关)在事件点调 juice/gamefeel 事件 API(方法名以 api.d.ts 为准)。

详见 .agents/skills/littlejs-game-dev.md(12 插件 API 速查 + 易犯错)。