Decision Log
This page records technical decisions for the project, such as changes to CI, the build, the architecture, or the public API. Each row keeps the state before the change, the expected effect, and, where useful, an issue to check whether it paid off. The pull request holds the details.
Decisions
| Date | Decision | PR | Before | Effect | Revisit | Outcome |
|---|---|---|---|---|---|---|
| 2026-10-05 | Run the Android device tests on the aosp_atd emulator image at 280 dpi, with drawing turned back on. | #667 | Emulator job 13m14s–13m35s (run 37209512033). | 5m10s–6m34s over 8 runs. | — | Kept. |
| 2026-10-05 | Save the Linux and macOS Gradle caches on main when build files change, from a job that builds the CI targets. The iOS cache adds ~/.konan. Other workflows on main restore them read-only, except release jobs (next row). The playground job keeps its own cache. | #668, #675 | iOS job ~14 min with no cache. 6.9 GB of macOS caches that only their own PR could read. | Expected ~10 min or less, and one shared macOS cache, for PRs that keep main's build files. | #669 | — |
| 2026-10-05 | Release jobs start with no Gradle cache, so a release builds from fresh downloads and never from a stale cache. Snapshot jobs keep using the cache. | #668 | — | Release jobs download every dependency on each run. | — | — |
| 2026-10-06 | CI installs the JetBrains JDK 21 that gradle/gradle-daemon-jvm.properties names for the Gradle daemon, before JDK 17, and names its path in org.gradle.java.installations.paths in ~/.gradle/gradle.properties, so Gradle doesn't download it from foojay. The daemon JVM lookup ignores ~/.m2/toolchains.xml. | #684 | Each Gradle job downloaded the daemon JDK from api.foojay.io. When foojay didn't respond, every Gradle job on #682 failed (run 37502565335). | Expected: CI no longer depends on foojay. Each job downloads JBR 21 through setup-java instead. | #683 | — |
| 2026-10-07 | Turn off Axion's unshallowRepoOnCI, so only jobs that clone the full history get the real version. Assemble, Compile, Lint and Test stay shallow and build as 0.1.0-SNAPSHOT; Lint moves from a full clone to a shallow one. | #751 | On CI, Axion fetched the full history through JGit while Gradle configured every build, needed or not: about 13–24s from its Unshallowing repo log line to the next line in the shallow jobs. | Expected about 10–15s less per Gradle job that doesn't need the version. | #750 | — |
| 2026-10-12 | The web demo's and the playground's index.html clear Compose's compose_web_resources_cache and wait for that before they load the app script. Compose 1.12.1 clears this cache on each page load without waiting, and in WebKit (Safari, DuckDuckGo, every iOS browser) resource loads read the old entries first. | #778, charts-playground#62 | After a deploy that changed strings, returning WebKit visitors read the previous deploy's strings.commonMain.cvr. String decoding threw IllegalArgumentException and the loader spun until a refresh. Local Playwright WebKit test with a stale strings.commonMain.cvr in the cache: stuck 5 of 5 loads, in the demo and in the playground. | Same test, in both: stuck 0 of 8 in WebKit, 0 of 5 in Chromium. No extra downloads, since Compose already clears this cache on every load. | #779 | — |
| 2026-10-27 | Save Gradle task outputs separately from dependencies, keyed by OS, architecture, and commit. Warm them after source, resource, or build changes on main. PRs restore the latest available outputs for their platform. | #800 | Source-only merges left task outputs stale because the shared cache was keyed by build files. | Expected: unchanged modules compile and link FROM-CACHE, reducing PR job times. | #801 | Pending. After merge, check a successful warm run on main and a subsequent code PR for restored keys, Kotlin compile/link cache hits, archive sizes, and warm/PR job times. The warm workflow saves task outputs only on main, so this PR alone cannot verify reuse. |