k88936
|
9476290c4b
|
refactor(LLM): 列表无可用模型时复用 AgcModelResolveError 的错误码
- public_model_catalog 里硬编码的 MODEL_UNAVAILABLE 与 AgcModelResolveError::Unavailable.code() 重复
- 改为直接取枚举 code(),与 MODEL_ACCESS_UNAVAILABLE 的既有做法一致,避免两处字符串漂移
|
2026-10-04 16:01:13 +08:00 |
|
k88936
|
1e90254d0a
|
perf(泥点): 复用模块级 Intl.DateTimeFormat 格式化刷新时刻
- formatMudPointResetAt 原先每次调用都新建 Intl.DateTimeFormat,而它跑在多个渲染路径里
- locale / 时区 / 字段恒定,提升为模块级常量 MUD_POINT_RESET_FORMATTER 复用,输出不变
|
2026-10-04 15:57:22 +08:00 |
|
k88936
|
b431eb6074
|
refactor(钱包 store): 抽出余额就绪态统一构造,消除重复 set
- applyWalletBalanceSnapshot 与刷新循环各自重复「resolve 视图 + 写 4 个 ready 字段」
- 抽出 readyWalletBalanceState 统一派生 totalPoints / status / error,两条路径不再有漂移风险
- 行为不变(注:本文件既有的 rejects a snapshot from another owner 用例在改动前后均失败,与本次无关)
|
2026-10-04 15:55:38 +08:00 |
|
k88936
|
9e13b83171
|
refactor(充值弹窗): 摊平套餐卡片里的嵌套三元价格行
- 原年付实付文案在模板字符串里再嵌一层 savingCents 三元,属于嵌套三元
- 把年付价格行提升为 annualPriceLine 常量,JSX 只保留 annual 单层分支,文案不变
|
2026-10-04 15:52:29 +08:00 |
|
k88936
|
349af04034
|
refactor(充值弹窗): 摊平结算弹窗里的嵌套三元 listPriceCents
- 原写法 plan / annual 两层三元叠加,扩展条件时容易漏分支
- 改为按 annual 分支 + 可选链与 ?? 兜底,保持 plan 为空时取 0 的语义不变
|
2026-10-04 15:49:31 +08:00 |
|
k88936
|
87f3cd4462
|
test(AGC): 去掉 findBy 查询后多余的 not.toBeNull 断言
- findBy* 在超时后会直接抛错,末尾的 .not.toBeNull() 永远看不到 null
- 充值弹窗用例内的 dialog / 「可用总额」断言改为直接 await,保持意图清晰
|
2026-10-04 15:48:35 +08:00 |
|
k88936
|
5d375332c9
|
chore(格式): 合并 .prettierignore 中重复的 ts-rs 生成产物忽略项
- packages/shared/src/contracts/generated/ 原先重复出现两次,两条中文注释描述同一理由
- 合并为单条忽略项与合并后的注释,避免后续误删其中一条造成 prettier 二次改写生成绑定
|
2026-10-04 15:44:59 +08:00 |
|
k88936
|
0b687651a2
|
Merge pull request 'Feat/pricing plan limit' (#603) from feat/pricing-plan-limit into feat/pricing-plan
Project CI / Backend tests (pull_request) Failing after 33s
Project CI / AI game creator shell Rust crates (pull_request) Successful in 2m56s
Project CI / AI game creator shell Rust lane 1/2 (pull_request) Successful in 6m38s
Project CI / Native shell tests (pull_request) Failing after 1m34s
Project CI / AI game creator shell Rust lane 2/2 (pull_request) Successful in 3m52s
Project CI / Repository checks (pull_request) Failing after 34s
Project CI / Frontend tests (pull_request) Failing after 1m26s
Project CI / AI game creator shell web tests (pull_request) Failing after 1m13s
Reviewed-on: #603
|
2026-10-04 13:36:50 +08:00 |
|
k88936
|
620f6ca938
|
fix(AGC): 目录缺 unavailableModels 时不再崩溃
Project CI / Backend tests (pull_request) Failing after 1m26s
Project CI / AI game creator shell Rust crates (pull_request) Successful in 3m5s
Project CI / Native shell tests (pull_request) Failing after 2m18s
Project CI / Frontend tests (pull_request) Failing after 1m7s
Project CI / Repository checks (pull_request) Failing after 1m15s
Project CI / AI game creator shell Rust lane 2/2 (pull_request) Successful in 5m3s
Project CI / AI game creator shell web tests (pull_request) Failing after 58s
Project CI / AI game creator shell Rust lane 1/2 (pull_request) Has been cancelled
- applyCatalog 归一化 catalog.unavailableModels,修掉按 reason 取降级文案时对 undefined 解引用(此前 26 个用例挂在这)
- 用例跟进新降级文案;disabled 用例补上下线桶,断言「该模型已下线」专用文案
|
2026-10-04 13:29:32 +08:00 |
|
k88936
|
c391352ff4
|
fix(会员): 并发上限按有效档位解析,过期会员回落 Normal
- effective_profile_concurrent_job_limit 原先直接读 profile_membership.plan;该列到期后仍保留最近购买档位,过期 Max 会继续拿 128 不限并发哨兵
- 补 expires_at 有效性过滤,与 build_profile_membership_snapshot_from_row 的对外口径一致;缺会员行 / 已过期按 Normal
|
2026-10-04 13:29:32 +08:00 |
|
k88936
|
964948bed2
|
fix(会员): 模型权限读链路失败改报独立 503 错误码
- 新增 MODEL_ACCESS_UNAVAILABLE(503),与 403 档位不足 / 422 模型不可用区分,不再把付费账号静默降级成 Basic
- resolve_owner_agc_model_access 返回 Result 并由 load_owner_llm_catalog 透传;缺会员行 / 缺目录行仍由 module 内失败关闭并返回成功
- 入口注释列出三类错误码语义;补错误码映射单测
|
2026-10-04 13:29:32 +08:00 |
|
k88936
|
6ed5d8fe88
|
style(AGC): 锁定模型原因提示允许换行避免溢出
- 气泡 width:max-content + max-width:220px 配 white-space:nowrap,长文案会溢出气泡
- 改为 white-space:normal,在 220px 内换行
|
2026-10-04 13:29:32 +08:00 |
|
k88936
|
7de5b858ec
|
fix(AGC): 不可用模型选项补回模型名到可访问名称
- role=option 的 aria-label 原只放降级原因,覆盖了可见模型名,读屏只报「订阅计划不支持」
- 改为 `${displayName}:${reasonLabel}`,名称与原因都可被朗读
|
2026-10-04 13:29:32 +08:00 |
|
k88936
|
b46c0be9ce
|
perf(会员): 模型目录与账号权限档并发读取
- load_owner_llm_catalog 原串行等待目录与权限档两次 SpacetimeDB 往返,热路径延迟叠加
- 改为 tokio::join! 并发发起;目录错误仍由 catalog? 返回,权限档失败关闭语义不变
|
2026-10-04 13:29:32 +08:00 |
|
k88936
|
2e13334fd7
|
perf(会员): 在飞 running 计数下推到 owner_status 索引范围
- count_running_external_generation_jobs_for_owner 原先把 status 当 Rust 后置过滤,owner 的 pending 积压也会被物化
- 改为 (owner_user_id, status) 复合条件,直接走 btree 范围,语义不变
|
2026-10-04 13:29:32 +08:00 |
|
k88936
|
181d72064c
|
fix(AGC): 默认模型解析复用档位可用校验
- resolve_requested_for 的默认分支原只校验 enabled,补回 access.allows 校验,避免默认模型解析与档位边界不一致
|
2026-10-04 13:29:32 +08:00 |
|
k88936
|
ce464168ce
|
docs(会员): 标注外部生成认领的跨账号队头阻塞 TODO
- claim_external_generation_jobs_tx 的 take(limit) 只检查前 limit 行,被上限拦下/lease 终结的行仍占检查名额
- 记录触发条件(负载越高 limit 越小)与未决修法(改为成功认领才计数,仍是全局 FIFO),本次不修
|
2026-10-04 13:29:32 +08:00 |
|
k88936
|
93fc9f98ba
|
feat(AGC): 模型选择器展示不可用模型与降级原因
- clientApi/llmModelCatalog 改用 @genarrative/shared 生成类型,自定义目录补 unavailableModels 空桶与 protocol
- 新增 modelAvailabilityCopy.ts:锁定项原因文案与按 reason 的降级提示
- ConversationModelSelect 渲染锁定项(不可点、可 focus、data-tooltip),降级提示按 reason 取值
- styles.css 补锁定项与 tooltip 样式(仅 hover / focus-visible)
- 新增 vitest 覆盖文案映射与锁定项渲染,vitest.config 纳入 features/project-workspace 用例
|
2026-10-04 13:29:32 +08:00 |
|
k88936
|
9437b71aee
|
feat(AGC): 模型目录 wire 复用 shared-contracts DTO
- llm_catalog.rs 删掉手写 WireModelCatalog/WireModelSummary 与 map_catalog,直接反序列化 LlmModelsResponse
- 旧服务端缺 agentMode/protocol/unavailableModels 时按 Codex + OpenAI Responses + 空桶兼容
- 新增未知 reason 收口为 unknown 且 agentMode/protocol 解析为枚举的单测
|
2026-10-04 13:29:32 +08:00 |
|
k88936
|
f3f89efddd
|
feat(shared): 转发 AGC 模型目录 ts-rs 绑定
- 新增 packages/shared/src/llm/modelCatalog.ts,re-export Rust 生成的目录 DTO 与枚举
- 根 index.ts 增加 export type * from './llm/modelCatalog',AGC 从 @genarrative/shared 根导入
|
2026-10-04 13:29:32 +08:00 |
|
k88936
|
e89420053a
|
feat(会员): 模型列表返回可用与不可用分桶
- shared-contracts 新增 llm_catalog.rs:LlmModelsResponse/LlmModelSummary/LlmUnavailableModel/LlmModelUnavailableReason(plan_required/disabled/unknown),未停用优先于档位的 disabled 语义留给域层
- AgcAgentMode/AgcModelProtocol 从 module-runtime 迁入 shared-contracts(前后端 + ts-rs 单一真源),module-runtime re-export 保持路径可用
- 整个目录 DTO 与枚举走 ts-rs,生成到 packages/shared/src/contracts/generated,revision 标 number
- module-runtime 新增 AgcModelCatalog::unavailable_models_for(access):保持目录顺序,停用优先于档位不足,补单测
- api-server public_model_catalog 产出 models + unavailableModels 两桶,重写 model_catalog_tests
|
2026-10-04 13:29:29 +08:00 |
|
k88936
|
35a54d19e2
|
docs(会员): 记录模型权限改走只读 procedure 的落地状态
- 技术设计 §11.4:api-server 改调 get_profile_agc_model_access_and_return,性能说明去掉 TODO 并登记提交
- decision-log 追加「模型权限改走只读 procedure(性能收口)」条目
|
2026-10-04 13:29:16 +08:00 |
|
k88936
|
243ad3c0e4
|
perf(会员): 模型权限解析改用只读 procedure,去掉热路径写库读
- api-server llm/model_access.rs 改调 get_profile_agc_model_access,不再走带账期刷新的 get_profile_recharge_center
- 失败关闭语义不变:procedure 失败或档位目录缺行仍按 Basic
|
2026-10-04 13:29:07 +08:00 |
|
k88936
|
cf40df6be3
|
feat(会员): 新增只读 AGC 模型权限 procedure 与客户端访问器
- module-runtime 新增 RuntimeProfileAgcModelAccessSnapshot / ProcedureResult 领域类型
- spacetime-module 新增 get_profile_agc_model_access_and_return:只读会员账期投影 + 档位目录 model_access,缺目录行失败关闭 Basic
- 重新生成绑定并补 spacetime-client get_profile_agc_model_access 与结果映射
|
2026-10-04 13:29:05 +08:00 |
|
k88936
|
e91abf9875
|
docs(会员): 定案模型列表可用/不可用分桶契约
- ADR 增补修订节:GET /api/llm/models 返回 models + unavailableModels,reason 枚举 plan_required/disabled/unknown,停用优先,不放松服务端强制
- 技术设计 §11.2 改述列表契约为分桶,§11.4 补 llm_catalog.rs 落点、域层分桶方法、AGC 客户端 hover 文案与 ts-rs 单一真源,并刷新落地提交号
- AGC 后台模型别名技术方案补 2026-10-03 修订说明
- AGC 模型目录上游同步里程碑标注「形状不变」已被后续变更取代
- decision-log 追加分桶决策、兼容与客户端口径
|
2026-10-04 13:28:37 +08:00 |
|
k88936
|
1d09d7e061
|
perf(会员): 外部生成认领按账号折叠并发上限与在飞计数查询
- 新增 ExternalGenerationOwnerConcurrencyCache:单次 claim 事务内按账号只查一次 concurrent_job_limit,running 计数按账号缓存
- 认领 / lease 耗尽终结后失效该账号 running 缓存,判定结果与逐候选行现查一致
- 回收豁免与不限档不再触发 running 计数查询;补缓存失效单测
|
2026-10-04 13:28:26 +08:00 |
|
k88936
|
413b3645c2
|
docs(会员): 补模型权限与并发上限的实现状态与契约说明
- 数据契约 external_generation_job 增补 2026-10-03 会员并发上限:新增 (owner_user_id, status) 索引、认领只算 running、过期回收豁免、缺行失败关闭到 Normal
- 设计文档 §11.4 增补落地状态与提交号,并标注账号档位轻量读与客户端 403 重选提示为后续可选项
- decision-log 追加落地实现条目:实现拆分、Basic/Full 与 Normal 的失败语义、验证结论与边界 TODO
|
2026-10-04 13:28:24 +08:00 |
|
k88936
|
3306d932bb
|
feat(会员): AGC 模型代理按会员档位过滤与校验
- 新增 llm/model_access.rs:用 get_profile_recharge_center 解析账号档位到 AgcModelAccess,缺会员行/缺目录行/读失败统一失败关闭到 Basic
- GET /api/llm/models 按档过滤并给出该档默认模型;该档无可用模型时返回 503 而不是不可解析的默认项
- /api/llm/responses、/api/llm/chat/completions、/api/llm/anthropic/* 全部改按档解析;越权返回 403 + MODEL_NOT_AVAILABLE_FOR_PLAN,目录外/停用仍是 422
- 补 api-server 单测:Basic 档过滤 Full 模型并回退默认项、越权错误码与状态映射
|
2026-10-04 13:28:13 +08:00 |
|
k88936
|
2630b0f690
|
feat(会员): 后台 AGC 模型支持标注权限档
- AdminAgcModel 新增 access 字段(缺省 basic,失败开放),GET 回读 PUT 写入
- api-server 保存时校验权限档只允许 basic/full
- 后台 AGC 模型页新增「权限档」列,可按模型选择基础/高性能模型
- fake API 与页面用例覆盖权限档选择与保存
|
2026-10-04 13:28:13 +08:00 |
|
k88936
|
103280025c
|
feat(会员): 外部生成认领按账号并发上限过滤
- external_generation_job 追加 (owner_user_id, status) 组合索引,认领事务内现算 running 行数,不建计数表
- claim_external_generation_jobs_tx 认领前判定会员并发上限:达上限的 pending 保持排队
- 账号自身过期 running 的回收豁免上限,避免超限账号卡死任务无法回收
- profile.rs 新增 effective_profile_concurrent_job_limit:缺会员行按 Normal、缺目录行失败关闭到 1
- 抽取纯函数 external_generation_claim_within_concurrency_limit 并补单元测试
|
2026-10-04 13:28:13 +08:00 |
|
k88936
|
325466d9b4
|
feat(会员): AGC 模型目录新增权限档与按档过滤能力
- 新增 agc_model_access.rs:AgcModelAccess(basic/full,缺省 basic 失败开放)、越权错误码 MODEL_NOT_AVAILABLE_FOR_PLAN、AgcModelResolveError,以及会员档位到模型权限档的映射
- AgcModel 末位追加 #[serde(default)] access,存量目录 JSON 缺字段按 basic 解析
- AgcModelCatalog 新增 available_models_for / default_model_id_for / resolve_requested_for:显式越权不静默回退,默认模型优先登记项、不可用时回退目录顺序首个可用项
- 覆盖缺省解析、档位过滤、越权与未知模型区分、无可用模型等纯函数测试
|
2026-10-04 13:28:13 +08:00 |
|
k88936
|
56708988ed
|
docs(会员): 补 §11.4 实现落点,钉死模型权限与并发的编码约定
- 新增 §11.4:module-runtime 的 AgcModelAccess / 解析错误、spacetime-module 的 (owner_user_id, status) 索引与认领过滤、api-server 的档位解析与 403 错误码、后台 access 字段
- 明确默认模型语义:登记默认项优先,不在该档可用集合里时回退目录顺序首个可用项
- 记录本期复用 get_profile_recharge_center 解析档位的性能 TODO
|
2026-10-04 13:28:13 +08:00 |
|
k88936
|
cbe6697d03
|
docs(会员): 定案模型权限与并发上限的服务端强制边界
- 新增 ADR「模型权限与并发上限的强制边界」:并发只在认领事务按账号过滤 running job、模型档缺省 Basic、直连同步生成暂不计入
- 技术设计新增 §11,承接并作废 §9/§10 的「只落字段、不拦截」表述
- CONTEXT 修订「模型权限」「并发上限」词条,新增「独立生成任务」
- docs/README 与 decision-log 登记本 ADR 与拷问定案
|
2026-10-04 13:28:09 +08:00 |
|
k88936
|
65b9821d25
|
Merge remote-tracking branch 'origin/master' into feat/pricing-plan
Project CI / AI game creator shell Rust lane 1/2 (pull_request) Has been cancelled
Project CI / AI game creator shell Rust lane 2/2 (pull_request) Has been cancelled
Project CI / AI game creator shell Rust crates (pull_request) Has been cancelled
Project CI / Backend tests (pull_request) Has been cancelled
Project CI / Native shell tests (pull_request) Has been cancelled
Project CI / Frontend tests (pull_request) Has been cancelled
Project CI / Repository checks (pull_request) Has been cancelled
Project CI / AI game creator shell web tests (pull_request) Has been cancelled
# Conflicts:
# docs/project-memory/shared-memory/decision-log.md
|
2026-10-04 13:27:20 +08:00 |
|
k88936
|
a6fb2f01c1
|
Merge pull request 'Feat/游玩计数' (#604) from feat/play-count-with-cache into master
Project CI / AI game creator shell Rust crates (push) Successful in 3m8s
Project CI / AI game creator shell Rust lane 2/2 (push) Successful in 4m44s
Project CI / AI game creator shell Rust lane 1/2 (push) Successful in 6m7s
Project CI / Backend tests (push) Successful in 7m12s
Project CI / Frontend tests (push) Successful in 3m3s
Project CI / Native shell tests (push) Has been cancelled
Project CI / Repository checks (push) Has been cancelled
Project CI / AI game creator shell web tests (push) Has been cancelled
Reviewed-on: #604
|
2026-10-04 13:21:04 +08:00 |
|
k88936
|
9d7ca1b3b7
|
文档(会员目录):明确懒播种策略与只读入口首次写库的副作用
- ensure_default_profile_membership_plan 注释说明 init 与读取 helper 共用、目录空时首次读取会写库
- init_profile_membership_plan_catalog 注释改为不覆盖「表已存在但为空」的存放量库
- 报价与建单注释去掉「不写库」的绝对说法,注明目录空时的懒播种例外
- 同步设计文档 7 / 10.2 与决策日志(播种策略定为保留懒播种 + 明示副作用)
|
2026-10-04 13:20:06 +08:00 |
|
k88936
|
fdf636ce95
|
补充(会员错误):兑换码链路留 TODO 接入 typed error
- is_runtime_profile_redeem_code_domain_error 顶部注明仍靠中文文案匹配判 400
- 指明后续按 RuntimeProfileMembershipErrorCode + ProcedureRejected 的做法改造
|
2026-10-04 13:19:42 +08:00 |
|
k88936
|
9ce43071ad
|
Add gamePlayClientId.ts to module and test exclusions
Project CI / AI game creator shell Rust crates (pull_request) Successful in 3m14s
Project CI / AI game creator shell Rust lane 2/2 (pull_request) Successful in 4m54s
Project CI / AI game creator shell Rust lane 1/2 (pull_request) Successful in 6m0s
Project CI / Backend tests (pull_request) Successful in 6m54s
Project CI / Frontend tests (pull_request) Successful in 2m54s
Project CI / Native shell tests (pull_request) Successful in 6m47s
Project CI / AI game creator shell web tests (pull_request) Successful in 3m8s
Project CI / Repository checks (pull_request) Successful in 5m9s
|
2026-10-04 12:53:17 +08:00 |
|
k88936
|
68c8544a15
|
类型化(会员错误):会员业务拒绝改用机器可读 error_code
- module-runtime 新增 RuntimeProfileMembershipErrorCode 与 RuntimeProfileMembershipDomainError
- 会员报价 / 充值中心 / 后台档位 upsert 的 procedure 结果末尾追加 error_code
- spacetime-module 在拒绝点显式赋码,中文 error_message 逐字保持不变
- spacetime-client 新增 SpacetimeClientError::ProcedureRejected 并映射生成绑定
- api-server 删除会员中文前缀分类,改按 error_code 返回 400,基础设施错误仍 502
- 重生成 module_bindings,并同步设计文档 5.8 与决策日志
|
2026-10-04 12:41:26 +08:00 |
|
k88936
|
ff83b67196
|
Merge branch 'master' into feat/play-count-with-cache
Project CI / AI game creator shell Rust crates (pull_request) Successful in 3m7s
Project CI / AI game creator shell Rust lane 2/2 (pull_request) Successful in 4m20s
Project CI / AI game creator shell Rust lane 1/2 (pull_request) Successful in 5m28s
Project CI / Backend tests (pull_request) Successful in 7m46s
Project CI / Frontend tests (pull_request) Successful in 3m55s
Project CI / AI game creator shell web tests (pull_request) Successful in 3m18s
Project CI / Native shell tests (pull_request) Successful in 8m37s
Project CI / Repository checks (pull_request) Failing after 6m40s
|
2026-10-04 12:08:32 +08:00 |
|
k88936
|
75766824f6
|
文档(会员计费):同步 granted_points_delta 改 u64 与 wire token 枚举
- membership_granted_points_delta 列类型文档由 i64 更新为 u64
- 补充 shared-contracts 新增四个会员 wire token 枚举及其与模块枚举的映射说明
|
2026-10-04 11:59:05 +08:00 |
|
k88936
|
57e259278d
|
Merge remote-tracking branch 'origin/master' into feat/play-count-with-cache
Project CI / Backend tests (pull_request) Failing after 36s
Project CI / AI game creator shell Rust crates (pull_request) Successful in 2m28s
Project CI / AI game creator shell Rust lane 1/2 (pull_request) Successful in 6m41s
Project CI / Repository checks (pull_request) Failing after 15s
Project CI / AI game creator shell web tests (pull_request) Has been cancelled
Project CI / AI game creator shell Rust lane 2/2 (pull_request) Has been cancelled
Project CI / Native shell tests (pull_request) Has been cancelled
Project CI / Frontend tests (pull_request) Has been cancelled
# Conflicts:
# docs/project-memory/shared-memory/decision-log.md
|
2026-10-04 11:58:25 +08:00 |
|
k88936
|
d7dec9b475
|
枚举化(会员后台):档位与模型权限请求字段改用 typed enum
- AdminUpsertProfileMembershipPlanRequest.plan/model_access 由 String 改为 token 枚举
- 未登记的档位 / 权限 token 在反序列化阶段直接拒绝,后台不能再持久化任意字符串
- admin handler 去掉字符串解析分支,改为 From 转换
- 删除仅用于手写解析的 parse_runtime_profile_membership_* 辅助函数
|
2026-10-04 11:46:08 +08:00 |
|
kdletters
|
13a15fed5c
|
修复 AGC 渠道更新互相终止与快捷方式迁移
Project CI / AI game creator shell Rust crates (push) Successful in 3m5s
Project CI / AI game creator shell Rust lane 2/2 (push) Successful in 4m24s
Project CI / AI game creator shell Rust lane 1/2 (push) Successful in 5m20s
Project CI / Backend tests (push) Successful in 6m42s
Project CI / Frontend tests (push) Successful in 3m2s
Project CI / Native shell tests (push) Successful in 7m16s
Project CI / AI game creator shell web tests (push) Successful in 3m17s
Project CI / Repository checks (push) Successful in 6m25s
为 release 与自定义渠道注入独立主程序名,隔离 Windows 更新进程。
新增 release 旧安装目录与快捷方式迁移钩子,保护 dev 历史目录清理。
同步渠道规范、共享决策与排障记录,补充发布脚本回归测试。
|
2026-10-04 11:45:20 +08:00 |
|
k88936
|
c660ca41fe
|
枚举化(会员):快照与报价/档位响应改用 typed enum
- shared-contracts 新增 ProfileMembershipPlan/CycleKind/ModelAccess/ChangeKind Token 枚举
- RuntimeProfileMembershipOrderChangeSnapshot 与 UpgradeQuoteRecord 档位/周期改用模块枚举
- AdminMembershipOrderChangePayload、ProfileMembership/Plan/UpgradeQuote Response 改用 token 枚举
- module-runtime 提供模块枚举与 wire token 的双向 From 映射
- api-server / spacetime-client / spacetime-module 同步去掉 as_str().to_string() 拼装
- 重生成 SpacetimeDB 绑定:订单变更快照字段改为枚举
|
2026-10-04 11:43:57 +08:00 |
|
k88936
|
08020e664b
|
文档:同步客户端 IP 只信 X-Real-IP
- ADR:身份与去重键节写明 IP 取 nginx 覆盖的 X-Real-IP、XFF 只取末段,并追加 2026-10-04 修订记录
- 玩法链路:去重与限流节标注 IP 来源
- decision-log:2026-10-04 条目补安全修正说明与标题
|
2026-10-04 11:39:00 +08:00 |
|
k88936
|
95705cbb11
|
后端:客户端 IP 只信 X-Real-IP,不再取 XFF 首段
- request_context.rs:client_ip_from_headers 改为优先 nginx 覆盖写入的 x-real-ip,x-forwarded-for 只作回退且取最后一段(nginx 用 $proxy_add_x_forwarded_for 追加的真实对端),不再信任可伪造的首段
- 影响两个调用方:公开游玩上报的匿名身份与 IP+game 限流键、微信支付下单的 payer_client_ip
- 更新测试:X-Real-IP 优先、XFF 回退取末段、空 X-Real-IP 回退与回环兜底
|
2026-10-04 11:38:47 +08:00 |
|
k88936
|
1744262b0b
|
对齐(会员订单):granted_points_delta 全链路 i64 改 u64
- profile_recharge_order.membership_granted_points_delta 列由 i64 改为 u64
- RuntimeProfileMembershipOrderChangeSnapshot 与 AdminMembershipOrderChangePayload 同步改 u64
- 删除 snapshot/order 之间的 as i64 与 try_from 兜底转换
- 重生成 SpacetimeDB 绑定:profile_recharge_order、订单变更快照
|
2026-10-04 11:23:21 +08:00 |
|
k88936
|
168028d5e5
|
修正(会员账期):期号水位缺失不再被当成换期重发额度
- advance_profile_membership_cycle_to 只在 cycle_resets_at 缺失时判定需要初始化写库
- cycle_index == 0(新列默认值)只补写期号水位,不重置 cycle_granted/remaining_points
- 补测试覆盖 cycle_index=0 且账期窗口已存在时保留本期余额
|
2026-10-04 11:21:42 +08:00 |
|
k88936
|
c0148dda7e
|
文档:同步游玩计数关停不强制 flush 与失败丢弃口径
- ADR:修订「正常关停必须 force flush」为关停不做强制 flush,并补充 flush 任一分片失败即丢弃剩余分片;追加修订记录
- 玩法链路:缓冲与延迟改为崩溃/被杀/正常关停都允许丢一个窗口;限流节补充先做内存预检;写入语义补充失败丢弃口径
- decision-log:顶部新增 2026-10-04 修订条目,并给 2026-10-03 条目标注失效项
- docs/README:ADR 摘要去掉「关停 flush」
|
2026-10-04 11:13:55 +08:00 |
|