37 Commits

Author SHA1 Message Date
lili
3bff0eefc3 feat(release): wire dogfood staging product flow 2026-07-22 22:23:19 -07:00
lili
da05ecc0b1 feat(studio): WU1 前端——登录页新增用户名密码 Tab(注册/登录)
WU1 §3.5 步骤④前端落地:Login.vue 在 sms/invite 之外加第三个「用户名密码」
Tab,内含登录/注册子模式段控——用户名、密码两输入框,前端做与后端一致的
用户名正则 ^[a-zA-Z0-9]{4,30}$ + 密码 6-32 位预校验(仅提示,信任边界在后端);
复用既有隐私政策勾选、?redirect= 回跳、setLogin 落持久化、user_login 遥测
双带四段,登录成功路径与短信路一致(同拿 LoginResp)。

passport.ts 加 PasswordRegisterReq/PasswordLoginReq 入参接口与 passwordRegister/
passwordLogin 两函数(贴 VO 契约、走同一 request 信封解包),PlayerMeResp 补
username;Profile.vue fallbackMe 同步补 username 空串兜底。entry.zh/en 补 Tab
标题、用户名/密码占位、子模式与提交按钮多态文案、两条本地预校验提示。

自证:npm run build(vue-tsc -b && vite build)退出 0。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-07 12:04:02 -07:00
lili
2ce0ed3a9d feat(save-cap): W-SAVE-CAP 存档面定容+schemaVersion——单槽版本信封,北极星三款共享基建
契约先行(sdk-interface.d.ts+镜像 additive):白名单新增恰等键族 save:{gameId}:{versionId}(≤65536 码元,
写入必须 {schemaVersion≥1, data} 信封,宿主闸 fail-closed);idle: 族 4096 逐字不动;弃多 key 分片。
宿主闸抽纯函数模块 storageGate.ts(四闸合一可 node 直测);save-progress 插件 v1.0.0→v1.1.0 additive:
setVersioned/getVersioned 逐级迁移/缺级兜底/降档读新档不毁档/无版本旧档按 0 版进链+探针两计数。
证据:插件单测 18/18、game-runtime 31/31、宿主闸负向演示脚本入仓真跑全断言过、vue-tsc+vite build 绿。
三书 M 门影子存档降级口径解除条件就位(卡牌 M2/割草 M4/夜市 M5 切换)。设计页 docs/plans/2026-07-06-002。
2026-07-06 09:24:44 -07:00
lili
0fa1cda1b7 feat(studio): inject.ts 去 gamedef 化石注释 + CSP 收紧(撤 unsafe-eval)
产物沙箱 inject.ts 外科改(两条加载路径主体不碰):
- 删 L69-71 三行 gamedef 专属注释化石(声明式 gameDefinition behaviors/rules
  + gd-runtime new Function 编译执行的理由)
- CSP script-src 由 'unsafe-inline' 'unsafe-eval' 收紧为 'unsafe-inline':
  两条活路径(A-model esbuild iife bundle / SDK Runtime 内联)皆静态打包、
  不含 eval/new Function,'unsafe-eval' 纯属已删 gamedef gd-runtime 遗留需求,
  撤之缩小 XSS 攻击面、不影响活路径

验证:cd game-studio && npm run build = 绿(vue-tsc 类型检查 + vite build
全过,✓ built;CSP/注释改动不引入类型错,无 spec 预警的 vue-i18n 红)。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-25 02:28:56 -07:00
lili
347dd023a1 fix(studio): iframe CSP script-src 加 'unsafe-eval'——解 gamedef 游戏静止(bug#2,补回丢失推送)
studio iframe srcdoc CSP 缺 'unsafe-eval' → gd-runtime new Function 编 behaviors/rules 全抛 EvalError
被静默吞进 errors[] → tickBehaviors 空 → 游戏只渲首帧静态、世界永不演进。系统性(非 breakout 特定),修一处全解。
A/B 实证(bug#2):加 'unsafe-eval' 后 errCnt 7→0、score 0→演进;Node gd-runtime 三款本就演进=运行时逻辑对、纯 iframe-CSP wiring 坑。
安全承接:逻辑串经 scanLogic 静态拦 + connect-src 'none' 无出站 + iframe sandbox,三重边界不扩大攻击面。
注:此修先前 bug#2 调查在 mini-desktop 工作树改+build 验过,但提交/推送被 77f67fdb 大合并竞态吞、未落地;此处规范化补回 origin/dev/2.0.0。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-20 21:59:21 -07:00
lili
2eb507da4a feat(studio): U9 素材中心/玩法模板中心/创作者公开主页 + P-ACC-03适龄徽标
3 new pages(view→store→api→request CommonResult 范式,全 mock 兜底):
- 素材中心 /studio/material:六类浏览(GET /app-api/studio/asset/browse)+ 上传
  (POST /infra/file/upload→POST /app-api/studio/asset)+ 选用入草稿
  (POST /app-api/studio/asset/select)
- 玩法模板中心 /studio/template:GET /app-api/studio/template/list(5 品类
  business-sim/narrative/puzzle/trpg/heritage)+ 一键去创作
- 创作者公开主页 /creator/:creatorId(PUBLIC 非 requiresAuth,P-OPN-08):
  GET /app-api/project/public/creator/{id}(仅 status==4)+
  GET /app-api/telemetry/public/creator/{id}/summary

P-ACC-03 适龄徽标 AgeRatingBadge(4 级 all/8+/12+/16+)渲染于:项目详情/我的项目
列表/创作者主页(VO ageRating)+ 试玩页(compliance/rating/get 回读)。
gap:feed 卡 VO 无 ageRating 字段(不杜撰,待 feed.yaml additive);profile/account
页无单局分级数据源——均显式留空。

HJ-FE-DS-001 token/组件复用 + i18n zh/en + 移动优先;strict TS 无 any;
新增 mock studio.ts(注册 index.ts,/infra 前缀放行)。
gate:npm run build(vue-tsc -b && vite build)GREEN;preview+curl 6 端点
+ 3 路由 200 实证。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-18 13:40:14 -07:00
lili
50a089170d feat(studio): U8 创作可用性 P-CRT-10引导/11示例/13就地失败可重试 + mock失败路径
- P-CRT-10 创作引导: 创作页新手引导卡(三步, 可收起) + Prompt 输入近场写法提示;
  示例库按钮始终可用(未选模板回落通用示例 genericExample); 升级中空态补「一句话造游戏」引导+示例预告
- P-CRT-11 示例库: Create.vue 消费真实 TemplateRespVO.examplePrompt, 强化「示例库」语义;
  mock TEMPLATES 对齐真实后端 U7 五品类(business-sim/narrative/puzzle/trpg/heritage)逐字段同源
- P-CRT-13 就地失败可重试: Task.vue 监听 failed/timed_out 终态就地 showToast(一次, taskId 幂等去重),
  区分 status=4 超时与 status=3 失败文案; 终态失败为 CommonResult code:0 不触发拦截器网络错误 Toast(单 Toast 不重复);
  mock 失败注入: Prompt 含 test_fail→终态 failed(llm_error), test_timeout→终态 timed_out(timeout), 重试不继承失败(失败→重试→成功)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-18 13:10:29 -07:00
zizi
7534bdf9b7 feat(create): generic 桥接——一句话创作无需选模板即可生成(入口归一缺省 templateId=generic)
背景:W-CLEAN 废玩法模板层后 template/list 返空,创作页「开始生成」因 canSubmit 依赖
「必须选中模板」而恒禁用;后端 @NotBlank/同源白名单/派发分支/落包一致性四道硬约束又要求
templateId 必填非空。核心思想=在入口把缺省 templateId 归一为 "generic"(恰好命中
SUPPORTED_TEMPLATE_IDS=[generic] 单一通用口径,品类区分留 prompt 层),四道约束以「恰好
generic」全部一致通过,DB 零改(template_id NOT NULL DEFAULT '' 归一后落 generic)、后端业务零改。

契约层(2):aigc.yaml AigcGenerateReqVO required 去 templateId、project.yaml
  ProjectCreateReqVO required 去 templateId,templateId 描述标注「可选,缺省 generic」。
后端层(归一 generic):
  - AigcGenerateReqVO/ProjectCreateReqVO/StudioDraftCreateReqVO 去 templateId @NotBlank +
    requiredMode REQUIRED→NOT_REQUIRED;
  - AigcTaskServiceImpl.submitGenerate 在 validateTemplateExists 前归一(validateTemplateExists 不改);
  - ProjectServiceImpl.createProject(BeanUtils.toBean 后)归一;
  - StudioServiceImpl.createDraft 原「空 templateId 抛 STUDIO_TEMPLATE_REQUIRED」改为归一 generic;
  - ProjectApi.createProject 的 templateId @Parameter required 放开(契约面一致避免 drift)。
前端 game-studio(去模板门):types.ts 两请求体 templateId 改可选;store/create.ts、api/aigc.ts
  generate 入参改可选;Create.vue canSubmit 去「必须选中模板」条件(prompt 非空即可提交)、
  onSubmit 缺省传 'generic'(空态下也能提交)。
测试校正:StudioServiceImplTest「空模板抛错」→「空模板归一 generic 透传 project」(行为变更)。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-17 04:05:39 +00:00
zizi
4e486f60bc fix(studio-host): 非安全上下文(明文IP http)整款游戏加载失败——crypto.subtle缺失退demo误报
根因:经局域网 IP 明文 http(如 http://100.64.0.7:4173)跨内网机访问时,浏览器判为
「非安全上下文」,window.crypto.subtle 为 undefined。inject.ts 的 sha256Hex 旧实现此时
直接抛错 → fetchAndVerifyManifest 完整性校验失败 → GamePlayer 退 demo 兜底,而 W-CLEAN 后
demo 是「模板体系重构中」并发 game_error → 页面误报「游戏加载失败/网络波动」(真因是上下文
不安全,非网络)。门禁此前经 localhost(安全上下文)走查,subtle 可用,故漏过此类上下文依赖缺陷。

修复:sha256Hex 改双通道——优先 Web Crypto SubtleCrypto(安全上下文,原生最快);缺失时回退
纯 JS SHA-256(FIPS 180-4,零依赖,确定性)。两通道对同一份 UTF-8 字节摘要,结果逐字节一致,
使 manifest 完整性校验在「明文 IP http」与「安全上下文」下行为一致,整款引擎游戏正常装载。
仅改 game-studio/src/host/inject.ts(+89/-12),不动契约/不放宽 CSP/不削弱完整性校验。

验证:
① 纯 JS SHA-256 对已知向量 + 跨块边界 + 真 manifest(214KB→456c38cb,与后端 checksum 及
   node crypto 三方一致)13/13 通过;
② npm run build -- --mode staging(vue-tsc -b 真类型门 + vite build)EXIT=0;
③ CDP 经 http://100.64.0.7:4173(实测 isSecureContext=false、crypto.subtle 缺失)深链
   /play/9306/93112:真 LittleJS 引擎装载、井字棋棋盘渲染、loading 收起、无 [GamePlayer]
   兜底 warn、无错误态——修复前同路径报「游戏加载失败」。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-17 01:15:00 +00:00
zizi
2c96e63a5f feat(studio-ds-polish): 品牌→绘境AI + 3 helper 标签 i18n + 裸令牌收口
- 对外品牌 common.brand: 造梦AI→绘境AI / ZaoMeng AI→Huijing AI(创始人拍板 huijing)
- helper i18n: status.ts/msg-type.ts/biz-meta.ts 的 label→labelKey(common.projectStatus/msgType/bizStatus/bizType),状态徽章/消息类型/biz 标签英文态也翻译;8 消费方包 t()(13 处)
- 裸旧令牌收口: var(--cyan/--green/--amber)→--accent/--success/--warning(严格等值,零视觉变化)
- 逻辑/契约枚举键/color/查找语义零改

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-16 18:13:06 +00:00
zizi
1bb29a5589 feat(studio-ds-batch): 批量波次——其余15视图克隆金样板(token+i18n+SVG图标+圆角)
5 簇并行迁移(逻辑零改,opus 子代理执行+主代理验证):
- 入口: Login/Share/Play  - 生成流: Task/Preview  - 项目: Project/Detail/Publish/StatusBadge
- 中枢: Message/Dashboard  - 企业: BizLeads/BizCreate/BizLeadDetail/BizTemplatePicker
- i18n: 各簇 local-scope 注入(entry/taskflow/project/hub/biz 命名空间,中英同构)
- Icon 补 close/ban/plus/lock/phone/clock/inbox/edit/trash
- 硬编码色→语义令牌、emoji/字形→<Icon>、圆角统一

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-16 17:10:54 +00:00
zizi
87f00323ce fix(studio-ds): P5 评审收口——a11y + 文案 + 注释清理
- 补 icon-only 按钮 aria-label:Feed 上/下切换(common.action.prev/next)
- GameCard 封面播放区键盘可达:role=button/tabindex/aria-label/@keydown.enter.space
- 新增 common.action.prev/next 中英文案;删 InteractBar 过期注释(flag 已补)

P5 of HJ-FE-DS-001。opus 评审无 P0、逻辑保真经机器 diff 实证;修 P1-1 无障碍。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-16 16:26:09 +00:00
zizi
caa2e1ba03 feat(studio-ds): P4 代表面落地——Feed簇/Create/Profile/TabBar 接入设计体系+i18n+SVG图标+多档主题
- Feed/GameCard/InteractBar + Create + Profile + TabBar:硬编码色→语义令牌、emoji/字形→<Icon>、圆角统一、文案 i18n 化(feed/create/profile 命名空间)
- EmptyState 增 iconName(SVG,向后兼容)消 Create ⚠/✨;Icon 补 flag/projects/dashboard/enterprise/help/warning
- i18n/index.ts 合并 feed/create 命名空间;Profile 走页内 local-scope;TabBar 用 common.nav
- Profile 接入 <AppearanceSwitch>(暗/浅/柔 + 中/英 切换入口=决议②落地)

P4 of HJ-FE-DS-001 金样板。逻辑零改(子代理只动样式/文案/图标,主代理验证)。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-16 16:26:09 +00:00
zizi
655673eb99 feat(studio-ds): P3 组件库——AppButton 令牌化(grad-primary/on-accent/focus环) + 新增 Icon(SVG)/Field/AppearanceSwitch
P3 of HJ-FE-DS-001 金样板。通用品牌组件,P4 接入 Feed/Create/Profile。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-16 16:26:09 +00:00
zizi
ecae9025a9 feat(studio-ds): P2 i18n 脚手架——vue-i18n@10 + zh/en locales + 防闪烁早设脚本 + useAppearance(主题/语言持久化)
P2 of HJ-FE-DS-001 金样板。后续 P3 组件库 / P4 Feed+Create 落地。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-16 16:26:08 +00:00
zizi
f98ad0f801 docs(fe-ds): studio视觉体系/i18n/通用组件库 双spec+mockup+P1token层(HJ-FE-DS-001)
评审版+执行版双spec、真chrome验证mockup(zh/en+暗/浅/柔三主题实时切换)、P1 tokens.css体系化补全(全additive·旧令牌保留→暗色零回归)。
创始人5决议:响应式消费Web否决demo桌面侧栏/暗色先行+设置内多档主题/SVG图标替emoji/金样板先行/统一圆角矩形(禁药丸椭圆)。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-16 14:55:47 +00:00
zizi
c50e336792 feat(studio): feed 卖相打磨——互动按钮玻璃质感 + 卡片封面"无图也好看"(评审 V-1/V-2)
- V-1 互动按钮(InteractBar):深蓝实底 rgba(16,21,34,.6)→半透白 rgba(255,255,255,.10)+backdrop-filter blur(8px)+box-shadow,抖音式悬浮玻璃;图标/计数/点赞态行为不变
- V-2 卡片封面(GameCard+新增 utils/coverGradient.ts):纯确定性 FNV-1a hash→5套渐变主题(青绿/森系/青紫/暖/冷)+3套装饰,无封面卡按 title 分化渐变+柔光点+波形(无图也好看);真实封面优先逻辑不变
- verify:vue-tsc 类型门逮修一处真类型问题(computed 早返回{});build双绿;真机 :4173 CDP 实算样式(bg rgba(255,255,255,.1)/blur8)+截图(9卡按title渐变各异)双证
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-16 10:24:13 +00:00
zizi
22bc528243 feat(studio): 看板占位接真——完玩率/广告收益/七日趋势 接 G1/G2 live 端点
- 完玩率←telemetry/my/summary.completionRate;广告收益←trade/my/income-summary.totalNet(分→元);七日趋势←telemetry/my/game-stat/trend?days=7 渲真柱状(播放/完成双柱)
- 新增 api/trade.ts getMyIncomeSummary + telemetry.ts getMySummary/getMyTrend + types 契约镜像;api/index 导出 tradeApi
- 失败/空走真实空态(完玩率"--"/收益"--"/趋势"近7日暂无数据"),不再"建设中"
- 真机验证(:4173 live 截图双态):有数据态完玩率50%+真趋势柱、空账号态真空态,console 零错;测试态 DB 已还原零漂移(game_project 全归 creator=1)
- 契约 follow-up:trend.statDate 实测序列化为 JSON 数组[y,m,d](Jackson LocalDate 默认)与 telemetry.yaml 描述 yyyy-MM-dd 不符,前端已兼容,建议后端/契约对齐
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-16 09:54:08 +00:00
zizi
afa0771599 feat(studio): B端定制前端(goal G3)——提单/进度看板/验收接 biz 7端点
- 3 视图(views/biz):BizLeads(我的订单列表+提单入口)+ BizCreate(提单表单+分场景选模板)+ BizLeadDetail(进度时间线+报价+demo试玩/反馈/确认验收)
- 接 biz.yaml 7 客户侧端点逐条命中(leads/my/{id}/progress/templates/acceptances feedback/confirm);签署=客户侧契约无在线签章端点(sign-offline 归 admin),线下兜底符合契约
- router +3(均 requiresAuth)+ 个人中心"企业定制"入口;数据层 api/store/mock/types 复用既有范式
- verify:vue-tsc 类型门 + vite build 双绿;真机走查留合并点
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-16 09:01:19 +00:00
zizi
5463796f52 feat(studio): 创作者数据看板(P-OPS-01/02)——指标卡接真 + 趋势诚实占位
- 看板视图(views/dashboard):累计播放/点赞(project /my 聚合)+已发布数(community /level)+累计奖励(community /rewards)接真;完玩率/广告收益/七日趋势=诚实占位"数据接口建设中"(契约无创作者侧读端点,不伪造)
- 入口:个人中心"创作数据"→/dashboard(requiresAuth+hideTabBar)
- 实证缺口:契约仅 admin-api 有 telemetry game-stat / ad revenue(RBAC=admin),无 /app-api 创作者侧;建议后端补 /app-api/telemetry/my/{summary,trend}(creator 归属隔离)

verify-as-you-go:vite build + vue-tsc 双绿;接的3端点逐条命中契约;3处gap逐条grep证伪;真机走查留合并点
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-16 09:01:19 +00:00
zizi
3147b11d60 feat(studio): 用户向前端——消息中心 + 个人中心(闭合评审 L-1 消息无入口 / Profile 缺失)
- 消息中心(views/message):消费 community.yaml 玩家侧端点(messages 列表/mark-read/unread-count),类型筛选+未读红点+标记已读+游标翻页+诚实空态;TabBar 底部 3→4 tab 加"消息"一级入口
- 个人中心(views/profile):账号信息(passport /me)+创作成长(community /level)+功能入口+退出登录(复用既有 logout() 不重实现);"我的"tab 指向 /profile
- 支撑:api/community.ts + store/message.ts + mock/community.ts(沿用每模块带 mock 约定)+ 契约 VO 入 types.ts;router 加 /message /profile(均 requiresAuth)

verify-as-you-go:vite build --mode staging ✓ + vue-tsc EXIT=0;消费端点逐条核验在 community.yaml(:41/:69/:90/:114)+passport.yaml(:100)契约内;真机走查留合并点
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-16 09:01:19 +00:00
zizi
42342e8c53 fix(studio): Phase0 卖相批——退出登录入口/品牌渐变/Inter字体/字号token/创作页诚实空态
- 退出登录入口(Project.vue):接既有 userStore.logout()(不重实现),isRealLogin() 门控仅登录态显示,二次确认→replace('/feed');闭合 §7「退出登录无入口」孤儿红线
- 主按钮品牌渐变(AppButton.vue):.app-btn--primary 纯色青→135° cyan→green 渐变+weight 820+深色字#061014,对齐 demo
- 品牌字体(reset.css + public/fonts):self-host Inter 拉丁子集 400/600/700 woff2,@font-face font-display:swap,'Inter' 前置字体栈(中文兜底 PingFang SC/微软雅黑)
- 字号阶梯(tokens.css):新增 --fs-h1/h2/body/caption,additive
- 创作页诚实空态(Create.vue):W-CLEAN 后模板列表返空属迁移非故障,区分"✨升级中"与"⚠加载失败"不再误报,空态给"去游戏流"出口

真机走查实证(staging :4173 CDP 截图双证):退出登录可见可登出/主按钮青绿渐变/Inter真渲/创作页诚实文案 全生效
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-16 06:43:12 +00:00
zizi
063ec4edf2 docs(rename): ③ 文档/契约漂移清理——contracts+docs+根文档 yudao 标识同步 com.wanxiang.huijing(follow-up,脚本)
- 范围:全仓除已完成的 game-cloud/game-admin(及排除区);91 文件
- cn.iocoder.yudao→com.wanxiang.huijing / cn.wanxiang.game→com.wanxiang.huijing.game / cn.iocoder.cloud→com.wanxiang / Yudao*→Huijing* / bare yudao→huijing
- 含 contracts/api-schemas(apiInterface FQCN)、docs/architecture+agent-specs(含中文名,git ls-files -z 修复)、AGENTS.md/CLAUDE.md 等根文档
- 保留不动:上游归属 URL(gitee/github yudaocode·YunaiV,改则断链+违反署名)、game-cloud Flyway 迁移注释(保 checksum)、lockfile(装包重生)
- 纯文档/字符串,零构建影响(game-cloud/game-admin 字节码未动)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-15 14:32:44 +00:00
zizi
384a26da59 fix(studio): feed 卡占位封面(1×1 透明 GIF)当无封面走标题底纹兜底——修"一片黑"卖相
链路③⑤ 人测亲见:feed 卡一片黑+只剩播放按钮。根因=生成侧无缩略图时后端回填 1×1
透明占位 GIF(data:image/gif;base64,R0lGODlhAQAB…),它是 truthy → 绕过旧 `!coverUrl`
兜底、被当背景渲染成透明(视觉=黑)。

修:GameCard.vue 加 hasCover 计算属性,识别 1×1 占位 GIF 当"无封面"→走既有标题底纹兜底,
feed 卡始终有可读内容。真实封面(OSS http(s)/实质图)才用作背景;真缩略图归 W-G1。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-15 13:39:14 +00:00
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
zizi
7bf2cd1d3b refactor(w-clean): 旧玩法模板清除(创始人令2026-06-12)——模板哲学落地第一刀
- game-studio runtime/index.ts 843→113行:clicker/merge/idle/tycoon 四模板游戏逻辑全删,统一「模板体系重构中」错误态(画布明示+game_error事件,不抛裸异常);运行时壳/生命周期/SDK/destroy 契约保留
- 后端:AigcTemplateConstants.SUPPORTED_TEMPLATE_IDS=List.of()+getTemplateList 返回空(提交入口/执行器双层拒绝,直插任务不烧LLM);两测试诚实适配(机制覆盖保留+清空后拒生成断言),aigc 模块 56 测全绿
- staging DB:15 表 1022 行已先归档(mini-desktop:/root/backups/w-clean-20260612/,304,606字节,可整表回滚)后物理删除;遥测/zone/player/trade/community/biz 全保留
- 验证:前端 build 绿/health 200/feed 空列表优雅(既有空态分支)/smoke 9/12(3 FAIL=feed空的预期差异,留档不掩绿)
- 未动:contracts/templates schema 与 prompt registry(死内容,随 W-T1b spec v2 的 9a 能力插件清单一并清退)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-06-12 09:24:27 +00:00
zizi
b8d1a0da73 fix(runtime-host): host→game 回包全断根因修复——v-for 模板 ref 数组解包
根因(探针四锚点+判别实验实证):ref=iframeRef 位于 v-for 内,Vue 3 填充为数组;
attachBridge 按元素直取 (数组).contentWindow=undefined → HostBridge.targetWindow=
undefined → post() 静默丢弃全部 host→game(storage/ad/pay 回包+init 同断)。
game→host 监听全局 window 不受影响,故游戏可玩/遥测可达,两波未现形。
修法:currentIframe() 解包 + contentWindow 不可用时显式 console.warn(可观测)。

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-06-11 02:45:31 +00:00
zizi
f82d480dfd feat(host-storage): M-c批② idle离线存档三端——contract storage payload+GamePlayer受信边界四道闸+inject注入侧应答端;主agent逮修loadState三端协议错配
- contract.ts:+3 storage payload interface;GamePlayer handleStorage(键白名单idle:/4KB上限/JSON校验/wxgame:隔离);inject mountStorageBridge(requestId→resolve映射,5s超时resolve null绝不reject,幂等防重挂)+包装runtimeView传startRuntime;不触sdk/(Core红线),demo锚不动
- 【主agent核验逮修·承重接口】loadState三端协议错配:runtime自裁object签名(避§5.5零解析红线)但GamePlayer/inject照spec原草案回string→runtime读字段全undefined→离线补发恒0静默失效。统一到object(宿主受信边界解析):contract value string→Record(批②新增契约无存量消费者,同波定稿不破semver)+GamePlayer读分支接住parse结果回包对象+inject:130 resolve对象。runtime内部saveState/loadState字段(v/resource/autoYield/upgraded/leftAtMs)闭环自洽

HJ-MC-TPL-EXEC-002 §6.1/§6.2

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-10 16:46:06 +00:00
zizi
88388f7b46 feat(runtime): M-c批② initIdle(离线闭环)+initTycoon(经营循环)——纯追加双case,initMerge零行删改
- RuntimeSDKView 扩 saveState?/loadState? 两可选方法(loadState 返 object|null,宿主受信边界已解析,runtime侧零JSON.parse守§5.5);缺失安全跳过(旧宿主/demo退化无离线态不崩)
- initIdle:loadState→离线补发公式(钳offlineMaxMin+折扣双闸防爆)→在线点击产料+每秒自动产出→节流saveState(≥2s)→资源达targetResource通关;score=floor(resource)
- initTycoon:进货带客(onDown waitingCustomers+1)→售出配对→金币达targetCoin通关;按钮布局契约(buy中心W*0.28/H*0.70,sell W*0.72/H*0.70)承重接口;score=coin
- clampInt/localXY各init函数体内复制(沿initMerge范式禁提升);零DOM/零可抛新增;hunk全>426(initMerge:255-426零删改)

HJ-MC-TPL-EXEC-002 §5

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-10 16:46:06 +00:00
zizi
cdf4d82aa6 feat(runtime): M-c批① 模板分发+merge玩法——单工厂switch(templateId)+initMerge拖拽合成+game_error防御
- 分发骨架:case ''/'clicker' 合并(空串兼容存量30款旧包)/case 'merge'/default=reportError+game_error不起循环不绑监听
- initClicker:现行逻辑逐字符迁入,计分/提示文案与坐标逐像素保真,仅绑 pointerdown;life/finish/loop/markStarted/drawBase 共享单份(红线代码不复制)
- initMerge:clampInt/cleanLabels 自包含纯函数兜底(targetLevel 钳≤chainLength 防死局);§5.3.1 布局契约逐字符照钉(cols=ceil(sqrt)/topPad=round(H*0.18)/margin=W*0.06/gap=W*0.03,格中心预计算缓存);半格方形容差命中;pointerdown 产料/起拖+pointermove 预览+pointerup 任意两格同级合成;score=合成次数(拍板#6)
- finish(score) 参数化单一 emit 点,duration_ms 计数维持基线3;零 DOM/零可抛/toString() 注入约束全守

HJ-MC-TPL-EXEC-001 §5(构建+体积门待 mini-desktop)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-10 12:31:26 +00:00
zizi
b0850a2ad9 feat(passport): 鉴权建设波——V11契约+system passport子包+14端点@PermitAll+白名单挂点+剔除桩+前端登录守卫
- 契约先行: V11.0.0 双落点(game_player/game_invite_code/runtime_session匿名兼容ALTER) + passport.yaml(4 app+4 admin) + events登记user_login
- B1 system侧: passport独立子包(fork隔离), 验证码+邀请码旁路登录注册一体, OAuth2 MEMBER token(client=default已核), 错误码1_002_090/091远段, PlayerApi @Primary本地化(mock豁免裁决=无行+mockEnable放行), R6限频(IP 10次/h+Redis日/时双闸), 25单测
- B2 存量: @PermitAll恰好14端点(主agent grep复核, 不放行名单零触碰), 匿名session(player_user_id可空+anon_id), 白名单5挂点(studio/aigc/project), ad计费限频, telemetry剔除桩(照落库不进聚合+Redis降级放行), EnvelopeReqVO文案回写
- F1 前端: 登录页两Tab+占位协议, isRealLogin守卫(isLogin恒真不可用), 401统一拦截, 互动转正onInteract单入口gating, user_login遥测双带; test1批跑路径原样保留(主agent复核)
- 三面对抗核验全pass零blocker; 构建门待mini-desktop(本机禁构建铁律)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-10 09:40:10 +00:00
zizi
17bd6b1582 feat(studio): M-b② 渲染面扩展——theme/scoreLabel 入画布(解除 §6.3 不渲染边界)
- theme: djb2 哈希派生双色渐变底色 + 顶部标题入画(≤16字清洗截断, cleanText 控制字节剔除)
- scoreLabel: 替换计分文案「{scoreLabel}:n/target」(≤8字, 缺省回落'点击得分')
- demo 包同步带 theme/scoreLabel 保持 parity(target:5 不动, player 信号 c 依赖)
- 遥测/生命周期契约零触碰(game_end{score,completed,duration_ms} 蛇形逐字不动)
- 体积: startRuntime(min) 1673→2260B raw(gzip 1193B), 占 15KB 红线 14.7%
- 纯 Canvas fillText, 零 DOM 注入; theme 为空时旧包渲染逐像素零变化
- spec: 2026-06-10-Mb渲染面-execution.md(85行, 体积/契约双门禁)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-10 03:01:02 +00:00
zizi
d279898192 fix(studio): B2′ 真人试玩闭环 3 处修复 — 布局高度链/demo兜底非致命/game_end补completed
浏览器实玩(staging+真无头Chrome)首次暴露、curl/单测均未现形的 3 个真 bug:

1) 布局:#app/.app-root 改 height:100% 建确定高度链——原 min-height 链断,子页 .feed/.play 的 height:100% 塌成 0,封面/画布 0 高不可点(真机也塌)。

2) GamePlayer:取包/manifest 校验失败回退 demo 是「可恢复」场景,不再 emit('error')(父级 Play 把 error 当致命态 v-else-if 隐藏宿主显示「加载失败」,与 demo 兜底冲突),仅 console.warn。

3) runtime:clicker finish() 补发 completed:true+duration_ms——后端 quality_score 完玩率口径依赖 props.completed,缺它真玩也推不动 quality(数据回路失效)。

实证:浏览器玩 A-小卖部通关→quality 0→60→feed 从 B 领头(30)翻转为 A 登顶(60)。vue-tsc -b 绿。

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-09 17:01:04 +00:00
zizi
a7076871e4 feat(B1): 黄金闭环前端联调(step③) — 真连 staging + 有效遥测信封
step③ game-studio 联调(编译验证待 mini-desktop):
- request.ts 注入 tenant-id:1;user.ts token 取 VITE_STUDIO_TOKEN(=test1)
- vite.config.ts: VITE_API_BASE 非空则关 mock + 启动打印 baseURL/mock 状态
- runtimeApi.ts: 取包改委托 src/api/runtime.ts(带 base+token+tenant,修 Codex C3 裸 axios 同源)
- inject.ts: manifestUrl resolve 到 VITE_API_BASE + 带鉴权头(修 Codex C4)
- telemetry: 信封补 eventId(randomUUID)+ traceId 兜底非空;sendBeacon→fetch keepalive 带头(sendBeacon 不能带 Authorization/tenant)
- Play.vue onTelemetry 白名单原样转发 like/share/play_end(修 Codex H8 吞事件)
- 新增 game-studio/.env.staging + vite-env.d.ts;.gitignore 豁免 .env.staging(防 gitignore-swallows-frontend-source 同类坑)
- 注:Feed.vue 互动经 buildEnvelope traceId 兜底覆盖,免改

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-09 14:40:53 +00:00
zizi
b70e90b775 feat(wave3-phaseB): compliance/studio 模块 + contractGaps(后端全绿)
Phase B 并行建(4 路互斥目录),主 agent 合并 reactor 验证:
- compliance(109/V9):ComplianceGateApi.evaluate seam + 风格原子桩(StyleComplianceAtom/IpComplianceSeam)
  + 分级 + 封禁(R3 状态分支,下架联动留 Phase C)+ V9 DDL(gate_result/content_rating/user_ban,不建审核状态机表 D2)
- studio(112/V8):创作任务链(createDraft→project.createProject / generate→aigc)+ attachments 持久化-only
  + 新增 AigcApi seam(additive)+ V8 DDL
- contractGaps 后端:GAP-3 feed ShareMeta versionId(调 getCurrentVersionId 仅已发布)、GAP-2 runtime manifestUrl(纯派生零DDL)
- contractGaps 前端 game-studio:GAP-1 publish admitted/gates、GAP-3 share→play versionId、GAP-2 取包 manifestUrl+sha256
- 合并验证:全 53 模块 reactor 编译 SUCCESS;新/改模块单测全绿(compliance8/studio11/feed12/runtime24)
- 注:前端 game-studio build 待 mini-desktop 验;Phase C 待接入 project.publish→ComplianceGateApi

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-09 02:15:20 +00:00
zizi
9e95a66ea6 refactor: 技术命名空间 huijing→wanxiang 全栈落地(代码+契约,原「只改文档」决策反转)
- Java 包 cn.huijing.game→cn.wanxiang.game:126 .java + 15 目录 git mv(保留历史)+ Application scanBasePackages/@MapperScan + yaml type-aliases
- SDK HuijingGameSDK→WanxiangGameSDK + postMessage channel huijing-game-sdk→wanxiang-game-sdk(契约 + 前端 host/sdk/inject/bridge)
- 契约 contracts/ 同步(sdk-interface.d.ts / runtime.yaml / game-package.schema / $id URL / V3 SQL 注释)
- 主 agent 独立验证全绿:后端集成编译+55 单测(cn.wanxiang)、前端 build+/browse 冒烟(WanxiangGameSDK+demo 911 像素+遥测 200)、残留 huijing=0、Flyway 5 迁移 diff-identical、yudao cn.iocoder.yudao 2167 文件未误伤
- 保留 yudao 框架 cn.iocoder.yudao + Maven groupId cn.iocoder.cloud

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-08 10:16:52 +00:00
zizi
67ad750abe feat(frontend): game-studio 前端脊柱(双闭环 + 宿主×SDK×Runtime,mock 验收通过)
- 单 SPA 双区(玩家 feed/play/share + 创作 create/project),Vue3 + Vant + Vite8 + Pinia
- 三相 Workflow 并行建成(A1 地基 + A2 宿主引擎 ∥ → B1/B2/B3 业务页 ∥)→ 主 agent Phase C 验证门
- 双闭环 + 三方链路(GamePlayer iframe × HuijingGameSDK × Canvas Runtime 3.5KB) + ad 桩经 /browse 实证
- npm run build + vue-tsc -b 绿(验证门修复 2 处类型 bug);自写 mock 中间件(dev+preview 双 hook)
- 4 个 contractGaps 已上报、骨架 mock 兜底,待 staging 真实联调前补

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-08 09:10:38 +00:00