From 86f82670c2551a1b50811fadf3a3b27dd7811561 Mon Sep 17 00:00:00 2001 From: Claude Date: Sat, 12 Sep 2026 17:05:57 +0000 Subject: [PATCH 1/2] docs: refresh STATUS.md and phase tracker after Phase 7 wrap-up, add next-steps backlog STATUS.md still claimed the 2.0.0 keystore/release step was pending and carried a stale (and self-contradictory) test count; both 2.0.0 and 2.0.1 have shipped and the JVM test suite is now at 336 tests. docs/plan/README.md was missing Phase 7 from its progress list even though CLAUDE.md already marks it done, and CLAUDE.md still described the Phase 7 plan doc as "the next phase's plan" even though it declares itself done and no Phase 8 exists. Added docs/next-steps.md, a cited backlog of real remaining work (the unreleased Showdown import fix, the deliberately-deferred generational type charts and suggestion-engine characteristics, and the roster-search gap in the slot editor's species picker). Co-Authored-By: Claude Sonnet 5 Claude-Session: https://claude.ai/code/session_01LvPktDUdCYQVtUv66KzL7r --- CLAUDE.md | 6 +++-- docs/STATUS.md | 52 +++++++++++++++++++++++------------- docs/next-steps.md | 65 +++++++++++++++++++++++++++++++++++++++++++++ docs/plan/README.md | 2 ++ 4 files changed, 104 insertions(+), 21 deletions(-) create mode 100644 docs/next-steps.md diff --git a/CLAUDE.md b/CLAUDE.md index 3f4392f..2930213 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -17,8 +17,10 @@ before editing anything, then read the phase plan you are executing. One new section per phase; one "Known regressions" entry per real bug found. - [`CHANGELOG.md`](CHANGELOG.md) — one entry per release, updated as you go. - [`docs/plan/phase-7-accuracy-and-customization.md`](docs/plan/phase-7-accuracy-and-customization.md) - — the next phase's plan: what is wrong with the engines today (measured, - with the dataset evidence) and exactly what to build. + — the most recently completed phase's plan (status: done): what was + wrong with the engines before it (measured, with the dataset evidence) + and exactly what was built to fix it. No phase 8 exists yet — no + further phase is currently planned. ## What this project is diff --git a/docs/STATUS.md b/docs/STATUS.md index 5b1c34b..5be1c2a 100644 --- a/docs/STATUS.md +++ b/docs/STATUS.md @@ -2,17 +2,18 @@ A snapshot of what's implemented, what's known to be missing, and any loose ends — written for whoever (human or agent) picks this project up next. -Last verified 2026-09-06, at the end of Phase 7 (engine accuracy, -abilities/items, BST-aware suggestions) — the native rewrite described in +Last verified 2026-09-12, after release `2.0.1` and the post-2.0.1 +Showdown import fix — the native rewrite described in [`docs/plan/README.md`](plan/README.md) and its Phase 7 follow-up are both -complete. Re-verify anything here +complete and shipped. Re-verify anything here before relying on it — this file goes stale the moment someone ships a change without updating it. It complements, not replaces, the other docs: [`CLAUDE.md`](../CLAUDE.md) for rules and invariants, [`docs/plan/README.md`](plan/README.md) for the phase-by-phase build, [`docs/plan/native-spec.md`](plan/native-spec.md) for what the -finished app must do, [`ROADMAP.md`](../ROADMAP.md) for the deferred -backlog. +finished app must do, [`ROADMAP.md`](../ROADMAP.md) for the deliberately +out-of-scope backlog, and [`docs/next-steps.md`](next-steps.md) for the +concise, cited list of remaining known work. ## What CoverDex is right now @@ -42,12 +43,22 @@ abilities (plus an offensive gap) now affect the coverage calculation. That is the full feature set of `docs/plan/native-spec.md` plus Phase 7's accuracy/customization work; the native rewrite in [`docs/plan/README.md`](plan/README.md) is complete. -Only the human repository owner's remaining, non-code steps are left: -generating the real release keystore, setting the GitHub secrets it needs, -and running the `Release` workflow for the first real `2.0.0` build — an -agent session has no safe way to hold a signing key or write repository -secrets on someone else's behalf (see -[`docs/release-signing.md`](release-signing.md)). +The real release keystore was generated and the GitHub secrets set by the +repository owner (that part was never an agent's to do — see +[`docs/release-signing.md`](release-signing.md)), and the `Release` +workflow has since shipped `2.0.0` (2026-09-04) and `2.0.1` (2026-09-06) — +see `CHANGELOG.md` and `app/build.gradle.kts` (`versionCode = 3`, +`versionName = "2.0.1"`). `2.0.1` fixed a Surprise Me crash, a broken +"Custom slots" constraint, coverage/generation running on the main thread, +a missing "coverage is already solid" note, and a scoring/ability +mismatch between the Analysis grid and Suggestions — see +`docs/post-migration-review.md` for all six audited findings. Since then, +an additional real bug was found and fixed (2026-09-12, not yet cut into a +release): Showdown import corrupted the species on any real-world set +carrying a `Level:`/`Tera Type:`/`Shiny:`-style line, because the parser +treated any unrecognized line as a fresh species line — see +`CHANGELOG.md`'s `[Unreleased]` section and +`docs/implementation-decisions.md`, "Showdown format compatibility". ## What's implemented @@ -154,7 +165,8 @@ secrets on someone else's behalf (see the `images/` half neither app's data model needs the same way here — CoverDex has no photos on a team slot. - **`./gradlew testDebugUnitTest lintDebug assembleDebug`** all green in one - invocation — 226 unit tests, 0 failures (verified locally with a + invocation — 336 unit tests as of 2026-09-12 (counted via + `grep -rc "@Test" app/src/test`), 0 failures (verified locally with a temporary, non-persistent SDK this session, same as every prior phase). - **The release pipeline** — `signingConfigs["release"]` (Phase 0) reads `RELEASE_KEYSTORE_PATH`/`RELEASE_KEYSTORE_PASSWORD`/`RELEASE_KEY_ALIAS`/ @@ -215,11 +227,10 @@ secrets on someone else's behalf (see Nothing from `docs/plan/native-spec.md` or `docs/plan/ phase-7-accuracy-and-customization.md` — all six phases of -[`docs/plan/README.md`](plan/README.md), plus Phase 7, are done. What -remains is the repository owner's own, non-code responsibility (see -above): generating the production signing keystore, setting the five -GitHub Actions secrets, and running the first real `Release` workflow -dispatch. +[`docs/plan/README.md`](plan/README.md), plus Phase 7, are done, and the +release pipeline has already shipped `2.0.0` and `2.0.1` (see above). The +one open item is releasing the `[Unreleased]` Showdown import fix — see +[`docs/next-steps.md`](next-steps.md). Also deliberately deferred (not a bug, see `docs/implementation-decisions.md` and, for the Phase 7 items, `docs/post-migration-review.md`'s "Phase 7 @@ -250,7 +261,10 @@ a backend). ## Known regressions -None yet. The one deliberate, non-regression gap: **upgrading from the old +See `docs/test-plan.md`'s per-phase "Known regressions" sections for the +full, dated list of real bugs found and fixed (six from the Phase 7 audit, +plus the 2026-09-12 Showdown import fix) — not repeated here to avoid two +copies going stale independently. The one deliberate, non-regression gap: **upgrading from the old Capacitor build loses saved teams and the custom roster.** This is a decided trade-off (see `docs/implementation-decisions.md`), not a bug, but it will read as one to a real user with existing data unless Phase 6's release notes @@ -260,7 +274,7 @@ say so plainly before they update. ```bash export ANDROID_HOME=... # if a local SDK is available; otherwise rely on CI -./gradlew testDebugUnitTest # 329 tests as of Phase 7 +./gradlew testDebugUnitTest # 336 tests as of 2026-09-12 ./gradlew lintDebug ./gradlew assembleDebug ``` diff --git a/docs/next-steps.md b/docs/next-steps.md new file mode 100644 index 0000000..58e685d --- /dev/null +++ b/docs/next-steps.md @@ -0,0 +1,65 @@ +# Next steps + +A concise backlog of known remaining work, for whoever picks this project +up next. Every item cites where it's documented — this file doesn't +introduce anything new, it just collects what's already written down +across `CHANGELOG.md`, `docs/STATUS.md`, `ROADMAP.md` and +`docs/post-migration-review.md` into one place. Re-check the cited source +before acting — this file can go stale like any other. + +## Ready to ship + +- **Cut a release for the `[Unreleased]` Showdown import fix.** Two real + bugs are fixed on `main` but not yet in a tagged release: importing a + real Pokémon Showdown export with a `Level:`/`Tera Type:`/`Shiny:`-style + line used to corrupt the species, and the exporter used to write blank + `Ability:`/`EVs:`/`Nature` placeholder lines and a dangling `@ `. See + `CHANGELOG.md`'s `[Unreleased]` section and + `docs/implementation-decisions.md`, "Showdown format compatibility". + Cutting the release is a manual `Release` workflow dispatch — see + `CLAUDE.md`, "Changelog and release process", and + `docs/release-signing.md` for the signing prerequisites (already + satisfied as of `2.0.0`/`2.0.1`). + +## Deliberately deferred (not bugs) + +- **Generational type charts and generational typings.** The pinned + dataset already downloads `type_efficacy_past.csv` (Gen-1 + Ghost/Psychic and Bug/Poison interactions, the pre-Gen-6 Steel/Dark + resistance to Ghost, ...) and `pokemon_types_past.csv` (pre-Fairy-retcon + typings — Clefairy et al. were Normal-type through Gen 5), but neither + file is ever read. There is no existing "which generation's rules am I + analysing against" concept to hang this on anywhere else in the app — + a genuine feature, not a bug fix. See `ROADMAP.md`, "Deliberately not + planned", and `docs/plan/phase-7-accuracy-and-customization.md` §0.6/§7.4. +- **Four pre-existing suggestion-engine characteristics**, found while + auditing the engine for Phase 7 and each left as-is for its own + documented reason (see `docs/post-migration-review.md`, "Phase 7 + audit", and `docs/STATUS.md`, "What's known to be missing"): + - `Suggestion.gain`'s meaning differs between addition mode and + replacement mode. + - `weaknesses()` counts weakness *types*, not magnitude — a x4 and a x2 + weakness score identically. + - Replacement mode computes one context's score twice. + - A custom roster entry named after a catalogue species can be silently + deduplicated away. +- **The slot editor's species picker never searches the custom roster.** + Unlike `legacy-web`'s "Include saved custom Pokémon in search" checkbox, + the native species picker (`SearchableDropdown`, backed by + `PokedexRepository`) only searches the synced catalogue — a custom + roster entry can only be placed into a slot via "Save as custom" on + that same slot, not found by name from another slot's picker. + `phase-2-teams-and-roster.md`'s own description of the species picker + never mentions the roster as a search source, so this was never + implemented rather than regressed. See `docs/STATUS.md`, "What's known + to be missing" (filed under Phase 2). + +## Out of scope (tracked, not backlog) + +`ROADMAP.md`'s "Deliberately not planned" list (Play Store submission, +iOS, a backend, account/multi-user concepts, damage calculation/battle +simulation/EV-IV tracking/legality validation, migrating data from the +Capacitor build) is a permanent no-list, not deferred work — repeated here +only so this file's "what's left" scope is unambiguous. See +`docs/plan/native-spec.md`, "Explicitly out of scope", for the reasoning +behind each one. diff --git a/docs/plan/README.md b/docs/plan/README.md index 7b16c07..748faa8 100644 --- a/docs/plan/README.md +++ b/docs/plan/README.md @@ -170,3 +170,5 @@ real bug found that way gets an entry in that file's "Known regressions". - **Phase 4 — Suggestions and generator**: ✅ done - **Phase 5 — Import/export and settings**: ✅ done - **Phase 6 — Release**: ✅ done +- **Phase 7 — Engine accuracy, abilities/items, BST ranking**: ✅ done — + see [`phase-7-accuracy-and-customization.md`](phase-7-accuracy-and-customization.md) From 147926adca45da31ebfdd0774fbf7ccc46c6800f Mon Sep 17 00:00:00 2001 From: Claude Date: Sat, 12 Sep 2026 17:15:41 +0000 Subject: [PATCH 2/2] docs: add approved improvement proposals to next-steps backlog Co-Authored-By: Claude Sonnet 5 Claude-Session: https://claude.ai/code/session_01LvPktDUdCYQVtUv66KzL7r --- docs/next-steps.md | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/docs/next-steps.md b/docs/next-steps.md index 58e685d..38d0160 100644 --- a/docs/next-steps.md +++ b/docs/next-steps.md @@ -54,6 +54,29 @@ before acting — this file can go stale like any other. implemented rather than regressed. See `docs/STATUS.md`, "What's known to be missing" (filed under Phase 2). +## Proposed improvements (approved by the user, 2026-09-12) + +Not yet planned in any phase document — these are new proposals raised +during a cross-repo audit and approved for the backlog, not gaps found in +existing docs. Each still needs its own design pass before implementation. + +- **Side-by-side team comparison.** A view that lines up the offensive/ + defensive coverage of two or more saved teams to spot shared weaknesses + at a glance. A natural extension of the existing `AnalysisScreen`/ + `AnalysisViewModel` and `CoverageGridTable`, staying within scope (it's + still coverage analysis, not a battle simulator). +- **Cloud backup (Google Drive).** Both sibling apps (Hall of Memories, + ThePatientGamerHelper) already have automatic Drive backup; + CoverDex only has local SAF export/import. This is a real cost, not a + drop-in: it needs its own OAuth client registration (web + Android + client, SHA-1 pinned to the release keystore), the Credential + Manager/`AuthorizationClient` dance, and a hand-written + `HttpURLConnection` Drive REST client — see ThePatientGamerHelper's + `CLAUDE.md` "Phase 4" for the full shape of what this actually involves, + including its own still-open "OAuth Testing mode expires after 7 days" + limitation. Does not conflict with "no backend of any kind" (Drive + backup needs no backend, as the two sibling apps already demonstrate). + ## Out of scope (tracked, not backlog) `ROADMAP.md`'s "Deliberately not planned" list (Play Store submission,