diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 35a8356..94e60f9 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -1,8 +1,15 @@ name: Release -# Push a version tag (v0.2.0, v0.3.1, ...) and this job builds the .deb on -# Ubuntu 24.04 and publishes it as a GitHub Release asset with sha256sums - -# that release is what tools/install-deb.sh downloads. +# Push a version tag and this job builds the .deb on Ubuntu 24.04 and publishes +# it as a GitHub Release asset with sha256sums - that release is what +# tools/install-deb.sh downloads. +# +# Tags are the version with a v prefix. Since 10.12.0 the versions are +# date-based MM.DD.N (first release of a day = .0), so v10.12.0, v10.12.1, ...; +# the older v0.x tags were semantic. Whatever the shape, the tag must equal the +# top debian/changelog version (plus the -1 revision) or the mismatch gate below +# refuses to publish - that check is what makes a bumped meson.build and a +# forgotten changelog impossible to ship together. "on": push: diff --git a/CHANGELOG.md b/CHANGELOG.md index 297ad5c..e11e8cf 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,11 +1,17 @@ # Changelog All notable changes to Nextless are documented here. The format follows -[Keep a Changelog](https://keepachangelog.com/en/1.1.0/), the versions follow -[Semantic Versioning](https://semver.org/spec/v2.0.0.html), and this project keeps one line per +[Keep a Changelog](https://keepachangelog.com/en/1.1.0/), and this project keeps one line per user-visible change rather than one per commit. -## [Unreleased] +**Version scheme.** Since `10.12.0` the versions are date-based: `MM.DD.N`, where `N` counts +releases made that day starting at 0 - so `10.12.0` is "October 12th, first cut", and a second +release the same day would be `10.12.1`. The tag is the version with a `v` prefix (`v10.12.0`), +which is what `.github/workflows/release.yml` matches and what must equal `debian/changelog` +(`10.12.0-1`) or the publish step refuses to run. The earlier `0.x` line was semantic versioning; +it stays as history and `dpkg` still orders it correctly (`10.12.0` upgrades `0.3.1`). + +## [10.12.0] - 2026-10-12 ### Added - **The optional DeepFilterNet denoiser is now measured, not assumed** diff --git a/FINDINGS.md b/FINDINGS.md index 66ecdfd..fc3920c 100644 --- a/FINDINGS.md +++ b/FINDINGS.md @@ -836,3 +836,23 @@ Roadmap 上 "Silence should be a no-op, not an `ASR error: empty result`" 的实 #### 未处理风险 - VAD 跑在 EBU R128 归一化**之后**,所以安静房间的底噪会被 +107 dB 的增益抬成"有语音",静音仍然白花一次进程调用(约 1.4s)。正确修法是对归一化前的信号做 VAD,或给增益设上限(例如 30 dB)。这条与降噪顺序纠缠,单独处理。 - `Nextless: no audio captured` / `microphone read failed` 这类状态同样没有清理时机,只是它们本来就该被看见。 + +### 2026-10-12 — 版本号改成日期制(用户定的规则) + +#### 决策 +- 从 **`10.12.0`** 起不再用 semver,改成 **`MM.DD.N`**:当天第一个版本 `N=0`,同一天再发就是 `10.12.1`。tag 是版本号加 `v` 前缀(`v10.12.0`)。已有的 `0.2.0/0.3.0/0.3.1` 保留为历史,不回溯改写。 +- 规则写在三处,因为读的人不同:`CHANGELOG.md` 顶部(发布口径权威)、`release.yml` 头部注释(打 tag 的人先看到)、`debian/changelog` 条目里(打包者)。 + +#### 发一个版本要动的地方(这次的全集) +- `meson.build` 的 `version:` —— addon 版本是从它注入 `adapter/src/nextless-addon.conf.in` 的 `@PROJECT_VERSION@`,所以 **`fcitx5-diagnose` 显示的就是这一个值**。本机升之前显示 0.2.0、仓库已经是 0.3.1,说明那次之后没重装 addon;这就是「版本对不上到底哪来的」的答案。 +- `debian/changelog` 新条目 `fcitx5-nextless (-1)`:星期的英文缩写必须是**真实星期**(dpkg 校验;用 `LC_ALL=C date -d +"%a, %d %b %Y %H:%M:%S %z"`),条目之间恰好一个空行。本地先 `dpkg-parsechangelog -l debian/changelog` 验,别等 CI。 +- `docs/nextless.1` 的 `.TH` 日期与版本两个参数。 +- `CHANGELOG.md`:`## [Unreleased]` 改名成 `## [] - `;release.yml 的发布说明就是按 `## []` 抓这一段,抓不到只发警告不发正文。 +- tag 与 `debian/changelog` 不一致时 mismatch 门会**拒绝发布**,所以顺序固定为:bump PR → 合 main → 打 tag → push tag。 + +#### 风险与判断 +- 排序没问题:dpkg 里 `10.12.0 > 0.3.1`(先比第一段),GitHub `releases/latest` 也跟新版本;`install-deb.sh` 只按 `${tag}-1_amd64.deb` 拼确定性文件名,对版本形状没有假设。 +- 代价要说清楚:日期版本号看不出「补丁还是破坏性变更」。缓解是发布说明必须有实质内容(现在强制从 CHANGELOG 取),以及 CHANGELOG 一行只写一条用户可见变化。 + +#### 验证 +- `dpkg-parsechangelog` 解析新条目通过,时间戳 `Mon, 12 Oct 2026 08:50:00 +0800`;`meson test -C build` 21/21。 diff --git a/README.md b/README.md index 8075a52..96e770c 100644 --- a/README.md +++ b/README.md @@ -358,7 +358,7 @@ only way to get the 1.8 GB back, and `nextless-get-models` will re-download what **Check what is actually loaded**, because a stale install is otherwise invisible: ```bash -fcitx5-diagnose | grep -i nextless # e.g. "Nextless 0.3.1" +fcitx5-diagnose | grep -i nextless # e.g. "Nextless 10.12.0" ``` If that prints an older version than the release you installed, the running addon is the old one - diff --git a/README.zh.md b/README.zh.md index ccb09f9..b34a553 100644 --- a/README.zh.md +++ b/README.zh.md @@ -321,7 +321,7 @@ grep -v '^#' build/meson-logs/install-log.txt | sudo xargs -d '\n' rm -f -- **确认到底加载的是哪个版本**,否则装了旧版你看不出来: ```bash -fcitx5-diagnose | grep -i nextless # 例如 "Nextless 0.3.1" +fcitx5-diagnose | grep -i nextless # 例如 "Nextless 10.12.0" ``` 如果这里显示的数字比你装的 release 旧,说明在跑的还是老 addon:要么安装那步没执行, diff --git a/SECURITY.md b/SECURITY.md index 733d215..0334a33 100644 --- a/SECURITY.md +++ b/SECURITY.md @@ -44,7 +44,9 @@ Use [GitHub Security Advisories](https://github.com/RevolutionLA/nextless/securi — private, and the right channel. Please do not open a public issue. I aim to reply within 7 days and ship a fix or a mitigation within 30. Reportedly affected -versions: `0.3.1` and everything before it, including upstream `vinput`. +versions: every release, `10.12.0` included (and upstream `vinput`) - assume your version is +affected until an advisory says otherwise. Versions before `10.12.0` were numbered semver +(`0.3.1` was the last of them). Not valid on its own: an open port, a missing HTTP header, a dependency advisory without an exploitable path through this add-on, or "the cloud backend sends my audio to a cloud backend". diff --git a/debian/changelog b/debian/changelog index ef9a4e9..7318750 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,26 @@ +fcitx5-nextless (10.12.0-1) unstable; urgency=medium + + * Capture-path behaviour fix (issue #61): with denoise=deepfilter, both legs + of the 16k -> 48k -> 16k resample are now drained (soxr returns its + group-delay tail only when end-of-input is signalled with in == NULL, not + with ilen == 0), and deep-filter's own constant 30 ms is appended back from + the raw input. A denoised utterance therefore keeps its full length instead + of silently losing 69-97 ms off the end, which is where the last syllable + lives. A response more than 160 ms short is treated as a malfunction and + falls back to speexdsp rather than being padded into a half-denoised buffer. + * Benchmark harness: bench_asr --denoise (and BACKENDS="deepfilter" in + run_bench.sh) measures the add-on's own dfDenoise(). docs/benchmarks.md + carries the first real-binary DeepFilterNet row - RTF 0.13-0.16, ~1.0-1.3 s + per 5-10 s utterance, 60 MB - with the machine header and raw JSONL + committed next to it. + * README: the measured DeepFilterNet cost, and a new "Rolling back" section + (apt remove vs purge, downgrading with dpkg -i, the meson install-log + manifest, and fcitx5-diagnose as the which-version-is-loaded check). + * Versioning moves to date-based MM.DD.N (first release of a day is .0); + this is the first under that scheme and supersedes 0.3.1. + + -- RevolutionLA Mon, 12 Oct 2026 08:50:00 +0800 + fcitx5-nextless (0.3.1-1) unstable; urgency=medium * Bug-fix release, no new configuration surface: diff --git a/docs/nextless.1 b/docs/nextless.1 index 2cb323d..3c09147 100644 --- a/docs/nextless.1 +++ b/docs/nextless.1 @@ -1,5 +1,5 @@ .\" Man page for fcitx5-nextless -.TH nextless 1 "2026-10-09" "0.3.1" "fcitx5-nextless" +.TH nextless 1 "2026-10-12" "10.12.0" "fcitx5-nextless" .SH NAME fcitx5\-nextless \- push-to-talk voice input addon for fcitx5 .SH SYNOPSIS diff --git a/meson.build b/meson.build index 168d904..3850c97 100644 --- a/meson.build +++ b/meson.build @@ -1,5 +1,5 @@ project('fcitx5-nextless', 'cpp', - version: '0.3.1', + version: '10.12.0', default_options: ['cpp_std=c++20', 'warning_level=2', 'werror=true']) # warning_level=2 is -Wall -Wextra (plus -Werror); 3 would add -Wpedantic, and that one is not