diff --git a/CHANGELOG.md b/CHANGELOG.md index e37abea..c881a79 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,20 @@ All notable changes are recorded here. Versions follow [SemVer](https://semver.org/). +## v0.7.26 (2026-09-21) + +自 v0.7.25 起累计 10 个 PR(#261–#270)。本版两条主线:**「一个事实只有一个真源 / 显示口径必须等于消费口径」的第 2 批**(前端 6 处),以及 **i18n 的可达性收口**(先上门禁、再删死键)。另含**网关请求体上限真正生效的那一层**(rant `2026-09-18T09:14:18` 的应用侧一半)。**无 schema 变更、无 config 变更**(`config.toml` 无需同步)。 + +- **请求体上限改挂在 axum 真正读取的那一层(#267 2ccbc76)** — v0.7.10 起的那句 `RequestBodyLimitLayer::new(70MB)` 从未生效:tower-http 那层只把**外层流**包成 `Limited`,**不往请求扩展里写任何东西**;而 axum 提取器读的是 `DefaultBodyLimitKind` 扩展,缺失时回落到 `DEFAULT_LIMIT = 2MB` ⇒ 实际上限 = min(70MB, 2MB) = **2MB**(直连实测 2.02MB → `413 Failed to buffer the request body`)。改为三条网关路由(`/v1/chat/completions`、`/anthropic/v1/messages`、`/v1/responses`)各挂 `.layer(DefaultBodyLimit::max(GATEWAY_BODY_LIMIT))`(`GATEWAY_BODY_LIMIT = 8 MiB`),未认证端点保持 2MB 默认;A/B 在真 crate 内跑(还原路由层 ⇒ 正向测试在 `/v1/chat/completions` 上 413、负对照仍绿)。⚠️ 本 PR 落在 `v0.7.25` **之后** ⇒ v0.7.24 / v0.7.25 都不含它;**且公网仍受 prod nginx 的 1MB 内置默认限制**(给反代加 per-domain `client_max_body_size` 是宿主的部署动作,尚未做)。同 PR 更正了下方 v0.7.10 那条被实测证伪的「raised to 70MB」。 +- **侧栏「永久点数」改读可花的那一半(#261 13898d6)** — 运营者给自己充值后,`inlineOpsTopup` 的自刷新分支自己又取一次 `/api/wallet` 且只读 `w.balance`(永久额),而产品把可用余额定义为 `available = balance + gift_balance`、赠送与角色无关(`gift::ensure_daily_gift` 挂每个已认证请求)⇒ 实测「100 + 1、充 100」屏幕显示 **200**、真值 **201**,且永不自愈。改为调用唯一写者 `refreshWallet()`(只把字段换成 `w.available` 是被探针拒掉的竞争修法);门禁 `the_session_balance_has_one_source_and_it_is_the_spendable_half`。 +- **交易载荷签名必须覆盖时间段(#262 03b6be7)** — 缓存签名只含列筛选、不含三个时间段状态值 ⇒ 从第 2 页起改一次时间段**不发新请求**(屏幕停在旧数据)。改为 `txQuerySig()`(**不可**由 `txRangeParams()` 派生 —— 其中的毫秒时间戳会让签名恒变、退化成自喂请求风暴)+新增**唯一**重拉触发器 `reloadTransactions()`,四个控件全走它;门禁 `the_transaction_payload_has_one_signature_and_one_reload_trigger`。 +- **设置页三族控件:要么接线、要么显式惰性(#263 ad72020)** — 昵称可编辑却无人消费(后端无 name 写路径)、`#prefs-model` 看着能选但全仓无消费者(设计稿那个 `