diff --git a/CHANGELOG.md b/CHANGELOG.md index a72dc5e..a0c37ab 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,15 @@ All notable changes are recorded here. Versions follow [SemVer](https://semver.org/). +## v0.7.32 (2026-10-15) + +自 v0.7.31 起累计 2 个提交(#406–#407)。**无 schema 变更(仍 16)**;**行为变更一处**:明细保留窗口的**默认值**从 30 天改成 **10 分钟**(老配置里显式写过的窗口不受影响 —— `retain_days` 仍被认且优先)。本版把宿主 2026-10-15 的裁定落地:**真实的明细只留 10 分钟,交易页的「明细」由分钟级汇总承担**。 + +- **交易页列表改从读模型取数(#406)** — 此前 `GET /api/transactions` 的行与 `total` 都读原始明细表,于是「明细只留一小段」等于「交易页只答得出那一小段」。而列表真正渲染的 11 个字段**汇总维度全都覆盖**(`counterpart` 在页面零消费点、汇总行的主键也从不被读回)⇒ 列表与 `total` 改读 `tx_facts`(分钟汇总行 ∪ 未折叠尾巴),更早的历史以**分钟汇总行**照样列得出来。每行带 `row_count`(它代表多少条真实明细;未折叠明细恒 1),页面在类型列后渲染 `×N` 并由悬停说明(新键 `tx.row.bucket`)交代 —— **不把汇总行当作单条真实明细**。`total` 数是**行数**(`COUNT(*)`,与列表同源、页码数不会对不上),`summary.entries` 仍是**条数**(`SUM(row_count)`,折叠对它不可见):两者刻意不同,差额就是折叠本身。两条臂的交界**不沉默**:折叠按 `id` 分批 ⇒ 某一分钟可能一半折进桶、一半还在尾巴,于是同一分钟在列表里出现「一行汇总 + 若干行明细」—— 两截互斥、`SUM(row_count)` 仍等于那一分钟的真实条数(`tx_facts.rs::a_minute_folded_in_half_still_adds_up` 钉住)。默认排序随之从 `t.id DESC` 改成 `t.time DESC, t.id DESC`(两条臂的 `id` 各自从 1 起,按 `id` 排会拿汇总表的主键当时间用),`fmtPrecise()` 也不再给只有分钟的源串补 `:00`(那秒是伪造的精度)。门禁 `tx_facts_gate` 随之改写:R2 要求**每一处读视图都声明粒度**,并新增 R4「列表真的在视图上」—— 把列表搬回原始表只翻 R4 一条(变异腿钉住)。 +- **明细保留窗口默认 10 分钟(#407)** — 窗口不再决定交易页能答多深(#406 之后那段历史由汇总行承载),于是它可以按真实需要设定,而宿主的裁定是「根本没有查询真实明细的需求」:`[rollup] retain_minutes` 默认由 `43200`(30 天)改为 `10`,示例配置同步。删除本身一条没变 —— 仍然只删**已折叠且已归档**的行,所以窗口外的那段既不丢信息也不丢原件(汇总行答得出、JSONL 里躺着原件)。交易页那句说明不再把边界换算成「天」(分钟级窗口取整成天会变成「最近 0 天」这种错话):改成直接说**边界那一刻**(单位无关,前端也不必再算一遍窗口)。门禁 `tx_retention_gate` 的 R1 判据随前提改写:①窗口必须能用**分钟**表达(退回按「天」写即红 —— 天粒度写不出「10 分钟」,一天以下只剩 `0`,而 `0` 是「完全不留明细」这条**另一条**规则);②窗口比列表最深的预设浅时,「欠」只能由**列表不再从明细表取数**来还 —— 不是把规则删掉:谁把列表搬回明细表,这条立刻重新生效。两条都做过真语料变异(配置退回按天 ⇒ 只 R1 红;列表搬回明细表 ⇒ 只 R1 红)。 + +`cargo test` 559 → **562**(新增 3 条:折叠交界、门禁 R4 的变异腿、门禁的读法)。UI 资产令牌随各前端 PR 自行推进,本版结束在 `app.js` `?v=20261015-3`、`i18n.js` `?v=20261015-2`、`style.css` `?v=20261012-1`、`api.js` `?v=20261012-1`、`data.js` `?v=20260914-11`。 + ## v0.7.31 (2026-10-15) 自 v0.7.30 起累计 48 个提交(#357–#404)。**无 schema 变更(仍 16)**;**无破坏性改动** —— 唯一的配置改动(#404)向后兼容,旧拼写仍被认且优先。本版三条主线:**交易明细保留窗口的单位与披露**、**前端文案与 i18n 包的对齐**,以及**一大批「文档 / 注释陈述了一个今天已不成立的事实」的校准**。 diff --git a/Cargo.lock b/Cargo.lock index 4dd20fb..5228803 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -51,7 +51,7 @@ dependencies = [ [[package]] name = "aitokenpool" -version = "0.7.31" +version = "0.7.32" dependencies = [ "aes-gcm", "anyhow", diff --git a/Cargo.toml b/Cargo.toml index 1d09e32..e164507 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "aitokenpool" -version = "0.7.31" +version = "0.7.32" edition = "2021" description = "AI Token 共享池 — 企业 key 池 + 公共共享市场" license = "MIT" diff --git a/Dockerfile b/Dockerfile index 177463a..39eeed9 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,9 +1,9 @@ -# AITokenPool — multi-stage release image (v0.7.31) +# AITokenPool — multi-stage release image (v0.7.32) # -# Build: docker build -t aitokenpool:0.7.31 . +# Build: docker build -t aitokenpool:0.7.32 . # Run: docker run -p 8080:8080 -v "$PWD/atp-data:/data" \ # -e ATP_MASTER_KEY="$(openssl rand -hex 32)" \ -# aitokenpool:0.7.31 +# aitokenpool:0.7.32 # # Notes: # - unified data dir (rant 2026-08-19T20:53:23): ATP_DATA_DIR=/data holds diff --git a/docker-compose.yml b/docker-compose.yml index 5fb60b2..f2f4dd2 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,4 +1,4 @@ -# AITokenPool — Docker Compose 一键部署(v0.7.31) +# AITokenPool — Docker Compose 一键部署(v0.7.32) # # 快速开始: # export ATP_MASTER_KEY=$(openssl rand -hex 32) # 必填,见下方说明 @@ -16,7 +16,7 @@ services: aitokenpool: build: . - image: aitokenpool:0.7.31 + image: aitokenpool:0.7.32 ports: - "8080:8080" volumes: