fix: replace exercise catalogue with free-exercise-db - #706
Conversation
Remove the bundled dump, streamed mux/jwplayer demos, and decompilation docs. Seed the library from openly licensed free-exercise-db stills, archive legacy catalogue rows so workout history still resolves, and add an optional wger refresh behind Settings.
|
You have reached your Codex usage limits for security reviews. Please try again later. |
Code Review Roast 🔥Verdict: 1 Suggestion | Recommendation: Merge — Ponytail nit only Oh wait, this incremental is almost clean. I had my flamethrower warmed up and everything, but the new Overview
Issue Details (click to expand)
🏆 Best part: 💀 Worst part: 📊 Overall: Like the third pancake — the batter is right, the flip is clean, and you didn't overcook it. The incremental is small, correct, and well-tested. The previous round's Files Reviewed (4 files)
Fix these issues in Kilo Cloud Previous Review Summaries (7 snapshots, latest commit 4cc665b)Current summary above is authoritative. Previous snapshots are kept for context only. Previous review (commit 4cc665b)Verdict: 0 Critical Issues | Recommendation: Merge — Ponytail nits only The previous round's Overview
Issue Details (click to expand)
🏆 Best part: 💀 Worst part: The new 📊 Overall: Like the second pancake — same batter as the first, but you flipped it before it burned. The Files Reviewed (3 files)
Fix these issues in Kilo Cloud Previous review (commit ba0b84c)Verdict: 1 Issue Found | Recommendation: Address before merge The remap pipeline is the right shape — explicit id map + name fallback + per-table reassign + user-field merge + duplicate-PR dedupe — but it's wired up to fire on every Overview
Issue Details (click to expand)
🏆 Best part: The user-field merge logic in 💀 Worst part: The same merge that gets 📊 Overall: Like installing a beautiful new boiler that also happens to drip into the basement every time you turn on a tap. Fix the wiring, leave the boiler. Correctness / Safety Findings
Ponytail Review
Ponytail net: -3 lines. Suggested Minimal Patch
Final Merge GuidanceCan merge after the Fix these issues in Kilo Cloud Previous review (commit e562d9b)Verdict: No Issues Found | Recommendation: Merge Five surgical commits, each one responding to a different raised hand from the last round. The orphan-key relapse is in remission, the legacy catalogue IDs get the same canonical treatment as fresh slugs, and a foam roll no longer pretends to need a cable machine. The PR is finally behaving like a person who reads review comments. Overview
What changed since the last review (click to expand)
🏆 Best part: The behaviour change in 💀 Worst part: The new test 📊 Overall: Five commits, five clean fixes, zero regressions. The pony is loose, well-fed, and finally doing the trick. Ponytail note (click to expand)
private val legacyToCanonical = mapOf(
LEGACY_BENCH_ID to BENCH_ID,
LEGACY_SHOULDER_PRESS_ID to SHOULDER_PRESS_ID,
LEGACY_SQUAT_ID to SQUAT_ID,
LEGACY_DEADLIFT_ID to DEADLIFT_ID,
)
fun canonicalMainLiftId(exerciseId: String?): String? = exerciseId?.let {
legacyToCanonical[it] ?: if (it in MAIN_LIFT_IDS) it else null
}Optional — only worth doing if you anticipate more legacy IDs or want one source of truth for the canonical set. Files Reviewed (11 files)
Previous review (commit c43b083)Verdict: No Issues Found | Recommendation: Merge Oh wait, this PR is actually clean. I had my flamethrower warmed up for a fifth orphan localization key and the author just… shipped the missing Overview
What changed since the last review (click to expand)
🏆 Best part: The fix is actually localized this time. Five locale files, one consistent message, no more decorative 💀 Worst part: The redundant 📊 Overall: Like a recovery arc I didn't expect to see. The PR kept shipping orphan keys like it was a subscription box, and now it ships five matching translations in one commit. The pony is loose. Files Reviewed (8 files)
Previous review (commit 0bceb5f)Verdict: 1 Issue Found | Recommendation: Address before merge Overview
Issue Details (click to expand)
🏆 Best part: The intent is finally right — the literal is gone and the codebase wants to be localized. 💀 Worst part: This is the fourth orphan key this PR has shipped across its own commits, after previously being roasted for exactly that. The pattern isn't a bug anymore; it's a tradition. 📊 Overall: A PR that's one missing Files Reviewed (1 file)
Fix these issues in Kilo Cloud Previous review (commit 48fc8d1)Verdict: 1 Issue Found | Recommendation: Merge (optional cleanup) Overview
Issue Details (click to expand)
VerdictApprove — the heavy lifting is correct: Correctness / Safety Findings
Ponytail Review
Ponytail net: 0 lines (refactor only). Suggested Minimal PatchAdd stringResource(Res.string.settings_exercise_demos_disabled)Optional cleanup: move the unified-attachment token set into a single constant referenced from both Final Merge GuidanceCan merge as-is. The hardcoded-string finding is a localization nit, not a correctness blocker; the duplicate logic in Fix these issues in Kilo Cloud Previous review (commit b7533c7)Verdict: 1 Issue Found | Recommendation: Merge (optional cleanup) Overview
Issue Details (click to expand)
Resolved From Previous Review ✅The 5 issues from the previous review at
🏆 Best part: You took the previous review's "stop hardcoding what you just localized" note, wrote a 💀 Worst part: The helper you wrote is so good it makes two of the lines right after it unreachable, and you left them there anyway. Future-you will read that 📊 Overall: Like a kitchen where the chef finally cleans the fridge, swaps the menu, and bumps the health-department permit — but leaves one expired yogurt in the back. The food is safe. The yogurt is theoretical. Files Reviewed (9 files in incremental diff)
[Snapshot truncated.] Additional previous summary content was truncated to keep this comment within platform limits. Reviewed by minimax-m3 · Input: 52.3K · Output: 25.5K · Cached: 330.9K Review guidance: REVIEW.md from base branch |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 05693853c9
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
Count dropped-table heals in SchemaManifestTest and pin SetReady layout to ExerciseDemoImage after mux video removal.
43.sqm migrates 43 -> 44; keep Gradle version aligned so existing installs archive stock rows and create ExerciseImage.
Wire existing translation keys, add in-progress copy, store BODYWEIGHT, and match the picker Bodyweight filter to the explicit flag.
|
Unit Tests was red on 0569385 (2 failures in Shared Module Test Results). |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: b7533c73ec
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
Honor the HUD demo preference, mark barbell/E-Z curl bar imports as dual-cable unified attachments, and drop unreachable wger bodyweight checks.
|
Resolved all review threads. |
…tion/screen/WorkoutHud.kt Co-authored-by: kilo-code-bot[bot] <240665456+kilo-code-bot[bot]@users.noreply.github.com>
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 0bceb5f13f
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
Define settings_exercise_demos_disabled so WorkoutHud's localized disabled-demo label compiles.
Pin WorkoutHud disabled-demo copy to settings_exercise_demos_disabled instead of the removed English literal.
Skip remote thumbnail fetches, dialogs, and thumbnail clicks when enableVideoPlayback is false.
|
Lint Check and Unit Tests both failed on |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: c43b0833d6
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
Existing cycles still store ZZ92/UjIG/e64c/0040d53f IDs. Normalize them to the four replacement slugs so week and training-max advancement keep working after migration 43.
Point GLUTE_KICKBACKS at One-Legged_Cable_Kickback so the TUT percentage lift stays a machine exercise instead of body-only Glute_Kickback.
Store isBodyweight=1 only for BODYWEIGHT, 0 for cable accessories, and NULL otherwise so foam-roll/ball work uses !hasCableAccessory instead of requiring the machine.
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: e3fcd217aa
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
Replace JVM-only MutableMap.putIfAbsent with a common contains-key write so compileKotlinIosArm64 can resolve 5/3/1 TM bump tracking.
Filter shelf and getEquipmentDatabaseValues now map Cable to CABLE so Face Pull and other free-exercise-db cable rows are selectable.
|
Automated fix for iOS Test Target Compile. |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: e562d9b68e
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
INSERT OR IGNORE plus an in-place catalogue UPDATE keeps favorites, 1RM, usage, MVT, and custom rows instead of INSERT OR REPLACE deleting through FKs. Zero of N imports now fail so the source marker is not set.
SqlDelightExerciseRepository only records BUNDLED_CATALOG_SOURCE when the importer reports a positive count, so a 0-of-N or failed import can retry.
…lbacks Reimport keeps favorite/1RM/usage; colliding custom IDs fail the import; name lookups prefer archived=0 over legacy rows.
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 217c7e2efd
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
After import, rewrite sessions, PRs, routines, assessments, and related rows from archived Vitruvian IDs onto free-exercise-db slugs so upgrade history and 1RMs show on the active picker entries.
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: ba0b84ccc3
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
Zero consumed legacy user fields after merge so timesPerformed cannot compound on later picker opens. When both IDs already have a PR, keep the heavier/higher-volume record. Do not un-archive stock rows on catalogue refresh.
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 4cc665b26a
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
Exact-name remap missed plural renames such as Rack Pull vs Rack Pulls. Add explicit IDs, a reviewed alias table, and unique last-word stemming. Merge personal MVT running means instead of deleting the legacy aggregate. Simplify PR collision to compareBy and cover weight/volume winners in tests.
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 1ffb116198
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
Add the bar-based Bench Press ID and other same-name dump duplicates so history is not left on archived rows. Collision resolution now prefers live PRs over heavier tombstones before comparing metrics.
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 15070d69c0
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
| if (exercises.isNotEmpty() && importedCount == 0) { | ||
| Logger.e { "Imported 0 of ${exercises.size} free-exercise-db rows" } | ||
| return@withContext Result.failure( | ||
| Exception("Imported 0 of ${exercises.size} exercises"), | ||
| ) |
There was a problem hiding this comment.
Reject partial catalogue imports before saving the marker
Fresh evidence after the stated zero-row fix is that this guard fails only when importedCount == 0: each row exception is still swallowed at lines 201-203, and the counter is incremented before image replacement at line 185. A transient failure affecting one row—or even every image write after its exercise was counted—therefore returns success, causing SqlDelightExerciseRepository.importExercises() to persist the source marker and skip all future repair attempts. Propagate any row/image failure, or verify catalogue completeness before marking the source imported.
Useful? React with 👍 / 👎.
| * (`Rack Pull` / `Rack Pulls` → `rack pull`). Applied only when that key | ||
| * identifies a single active catalogue row. | ||
| */ | ||
| fun stemKey(name: String): String { |
There was a problem hiding this comment.
🔥 The Roast: You wrote a hand-rolled English stemmer. Twenty lines of "ies drops to y, ches/shes/sses/xes drop two, generic s drops one" — enough suffix rules to make a linguist wince and a future maintainer weep. And nameAliases already covers every single one of these cases with explicit, reviewable entries (rack pull → rack pulls, concentration curl → concentration curls, mountain climber → mountain climbers, etc.). The stemmer is a fallback for a fallback that never fires.
🩹 The Fix: Delete stemKey (lines 149-166), the activeByStem construction in ExerciseImporter.kt:352-355, and the activeByStem[...] branch in ExerciseImporter.kt:378. Rely on nameAliases as the single source of truth — if a new rename is needed, add it to the map rather than hoping the stemmer guesses right. Net: ~25 fewer lines, zero behavior change for known cases.
📏 Severity: suggestion
Reply with @kilocode-bot fix it to have Kilo Code address this issue.
* fix: remove remaining Vitruvian IP outliers after catalogue swap E2E audit follow-up to #706/#708 for the Vitruvian takedown request. HEAD was already clean of the exercise dataset, the mux/jwplayer streaming stack and the decompilation docs; this removes what survived: - Drop stale "572 exercises with video" copy (TESTFLIGHT_NOTES, docs/index.html), add non-affiliation line to TestFlight notes. - Delete final-visuals/ QA screenshots that render the old catalogue (three show a live stream.mux.com playback URL). Unreferenced by code. - Migration 39: replace the six legacy catalogue IDs (+ catalogue-name comments) with the equivalent name-based heal on non-custom rows; drop the redundant RoutineExercise ID block. Idempotent, data-only; Kotlin mirror and SchemaParityTest updated to synthetic IDs. - Reword ~70 comments/identifiers that cited the official app or decompiled internals as the source of behaviour (BLE/protocol, diagnostics, UI, tests, third-party Kable patch, almanac). createOfficialStopPacket() -> createSoftStopPacket(); DiagnosticFaultCategory.VITRUVIAN("Vee") -> CONTROLLER("Controller"); fault labels re-authored in Phoenix wording. - Delete HardwareValidationTest scaffold (described the official app's Sample struct); update BlePacketCapture comments. - Remove dead media3/HLS version-catalog aliases and unused video strings; "video" wording -> demo images in en/de/es/fr/nl. - Neutralise safe branding strings (backup filenames, export headers, install guides, bug template, disconnect prompt); persisted names (vitruvian.db, vitruvian_preferences, video_playback key) untouched. - LegacyCatalogueIdMap KDoc now states keys are migration-only opaque IDs. Verified: :shared:testAndroidHostTest + :androidApp:testDebugUnitTest + verifyCommonMainVitruvianDatabaseMigration -> 3,724 tests, 0 failures. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01RpYk6iyjaMzC4DjiMEBwvK * Bump app version to 1.0.0 --------- Co-authored-by: Codex <codex@openai.com> Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Remove the bundled dump, streamed mux/jwplayer demos, and docs. Seed the library from openly licensed free-exercise-db stills, archive legacy catalogue rows so workout history still resolves, and add an optional wger refresh behind Settings.