3b-B e2e(mini-desktop 真跑·证据 wg1/gen-worker/evidence-3bB/): ✅ P0-P4 安全面+全自动管线=真证闭合(铁证 backend-callback-hmac.log + p4*.txt): - HMAC 双向证:缺签名头→HTTP 401 / 错签(deadbeef≠482147b5)→HTTP 401 / 正签→过门(走到下游"任务不存在"非401) =关死 /dify/callback-internal 裸 @PermitAll 缺口 - 全自动派发链真通:执行器认领 taskId→dispatchGeneric 投 §6.1 job→worker 真生成(真烧模型)→ HMAC 签名回调→验签通过→handleCallback 落库(gen-9303/9304/9305 三轮齐全) ❌ P5 一句话真生成=未达终局:三款全 nine_gate_failed。但截图(gen-9303-after-play.png)证生成 真出 on-theme 可渲可动的「点击小怪物」游戏(Score/3s 倒计时/多彩怪物 monsters/targetScore=12), 仅点击→计分坏(Score 仍 0)→九门确定性地板正确拦截「看着像但玩不了」=质量门正确履职、拒发不可玩。 判:L0 交付(管线+安全+质量门)已完成且证;缺=便宜模型把「点击命中→计分」写对=L1 生成域 (prompt 点击坑+模型档+player/calibration,run_studio 自修 max_repairs 未救回)→转 L1 v3 迭代。 附带:serve-and-play.sh 跨平台 Chrome 探测(CHROME_BIN 覆盖>Linux /usr/bin>macOS>PATH 兜底, Linux 在前因 mini-desktop x86 是权威 e2e 机);p3bB_*.sql 发布四态/翻 feed 桩。 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
41 lines
1.1 KiB
JavaScript
41 lines
1.1 KiB
JavaScript
'use strict';
|
|
export default function createGame(opts) {
|
|
const o = opts || {};
|
|
let ctx = null;
|
|
const W = 390, H = 844;
|
|
const BUTTON_RADIUS = 60;
|
|
const COLORS = ['#FF4136', '#2ECC40', '#0074D9', '#FFDC00'];
|
|
const BRIGHT_COLORS = ['#FF6B6B', '#5FDC6F', '#4A9EF5', '#FFE54C'];
|
|
const TONES = [262, 330, 392, 494]; // C4 E4 G4 B4
|
|
const HIGHLIGHT_DURATION = 500; // ms
|
|
const GAP_DURATION = 200; // ms
|
|
const BUTTON_Y = 550;
|
|
const totalButtonWidth = 4 * BUTTON_RADIUS * 2 + 3 * 30;
|
|
const startX = (W - totalButtonWidth) / 2 + BUTTON_RADIUS;
|
|
|
|
const buttonPositions = COLORS.map((_, i) => ({
|
|
x: startX + i * (BUTTON_RADIUS * 2 + 30),
|
|
y: BUTTON_Y,
|
|
color: COLORS[i],
|
|
brightColor: BRIGHT_COLORS[i]
|
|
}));
|
|
|
|
let phase = 'playing';
|
|
let score = 0; // 已完成的关卡数
|
|
let sequence = [];
|
|
let userStep = 0;
|
|
let remaining = 0;
|
|
let gameoverReason = '';
|
|
let inputSub = null;
|
|
|
|
// 动画状态
|
|
let showState = 'idle'; // 'showing' | 'waiting' | 'idle'
|
|
let showStartTime = -1;
|
|
let activeIndex = -1;
|
|
let isLight = false;
|
|
let lastPlayedIndex = -1;
|
|
|
|
// 按钮缩放动画
|
|
let popTimers = [0, 0, 0, 0]; // 剩余秒数
|
|
|