From 7528c40fe18e82491ae9271f8eb93ada68d7a348 Mon Sep 17 00:00:00 2001 From: argszero Date: Mon, 21 Sep 2026 19:37:04 +0800 Subject: [PATCH] chore(release): v0.7.26 Ships the 10 PRs merged since v0.7.25 (#261-#270). No schema change, no config change, so the deployment-side config.toml needs no edit. One fact, one source / display must equal what it consumes (frontend, 6 places) - #261 read the spendable half of the wallet payload when refreshing your own balance; #262 the transactions payload signature covers the time range, with one reload trigger shared by the four controls; #263 the settings controls are either wired or explicitly inert; #265 the re-list outcome comes from the same entry as its action; #268 the sharing form shows a plan's label, not its config id; #269 the ops card stops reading a key's status count as a health verdict. i18n reachability - #266 every pack key must reach a consumer (the gate), and #270 drops the 23 keys that gate proved unreachable: ZH/EN key count 811 -> 788, sunset list 59 -> 36. Gateway - #267 applies the body limit where axum actually reads it (per-route DefaultBodyLimit, 8 MiB on the three gateway routes; unauthenticated endpoints keep the 2 MiB default). This is the application half of rant 2026-09-18T09:14:18. It also corrects the false v0.7.10 "raised to 70MB" CHANGELOG line, which described installing a layer rather than raising a limit. - Cargo.toml / Cargo.lock: 0.7.25 -> 0.7.26. - CHANGELOG.md: v0.7.26 entry plus the v0.7.10 correction. - ui/index.html cache-bust left as-is: this release touches no UI file; the live values are app.js 20260921-2 / i18n.js 20260921-2. cargo test 302 passed; cargo fmt --check clean; clippy -D warnings clean. --- CHANGELOG.md | 16 +++++++++++++++- Cargo.lock | 2 +- Cargo.toml | 2 +- 3 files changed, 17 insertions(+), 3 deletions(-) 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` 看着能选但全仓无消费者(设计稿那个 `