# Handoff — 2026-09-01 — tickets 9 to 14 ## State All six tickets are done and verified, on the branch `feature/menu-theme-and-settings` in all three repositories. Nothing is committed. Four land in turbo-core: | Ticket | What changed | | --- | --- | | 12 | `reapplySettings` in `app/project.go`, run from a new `afterSave` shared by both save paths. Saving `settings.toml` applies it at once. | | 11, 13, 14 | `projectFile` + `openProjectFile`/`hasProjectFile`/`not`. Six menu items: create greyed once the file exists, open greyed until it does. New API: `OpenTools`, `OpenSnippets`, `HasProjectTools`, `HasProjectSnippets`. | | 10 | `syntax.comment` raised past 4.5:1 WCAG in the six themes we author, plus `TestEveryThemeWeAuthorKeepsItsCommentsReadable`. | Suite green (16 packages), quality gate **PASS 0/0/0** at complexity 1724. Documentation complete in EN and FR, including a new `docs/*/how-to/test-without-publishing.md`. ## In flight Nothing half-done. ## Next steps 1. Review and commit on `feature/menu-theme-and-settings`, merge to `main`. 2. **Release v0.3.0** — `OpenTools`, `OpenSnippets`, `HasProjectTools` and `HasProjectSnippets` are new public API, so it is a minor bump: ```sh TAG=v0.3.0 ./01-release.tag.sh TAG=v0.3.0 ./02-release.publish.sh ``` 3. In each editor: `go get codeberg.org/turbo-editors/turbo-core@v0.3.0 && go mod tidy && make check`. Until then the editors keep requiring v0.2.0, which builds — the five library-side tickets simply are not visible in them yet. This is deliberate, and different from the last two releases: nothing is left unbuildable. ## Open questions / blockers - None. ## Watch out for - **`reapplySettings` matches on the path, not on `a.settingsPath`.** A project that had no settings file has nothing remembered, so a remembered handle cannot see the file being *created*. There is a test named for that case. - **It runs from `afterSave`, which both save paths share.** Anything added to one save path and not the other goes missing silently; that is what this function exists to prevent. Do not re-inline it. - **The status message ordering is deliberate**: `Saved …` is emitted first so that re-reading the settings can replace it. A settings file that no longer parses must win the status bar over "saved". - **The two contrast measures are not interchangeable.** `channelDistance` for anything the eye must merely distinguish; `contrastRatio` for anything read. The bug in ticket 10 sailed through the first at 128 against a floor of 64. - **Do not widen the WCAG rule to every key.** It was measured: 84 of 432 theme/key pairings across the shipped themes are under 4.5, most of them Catppuccin's published palette. A blanket floor would either fail honestly-correct themes or have to be lowered until it means nothing. - **The Catppuccin exemption is guarded.** `TestTheThemesWeDoNotOwnAreStillNamedThemesWeShip` fails if the list ever names a theme that is not shipped, so the exemption cannot quietly outlive its reason. - **`Already there` and "this project has no …" are now unreachable from the menus** but still reachable from the API, and still tested. Do not delete them as dead code. - `release.env` and `turbo-core.token.env` hold live Codeberg tokens and are covered by `*.env`. Keep it that way.