+
diff --git a/README.md b/README.md
index b5fd44f..ea5b442 100644
--- a/README.md
+++ b/README.md
@@ -28,6 +28,7 @@
+
From cfd3096083b0e2fc9373b907980ef1ba7dd744ba Mon Sep 17 00:00:00 2001
From: notth3dev <160973721+noth3dev@users.noreply.github.com>
Date: Fri, 23 Oct 2026 22:27:03 +0900
Subject: [PATCH 3/4] chore: prepare v0.10.10 release
Publish the Android keyboard redesign and persistent appearance controls with aligned package versions and bilingual release notes.
Signed-off-by: notth3dev <160973721+noth3dev@users.noreply.github.com>
---
CHANGELOG.en.md | 5 ++++-
CHANGELOG.md | 5 ++++-
Cargo.lock | 14 +++++++-------
README.en.md | 2 +-
README.md | 2 +-
crates/cli/Cargo.toml | 2 +-
crates/config/Cargo.toml | 2 +-
crates/core/Cargo.toml | 2 +-
crates/packgen/Cargo.toml | 2 +-
lab/Cargo.lock | 4 ++--
platforms/android/native/Cargo.toml | 2 +-
platforms/ffi/Cargo.toml | 2 +-
platforms/windows/Cargo.toml | 2 +-
13 files changed, 26 insertions(+), 20 deletions(-)
diff --git a/CHANGELOG.en.md b/CHANGELOG.en.md
index 9c4c6cc..1698cb9 100644
--- a/CHANGELOG.en.md
+++ b/CHANGELOG.en.md
@@ -9,6 +9,8 @@ Korean version: [CHANGELOG.md](CHANGELOG.md).
## [Unreleased]
+## [0.10.10] - 2026-10-23
+
### Changed
- Android now keeps a fixed toolbar and a separate reading strip, with direct paste, clipboard and emoji access. Spacebar dragging moves the cursor without typing spaces. Neutral light/dark colors and clearer function keys simplify the keyboard. An in-keyboard settings panel saves system/light/dark themes, three key heights, haptics and key previews; changing theme or height preserves the current composition.
@@ -444,7 +446,8 @@ This version is **0.8.0**, not 0.7.1, because the pack file format changed. Pack
- First release: English/Korean auto-decision input method for Windows (TSF), Tab completion, per-app rules, KakaoTalk compatibility.
-[Unreleased]: https://github.com/iamallyouneed/tacit/compare/v0.10.9...HEAD
+[Unreleased]: https://github.com/iamallyouneed/tacit/compare/v0.10.10...HEAD
+[0.10.10]: https://github.com/iamallyouneed/tacit/compare/v0.10.9...v0.10.10
[0.10.9]: https://github.com/iamallyouneed/tacit/compare/v0.10.8...v0.10.9
[0.10.8]: https://github.com/iamallyouneed/tacit/compare/v0.10.7...v0.10.8
[0.10.7]: https://github.com/iamallyouneed/tacit/compare/v0.10.6...v0.10.7
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 614c1d2..7bc1ca3 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -9,6 +9,8 @@ GitHub 릴리스 노트가 되고 대시보드의 업데이트 탭에도 그대
## [Unreleased]
+## [0.10.10] - 2026-10-23
+
### 변경
- Android 키보드의 도구바와 후보 줄을 분리하고 붙여넣기·클립보드·이모지를 바로 열 수 있게 했습니다. 스페이스를 드래그하면 공백 입력 없이 커서를 옮깁니다. 밝은·어두운 모두 무채색으로 정리하고 기능 키 구분과 키 크기를 다듬었습니다. 키보드 안에서 시스템·라이트·다크 테마, 키 높이 3단계, 진동·키 미리보기를 설정하고 저장할 수 있으며, 테마와 높이를 바꿔도 작성 중인 조합을 유지합니다.
@@ -444,7 +446,8 @@ GitHub 릴리스 노트가 되고 대시보드의 업데이트 탭에도 그대
- 첫 공개: Windows용 영어·한국어 자동 판별 입력기(TSF), Tab 자동완성, 앱별 규칙, 카카오톡 호환.
-[Unreleased]: https://github.com/iamallyouneed/tacit/compare/v0.10.9...HEAD
+[Unreleased]: https://github.com/iamallyouneed/tacit/compare/v0.10.10...HEAD
+[0.10.10]: https://github.com/iamallyouneed/tacit/compare/v0.10.9...v0.10.10
[0.10.9]: https://github.com/iamallyouneed/tacit/compare/v0.10.8...v0.10.9
[0.10.8]: https://github.com/iamallyouneed/tacit/compare/v0.10.7...v0.10.8
[0.10.7]: https://github.com/iamallyouneed/tacit/compare/v0.10.6...v0.10.7
diff --git a/Cargo.lock b/Cargo.lock
index 0c1cf88..ab1f231 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -525,7 +525,7 @@ dependencies = [
[[package]]
name = "tacit-android"
-version = "0.10.9"
+version = "0.10.10"
dependencies = [
"jni",
"tacit-core",
@@ -533,14 +533,14 @@ dependencies = [
[[package]]
name = "tacit-cli"
-version = "0.10.9"
+version = "0.10.10"
dependencies = [
"tacit-core",
]
[[package]]
name = "tacit-config"
-version = "0.10.9"
+version = "0.10.10"
dependencies = [
"getrandom 0.3.4",
"serde",
@@ -556,7 +556,7 @@ dependencies = [
[[package]]
name = "tacit-core"
-version = "0.10.9"
+version = "0.10.10"
dependencies = [
"memmap2",
"serde",
@@ -567,14 +567,14 @@ dependencies = [
[[package]]
name = "tacit-ffi"
-version = "0.10.9"
+version = "0.10.10"
dependencies = [
"tacit-core",
]
[[package]]
name = "tacit-packgen"
-version = "0.10.9"
+version = "0.10.10"
dependencies = [
"serde_json",
"sha2",
@@ -583,7 +583,7 @@ dependencies = [
[[package]]
name = "tacit-tip"
-version = "0.10.9"
+version = "0.10.10"
dependencies = [
"tacit-core",
"windows",
diff --git a/README.en.md b/README.en.md
index 98a087f..5644e93 100644
--- a/README.en.md
+++ b/README.en.md
@@ -111,7 +111,7 @@ Re-running the command on an existing install is fine (enabled languages are kep
```powershell
$i = [scriptblock]::Create((irm https://github.com/iamallyouneed/tacit/releases/latest/download/install.ps1))
& $i -Uninstall # remove (settings and language packs are kept)
-& $i -Version v0.10.9 # pinned release
+& $i -Version v0.10.10 # pinned release
& $i -Japanese # also enable Japanese (adds to -Languages if given)
```
diff --git a/README.md b/README.md
index ea5b442..88adeaf 100644
--- a/README.md
+++ b/README.md
@@ -113,7 +113,7 @@ irm https://github.com/iamallyouneed/tacit/releases/latest/download/install.ps1
```powershell
$i = [scriptblock]::Create((irm https://github.com/iamallyouneed/tacit/releases/latest/download/install.ps1))
& $i -Uninstall # 제거 (설정과 언어 팩은 남는다)
-& $i -Version v0.10.9 # 특정 버전
+& $i -Version v0.10.10 # 특정 버전
& $i -Japanese # 일본어도 켠다 (-Languages 와 같이 쓰면 거기에 더한다)
```
diff --git a/crates/cli/Cargo.toml b/crates/cli/Cargo.toml
index 3741a21..d989df1 100644
--- a/crates/cli/Cargo.toml
+++ b/crates/cli/Cargo.toml
@@ -1,6 +1,6 @@
[package]
name = "tacit-cli"
-version = "0.10.9"
+version = "0.10.10"
edition = "2021"
license = "AGPL-3.0-only"
repository = "https://github.com/iamallyouneed/tacit"
diff --git a/crates/config/Cargo.toml b/crates/config/Cargo.toml
index 3c0a260..bdb7258 100644
--- a/crates/config/Cargo.toml
+++ b/crates/config/Cargo.toml
@@ -1,6 +1,6 @@
[package]
name = "tacit-config"
-version = "0.10.9"
+version = "0.10.10"
edition = "2021"
license = "AGPL-3.0-only"
repository = "https://github.com/iamallyouneed/tacit"
diff --git a/crates/core/Cargo.toml b/crates/core/Cargo.toml
index e20f8bf..0131953 100644
--- a/crates/core/Cargo.toml
+++ b/crates/core/Cargo.toml
@@ -1,6 +1,6 @@
[package]
name = "tacit-core"
-version = "0.10.9"
+version = "0.10.10"
edition = "2021"
rust-version = "1.89"
license = "AGPL-3.0-only"
diff --git a/crates/packgen/Cargo.toml b/crates/packgen/Cargo.toml
index d16723a..e6ec24e 100644
--- a/crates/packgen/Cargo.toml
+++ b/crates/packgen/Cargo.toml
@@ -1,6 +1,6 @@
[package]
name = "tacit-packgen"
-version = "0.10.9"
+version = "0.10.10"
edition = "2021"
license = "AGPL-3.0-only"
repository = "https://github.com/iamallyouneed/tacit"
diff --git a/lab/Cargo.lock b/lab/Cargo.lock
index 0df7e2c..392cdd4 100644
--- a/lab/Cargo.lock
+++ b/lab/Cargo.lock
@@ -280,7 +280,7 @@ dependencies = [
[[package]]
name = "tacit-core"
-version = "0.10.9"
+version = "0.10.10"
dependencies = [
"memmap2",
"serde",
@@ -297,7 +297,7 @@ dependencies = [
[[package]]
name = "tacit-packgen"
-version = "0.10.9"
+version = "0.10.10"
dependencies = [
"serde_json",
"sha2",
diff --git a/platforms/android/native/Cargo.toml b/platforms/android/native/Cargo.toml
index b2485f3..5a85869 100644
--- a/platforms/android/native/Cargo.toml
+++ b/platforms/android/native/Cargo.toml
@@ -1,6 +1,6 @@
[package]
name = "tacit-android"
-version = "0.10.9"
+version = "0.10.10"
edition = "2021"
license = "AGPL-3.0-only"
repository = "https://github.com/iamallyouneed/tacit"
diff --git a/platforms/ffi/Cargo.toml b/platforms/ffi/Cargo.toml
index f727261..1c1a7c4 100644
--- a/platforms/ffi/Cargo.toml
+++ b/platforms/ffi/Cargo.toml
@@ -1,6 +1,6 @@
[package]
name = "tacit-ffi"
-version = "0.10.9"
+version = "0.10.10"
edition = "2021"
license = "AGPL-3.0-only"
repository = "https://github.com/iamallyouneed/tacit"
diff --git a/platforms/windows/Cargo.toml b/platforms/windows/Cargo.toml
index cd73e2d..f3b493d 100644
--- a/platforms/windows/Cargo.toml
+++ b/platforms/windows/Cargo.toml
@@ -1,6 +1,6 @@
[package]
name = "tacit-tip"
-version = "0.10.9"
+version = "0.10.10"
edition = "2021"
license = "AGPL-3.0-only"
repository = "https://github.com/iamallyouneed/tacit"
From bc3b199c41ab3904ca26b1f2de1c38aafea86ff9 Mon Sep 17 00:00:00 2001
From: notth3dev <160973721+noth3dev@users.noreply.github.com>
Date: Fri, 23 Oct 2026 22:40:43 +0900
Subject: [PATCH 4/4] docs: record v0.10.10 release measurements
Record five-run packaged measurements separately for enko and enkoja, preserving previous release sections and avoiding claims from unmatched historical latency samples.
Signed-off-by: notth3dev <160973721+noth3dev@users.noreply.github.com>
---
docs/report/performance-enkoja.md | 163 +++++++++++++++++++++++++-----
docs/report/performance.md | 139 +++++++++++++++++++++----
2 files changed, 252 insertions(+), 50 deletions(-)
diff --git a/docs/report/performance-enkoja.md b/docs/report/performance-enkoja.md
index 7ecf34e..bec3eb4 100644
--- a/docs/report/performance-enkoja.md
+++ b/docs/report/performance-enkoja.md
@@ -24,7 +24,7 @@ cargo run --release --manifest-path lab/Cargo.toml -- --profile enkoja --save
직전 버전과 비교합니다. 기준선은 `lab/baseline-enkoja.tsv`이며, 영·한 기준선을 대신
사용하지 않습니다. 아래 수치는 동일 프로필 5회 실행의 중앙값입니다.
-## 한눈에: 0.10.3 → 0.10.9
+## 한눈에: 0.10.9 → 0.10.10
▲ 좋아짐 · ▼ 나빠짐 · = 동점/잡음(정확도 0.05%p, 지연 25% 안은 잡음으로 봄). 정확도는 높을수록, 크기·지연·메모리는 낮을수록 좋음.
@@ -34,7 +34,7 @@ cargo run --release --manifest-path lab/Cargo.toml -- --profile enkoja --save
막대 범위: 영·한 80~100%, 일본어(ja.*) 0~100%.
-| 지표 | 0.10.3 | 0.10.9 | 변화 |
+| 지표 | 0.10.9 | 0.10.10 | 변화 |
| --- | ---: | ---: | ---: |
| `acc.ALL` | 99.52 `████████████` | 99.52 `████████████` | +0.00 = |
| `acc.en.freq/none` | 98.85 `███████████░` | 98.85 `███████████░` | +0.00 = |
@@ -63,7 +63,7 @@ cargo run --release --manifest-path lab/Cargo.toml -- --profile enkoja --save
### 유형별 시나리오 문장 정답률 (%, 높을수록 좋음, 막대 80~100 구간)
-| 유형 | 0.10.3 | 0.10.9 | 변화 |
+| 유형 | 0.10.9 | 0.10.10 | 변화 |
| --- | ---: | ---: | ---: |
| chat | 96.51 `██████████░░` | 96.51 `██████████░░` | +0.00 = |
| dev | 98.98 `███████████░` | 98.98 `███████████░` | +0.00 = |
@@ -72,43 +72,150 @@ cargo run --release --manifest-path lab/Cargo.toml -- --profile enkoja --save
### 크기 비교 (KiB, 낮을수록 좋음, 막대 표 안 최대 기준)
-| 항목 | 0.10.3 | 0.10.9 | 변화 |
+| 항목 | 0.10.9 | 0.10.10 | 변화 |
| --- | ---: | ---: | ---: |
-| `tacit_tip.dll` (x64) | 962 `█░░░░░░░░░░░` | 968 `█░░░░░░░░░░░` | +6 (+0.6%) ▼ |
-| `tacit_tip.dll` (x86) | 773 `█░░░░░░░░░░░` | 778 `█░░░░░░░░░░░` | +5 (+0.6%) ▼ |
-| `tacit-config.exe` | 3285 `███░░░░░░░░░` | 3339 `███░░░░░░░░░` | +54 (+1.6%) ▼ |
-| `tacit-windows-ja.zip` | 2389 `██░░░░░░░░░░` | 2418 `██░░░░░░░░░░` | +29 (+1.2%) ▼ |
-| `tacit-pack-en-0.10.9.zip` | 446 `█░░░░░░░░░░░` | 446 `█░░░░░░░░░░░` | 0 = |
-| `tacit-pack-ko-0.10.9.zip` | 450 `█░░░░░░░░░░░` | 451 `█░░░░░░░░░░░` | +1 (+0.2%) ▼ |
-| `tacit-pack-ja-0.10.9.zip` | 14628 `████████████` | 14628 `████████████` | 0 = |
+| `tacit_tip.dll` (x64) | 968 `█░░░░░░░░░░░` | 968 `█░░░░░░░░░░░` | 0 = |
+| `tacit_tip.dll` (x86) | 778 `█░░░░░░░░░░░` | 778 `█░░░░░░░░░░░` | 0 = |
+| `tacit-config.exe` | 3339 `███░░░░░░░░░` | 3339 `███░░░░░░░░░` | 0 = |
+| `tacit-windows-ja.zip` | 2418 `██░░░░░░░░░░` | 2418 `██░░░░░░░░░░` | 0 = |
+| `tacit-pack-en-0.10.10.zip` | 446 `█░░░░░░░░░░░` | 446 `█░░░░░░░░░░░` | 0 = |
+| `tacit-pack-ko-0.10.10.zip` | 451 `█░░░░░░░░░░░` | 450 `█░░░░░░░░░░░` | -1 (-0.2%) ▲ |
+| `tacit-pack-ja-0.10.10.zip` | 14628 `████████████` | 14628 `████████████` | 0 = |
### 지연 비교 (µs 중앙값, 낮을수록 좋음, 막대 표 안 최대 기준)
-| 항목 | 0.10.3 | 0.10.9 | 변화 |
+| 항목 | 0.10.9 | 0.10.10 | 변화 |
| --- | ---: | ---: | ---: |
-| `commit.avg_us` | 46.94 `█░░░░░░░░░░░` | 78.49 `█░░░░░░░░░░░` | +31.55 (+67.2%) ▼ |
-| `commit.p50_us` | 42.50 `█░░░░░░░░░░░` | 68.40 `█░░░░░░░░░░░` | +25.90 (+60.9%) ▼ |
-| `commit.p95_us` | 99.90 `█░░░░░░░░░░░` | 172.30 `██░░░░░░░░░░` | +72.40 (+72.5%) ▼ |
-| `commit.p99_us` | 143.50 `██░░░░░░░░░░` | 257.60 `████░░░░░░░░` | +114.10 (+79.5%) ▼ |
-| `keystroke.avg_us` | 22.07 `█░░░░░░░░░░░` | 37.14 `█░░░░░░░░░░░` | +15.07 (+68.3%) ▼ |
-| `keystroke.p50_us` | 14.00 `█░░░░░░░░░░░` | 22.70 `█░░░░░░░░░░░` | +8.70 (+62.1%) ▼ |
-| `keystroke.p95_us` | 64.30 `█░░░░░░░░░░░` | 111.00 `██░░░░░░░░░░` | +46.70 (+72.6%) ▼ |
-| `keystroke.p99_us` | 101.30 `█░░░░░░░░░░░` | 181.80 `███░░░░░░░░░` | +80.50 (+79.5%) ▼ |
-| `ja.convert.avg_us` | 191.27 `███░░░░░░░░░` | 360.45 `█████░░░░░░░` | +169.18 (+88.5%) ▼ |
-| `ja.convert.p50_us` | 173.10 `██░░░░░░░░░░` | 317.00 `████░░░░░░░░` | +143.90 (+83.1%) ▼ |
-| `ja.convert.p95_us` | 320.90 `████░░░░░░░░` | 592.00 `████████░░░░` | +271.10 (+84.5%) ▼ |
-| `ja.convert.p99_us` | 386.00 `█████░░░░░░░` | 860.00 `████████████` | +474.00 (+122.8%) ▼ |
+| `commit.avg_us` | 78.49 `█░░░░░░░░░░░` | 75.77 `█░░░░░░░░░░░` | -2.72 (-3.5%) = |
+| `commit.p50_us` | 68.40 `█░░░░░░░░░░░` | 63.20 `█░░░░░░░░░░░` | -5.20 (-7.6%) = |
+| `commit.p95_us` | 172.30 `██░░░░░░░░░░` | 170.40 `██░░░░░░░░░░` | -1.90 (-1.1%) = |
+| `commit.p99_us` | 257.60 `████░░░░░░░░` | 238.70 `███░░░░░░░░░` | -18.90 (-7.3%) = |
+| `keystroke.avg_us` | 37.14 `█░░░░░░░░░░░` | 34.50 `█░░░░░░░░░░░` | -2.64 (-7.1%) = |
+| `keystroke.p50_us` | 22.70 `█░░░░░░░░░░░` | 20.80 `█░░░░░░░░░░░` | -1.90 (-8.4%) = |
+| `keystroke.p95_us` | 111.00 `██░░░░░░░░░░` | 104.00 `█░░░░░░░░░░░` | -7.00 (-6.3%) = |
+| `keystroke.p99_us` | 181.80 `███░░░░░░░░░` | 164.00 `██░░░░░░░░░░` | -17.80 (-9.8%) = |
+| `ja.convert.avg_us` | 360.45 `█████░░░░░░░` | 339.06 `█████░░░░░░░` | -21.39 (-5.9%) = |
+| `ja.convert.p50_us` | 317.00 `████░░░░░░░░` | 311.00 `████░░░░░░░░` | -6.00 (-1.9%) = |
+| `ja.convert.p95_us` | 592.00 `████████░░░░` | 571.60 `████████░░░░` | -20.40 (-3.4%) = |
+| `ja.convert.p99_us` | 860.00 `████████████` | 666.60 `█████████░░░` | -193.40 (-22.5%) = |
### 시작·메모리 비교 (낮을수록 좋음, 막대 행별 비교)
-| 항목 | 0.10.3 | 0.10.9 | 변화 |
+| 항목 | 0.10.9 | 0.10.10 | 변화 |
| --- | ---: | ---: | ---: |
-| `load.ms` | 18.74 `███████░░░░░` | 30.86 `████████████` | +12.12 (+64.7%) ▼ |
+| `load.ms` | 30.86 `████████████` | 19.83 `████████░░░░` | -11.03 (-35.7%) ▲ |
| `heap.loaded_kb` | 2468.14 `████████████` | 2468.14 `████████████` | +0.00 (+0.0%) = |
-| `heap.peak_kb` | 14047.56 `████████████` | 14047.65 `████████████` | +0.09 (+0.0%) = |
-| `ja.load.ms` | 2.91 `██████░░░░░░` | 5.60 `████████████` | +2.69 (+92.4%) ▼ |
+| `heap.peak_kb` | 14047.65 `████████████` | 14047.65 `████████████` | +0.00 (+0.0%) = |
+| `ja.load.ms` | 5.60 `████████████` | 4.23 `█████████░░░` | -1.37 (-24.5%) = |
| `ja.heap.loaded_kb` | 2998.60 `████████████` | 2998.60 `████████████` | +0.00 (+0.0%) = |
+## 0.10.10
+
+commit cfd3096, 2026-10-23, rustc 1.93.1 (01f6ddf75 2026-02-11)
+
+프로필: `enkoja` (영·한·일), lab 0.2.12.
+
+공통 정확도·시나리오는 해당 언어가 켜진 판별기로 측정합니다. acc.ALL은 영·한 공통 세트이며 일본어 정답률과 합산하지 않습니다.
+
+load.ms·heap.*는 판별기 시작/단어 평가 기준입니다. enkoja의 ja.load.ms·ja.heap.loaded_kb는 별도 가나→한자 변환기 초기화/힙 증가입니다. 영·한판(tacit-windows.zip)과 일본어 포함판(tacit-windows-ja.zip)은 프로그램과 설치 zip이 다르고, 팩 목록도 활성 언어에 따라 다릅니다.
+
+### 크기 (KiB)
+
+| 항목 | KiB |
+| --- | ---: |
+| `tacit_tip.dll` (x64) | 968 |
+| `tacit_tip.dll` (x86) | 778 |
+| `tacit-config.exe` | 3339 |
+| `tacit-windows-ja.zip` | 2418 |
+| `tacit-pack-en-0.10.10.zip` | 446 |
+| `tacit-pack-ko-0.10.10.zip` | 450 |
+| `tacit-pack-ja-0.10.10.zip` | 14628 |
+
+### 정확도 (%)
+
+| 세트 | 정확도 |
+| --- | ---: |
+| `acc.ALL` | 99.52 |
+| `acc.en.freq/none` | 98.85 |
+| `acc.en.freq/after-ko` | 98.80 |
+| `acc.ko.words/none` | 100.00 |
+| `acc.ko.vocab/none` | 100.00 |
+| `big.ko.sent.sentence` | 99.03 |
+| `big.ko.sent.token` | 99.81 |
+| `big.ko.phrase.sentence` | 99.37 |
+| `big.ko.long.sentence` | 97.70 |
+| `big.en.sent.sentence` | 99.90 |
+| `big.cs.particle.sentence` | 99.06 |
+| `big.cs.particle.token` | 99.85 |
+| `big.cs_heldout.particle.sentence` | 98.95 |
+| `big.cs.bare.sentence` | 96.94 |
+| `big.cs.number.sentence` | 99.05 |
+| `big.ko.title.none` | 99.87 |
+| `big.ko.title.after-en` | 99.37 |
+| `big.learn.other_forms_before` | 100.00 |
+| `big.learn.other_forms_after` | 100.00 |
+| `ja.convert.ALL.top1` | 85.94 |
+| `ja.convert.ALL.top5` | 96.88 |
+| `ja.detect.none.top1` | 100.00 |
+| `ja.detect.after-ja.top1` | 100.00 |
+| `ja.guard.english.top1` | 100.00 |
+
+### 유형별 시나리오 (문장 정답률 %, token은 단어 단위, chain은 4문장 이어 입력)
+
+| 유형 | 문장 | token | chain.token | µs/글자 |
+| --- | ---: | ---: | ---: | ---: |
+| chat | 96.51 | 98.78 | 99.17 | 7.08 |
+| dev | 98.98 | 99.69 | 99.37 | 7.24 |
+| writing | 98.78 | 99.77 | 99.75 | 8.34 |
+| 전체 | 98.12 | 99.50 | | |
+
+| 시나리오 | 문장 정답률 |
+| --- | ---: |
+| `chat.brand` | 100.00 |
+| `chat.casual` | 100.00 |
+| `chat.english` | 100.00 |
+| `chat.loan` | 92.31 |
+| `chat.number` | 100.00 |
+| `chat.punct` | 100.00 |
+| `chat.slang` | 88.24 |
+| `dev.commit` | 100.00 |
+| `dev.error` | 100.00 |
+| `dev.identifier` | 100.00 |
+| `dev.issue` | 100.00 |
+| `dev.review` | 100.00 |
+| `dev.terminal` | 96.00 |
+| `dev.tool` | 100.00 |
+| `writing.academic` | 92.86 |
+| `writing.email` | 100.00 |
+| `writing.english` | 100.00 |
+| `writing.essay` | 100.00 |
+| `writing.formal` | 100.00 |
+| `writing.long` | 100.00 |
+| `writing.numbers` | 100.00 |
+| `writing.quote` | 100.00 |
+
+### 속도·메모리 (중앙값, 5회)
+
+| 항목 | 값 |
+| --- | ---: |
+| `commit.avg_us` | 75.77 |
+| `commit.p50_us` | 63.20 |
+| `commit.p95_us` | 170.40 |
+| `commit.p99_us` | 238.70 |
+| `keystroke.avg_us` | 34.50 |
+| `keystroke.p50_us` | 20.80 |
+| `keystroke.p95_us` | 104.00 |
+| `keystroke.p99_us` | 164.00 |
+| `ja.convert.avg_us` | 339.06 |
+| `ja.convert.p50_us` | 311.00 |
+| `ja.convert.p95_us` | 571.60 |
+| `ja.convert.p99_us` | 666.60 |
+| `load.ms` | 19.83 |
+| `heap.loaded_kb` | 2468.14 |
+| `heap.peak_kb` | 14047.65 |
+| `ja.load.ms` | 4.23 |
+| `ja.heap.loaded_kb` | 2998.60 |
+
## 0.10.9
commit b58cc6d, 2026-10-23, rustc 1.93.1 (01f6ddf75 2026-02-11)
diff --git a/docs/report/performance.md b/docs/report/performance.md
index 04ffbb8..430823e 100644
--- a/docs/report/performance.md
+++ b/docs/report/performance.md
@@ -86,7 +86,7 @@ sh lab/report.sh --profile enkoja > section-enkoja.md # 별도 영·한·일 문
- 기준선 저장도 프로필별입니다: `cargo run --release --manifest-path lab/Cargo.toml -- --profile enko --save`는 `lab/baseline-enko.tsv`, `--profile enkoja --save`는 `lab/baseline-enkoja.tsv`만 갱신합니다. 기본값은 `enko`입니다.
- **이전 버전과 비교할 때는 같은 lab으로 잽니다.** 세트와 데이터가 달라지면 같은 코드도 수치가 달라집니다. 새 worktree 둘을 만들어 한쪽에만 `git restore --source=<이전 태그> --worktree --staged crates/core`를 하고(코어에 없는 API를 쓰는 `lab/src/tune.rs` 같은 파일은 그 worktree에서만 비활성으로 바꿉니다), 각각 `lab/data`를 **복사**해 두고 5회씩 돌려 중앙값을 냅니다. `lab/data`를 junction이나 링크로 연결한 worktree를 `git worktree remove --force` 하면 링크 너머의 실제 데이터까지 지워집니다.
-## 한눈에: 0.10.3 → 0.10.9
+## 한눈에: 0.10.9 → 0.10.10
▲ 좋아짐 · ▼ 나빠짐 · = 동점/잡음(정확도 0.05%p, 지연 25% 안은 잡음으로 봄). 정확도는 높을수록, 크기·지연·메모리는 낮을수록 좋음.
@@ -96,7 +96,7 @@ sh lab/report.sh --profile enkoja > section-enkoja.md # 별도 영·한·일 문
막대 범위: 영·한 80~100%, 일본어(ja.*) 0~100%.
-| 지표 | 0.10.3 | 0.10.9 | 변화 |
+| 지표 | 0.10.9 | 0.10.10 | 변화 |
| --- | ---: | ---: | ---: |
| `acc.ALL` | 99.69 `████████████` | 99.69 `████████████` | +0.00 = |
| `acc.en.freq/none` | 99.50 `████████████` | 99.50 `████████████` | +0.00 = |
@@ -120,7 +120,7 @@ sh lab/report.sh --profile enkoja > section-enkoja.md # 별도 영·한·일 문
### 유형별 시나리오 문장 정답률 (%, 높을수록 좋음, 막대 80~100 구간)
-| 유형 | 0.10.3 | 0.10.9 | 변화 |
+| 유형 | 0.10.9 | 0.10.10 | 변화 |
| --- | ---: | ---: | ---: |
| chat | 96.51 `██████████░░` | 96.51 `██████████░░` | +0.00 = |
| dev | 98.98 `███████████░` | 98.98 `███████████░` | +0.00 = |
@@ -129,35 +129,130 @@ sh lab/report.sh --profile enkoja > section-enkoja.md # 별도 영·한·일 문
### 크기 비교 (KiB, 낮을수록 좋음, 막대 표 안 최대 기준)
-| 항목 | 0.10.3 | 0.10.9 | 변화 |
+| 항목 | 0.10.9 | 0.10.10 | 변화 |
| --- | ---: | ---: | ---: |
-| `tacit_tip.dll` (x64) | 747 `███░░░░░░░░░` | 756 `███░░░░░░░░░` | +9 (+1.2%) ▼ |
-| `tacit_tip.dll` (x86) | 613 `██░░░░░░░░░░` | 620 `██░░░░░░░░░░` | +7 (+1.1%) ▼ |
-| `tacit-config.exe` | 3100 `████████████` | 3158 `████████████` | +58 (+1.9%) ▼ |
-| `tacit-windows.zip` | 2150 `████████░░░░` | 2182 `████████░░░░` | +32 (+1.5%) ▼ |
-| `tacit-pack-en-0.10.9.zip` | 446 `██░░░░░░░░░░` | 446 `██░░░░░░░░░░` | 0 = |
-| `tacit-pack-ko-0.10.9.zip` | 451 `██░░░░░░░░░░` | 451 `██░░░░░░░░░░` | 0 = |
+| `tacit_tip.dll` (x64) | 756 `███░░░░░░░░░` | 756 `███░░░░░░░░░` | 0 = |
+| `tacit_tip.dll` (x86) | 620 `██░░░░░░░░░░` | 620 `██░░░░░░░░░░` | 0 = |
+| `tacit-config.exe` | 3158 `████████████` | 3158 `████████████` | 0 = |
+| `tacit-windows.zip` | 2182 `████████░░░░` | 2182 `████████░░░░` | 0 = |
+| `tacit-pack-en-0.10.10.zip` | 446 `██░░░░░░░░░░` | 446 `██░░░░░░░░░░` | 0 = |
+| `tacit-pack-ko-0.10.10.zip` | 451 `██░░░░░░░░░░` | 450 `██░░░░░░░░░░` | -1 (-0.2%) ▲ |
### 지연 비교 (µs 중앙값, 낮을수록 좋음, 막대 표 안 최대 기준)
-| 항목 | 0.10.3 | 0.10.9 | 변화 |
+| 항목 | 0.10.9 | 0.10.10 | 변화 |
| --- | ---: | ---: | ---: |
-| `commit.avg_us` | 10.48 `██░░░░░░░░░░` | 15.84 `██░░░░░░░░░░` | +5.36 (+51.1%) ▼ |
-| `commit.p50_us` | 9.00 `█░░░░░░░░░░░` | 12.80 `██░░░░░░░░░░` | +3.80 (+42.2%) ▼ |
-| `commit.p95_us` | 19.80 `███░░░░░░░░░` | 26.30 `████░░░░░░░░` | +6.50 (+32.8%) ▼ |
-| `commit.p99_us` | 37.00 `█████░░░░░░░` | 56.50 `████████░░░░` | +19.50 (+52.7%) ▼ |
-| `keystroke.avg_us` | 9.70 `█░░░░░░░░░░░` | 15.18 `██░░░░░░░░░░` | +5.48 (+56.5%) ▼ |
-| `keystroke.p50_us` | 7.60 `█░░░░░░░░░░░` | 10.70 `██░░░░░░░░░░` | +3.10 (+40.8%) ▼ |
-| `keystroke.p95_us` | 22.80 `███░░░░░░░░░` | 33.70 `█████░░░░░░░` | +10.90 (+47.8%) ▼ |
-| `keystroke.p99_us` | 50.30 `███████░░░░░` | 83.60 `████████████` | +33.30 (+66.2%) ▼ |
+| `commit.avg_us` | 15.84 `██░░░░░░░░░░` | 19.04 `██░░░░░░░░░░` | +3.20 (+20.2%) = |
+| `commit.p50_us` | 12.80 `██░░░░░░░░░░` | 13.70 `██░░░░░░░░░░` | +0.90 (+7.0%) = |
+| `commit.p95_us` | 26.30 `███░░░░░░░░░` | 31.40 `████░░░░░░░░` | +5.10 (+19.4%) = |
+| `commit.p99_us` | 56.50 `███████░░░░░` | 75.00 `█████████░░░` | +18.50 (+32.7%) ▼ |
+| `keystroke.avg_us` | 15.18 `██░░░░░░░░░░` | 17.06 `██░░░░░░░░░░` | +1.88 (+12.4%) = |
+| `keystroke.p50_us` | 10.70 `█░░░░░░░░░░░` | 11.50 `█░░░░░░░░░░░` | +0.80 (+7.5%) = |
+| `keystroke.p95_us` | 33.70 `████░░░░░░░░` | 37.10 `█████░░░░░░░` | +3.40 (+10.1%) = |
+| `keystroke.p99_us` | 83.60 `██████████░░` | 97.70 `████████████` | +14.10 (+16.9%) = |
### 시작·메모리 비교 (낮을수록 좋음, 막대 행별 비교)
-| 항목 | 0.10.3 | 0.10.9 | 변화 |
+| 항목 | 0.10.9 | 0.10.10 | 변화 |
| --- | ---: | ---: | ---: |
-| `load.ms` | 1.57 `██████░░░░░░` | 3.19 `████████████` | +1.62 (+103.2%) ▼ |
+| `load.ms` | 3.19 `███████████░` | 3.47 `████████████` | +0.28 (+8.8%) = |
| `heap.loaded_kb` | 52.67 `████████████` | 52.67 `████████████` | +0.00 (+0.0%) = |
-| `heap.peak_kb` | 11628.73 `████████████` | 11628.82 `████████████` | +0.09 (+0.0%) = |
+| `heap.peak_kb` | 11628.82 `████████████` | 11628.82 `████████████` | +0.00 (+0.0%) = |
+
+## 0.10.10
+
+commit cfd3096, 2026-10-23, rustc 1.93.1 (01f6ddf75 2026-02-11)
+
+프로필: `enko` (영·한), lab 0.2.12.
+
+공통 정확도·시나리오는 해당 언어가 켜진 판별기로 측정합니다. acc.ALL은 영·한 공통 세트이며 일본어 정답률과 합산하지 않습니다.
+
+load.ms·heap.*는 판별기 시작/단어 평가 기준입니다. enkoja의 ja.load.ms·ja.heap.loaded_kb는 별도 가나→한자 변환기 초기화/힙 증가입니다. 영·한판(tacit-windows.zip)과 일본어 포함판(tacit-windows-ja.zip)은 프로그램과 설치 zip이 다르고, 팩 목록도 활성 언어에 따라 다릅니다.
+
+### 크기 (KiB)
+
+| 항목 | KiB |
+| --- | ---: |
+| `tacit_tip.dll` (x64) | 756 |
+| `tacit_tip.dll` (x86) | 620 |
+| `tacit-config.exe` | 3158 |
+| `tacit-windows.zip` | 2182 |
+| `tacit-pack-en-0.10.10.zip` | 446 |
+| `tacit-pack-ko-0.10.10.zip` | 450 |
+
+### 정확도 (%)
+
+| 세트 | 정확도 |
+| --- | ---: |
+| `acc.ALL` | 99.69 |
+| `acc.en.freq/none` | 99.50 |
+| `acc.en.freq/after-ko` | 99.45 |
+| `acc.ko.words/none` | 100.00 |
+| `acc.ko.vocab/none` | 100.00 |
+| `big.ko.sent.sentence` | 99.13 |
+| `big.ko.sent.token` | 99.83 |
+| `big.ko.phrase.sentence` | 99.37 |
+| `big.ko.long.sentence` | 98.40 |
+| `big.en.sent.sentence` | 99.93 |
+| `big.cs.particle.sentence` | 99.06 |
+| `big.cs.particle.token` | 99.85 |
+| `big.cs_heldout.particle.sentence` | 98.95 |
+| `big.cs.bare.sentence` | 97.77 |
+| `big.cs.number.sentence` | 99.29 |
+| `big.ko.title.none` | 99.87 |
+| `big.ko.title.after-en` | 99.37 |
+| `big.learn.other_forms_before` | 100.00 |
+| `big.learn.other_forms_after` | 100.00 |
+
+### 유형별 시나리오 (문장 정답률 %, token은 단어 단위, chain은 4문장 이어 입력)
+
+| 유형 | 문장 | token | chain.token | µs/글자 |
+| --- | ---: | ---: | ---: | ---: |
+| chat | 96.51 | 98.78 | 99.17 | 4.33 |
+| dev | 98.98 | 99.69 | 99.37 | 4.68 |
+| writing | 98.78 | 99.77 | 99.75 | 3.37 |
+| 전체 | 98.12 | 99.50 | | |
+
+| 시나리오 | 문장 정답률 |
+| --- | ---: |
+| `chat.brand` | 100.00 |
+| `chat.casual` | 100.00 |
+| `chat.english` | 100.00 |
+| `chat.loan` | 92.31 |
+| `chat.number` | 100.00 |
+| `chat.punct` | 100.00 |
+| `chat.slang` | 88.24 |
+| `dev.commit` | 100.00 |
+| `dev.error` | 100.00 |
+| `dev.identifier` | 100.00 |
+| `dev.issue` | 100.00 |
+| `dev.review` | 100.00 |
+| `dev.terminal` | 96.00 |
+| `dev.tool` | 100.00 |
+| `writing.academic` | 92.86 |
+| `writing.email` | 100.00 |
+| `writing.english` | 100.00 |
+| `writing.essay` | 100.00 |
+| `writing.formal` | 100.00 |
+| `writing.long` | 100.00 |
+| `writing.numbers` | 100.00 |
+| `writing.quote` | 100.00 |
+
+### 속도·메모리 (중앙값, 5회)
+
+| 항목 | 값 |
+| --- | ---: |
+| `commit.avg_us` | 19.04 |
+| `commit.p50_us` | 13.70 |
+| `commit.p95_us` | 31.40 |
+| `commit.p99_us` | 75.00 |
+| `keystroke.avg_us` | 17.06 |
+| `keystroke.p50_us` | 11.50 |
+| `keystroke.p95_us` | 37.10 |
+| `keystroke.p99_us` | 97.70 |
+| `load.ms` | 3.47 |
+| `heap.loaded_kb` | 52.67 |
+| `heap.peak_kb` | 11628.82 |
## 0.10.9