games-development-ai/game-cloud/scripts/p2_scaffold_4state.sql
zizi 5d3f7a87f0 feat(runner-v2): P2 通用宿主泛化落地——引擎游戏真渲入 feed 真玩(mini-desktop 真机门验)
P2 = 把 P1 装载契约从「装载王蓝莓一款」泛化为「装载任意 GamePackage」,经发布主链入 feed、
真人浏览器真玩。4 决策落实(O2(b)纳入 Phase C / DB-manifest 内嵌 / 灌库桩 / __GameBundle)。

三轨实现
- 后端:GamePackage schema 加 engineBundle additive 可选字段;buildGamePackage 加 engineBundle put
  (P3 生成路用,P2 恒 null→put 跳过→字节零变,单测 packageBytesReproducible 证);灌库桩
  p2_seed_engine_bundle.mjs + 四态脚手架 p2_scaffold_4state.sql(W-CLEAN 后重建已发布游戏)
- 运行时:P1 bootRef 泛化为 bootGameHost(opts)(引擎骨架照搬+参数化工厂来源/插件/视口),
  bootRef 退化薄包装;固化 build:ref-bundle 产 dist/ref-bundle.iife.js(--global-name=__GameBundle)
- studio:inject.ts 引擎包分支(pkg.engineBundle? → 内联 script 暴露 window.__GameBundle →
  bootGameHost 挂引擎真渲;否则旧 startRuntime 路保兼容);掏空壳改引擎分支(Phase C);CSP 不放外域

对抗代码复审逮 2 mustFix(主 agent 亲核亲修 + 6c6g 复验)
- 灌库桩读错产物(ref-bundle.js harness vs .iife.js)→ mini-desktop 灌库返工死循环
- 引擎分支漏发 game_start → 会话/play_count 静默吞、门②检不出 → 补发(DB session 行实证已修复)
+2 shouldFix(兜底可观测信号 / 灌库 SQL @pj 防撞 max_allowed_packet)
+ 真机门逮 2 环境缺陷已修(seed charset=utf8mb4 防双编码断 checksum 链 / 四态脚手架补 W-CLEAN 空库)

mini-desktop 真机门 6 门(逐门实数,主 agent 肉眼复核证据)
①build:ref-bundle 265374B/__GameBundle 真入包 ②Java 编译过+字节复现单测 ③studio staging 重建消 mock
④灌库 status=1∧checksum 64hex∧engineBundle 键齐∧manifest sha256 一致 ⑤真人 feed 点卡→引擎真渲
暖阳小卖部(warm=1246073px)非「重构中」+game_loaded+game_start+防 demo 三锚+console 零错+DB session 行
⑥回滚:无 engineBundle→demo 壳/错误态,向后兼容未破。证据 game-studio/evidence/p2-feed/

诚实 gap:game_end(到结算)未在自动化窗口内达成=ref gameover 需分钟级真玩+srcdoc 坐标盲点的取证局限,
非引擎/渲染能力缺陷(机制已通,留人工真玩到打烊补全)。受控面 6 项+game-host.d.ts 零改。

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

71 lines
4.1 KiB
SQL
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

-- ============================================================================
-- P2 真机门·四态脚手架W-CLEAN 清库后重建一款已发布游戏供 engineBundle 灌库桩附着)
-- 缘由seed 脚本 p2_seed_engine_bundle.mjs 原假设已存在已发布种子(9001 四态齐备)
-- 但 staging DB 已被 W-CLEAN 清空(0 version/0 package/0 feed_rank),故须先建四态脚手架。
-- mini-desktop 2026-06-13 P2 真机门实测可用gate 报告逮出后落库归仓。)
-- 四态game_project.status=4(PUBLISHED) ∧ game_version.status=3 ∧ game_runtime_package.status=1 ∧ game_feed_rank 行
-- IDgameId=9201 / versionId=92010 / pkgId=92010 / feedRankId=92010高位区零碰撞
-- engineBundle 由后续 p2_seed_engine_bundle.mjs 9201 覆写 package_json本脚本先建空 package_json 占位行)
-- 幂等:先 DELETE 同 ID 行再 INSERT纯重建可重复执行
-- tenantstaging application-staging.yaml tenant.enable=false → tenant_id=0 即可
-- 用法docker exec -i game-staging-mysql mysql --default-character-set=utf8mb4 -uroot -p"$MYSQL_ROOT_PASSWORD" < 本文件
-- ============================================================================
USE `ruoyi-vue-pro`;
-- charset 防御(与 seed 脚本同口径):强制 utf8mb4避免中文 title 被客户端默认 latin1 双编码
SET NAMES utf8mb4;
START TRANSACTION;
-- 清旧(幂等重建)
DELETE FROM game_feed_rank WHERE game_id = 9201;
DELETE FROM game_runtime_package WHERE game_id = 9201;
DELETE FROM game_version WHERE game_id = 9201;
DELETE FROM game_project WHERE id = 9201;
-- ① project已发布(status=4)current_version_id 指向 92010launch_zone_id 留 NULL(→feed zone 0)
INSERT INTO game_project
(id, creator_user_id, title, summary, cover_url, tags, template_id, age_rating,
status, current_version_id, launch_zone_id, featured, play_count, like_count,
creator, create_time, updater, update_time, deleted, tenant_id)
VALUES
(9201, 1, '王蓝莓小卖部(引擎真渲)', 'P2 通用宿主真机门ref 引擎 bundle 经 bootGameHost 真渲入 feed',
'data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==',
'P2,engine,wanglanmei', 'wanglanmei-ref', 'all',
4, 92010, NULL, b'0', 0, 0,
'p2-scaffold', NOW(), 'p2-scaffold', NOW(), b'0', 0);
-- ② version已发布(status=3)package_url 空(走 DB-manifest 端点)checksum 先占位(seed 脚本覆写运行包不动版本)
INSERT INTO game_version
(id, game_id, version_no, gen_task_id, package_url, bundle_size, checksum,
status, creator, create_time, updater, update_time, deleted, tenant_id)
VALUES
(92010, 9201, 1, NULL, '', 0, '',
3, 'p2-scaffold', NOW(), 'p2-scaffold', NOW(), b'0', 0);
-- ③ runtime_package先建 status=1 行 + 空 package_json 占位engineBundle 由 seed 脚本 UPDATE 覆写本行)
-- sandbox_attr/allow_origins 取既有发布默认package_url 空=DB-manifest 内嵌路
INSERT INTO game_runtime_package
(id, game_id, version_id, template_id, package_url, entry, runtime_version, preload_policy,
bundle_size, checksum, sandbox_attr, allow_origins, status,
creator, create_time, updater, update_time, deleted, tenant_id, package_json)
VALUES
(92010, 9201, 92010, 'wanglanmei-ref', '', 'index.html', '1.0.0', 'eager',
0, '', 'allow-scripts', '', 1,
'p2-scaffold', NOW(), 'p2-scaffold', NOW(), b'0', 0, NULL);
-- ④ feed_rankzone_id=0(混合流) + status=1 入流 + sort_score=0
INSERT INTO game_feed_rank
(id, game_id, version_id, zone_id, quality_score, boost, sort_score, pinned, status,
creator, create_time, updater, update_time, deleted, tenant_id)
VALUES
(92010, 9201, 92010, 0, 0.0000, 0.0000, 0.0000, 0, 1,
'p2-scaffold', NOW(), 'p2-scaffold', NOW(), b'0', 0);
COMMIT;
-- 回读四态
SELECT 'project' k, id, status, current_version_id FROM game_project WHERE id=9201
UNION ALL SELECT 'version', id, status, game_id FROM game_version WHERE id=92010
UNION ALL SELECT 'runtime_pkg', id, status, version_id FROM game_runtime_package WHERE id=92010
UNION ALL SELECT 'feed_rank', id, status, zone_id FROM game_feed_rank WHERE id=92010;