You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: CHANGELOG.md
+45Lines changed: 45 additions & 0 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -2,6 +2,51 @@
2
2
3
3
All SwiftFloris release history is consolidated here. This replaces the former root-level `RELEASE_NOTES_v*.md` file-per-release pattern.
4
4
5
+
<a id="v1.8.213"></a>
6
+
## v1.8.213
7
+
8
+
Released: 2026-06-04
9
+
10
+
### Release Roborazzi gate
11
+
12
+
F24 adds a non-shipping `releaseRoborazzi` build type that `initWith(release)` and carries only the Robolectric screenshot-host manifest overlay. A stable `:app:verifyRoborazziRelease` alias runs Roborazzi against that release-equivalent variant, and the manual Release workflow now runs the alias before lint, APK assembly, signing, artifact upload, or GitHub Release creation.
13
+
14
+
This gives release dispatches their own screenshot-baseline check against release resources and build flags, closing the gap where the PR/push gate only exercised `debug`.
15
+
16
+
### Changes
17
+
18
+
- **`app/build.gradle.kts`** - adds the non-shipping `releaseRoborazzi` build type, enables its UnitTest component, and exposes a stable `verifyRoborazziRelease` alias.
19
+
- **`app/src/releaseRoborazzi/AndroidManifest.xml`** - declares the screenshot host only for the release-equivalent Roborazzi variant, keeping the real release manifest unchanged.
20
+
- **`release.yml`** - adds a required release-variant Roborazzi step before signing/publication.
21
+
- **`README.md` / `LOCAL_VERIFICATION.md`** - document the release visual gate next to the existing debug gate.
22
+
- **`ROADMAP.md` / `COMPLETED.md`** - moved F24 out of active work and into shipped state.
Copy file name to clipboardExpand all lines: COMPLETED.md
+1Lines changed: 1 addition & 0 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -51,6 +51,7 @@ Consolidated from the archived open-work checklist (closed items). Full per-rele
51
51
-[x] F6 (P2) — Per-app accent opt-in discovery hint and Settings preview, with process-local three-app threshold tracking, persisted hint state only, Settings search coverage, and privacy docs. Shipped v1.8.210. — *Source: TODO_2026-06-03.md*
52
52
-[x] EI2 (P3, reframed) — Settings home regrouped into Typing experience, Personalization, Privacy & data, Advanced, and About buckets, with Physical keyboard surfaced directly under Advanced while preserving existing deep links. Shipped v1.8.211. — *Source: TODO_2026-06-03.md*
53
53
-[x] F23 (P1) — Release workflow now depends on the reusable reproducible-build verifier before signing or GitHub Release publication, blocking release dispatches when the build-twice APK check fails. Shipped v1.8.212. — *Source: TODO_2026-06-03.md*
54
+
-[x] F24 (P1) — Non-shipping `releaseRoborazzi` variant mirrors release build flags for Roborazzi, exposed through `:app:verifyRoborazziRelease`; the release workflow runs it before APK signing/publication. Shipped v1.8.213. — *Source: TODO_2026-06-03.md*
**SwiftFloris** is a privacy-first Android keyboard, forked from FlorisBoard and pushed toward SwiftKey-class multilingual typing without the cloud. It ships under Apache-2.0, holds no `INTERNET` permission, and binds zero accounts.
# Release-variant Roborazzi gate (run before publishing)
190
+
./gradlew :app:verifyRoborazziRelease
188
191
```
189
192
190
193
**Signed release build**
@@ -269,7 +272,7 @@ Real device-number collection is tracked in [`docs/BENCHMARKS.md`](docs/BENCHMAR
269
272
## Testing
270
273
271
274
-**Unit tests:** Kotest, run with `./gradlew test`. Last reported HEAD: 998+ tests (post-v1.8.40), expanding with each release. The v1.8.47 hardening pass added defensive tests around dictionary import limits, voice-model atomic install, theme asset traversal, and quick-action serializer fallback.
272
-
-**Visual regression:** Roborazzi 1.60.0, plugin alias active. CI runs `:app:verifyRoborazziDebug` on every push / PR as a hard gate, backed by committed baselines for the maintainer chip, SwiftKey High Contrast, Aurora Animated, and Settings -> Addons surfaces.
275
+
-**Visual regression:** Roborazzi 1.60.0, plugin alias active. CI runs `:app:verifyRoborazziDebug` on every push / PR as a hard gate, and the release workflow runs `:app:verifyRoborazziRelease` before APK publication. Baselines cover the maintainer chip, SwiftKey High Contrast, Aurora Animated, and Settings -> Addons surfaces.
273
276
-**Macrobenchmark:**`:benchmark` is wired for AndroidX trace/frame runs, and the adb harness scripts record repeatable IME first-render, first-suggestion, dictionary-load, candidate-row recomposition, theme-switch, and backup/restore baselines.
274
277
-**No-network gate:** CI verifies the absence of `INTERNET` permission on every build.
275
278
-**Lint drift:** CI lint runs through `scripts/run-lint-debug-with-baseline-check.sh`, which fails stale baseline entries instead of leaving them as console-only noise.
@@ -442,7 +445,7 @@ limitations under the License.
442
445
443
446
## Status
444
447
445
-
🚀 **Active development.** Current release: **v1.8.212** (2026-06-04). The SwiftKey account export window closed on **2026-05-31**; local/on-device migration paths remain documented above.
448
+
🚀 **Active development.** Current release: **v1.8.213** (2026-06-04). The SwiftKey account export window closed on **2026-05-31**; local/on-device migration paths remain documented above.
Hard rules still apply (see `AGENTS.md`): no `INTERNET` permission in `:app`; Apache-2.0 ceiling on `:app`; no closed-source blobs; one logical change per commit; every shipped release bumps `gradle.properties` version, writes a `CHANGELOG.md` section, and adds a `fastlane/metadata/android/en-US/changelogs/<versionCode>.txt` (draft <=480 chars for headroom).
8
8
@@ -62,11 +62,6 @@ Item IDs trace to their origin research: `F#`/`EI#` from the archived 2026-05-25
// F24: AGP only creates the debug unit-test component by default for
335
+
// application modules. Roborazzi wires tasks from AGP UnitTest
336
+
// components, so explicitly enable unit tests on the non-shipping
337
+
// releaseRoborazzi variant and expose it through the stable
338
+
// :app:verifyRoborazziRelease alias below.
339
+
(variantBuilder as com.android.build.api.variant.HasUnitTestBuilder).enableUnitTest =true
340
+
}
341
+
320
342
onVariants { variant ->
321
343
val verifyMerged = tasks.register("verifyNoInternetPermissionMerged${variant.name.replaceFirstChar { it.uppercase() }}") {
322
344
group ="verification"
@@ -358,6 +380,12 @@ androidComponents {
358
380
}
359
381
}
360
382
383
+
tasks.register("verifyRoborazziRelease") {
384
+
group ="verification"
385
+
description ="Runs Roborazzi against the non-shipping releaseRoborazzi variant, which mirrors release build flags and carries only the test host overlay (F24)."
386
+
dependsOn("verifyRoborazziReleaseRoborazzi")
387
+
}
388
+
361
389
// ROADMAP §6 N7.4 — pin the load-bearing excludes in
362
390
// `app/src/main/res/xml/data_extraction_rules.xml` against accidental
363
391
// rewrite. Android Lint validates the XML against the data-extraction-rules
0 commit comments