v1.2.0:9 — fuzzy-match AI exercises to the library by name
CI / proof-of-work (Next.js app) (push) Waiting to run
CI / start9/0.4 (StartOS package code) (push) Waiting to run

Both AI flows resolved suggested exercises to the user's library by exact exerciseId only, with no name fallback — so a model returning a good name with a null or invented id (e.g. "Overhead Press" when the library has "Overhead Press (barbell)") forced the user to hand-map an exercise they already own. Common with local models (Qwen via SparkControl) that don't reliably echo library ids.

Fix: a shared name matcher (lib/ai/exerciseMatch.ts) normalizes names (lowercase, strip the (barbell)-style qualifier + punctuation) and auto-resolves UNIQUE confident matches; ambiguous or unknown names stay flagged for manual mapping. Wired into both the workout and program generate flows at the parse->display boundary.

Client-only; no schema/data change. 274 tests pass; built + sideloaded to immense-voyage.local (1.2.0:9, clean non-root launch).
This commit is contained in:
Keysat
2026-06-19 16:17:57 -05:00
parent 794070a1d8
commit 891bf09d7e
7 changed files with 240 additions and 6 deletions
+6 -1
View File
@@ -23,6 +23,7 @@ import { v_1_2_0_5 } from './v1.2.0.5'
import { v_1_2_0_6 } from './v1.2.0.6'
import { v_1_2_0_7 } from './v1.2.0.7'
import { v_1_2_0_8 } from './v1.2.0.8'
import { v_1_2_0_9 } from './v1.2.0.9'
/**
* Version graph for the `proof-of-work` package.
@@ -96,9 +97,12 @@ import { v_1_2_0_8 } from './v1.2.0.8'
* float values (e.g. a half-step RPE 7.5 from a local model) before
* the .int() check, so one stray decimal no longer fails the whole
* generation. Parse-only; no schema/data change.
* v1.2.0:9 — Fuzzy-match AI exercises to the library by name (both generate
* flows): "Overhead Press" auto-maps to "Overhead Press (barbell)";
* ambiguous names stay manual. Client-only; no schema/data change.
*/
export const versionGraph = VersionGraph.of({
current: v_1_2_0_8,
current: v_1_2_0_9,
other: [
v_1_0_0_1,
v_1_0_0_2,
@@ -123,5 +127,6 @@ export const versionGraph = VersionGraph.of({
v_1_2_0_5,
v_1_2_0_6,
v_1_2_0_7,
v_1_2_0_8,
],
})