176 Commits

Author SHA1 Message Date
lili
1981a6be01 feat(storage): 闭合 Agent 到 Runtime 的 OSS 游戏链路
Some checks failed
contract-gates / contract-gates (push) Has been cancelled
docs-gate / docs-gate (push) Has been cancelled
增加不可变源码检出、两阶段 finalize/activate、Runtime 同源对象读取与 iframe 安全边界,并用 fail-closed CI 门固定契约。Git 仅提交平台实现、契约、迁移和 SoT,不包含具体游戏源码、素材、bundle 或验收证据。
2026-07-30 05:21:44 -07:00
lili
a513ae38fd fix(storage): harden source authorization and committed CAS
Some checks failed
contract-gates / contract-gates (push) Has been cancelled
docs-gate / docs-gate (push) Has been cancelled
Provision the isolated game-source writer path, bind source uploads to
GameSourceArchive manifests, and require every immutable storage field for
pending-to-committed CAS. Reuse the gate-validated runtime manifest snapshot,
normalize remote storage errors, and record the staging object/CAS evidence.
2026-07-29 19:10:09 -07:00
lili
17727d08c3 feat(storage): 接入游戏内容对象存储与运行时提交门
Some checks failed
contract-gates / contract-gates (push) Has been cancelled
docs-gate / docs-gate (push) Has been cancelled
冻结 GameArtifactManifest/GameSourceArchive 契约和 V34 pending/committed 状态记录,增加专用 writer 的全量回读物化校验,并让 Runtime API 在消费和发布前对账 committed、GamePackage checksum 与实际 engineBundle hash。隔离 staging 已验证真实消费拒绝未提交版本;源码桶权限仍保持 fail-closed,正式金标不切换。
2026-07-29 12:02:22 -07:00
lili
cbfd4d871b feat(acceptance): 闭合 playtest v3 与 A+ 可信消费链
Some checks failed
contract-gates / contract-gates (push) Has been cancelled
docs-gate / docs-gate (push) Has been cancelled
固化 Match-3 生产者、视觉、音频与双 Judge 证据闭包。

将《山海行纪》r1.1 绑定新的不可变 release,并以生产预检现场核验 bundle、Registry/2 和 25 项 Writer 快照。

同步地图1平衡锁值、跨游戏回归修复、验收契约与 SoT 证据。
2026-07-28 20:16:13 -07:00
lili
bcb7fec906 fix(release): bind dogfood gates to runtime state
Some checks failed
contract-gates / contract-gates (push) Has been cancelled
docs-gate / docs-gate (push) Has been cancelled
2026-07-23 02:49:08 -07:00
lili
5ad0d26daa fix(release): pin dogfood trust boundaries 2026-07-23 02:30:36 -07:00
lili
0551b3552f fix(release): close final dogfood safety gaps 2026-07-23 01:43:41 -07:00
lili
68f8b4fa86 fix(aigc): bind callback artifacts before completion 2026-07-23 00:45:25 -07:00
lili
f7d0942ab6 feat(project): bind runtime artifacts to versions 2026-07-23 00:42:40 -07:00
lili
9fb669c4fa fix(release): secure dogfood provisioning transaction 2026-07-23 00:41:34 -07:00
lili
20dd705fac fix(dogfood): close quota and trade race gaps 2026-07-23 00:26:11 -07:00
lili
c454610183 fix(security): reject forged staging identity headers 2026-07-23 00:23:15 -07:00
lili
65aecc56aa fix(release): harden dogfood identities and provisioning lease 2026-07-22 23:14:16 -07:00
lili
34da791f26 fix(release): reconcile missing dogfood quota claims 2026-07-22 22:57:16 -07:00
lili
819522d752 fix(release): close dogfood security blockers
Make the dogfood security foundation self-contained, reject external runtime RPC writes, and bind publish state transitions with database concurrency controls.
2026-07-22 22:12:45 -07:00
lili
640d9268c0 feat(release): enforce dogfood publish safety loop 2026-07-22 21:37:43 -07:00
lili
5bcaf6ac1e feat(cheap-gen): W-AXIS-V2 波1——测试 agent 生产化+三路统一验收编排器+字段迁移
Some checks failed
contract-gates / contract-gates (push) Has been cancelled
docs-gate / docs-gate (push) Has been cancelled
opus 执行位交付、主会话四步验收过(测试亲跑/红线 diff 亲读/硬证亲眼):

- playtest.cdp.cjs 生产版(§3 八件:DPR=1 playtest/1 坐标协议/坐标尺/落点回显/
  同点硬提示/反早退/预算 14→24 随进展扩/fail 二掷显式 seed+清存档/图像自检
  fail-closed exit=3)+ serve-and-playtest.sh;证据落 evidence/playtest/roll-N/
- cheap_verify:project_floor 四门投影(预筛权威唯一产地,绝不复用 harness 原生
  verdict.pass)+ run_playtest(子进程/超时/记账/playtest.json 真相层/端口派生避
  Chrome unsafe 5060/5061)+ run_acceptance 编排器(v2=floor∧测试员阻断/
  shadow=旧口径+shadowV2Accepted 对照/v1=旧判定器;修复反馈只引现象段)
- 三路接线:cheap_studio/cheap_service_driver/cheap_modify 两档全改调编排器,
  create 与 modify 单一验收标准
- §4 字段迁移:run-summary acceptanceVersion+playtest+floor 段、trace.playtest
  additive(firstPlay 三字段镜像 ReadinessScorer 口径)、批账 floorPass+accepted+
  acceptanceVersion(verdictPass 仅对照);result_out 三级取值(floor→verdictFull
  投影→verdict.pass 回落)、gate_judge 续修触发器切四门、xtheme 同批;判定语义单轨
- §5 Java 读侧:ReadinessScorer 可玩性/firstPlay 优先读 trace.playtest,
  GenMetrics 归因加 playtest/tester_degraded(向后兼容,未编译验证——本机无后端
  构建环境,待 mini-desktop 构建窗口)
- genconfig/generation.yaml:acceptance.mode 三态(波1 灰度默认 shadow)+
  playtest 旋钮(steps/二掷/超时/成本上限);judge 段未动
- 单测 32 项新增(二掷/图像 fail-closed/mode 三态/投影/现象分离/退出码/unsafe 端口)

验收:pytest 512 绿 + node 44/44(主会话亲跑);10 局考卷生产件重跑判对 9/9
(真坏 3/3 零放行、假阴 0/6,heritage-r4/puzzle-r1 二掷翻案、sb2 假超时根因=
Chrome unsafe 端口已修);Service E2E(w1v2-e2e1 shadow→v2 一发收敛)与 modify
回归(w1v2-mod1 ROUND_MS 60000→45000,src 与局内截图双证)真浏览器硬证;
总成本 ¥2.3。已知余项:真续修回喂环仅单测覆盖(波2 n=3 冒烟自然覆盖)。

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-10 07:07:08 -07:00
lili
a069afb649 feat(aigc): WU2③ job userToken 位 + per-user 额度门(只对真实 member 生效)
dispatchGeneric 组 §6.1 job 时追加 userToken 字段(向后兼容,worker .get 忽略未知键)。
per-user 门只对真实 member 在线创作生效——按 creatorUserId 是否命中一行 game_player 分流:
- 无 game_player 行(系统/编排器/bake-off/admin 触发)→ 旁路:不查池不懒 claim,userToken
  留空,worker 回落全局 key(不误伤 n=5 收敛环/批跑既有验证路);
- 命中 game_player 行 → 取其 CLAIMED 条目 token_key;无 CLAIMED 则派发线单 CAS 懒 claim
  (纯 DB CAS 非慢外呼,派发热路安全),抢到就用、池空抢不到当次干净失败 quota_exhausted。
token 随 job 内网下发日志脱敏(仅留前后 4 位)。经 12 参构造软注入,主开关关或未接线=现行行为字节零变。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-07 12:22:14 -07:00
lili
4cf0e14ec3 feat(aigc): WU2② 注册 claim 消费者——消费 WU1 注册成功事件从池 CAS 绑玩家
WU1 afterCommit 发「注册成功」事件(topic passport-register),本单作其消费者,不进注册
事务:渠道过滤(只 password/invite claim,sms/sms-mock 跳过防白占池)→ 从池单条 CAS
抢一个 FREE 绑 game_player(biz_no=claim_<id>,幂等靠 status='FREE'+两 uk)。
- 池空不抛异常(补池是离线动作、非 MQ 重试窗口内可恢复):记 WARN + 触发水位告警,
  该玩家暂不绑,首次生成由懒 claim 兜。
- 跨模块不依赖 system-server:按同名字段建消费侧镜像体 PassportRegisterEvent(topic 是唯一 wire 契约)。
- 主开关 aigc.newapi-quota.enabled 默认 false,关时消费者不装配、服务全旁路(WU2 整体 opt-in)。
单测 9 例:claim 幂等/渠道过滤/池空不抛/并发 dup 收敛/身份分流/懒 claim fail-fast。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-07 12:22:00 -07:00
lili
fe6079ba62 feat(contracts): WU2④ quota_exhausted 跨契约共享枚举同批新增三处
额度耗尽/池空要干净失败给用户可读拒因,而非含糊的「生成失败」。该失败因是跨契约
共享枚举(FailureReasonEnum 头注禁单边扩展),contract-first 同一批落三处保持一致:
- FailureReasonEnum 加 QUOTA_EXHAUSTED("quota_exhausted","生成额度已用完");
- contracts/api-schemas/aigc.yaml FailureReason.enum;
- contracts/dify-workflow-io.json output.failureReason.enum。
落库列 game_aigc_task.failure_reason(varchar(32)) 容得下(15 字符)。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-07 12:21:45 -07:00
lili
c13595fbc2 feat(aigc): WU2① new-api 额度池表 V32 + DO/Mapper——离线预建 FREE 条目 claim 抢占
内测 per-user ¥100 额度落 new-api 网关账本,game-cloud 维护一张预置池表:
ops 脚本离线预建 (user+token+¥100) 灌成 FREE 条目,注册/懒 claim 时 CAS 抢一个绑玩家。
- V32.0.0 迁移双落契约源 + huijing-server 执行副本(守门①),列名对齐 ops 脚本 INSERT,
  uk_newapi_user/uk_claimed_by/uk_biz_no 三键仿 trade GrantDO 的 uk_biz_no 保幂等。
- NewapiQuotaPoolDO 继承 TenantBaseDO(系统级池,运行时 executeIgnore 跨租户);
  Mapper 提供 selectClaimedByPlayer/countFree 水位/claimOneFree 单条 FREE→CLAIMED CAS。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-07 12:21:33 -07:00
lili
28bd5339d4 feat(passport): WU1 端点+配置+防明文+单测——两 @PermitAll 端点/remoteAddr/stdout 屏蔽
照 WU1 设计 §3.2/§3.3/§3.4:

- AppPassportController 加 password-register/password-login 两 @PermitAll 端点,IP 一律取连接层
  request.getRemoteAddr()(不读可伪造 XFF,§3.3 命门);@ApiAccessLog(sanitizeKeys=password)。
- ApiAccessLogInterceptor 代码级屏蔽两 password URI 的 stdout body 打印(不受 sanitizeKeys 约束的第二条
  链路,防明文密码进控制台,不只靠 logging.level)。
- application-staging.yaml wanxiang.passport 加 password-auth-enabled(true)/register-ip-limit(20,60)/
  login-ip-limit(30,100)。
- 单测:本地 mvn 34 通过(PassportServiceImplTest 31 + PassportSmsIpCounterRedisDAOTest 3),覆盖用户名占用、
  登录防枚举(统一错误码+假 hash 对齐耗时)、禁用拒登、并发撞名兜底、IP 越限 429、Redis fail-open、outbox 原子落、
  /me 空安全。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-07 11:52:40 -07:00
lili
d52696c589 feat(passport): WU1 服务层——注册扩参/BCrypt/防枚举/IP 泛化/outbox 生产者
照 WU1 设计 §3.2/§3.3/§3.6:

- registerPlayer 扩 username/encodedPassword 两可空参,按路径落列;默认昵称有 nickname 用之、
  用户名路取 username、手机号路后4位;uk_username 冲突报 PLAYER_USERNAME_ALREADY_REGISTERED(不转登录)。
- passwordRegister/passwordLogin:复用 admin BCrypt 范式 encode/matches + buildLoginResp(MEMBER token);
  防枚举——查无用户名与密码错误统一 PLAYER_USERNAME_OR_PASSWORD_ERROR,且查无用户名跑固定假 hash
  matches 对齐 BCrypt 耗时(惰性以本类 encoder 编出,cost 一致,堵时序侧信道)。
- PassportSmsIpCounterRedisDAO 泛化按 scene 分桶(sms/register/login/invite),Redis 异常 fail-open+WARN;
  发码回填 scene=sms,回填 sms-login(scene=login)/invite-register(scene=invite) 服务层纯 IP 闸。
- 注册事务内与建号原子写 outbox(三路共用出口);@Scheduled 投递器扫未投递发 RocketMQ(至少一次,
  RocketMQTemplate 经 ObjectProvider 兜底 name-server 未装配、CAS 置已投递防重投)。
- getPlayerMe 补 username + mobile 为 null 短路回空串(用户名用户防 NPE 回归)。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-07 11:52:23 -07:00
lili
987d489b63 feat(passport): WU1 契约层——用户名密码注册登录 schema/VO/错误码/outbox
内测种子用户「用户名+密码」注册登录(无短信)的契约层,照 2026-07-07 WU1 设计 §3.1/§3.6 落地:

- Flyway V31.0.0(同落 contracts 源+huijing-server 执行副本):game_player 加 username/password
  两列、mobile 放宽可空、加 uk_username、register_channel 值域扩 password;建 game_passport_register_outbox
  注册成功事件本地消息表。V31.0.1 回滚补偿仅置 contracts 源(手动执行,不进执行副本避免 Flyway 自动 DROP)。
- PlayerDO 加 username/password(password 仅服务层内部,永不进 RespVO);PlayerMapper 加 selectByUsername。
- PasswordRegisterReqVO/PasswordLoginReqVO;PlayerMeRespVO 加 username。
- 错误码 1_002_090_004/005/006(用户名占用/用户名或密码错误/通道未开启)。
- outbox DO+Mapper(@TenantIgnore 供 @Scheduled 投递器全表扫);pom 显式直依赖 rocketmq-spring-boot-starter。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-07 11:52:05 -07:00
lili
c6d6d39a2a feat(cfg): W-CFG-KB K3 知识包治理接线——knowledge 配置块+激活发布 Nacos+worker 订阅热物化(复用阶段二三·默认关)
Some checks failed
contract-gates / contract-gates (push) Has been cancelled
docs-gate / docs-gate (push) Has been cancelled
把切片一知识件外置接进受治理配置集,一条「改知识件→定版→激活→worker 物化生效」链,复用配置控制面阶段二/三治理机器零重造:

game-cloud:knowledge 作 content_json 第四内容块(仿 readiness),与 routeA/routeB/readiness 互斥、sanity(packageId/
  activeVersion 非空);走向相反=真下发(readiness 进程内空载荷,knowledge 跨进程),激活编成一条路 B 载荷
  {knowledge.packageId,knowledge.activeVersion}、经 KNOWLEDGE 档独立 dataId gen-hot-params-knowledge publish 给 worker;
  pathA=null→dispatch/reconcile 只走路 B、激活编排一行未改。加 AigcConfigTierEnum.KNOWLEDGE+KnowledgeConfigKeys+NO_ROUTE 文案。

worker:kb_store 加进程级激活版本源槽+attach/detach(对称 genconfig),resolve_active_version 取值链改为治理源(Nacos)>
  env 钉版>最新 committed;新 kb_nacos.py(KbActiveVersionSource 订阅 dataId、按 packageId 匹配、激活变更即重物化)+
  setup_knowledge_activation() 启动物化+(Nacos 启用时)attach,cheap_service_app 紧接 genconfig 热源挂它。复用 genconfig_nacos 启用旗+代理旁路。

默认关字节不变(TIER2_KB_ROOT 未配→不物化不订阅、read_file 回落仓根;无源→resolve 回落 env/最新);缺文件显式失败沿用
(materialize_active 照抛保留 kb_root、kb_nacos 只在 best-effort 边界接住不咬生成);全 best-effort。admin 本轮做前端契约点
sanity.ts,富编辑视图=紧接下一片(与 readiness 一致)。

主控终审:git 完整(HEAD 未动·无破坏操作)+11 文件精确+读码坐实互斥/routeB载荷/取值链/best-effort/默认关/缺文件失败没削弱
+亲跑 Java codec 34+activation 21(BUILD SUCCESS)+Python test_kb_externalize 21 全绿。真 Nacos 激活端到端排窗口。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-05 22:50:10 -07:00
lili
7e21b331a5 feat(aigc): 面五 game-cloud 生成业务埋点 GenMetrics(观测阶段四·flag 默认关)
Some checks failed
contract-gates / contract-gates (push) Has been cancelled
docs-gate / docs-gate (push) Has been cancelled
新增 GenMetrics 组件(@ConditionalOnProperty huijing.aigc.metrics.enabled,默认关=零装配零副作用),
把 MVP 要盯的生成指标以 micrometer 暴露给已活的 /actuator/prometheus:
- gen_task_total{status} Counter:终态计成功率(succeeded/failed/timed_out,超时据真实 failureReason 还原)
- gen_queue_depth Gauge:@Scheduled 定时刷 countGlobalInflight→内存 AtomicInteger,scrape 零 DB(勿全表重查)
- gen_gate_fail_total{gate} Counter:九门逐门失败,源 trace.sevenGateVerdict.guards(复用 ReadinessScorer.guardPass:H_progress 嵌套取 .pass)
- gen_duration_seconds Timer(直方图):源 trace.wallS
- llm_cost DistributionSummary:源 trace.cost.totalRmb(worker token×倍率自估值、非 new-api 权威计费)

埋点挂 DifyCallbackServiceImpl.postCommitBestEffort(post-commit best-effort、realSuccess 判定前、
覆盖成功/失败/超时三类终态),null 判空 + 内部吞异常双保险,绝不进 DifyCallbackTxService 事务方法、
不咬回调主链(§8 旁路铁律)。micrometer-core 经 spring-ai-commons 传递,无需改 pom。

GenMetricsTest 7 例(终态三标签/耗时成本/逐门guards嵌套裸/队列gauge/脏trace吞/开关装配三态/抛错不咬主链)
+ 主链回归 DifyCallbackServiceImplTest 20 + DifyCallbackTxTraceTest 6,主控亲跑 BUILD SUCCESS 全绿。
面一 actuator 已活;dev 重部署后 profile 开 flag 即出指标(下一窗口深冒烟真验)。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-05 19:23:20 -07:00
lili
2bc8c86c47 feat(feed): 新游戏发布汇入主混合流——发布基线 zone0 恒写 + 非零专区补写双写(创始人 2026-07-05 拍 A)
Some checks failed
contract-gates / contract-gates (push) Has been cancelled
docs-gate / docs-gate (push) Has been cancelled
发布编排原 zone_id = launch_zone_id 或 0 二选一:创作者选了非零专区(必填字段)则
游戏只落该专区排序行、不进 zone0 主混合流,而 /feed/stream 服务 zone0——内测玩家
默认流看不到新游戏(R5 走查暴露)。改为双写:发布恒写 zone0 主流基线 + 若创作者
另选非零专区再补写该专区一条(uk_game_zone 视作不同排序行,双写互不冲突,同发布事务原子)。
顺带消除既有潜伏不一致:telemetry 算分回灌固定打 zone0,原来非零专区游戏在 zone0
无基线行 → 回灌恒跳过、永不刷分;zone0 基线补齐后回灌可正常刷分。

抽出 writePublishBaseline helper;DTO zone_id javadoc 同步双写语义;
补 publish 路 3 单测锁分流(非零专区双写 / zone0 单写 / null 回落单写)。
PublishOrchestrationServiceImplTest 本机实跑 6/6 绿(3 原 unlist + 3 新 publish)。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-05 18:27:12 -07:00
lili
8724501f32 feat(aigc): D11 质量评分参数外置进配置集(W-CFG-EXT E1-E3)
Some checks failed
contract-gates / contract-gates (push) Has been cancelled
docs-gate / docs-gate (push) Has been cancelled
背景/目的:D11 就绪评分的四维权重与效率预算阈值原本硬编码在 ReadinessScorer
里,放量校准要改代码换 jar;本提交把它们收进阶段二配置集治理,改一版即生效、可
回滚、可归因(SoT §10「校准走配置、不在现场拍脑袋」的配置载体,不改任何命题)。

范围/做法(E1-E3):
- E1 content_json 加第三块 readiness(十字段,值=ReadinessScorer 常量)+ 档位枚举
  加跨档特例值 READINESS(无 Nacos dataId、进程内消费);codec 加 readiness 值域
  sanity(四维权重和≈1.0±0.001/各∈[0,1]/预算>0/repairs_good≤ok/子项分∈[0,1])
  与 routeA/routeB 互斥;NO_ROUTE 判据扩为 !hasA&&!hasB&&!hasReadiness(空串/{}
  仍红)。
- E2 新 ReadinessConfigProvider(读激活版 readiness、短 TTL 缓存、逐字段回落、读失
  败不抛)+ GenConfigService.getActiveVersionBySetKey(按 uk_set_key 定位、读不到返
  null);ReadinessScorer 从 provider 取权重阈值、硬编码常量降为回落默认(一个不删)
  、@Autowired(required=false) 可选注入不破坏既有 new ReadinessScorer() 单测;顺修
  :19/:151 陈旧「预算<=0.15」注释(实际 0.6)。
- E3 激活编排一行不改:readiness-only 经 codec 产空载荷,现有 dispatch/reconcile
  在空载荷下天然短路成「值域 sanity + 账本收口、无投影、恒一致」。

建模:按计划倾向用枚举值 READINESS(§7 待拍点,创始人未明拍,可 revise 为与 tier
正交的 kind 维度)。契约先落(content_json.readiness schema/javadoc、
AigcConfigTierEnum、GenConfigService 接口、NO_ROUTE 错误码文案)再改实现。

验证:整 game-module-aigc-server 单测 385/0/0(7 skipped=需真基建 RealIT);api
经 -am 从源码重建绿;既有反射测试(CheapWorkerResultOutContractTest)与 score==95
锚点(SaaGraphDispatcherTraceTest)未破坏。真 Spring 上下文 wiring + 真后端 e2e
排部署窗口。

边界:W-CFG-KB(知识件外置)不在本提交(gated 别的依赖);admin 端 readiness 数字
字段编辑表单为 follow-up(本提交只做后端)。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-05 18:11:20 -07:00
lili
7cdb3049eb feat(obs): huijing-server 接 actuator + micrometer-registry-prometheus 激活 /actuator/prometheus(阶段四观测 波② T2-2)
Some checks failed
contract-gates / contract-gates (push) Has been cancelled
docs-gate / docs-gate (push) Has been cancelled
单体聚合层(部署件)显式引入 spring-boot-starter-actuator + micrometer-registry-prometheus
(二者在 huijing-spring-boot-starter-monitor 里 optional 未随传递装入),wire 通「在席但残缺」的指标能力:
- /actuator/prometheus 端点成立、真出 JVM/HTTP/Tomcat 指标(供 mini-infra Collector/Prometheus 抓)
- HuijingMetricsAutoConfiguration 激活、aigc 的 SAA 图节点 ObservationRegistry 由 NOOP 转真(可产节点 span)
- /actuator/health 由假 {"code":404} 变真 Actuator HealthEndpoint
exposure 内网口径收敛为 health,prometheus(dev/local/staging 三 profile),不裸暴露 env/heapdump 等敏感端点。
不改 yudao 框架层 starter 的 optional 默认、不碰业务逻辑;版本由 spring-boot-dependencies BOM(3.5.14) 管。

验证:JDK17 下 mvn clean install -pl huijing-server -am -DskipTests 绿;repackaged jar 已含
spring-boot-actuator-3.5.14 + micrometer-registry-prometheus-1.15.11。
OTel java-agent 挂载属启动/部署项(T2-1),代码侧零改动,不在本 commit。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-05 10:29:07 -07:00
lili
79264197ae feat(aigc-admin): 配置控制面阶段三 game-admin 配置控制台 UI(14端点封装+列表/详情三区/版本diff/漂移对账+aigc:config五权限菜单种子)
Some checks failed
contract-gates / contract-gates (push) Has been cancelled
docs-gate / docs-gate (push) Has been cancelled
消费阶段二已落的 AdminGenConfigController(/admin-api/aigc/config 十四端点),把受治理生成配置变得可视可操作、有权限边界;不改一行后端契约。

- api/aigc/config/index.ts:14 端点封装 + VO 逐字对齐 TS 类型;三个 @RequestParam POST(archive/recover-activating/rebroadcast)走 params 位防真机 400;全走标准 CommonResult request(排除 genMonitor 裸 axios 范式)
- views/wanxiang/config:配置集列表+新建+归档;详情抽屉三区——草稿编辑(prompt 大文本域 + JsonEditor code 模式,解析→改叶子→原样回序列化保 routeA/routeB 信封 round-trip + routeA sanity 前端预校验)/ 版本历史+全量查看+与上一版 diff / 激活·回滚·恢复卡激活+漂移对账三态+一键重推;写按钮全 v-hasPermi 收敛(save/freeze/archive/activate)
- game-module-aigc/sql/aigc_config_menu.sql:自建父菜单(id 7120,component=wanxiang/config/index)+ 5 权限点(7121-7125:query/save/archive/freeze/activate)INSERT IGNORE 幂等,id 段避撞 biz(7100-07)/trade(7110-12)
- 契约核实:状态枚举实为 AigcConfigStatusEnum 五态(补工单漏的 ACTIVATING=15)/ verdict 五态 / changeType 三态逐字对源;version/get 参数是 versionId、version/diff 参数是 versionAId+versionBId
- 验收:vite build 绿(exit 0)+ eslint 干净(exit 0)+ vue-tsc 我方文件零类型错误(总数持平基线 55,均上游 yudao);真后端 e2e 走查待 staging 部署窗口(诚实口径:本地只到 build 绿)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-05 00:03:13 -07:00
lili
167cedde15 fix(aigc-test): 修两条既存测试债——控制平面测补 MQ producer @Mock + schema 校验测夹具自包含化
Some checks failed
contract-gates / contract-gates (push) Has been cancelled
docs-gate / docs-gate (push) Has been cancelled
条1 AigcControlPlaneTest(原 6 err):AigcTaskServiceImpl 接 RocketMQ(T-AGC-07)后新增
genTaskProducerProvider 软注入字段,本纯 Mockito 测未声明对应 @Mock → @InjectMocks 留 null →
成功入队路径(insert 后 getIfAvailable() 发 MQ 信号)6 例 NPE。补 @Mock provider(字段名同源
按名消歧)+ setUp 桩 getIfAvailable()→null(走生产「producer 缺席→跳过投递、任务留 queued」
软兜底;本测只断 insert 落库、不断 MQ 投递)。

条2 GameConfigSchemaValidatorTest(藏红/陈旧 target 假绿):accepted-configs.json 夹具由 pom
copy-wanxiang-test-fixtures 从 docs/agent-specs/2026-06-09-generation-spike 拷入,该源目录已随
史料档清理删除(6d2f8789)→ 干净构建拷空、夹具缺失、assertNotNull 红,仅靠上次构建残留 target/
陈旧副本假绿。修=从 git 史(6d2f8789^)捞回 6 条 clicker accepted 配置、落一等 test 资源
src/test/resources/wanxiang-test-fixtures/accepted-configs.json(普通 test 资源自动进 classpath)、
删已破 pom 执行段(另一拷 contracts 的执行段不动)。

验证(干净 mvn clean test 清陈旧 target/):两目标类 27/0/0;整个 aigc-server 模块套 363/0/0
Skipped 7(基础设施门测),BUILD SUCCESS,零回归。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-04 21:38:35 -07:00
lili
c3f9c26bf9 feat(aigc)+docs: 决策5「按推荐」落 BUDGET_RMB 0.15→¥0.6(D11 效率维纠错配,待外置)+ 决策6「进配置集」裁定入档 + 板追加四增量(W-CFG-EXT D11 外置/W-CFG-KB 知识件入集/阶段四 reframe 全链路 OTel-Prom-Grafana/W-ASSET 资产管理待 scope)
Some checks failed
contract-gates / contract-gates (push) Has been cancelled
docs-gate / docs-gate (push) Has been cancelled
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-04 21:05:18 -07:00
lili
22444fd5e8 fix(cfg): 路A PATCH /session→/sessions 复数(AgentScope 2.0.2 router prefix=/sessions,单数对真 Service 必 404;D 波对账读发现、fable 复核框架源码+bootstrap.py 双证后修;含测试断言与 javadoc 三处;受影响 43 测复跑绿)
Some checks failed
contract-gates / contract-gates (push) Has been cancelled
docs-gate / docs-gate (push) Has been cancelled
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-04 11:27:24 -07:00
lili
a0f1306754 feat(config): 配置漂移对账 + 一键重推 + 失败兜底(阶段二/步骤5)
只读对账 GenConfigReconcileService:拉两路投影比对当前激活版,产结构化漂移报告(路/键/期望/实际)。
严格分三种非漂移态不误报:①ACTIVATING 激活中间态跳过②Service/Nacos 不可达报不可达非漂移(不抛)③路B读用轮询容忍窗吸收 Nacos 最终一致延迟。
路A只读投影:AgentServicePatchClient 补 probeAgentSystemPrompt/probeSessionModelConfig,走真实 AgentScope 列表端点(无单 GET;/agent/ 按 id 过滤取 system_prompt、/sessions/?agent_id= 复数按 session.id 取 chat_model_config)。
路B只读投影:NacosConfigPublishClient 补 probeDataId 三态(登录成败作可达性探针,区分不可达/缺失/在)。
一键重推 rebroadcastActive:复用 C 波私有 dispatch 按当前激活版重放双路下发,指针本就 ACTIVE 保持不动(不落 ACTIVATING/不写账本/不补偿),幂等,某路失败可重试。
Controller 加对账端点(query 权限)+ 重推端点(activate 权限)+ @ApiAccessLog。不加表(读时比对)。
Service 启动自愈不做,对账报告显式标注"投影缺失"为后续增强位(设计 §6)。

验证:模块单测全量 342 绿(排除既存两坏类 AigcControlPlaneTest/GameConfigSchemaValidatorTest=已知债);
对账判定矩阵 12 用例绿;重推 5 用例绿;路A/路B 投影探测解析 11 用例绿;
路B 真 Nacos e2e 全链绿(重推→对账IN_SYNC→篡改→对账DRIFT检出→重推→收敛IN_SYNC→清理,演示 dataId gen-hot-params-e2e-recon-cheap 测完删除);单体在线编译 BUILD SUCCESS。

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-04 11:22:22 -07:00
lili
6720424eb7 feat(aigc): 配置控制面阶段二 步骤3 双路激活编排(值域sanity前置/路A PATCH+路B publish/失败补偿回上一激活版/ACTIVATING持久态恢复/回滚复用) (配置控制面阶段二 步骤3)
把生成配置版本升级为「值域校验 → 双路下发 → 账本收口」的可幂等、失败可补偿动作(设计 §3.3/§3.6):
- 编排 GenConfigActivationService:sanity前置(非法即拒不发不写账本)→ beginActivating落ACTIVATING+在途目标 →
  路A PATCH /agent+/session(完整chat_model_config整替)、路B publish 按档隔离生效dataId → 全成功收口(前移指针+清在途)/
  某路失败即整批判未生效+立即补偿重推已下发成功路回上一激活版+复位回上一态+可重试(指针不前移);路A败则路B不发;
  投影全成功但账本提交失败留ACTIVATING由recoverActivating幂等重放向前执行到底;回滚=对历史版重放同一编排。
- 账本原语落GenConfigServiceImpl(配置治理表唯一主人):beginActivating/markVersionActivated(扩展清activating指针)/
  abortActivating,经LambdaUpdateWrapper显式SET把BIGINT NULL指针写回NULL(updateById跳null做不到);状态机加ACTIVATING(15)+边。
- 外呼:GenConfigHttpClient(NO_PROXY JDK HttpClient任意方法+头+体,内网直连绕fake-ip代理);AgentServicePatchClient(路A,
  X-User-ID鉴权头/按档路由/两次PATCH都成功才算成功);NacosConfigPublishClient(路B,Nacos HTTP OpenAPI登录→publish/read/remove,
  与SCA客户端不冲突);口令走env占位符(AigcConfigActivationProperties,严禁明文入代码);地址可配置(不写死live端口)。
- content_json契约=Service-shaped透传(routeA→/agent+/session snake_case、routeB→area.key扁平),system_prompt取版本行prompt正文。
- Controller暴露 activate/rollback/recover-activating(权限aigc:config:activate + @ApiAccessLog操作日志)。
- V30迁移加 activating_version_id 列(承在途激活目标,供§3.6b幂等恢复对齐)。

验证(全真跑):配置子域76单测绿(sanity矩阵19+失败路矩阵14+账本25+两路客户端12+状态机4+权限门2);全模块310单测绿(排除2既有坏类
AigcControlPlaneTest/GameConfigSchemaValidatorTest,基线e5439c74同样失败,与本改动无关);真库IT 3绿(V1..V30 replay+ACTIVATING生命周期
NULL-clearing真库验);路B真Nacos e2e绿(生产客户端publish→读回→改→读回→删,演示dataId gen-hot-params-e2e-demo,轮询最终一致;
跨语言:Java publish→Python worker genconfig按area.key读回33.0→清理,生产dataId cheap/tier2从未碰=404);huijing-server -am编译绿。
路A真Service PATCH排部署窗口(本机cheap-worker/.venv缺redis/apscheduler起不了Service,不碰mini-desktop live 8300),请求形态经读
AgentScope 2.0.2真源(UpdateAgentRequest/UpdateSessionRequest/ChatModelConfig四字段)+桩测试双验。

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-04 10:37:24 -07:00
lili
790f53dc71 feat(aigc): 配置控制面阶段二 步骤1+2 生成配置治理子域(配置集建模+yudao治理骨架 / 版本行与历史 MySQL) (配置控制面阶段二 步骤1+2)
在 game-module-aigc 落生成配置治理子域,把散落的生成配置旋钮升级为「可版本、可回滚、可归因」的受治理
资产。治理单元=配置集(不塞 infra_config KV),走「改→定版→审核挂点→激活→回滚」生命周期(设计 §3.2)。
版本账本落 MySQL 版本行(prompt 存 MEDIUMTEXT、不进 Nacos):设计 §3.1 三约束——prompt 越 Nacos 100KB
上限 / 定版要原子(元数据+全量内容同库同事务一行) / diff 与检索要就地。

数据模型(V29,现行最大 V28→取 V29,replay 全绿):
- game_aigc_config_set:配置集(tier cheap/tier2 + set_key uk + 生命周期 status + 草稿工作副本 draft_prompt/
  draft_content_json + active_version_id 当前激活版指针[只由激活前移、定版不动])。
- game_aigc_config_version:版本行(全量快照,只增不删;prompt MEDIUMTEXT + content_json + content_hash +
  content_bytes[utf8mb4 字节数,按字节非字符] + uk_set_version 同集版本号唯一)。

能力面(admin,@PreAuthorize 权限门):建/改配置集(save)、定版(freeze,单库事务快照草稿→版本行、状态转待审、
不动激活指针)、历史列表/任一版取回/两版 diff(query,应用层拍平点路径逐项增删改)、归档(archive)。
状态机 AigcConfigStatusEnum 单点裁决合法流转。错误码续编 aigc 004 子段(不跳段)。

步骤3 接缝(非孤儿):激活的双路下发编排(值域校验 + PATCH /agent+/session + publish Nacos)属步骤3、本波不做;
激活的账本收口 GenConfigService#markVersionActivated(状态转 ACTIVE + 指针前移,纯 MySQL)已就位并单测,
步骤3 在双路下发成功后调它、失败不调(指针不前移、保留上一激活版为账本权威,设计 §3.6);controller 不暴露激活端点。

验证:aigc-server 单测绿(状态机流转 §3.2 / 权限门反射 / 定版事务 / content_bytes 字节口径 / diff;新增 26 测,
既有全不变);真 MySQL IT 绿(mini-infra 100.64.0.8,绕系统代理直连)——① V1..V29 全量迁移按版本序真库全应用
(replay 全绿,多语句交服务端解析,正确处理 V1 注释内分号)② 30KB/64KB 边界 prompt 无截断(证 MEDIUMTEXT 非 TEXT)
+ utf8mb4 字节口径(含中文/emoji round-trip、LENGTH>CHAR_LENGTH)+ uk_set_version 幂等;单体 huijing-server 编译绿。

范围说明:契约仅动 game-cloud;近期迁移 V26/V27/V28 均只在 db/migration(contracts/db-schemas 镜像自 V25 起已停维护,
R2 charge 亦未动 contracts),故 V29 循此现行先例、不动 contracts;新 admin 治理 API 未入 aigc.yaml 契约,与 R2 同——
待 fable 终审裁定是否补契约。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-04 09:32:21 -07:00
lili
056433d5bb fix(nacos): namespace 口径统一 public→空串(默认公共空间 namespaceId=空串,非字面量 public)(配置控制面阶段二前置)
Nacos 默认公共空间的真实 namespaceId 是空串,"public" 只是显示名(namespaceShowName)。
现状代码写 namespace: public 会带 tenant=public 静默落进一个 id 为 public 的空间,
路 B 写读两侧不一致时配置永远推不到(阶段〇同款坑)。真取证:
GET /nacos/v1/console/namespaces 返 namespace:"" / namespaceShowName:"public";
nacos-sdk-python v1 client.py 逻辑 `if self.namespace: params["tenant"]=...`——空串不带 tenant=走默认空间。

改动(五处触点,均只动默认公共空间语义处):
- game-cloud huijing-server application.yaml:discovery/config 两处 namespace public→""(+中文注释)
- tier2 gen-worker service/nacos_registry.py:NACOS_NAMESPACE 默认值 public→""(+中文注释)
- tier2 gen-worker tests/test_nacos_registry.py:断言随改 == "public" → == ""
- docs/内网凭据与端点.md:Nacos 段补 namespaceId 口径行(空串非 public,写读两侧对齐)

不动:各模块 -dev/-local profile 的 namespace: dev(独立命名空间 dev,非默认公共空间语义);
docs/plans 历史留痕档的 public 字面量(留痕层不改)。

验证:nacos_registry 单测 6 passed;application.yaml YAML 语法有效(两处 namespace 落空串);
py_compile 通过;docs-gate 6/7 检绿(唯一 G3 死链为 pre-existing、与本改动无关)。

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-04 08:46:53 -07:00
lili
3afed479f8 fix(studio): 透传集扩容并入 1101001003 生成暂停降级 + 1101001006 入口速率闸,保留产品语义 (工单j)
AIGC_USER_REJECT_CODES 从三码扩到五码:并入 AIGC_GENERATE_PAUSED(1-101-001-003,
降级开关开启时创作者原只见笼统「生成委托失败」的体验税)与 AIGC_ADMISSION_RATE_LIMITED
(1-101-001-006,Sentinel 入口速率闸,与背压/配额同族的控制面准入拒绝、用户可见)。委托
aigc 抛这两码时原样透传、保留产品语义,不再一刀切包成 STUDIO_AIGC_DELEGATE_FAIL。

未并入 AIGC_LLM_SAFETY_ERROR(1-101-001-005):其定义注释明记归因 tag 仍记 llm_error
(safety 超时/失败的 fail-closed 故障兜底),语义为内部错误、中性文案只作用户遮罩,非控制
面准入拒绝,故仍按原逻辑包裹。

只扩集合 + 补测试:三处委托点 catch(ServiceException) 结构与 isControlPlaneUserReject
helper 一字未动(引集合常量,扩集合即自动扩行为);文案不改;不动 aigc 模块本体。

验证:StudioServiceImplTest 37 测全绿(既有 35 不回归 + 1003/1006 各一透传断言),
mvn -pl game-module-studio/game-module-studio-server -am test。

生效需随下轮 jar 轮换(仅改后端字节码,已在跑实例不热更)。

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-04 00:30:28 -07:00
lili
f9b85d429b fix(studio): 透传控制面三拒绝码(1101001001/002/004)保留产品语义,其余异常仍包裹 1112002000 (cutover S2 工单d)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-03 18:51:08 -07:00
lili
0daa5e5011 merge: R3 广告回调验签 fail-closed 封铸币面 + M4 预接线设计回炉(双评审 BLOCKER/MAJOR 全修,ad 模块 33 单测绿)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-02 20:51:44 -07:00
lili
d32d5965fb feat(trade): 积分充值 P0 骨架(复用 payout mock-gated 渠道 SPI 范式·真支付收单 P1 受日历闸门) (W-REAL R2)
补 55 P0 最后一块结构缺口。MVP 不接真实支付收单(trade.yaml:支付收单=P1、归 pay 日历闸门)——充值渠道复用
game-module-trade 既有 payout 那套「mock-gated 渠道 SPI」范式,而非接入 12 表重 huijing-module-pay-server
(无 game 消费者、无 Flyway schema、Alipay/微信 SDK 重、P1 缓)。

- 充值渠道 SPI(镜像 PayoutClient):ChargeClient/MockChargeClient/ChargeClientFactory 按 Nacos trade.charge-channel
  路由(默认 mock),mock 同步直通即支付成功入账;真实 wxpay/alipay 未注册时工厂 fail-fast(TRADE_CHARGE_CHANNEL_UNAVAILABLE),
  绝不静默降级 mock 收假单(与 payout「假打款吞真钱」红线同构)。
- V28 game_trade_charge_order:充值单(status 0待支付→10已支付 CAS 入账),uk_biz_no 幂等,账本自包含
  (积分余额=Σ 已支付单 points),不污染创作者收益账户(game_trade_account)不变式。
- ChargeService:创建幂等(bizNo 去重 + uk 兜底并发)→ 发起收单 → mock 同步 CAS 置已支付 + 积分入账;整单同事务。
- app-api 薄骨架:POST /trade/charge/create + GET /trade/charge/points-balance(userId 由 token 解析防越权)。

验证:trade 模块单测绿(新增 ChargeChannelTest 3[mock契约+工厂路由+fail-fast红线] + ChargeServiceImplTest 5
[mock流程+幂等+校验+余额];既有 Account16/Withdraw18/Subscription13 等全不变);连真 MySQL charge mock e2e IT 绿
(V28 DDL+创建→CAS入账→积分余额150→bizNo幂等拒绝);Flyway 全绿(28/28 迁移含 V27+V28 按版本序真库全应用,61 语句);
huijing-server 单体编译 BUILD SUCCESS。Flyway 版本核对 V27→取 V28。

范围说明:「pay 模块接单体」按项目既有模式(game 模块自带 mock-gated 渠道 SPI、huijing pay 保持解耦)解读为复用 pay
模式而非全量接入重 pay-server;若需真接 12 表 pay-server 请复核(见交付报告)。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-02 20:46:54 -07:00
lili
00ebeedc50 fix(ad): M4 回调验签 fail-closed 封铸币面 + M4广告SDK预接线设计回炉(R3 双评审 BLOCKER/MAJOR)
代码加固(仅 game-module-ad):
- AdProviderFactory 增 getStrict(未注册返 null、绝不降级 mock),回调路径改用之;get() 展示计费降级保持不变
- MockAdProvider 覆写 verifyRewardCallback 返 false(mock 不接联盟回调,纵深防御第一层)
- reportRewardCallback fail-closed:provider 未就绪抛 PROVIDER_NOT_READY(新增 1-111-002-005)
- ad.force-mock 熔断:只拒真实联盟位回调、不碰 calcRevenue、不影响 mock/callback 桩
- 回调铸币面全组合矩阵单测 8 格(provider×force-mock);ad 模块 33 单测全绿(Callback 7/AdSlot 6/AdRevenue 20)

设计档回炉(逐条吃双评审):
- B1 三层开关安全语义拆分(算钱降级宽松 vs 验签 fail-closed)+ runbook 切前 fail-closed 闸
- B2 冲正定死:不估算入账,以联盟 T+1 账单实际金额为唯一 trade 入账源(消除冲正,uk_source 幂等/账户恒等式成立)
- M1 热刷新 @RefreshScope 方案入档(本机验不了标 follow-up,runbook 滚动重启兜底 + 资损敞口)
- M2 契约断言改真话(callback 枚举 R4 bc0f486b 已补齐;AdSlotSaveReqVO 无 enum 强校验如实、R3 不补理由)
- 防重放窗口配置项预置(owner/默认300/上限900/timestamp fail-safe)+ ACK/来源IP进待核清单 + runbook 放量停止阈值

红线守住:不动 trade(冲正只设计)/不动 contracts(R4 已收口)/不写真实 provider 类。docs-gate 七检全绿。

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-02 20:41:08 -07:00
lili
617abbb589 feat(telemetry): D1 次留旁路聚合(玩家×游戏×日去重·平台时区·quality_score 链路零风险) (W-REAL R6)
按质量模型设计 §3.4 口径立 L3 留存字段:同一 game_id、同一稳定玩家标识(登录取 userId、未登录取 anonId,
对齐 #5 契约 anonId 口径)在首玩自然日(平台时区,与 game_telemetry_game_stat.stat_date 同日界)后第 1 个
自然日内 ≥1 次 game_play_start,按玩家×游戏×日去重。

- V27 旁路两表:game_telemetry_player_first_play(游戏×玩家,首玩追踪+d1_returned CAS 去重)
  + game_telemetry_retention_stat(游戏×cohort日,new_player_count/d1_retained_count;D1率读时算)。
  不动既有 game_telemetry_game_stat 结构,quality_score 链路零风险。
- RetentionAggregateService:仅吃 game_play_start,首玩 INSERT IGNORE 落点+累加 cohort;首玩日+1 回访
  CAS 置位+累加分子;同日/非D1/已置位去重。挂进 R1 consumeFromMq(ingestOne 之后),best-effort 内部吞异常
  不外抛——次留失败绝不连累 quality_score 主链;软注入(单测不注入即跳过,既有行为不变)。
- 玩家标识命名空间隔离(u:{userId}/a:{anonId})防碰撞;匿名→登录跨身份桥接留后续(user_login)。

验证:模块 68 单测绿(新增 9 个口径单测覆盖首玩/D1窗口/去重/匿名标识/best-effort;既有 EventIngestServiceImplTest
13 逐字不变=回灌行为不变);连 mini-infra 真 MySQL 8.4.8 聚合真跑 IT 绿(throwaway 库跑真 V27 DDL + D1 两日场景,
new_player=2/d1_retained=1 断言通过)。Flyway 版本核对迁移目录 V26→取 V27。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-02 20:23:00 -07:00
lili
f2d85a072a feat(telemetry): 批量事件入口改 RocketMQ 异步消费(幂等·聚合/回灌行为不变) (W-REAL R1)
上报入口 /events/batch·/perf/beacon 从请求线程内同步写改为「轻量校验 + 投递 telemetry-event 主题、
消费侧异步落库+聚合+quality_score 回灌 feed」。灰度开关 telemetry.mq.enabled(默认关=同步回落、现行行为逐字不变)。

- TelemetryEventProducer:逐条投递 event/perf tag、keys=traceId、syncSend 带超时+RocketMQ 自带重试;
  发送失败不外抛、按 rejected 交前端重传兜底(不 500 阻断上报)。
- TelemetryEventConsumer:@RocketMQMessageListener 落地骨架,consumeThreadNumber=consumeThreadMax=8
  (min=max 破 consumeThreadMax 死参数坑,受 DB 池默认 10 约束);瞬时故障外抛触发 ≤16 次重投转 DLQ,
  毒消息吞掉 ack 防重投风暴;幂等由 eventId(uk_event_id)保证重投不双计。
- EventIngestServiceImpl:入口路由(MQ 在席=投递、缺席=同步回落),新增 consumeFromMq 单条事务入口
  逐字复用同步写核心 ingestOne——聚合行为与 quality_score 回灌 feed 行为与改造前一致,仅执行位置搬到消费线程;
  ObjectProvider 软注入生产者 + @Lazy 自代理保回落单条事务真生效。

验证:模块 59 单测绿(既有 EventIngestServiceImplTest 13 个逐字不变通过=回灌行为不变;新增生产者3/消费者4/
MQ路径5);连 mini-infra 真 broker(100.64.0.8:9876)往返 IT 绿(produce→broker→consume→consumeFromMq 转调,
往返序列化保真)。整条 HTTP POST→MQ→真库聚合行 的单体 e2e 待后端全栈窗口(同阶段〇 C1/C2/C3 处置)。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-02 20:04:18 -07:00
lili
4bc36ec6dd feat(game-cloud): RocketMQ 异步 gen 队列(生产者+有界消费≤15+CAS 幂等)(切片一 阶段〇 C3)
入队发 AIGC_GEN_TOPIC 信号替 @Scheduled 轮询触发;消费者 consumeThreadMax=15(在跑并发权威)+ 既有
claimQueuedTask CAS 认领幂等;派发失败落 failed 不留悬空 running;@Scheduled 降级兜底(捞 stale queued +
超时 running)。发 MQ best-effort 不回滚入队。单测锁幂等/best-effort;端到端随后端窗口。

name-server 各 profile(dev/local/staging)+base 指 mini-infra 100.64.0.8:9876;rocketmq-spring-boot-starter
在 starter-mq/websocket 均 optional=true 不传递,故 aigc-server 直依赖(版本走依赖管理)。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-01 17:40:40 -07:00
lili
6d6bb52d9d feat(game-cloud): Sentinel 入口 QPS 突发保护(FLOW_GRADE_QPS·规则热源 Nacos)(切片一 阶段〇 C2)
入队入口套 @SentinelResource(aigc:gen:admission)做入口速率闸,与 DB 三门(per-creator 配额)分层;
越限 blockHandler 优雅拒非 500。并发≤15 权威=C3 consumeThreadMax(非本 Task)。规则改 Nacos dataId 热生效。
单测锁降级语义;真限流集成验证随后端窗口。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-01 09:59:31 -07:00
lili
55e833b470 feat(game-cloud): 重启用 Nacos 配置中心+服务发现指向 mini-infra(切片一 阶段〇 C1)
application.yaml nacos discovery/config enabled false→true + server-addr 100.64.0.8:8848 + 鉴权。
依赖零新增(starter 已声明)。本地编译绿;真注册验证随后端窗口。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-01 09:32:42 -07:00
lili
5265f538b8 feat(contracts,aigc): prompt registry 一致性 CI 门 + Java TTL 运行时热取(切片一 C2)
check_registry.py 校验 registry.yaml 每条 id.version 与 .md frontmatter 对齐(漂移 exit 1,17 条全绿);PromptResourceLoader 加 @Scheduled 60s TTL 热取 + classpath 永久兜底 + volatile 原子换 Map(mvn compile 过 + 9/9 测试)。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-30 01:39:06 -07:00
lili
938219d7a5 feat(studio): A11 切片三 M2 判意图入口 Java 侧(studio→aigc→worker)
两段式第一段的后端承接:用户原话进系统、判意图、返建议供前端确认(确认后才调 /modify 执行)。

契约先行:
- studio.yaml 新增 POST /app-api/studio/modify/plan + StudioModifyPlanReqVO/RespVO

studio(应用面):
- AppStudioController.planModify;StudioServiceImpl.planModify =
  validateCreator 白名单门(与既有 createDraft/generate/modify 一致)+ 归属校验防越权
  + 委托 aigc classifyModify + 异常/空兜底 unclear

aigc(worker 对接):
- AigcApi.classifyModify + AigcModifyProposalDTO
- WorkerClassifyClient:据 baseVersionId 反查 base 源(同 injectBaseSourceProject seam)
  → NO_PROXY JDK HttpClient POST worker /classify → best-effort 兜底 unclear+needsConfirm
- AigcApiImpl 软注入 ObjectProvider<WorkerClassifyClient>(executor 关闭时缺席→兜底,
  绝不因 Bean 缺席启动失败,镜像 WorkerDispatchClient);worker URL 尾段 /generate→/classify

测试:StudioServiceImpl 31/31 + WorkerClassifyClient 10/10 + AigcApiImpl 2/2,
本地 maven 独立复跑 43/43 绿、BUILD SUCCESS,既有 modify/generate/SAA 回归零破坏。
真连 worker 的判意图 e2e 待 M5(mini-desktop)。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-29 01:22:24 -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