fix: remove remaining Vitruvian IP outliers after catalogue swap - #710
Conversation
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
| -- Matched by catalogue name on non-custom rows; TRIM handles a trailing-space | ||
| -- variant of 'Kneeling 45 Degree Kickback' present in older installs. | ||
| UPDATE Exercise SET isBodyweight = 0 | ||
| WHERE isCustom = 0 AND TRIM(name) IN ( |
There was a problem hiding this comment.
nitpick: The new TRIM(name) IN (...) clause is binary-collated by default in SQLite, so an imported row whose name is Squat vs squat (or any curly-quote/whitespace variant beyond trailing space) will silently slip past the backfill — and unlike the old ID list there is no fallback update. Worth either lower-casing the comparison (LOWER(TRIM(name)) IN (...)) with a matching list, or noting explicitly that the migration assumes the seed catalogue's casing. Not blocking — the previous ID-based migration also required exact match — but the case-insensitive upgrade is essentially free and closes a quiet regression for anyone who re-imported their old library with a different locale.
Reply with @kilocode-bot fix it to have Kilo Code address this issue.
Code Review Roast 🔥Verdict: No New Issues Found | Recommendation: Approve Overview
The incremental diff since
All three marketing strings updated in lockstep. The pre-existing migration-39 case-sensitivity nitpick from the prior review is on unchanged code and is therefore not carried forward in this pass; it remains an optional follow-up. 🏆 Best part: The version bump is a single, mechanical commit. The pbxproj has two 💀 Worst part: There is no worst part. The diff is four lines of 📊 Overall: A Files Reviewed (3 files, 4 changed lines)
Ponytail PassPonytail: Lean already. Ship. Ponytail net: 0 lines. Previous Review Summary (commit c217e50)Current summary above is authoritative. Previous snapshots are kept for context only. Previous review (commit c217e50)Verdict: 1 Minor Found | Recommendation: Approve; optional cleanup Overview
Issue Details (click to expand)
🏆 Best part: 112 QA screenshots, an empty 444-line 💀 Worst part: Migration 39 traded six opaque IDs for five catalogue names. The 📊 Overall: Like a museum that finally painted over the last unauthorized watermark — most of the work is deletion, the one piece of plumbing they touched (migration 39) is sensibly rewritten with synthetic-ID tests, and the rename ( Ponytail PassPonytail: Lean already. Ship. Ponytail net: 0 lines. Files Reviewed (74 source files + 112 deleted PNGs)Code touched:
Reviewed by minimax-m3 · Input: 52.8K · Output: 4K · Cached: 305.5K Review guidance: REVIEW.md from base branch |
Summary
E2E audit follow-up to #706 / #708 for the Vitruvian takedown request. HEAD was already clean of the exercise dataset (572/604), the mux/jwplayer streaming stack and the decompilation docs; this PR removes the outliers that survived the first pass. No behaviour changes.
Removed
iosApp/TESTFLIGHT_NOTES.txtanddocs/index.html(meta descriptions, stat tile, feature text, "the original app never had"); TestFlight notes now carry a non-affiliation line and point at this repo.final-visuals/(112 QA screenshots) — picker/routine/config frames render the old Vitruvian catalogue; 06a/06b/06c show a livestream.mux.com/…playback URL. Unreferenced by code/CI.isCustom = 0 AND TRIM(name) IN (...)); redundantRoutineExerciseID block dropped (the existing name heal already covers it). Idempotent, data-only edit;MigrationStatements.ktmirror andSchemaParityTest/SqlDelightSyncRepositoryTestswitched to synthetic IDs.HardwareValidationTest.kt— empty scaffold whose substance was a field-by-field description of the official app'sSamplestruct;BlePacketCapturecomments updated.media3/ HLS version-catalog aliases; unusedvideo_preview_unavailable/cd_video_thumbnailstrings (all locales).Reworded (behaviour unchanged)
BlePacketFactory,BleConstants,Constants,BleCompatibilityMode,KableBleConnectionManager,ProtocolParser,BleRepository, …), UI, tests, the vendored Kable patch and.almanac.BlePacketFactory.createOfficialStopPacket()→createSoftStopPacket().DiagnosticFaultCategory.VITRUVIAN("Vee")→CONTROLLER("Controller"),decodeVitruvianFault→decodeControllerFault; fault-label table re-authored in Phoenix wording (incl. "Bord Temp" → "Board temperature"). User-visible in the Diagnostics screen/export.settings_video_behavior,settings_exercise_demos_disabled, etc.) in en/de/es/fr/nl — values only, keys pinned by contract tests untouched.phoenix_backup_*/Download/ProjectPhoenix, export headers,disconnect_message, ConnectingOverlay, DeviceInfo, install guides, bug template. Persisted names (vitruvian.db,vitruvian_preferences,video_playback) are untouched.docs/superpowers/specs/2026-06-16-official-weight-handling-design.md→…per-cable-weight-handling-design.md.LegacyCatalogueIdMapKDoc states the keys are opaque migration-only IDs with no catalogue content.Not in this PR (owner decisions, see audit report)
Purging the 41 pre-#706 release binaries and editing release bodies;
git filter-repohistory rewrite (dataset reachable from all tags +origin/working_branch); hashing theLegacyCatalogueIdMapkeys; branding identifier renames (VitruvianApp,VitruvianDatabase, XcodeVitruvianPhoenix).Test plan
./gradlew -Pskip.supabase.check=true :shared:testAndroidHostTest :androidApp:testDebugUnitTest :shared:verifyCommonMainVitruvianDatabaseMigration→ 3,724 tests, 0 failuresgit grep -i 'official app|createOfficialStopPacket|VITRUVIAN\(|Bord Temp|572 exercises|Euclid|reference web application'→ no hits in tracked source/docs🤖 Generated with Claude Code
https://claude.ai/code/session_01RpYk6iyjaMzC4DjiMEBwvK