SmartSight Coach LoRA fine-tunes

LoRA fine-tunes for the SmartSight AI coach — an on-device fitness and nutrition coach that runs entirely on the phone, no account and no server round-trip. Converted to .litertlm for Android/iOS inference. → smartsight.app/ai-coach

Built and maintained by Niclas Bade.

Base model changed at v42 (2026-08-12). v27–v38 were fine-tuned from google/gemma-4-E2B-it. Everything from v42 on is fine-tuned from Google's quantization-aware-trained checkpoint google/gemma-4-E2B-it-qat-q4_0-unquantized, whose weights are conditioned to survive 4-bit rounding. The frontmatter above reflects the CURRENT parent, so the model tree matches what actually shipped. This repo keeps the current best checkpoints plus earlier superseded milestones for history — not every candidate tested each round. Rounds that lose are documented internally with their real failure cases; they are never uploaded here.

More coming. The vision tower is being trained surface by surface — body fat, meal photos and nutrition-label reading — each measured against held-out data before anything ships. Progress and honest limitations for every round are written up below and at smartsight.app/ai-coach.

smart-coach-vision.litertlm — CURRENT CHAMPION (v139)

Promoted 2026-08-30. sha256 da4a5d9bea7e6b13…, 2,795,655,584 bytes. Lineage: v27 → v31 → v34 → v38 → v42 → v44 → v46 → v47 → v48 → v51 → v54 → v55 → v69 → v85 → v127 → v134 → v137 → v138 → v139.

The first model in this project that can answer in half points — and the first that reads the lean end correctly. The lean band has been the open defect since v69 and every round since has failed to close it.

surface v138 v139
invents a number on non-body photos (58) 2/58 0/58
mean error, 21 real photographs 2.26 2.11 pp
mean error, 47-photo set 2.99 2.73 pp
counted vision test cases 131/133 133/133
ranking correlation, 12 distinct men +0.688 +0.806
regression slope (1.0 = tracks truth) 0.777 0.930
DEXA reference photo, mean error (9 encodings) 2.39 1.22 pp
DEXA reference photo, within 1.5 points 1/9 6/9
answers in half points no yes

The lean end. On the DEXA-measured reference photograph (truth 7.5%) v138 answers only 6 or 10 — it has no way to say 7.5, and giving it a prompt that explicitly permits halves changes nothing, because the capability was never trained. v139 answers 7.5 exactly on 4 of 9 encodings and sits within 1.5 points on 6 of 9. Mean bias against DEXA falls from +2.06 to +0.78 pp.

It also stopped inventing bodies. On 58 photographs with no person in them it declines all 58, answering "no person visible" every time. v138 invents a body-fat number on 2 of them.

⚠️ It needs the prompt below. This model is unusually sensitive to prompt wording, and the reason is a defect in its own training data: half-point targets were introduced without updating the training prompt, so 889 of 4,494 training rows pair an instruction reading "ONE WHOLE NUMBER" with an answer of "7.5%". One row in five teaches it to disobey its own instruction. Removing the explicit number list from the prompt — replacing it with, say, "any value from 3 to 45" — pushes readings up by more than a point and makes the value 7.5 disappear from its answers entirely. The next round tests the fix directly. Until then, ship this text:

You are a fitness physique analyst. Reply with ONLY:
1) a body-fat percentage you read from the photo (e.g. "14%" or "14.5%"), not a range, then
2) one short sentence on what you based it on (muscle definition, midsection, vascularity).
The SUBJECT is male. Visual body-fat guide — read the midsection and give ONE number, whole or half. Every number is available (1, 2, 3, 4, 5, 6, 7, 8, 9, 10 and up, and halves such as 7.5), not just the ones named here: 4 stage-shredded, striations across the abs and vascularity; 6 very lean, deep ab cuts, visible obliques, dry tight waist; 8 lean, all abs clear and separated, some vascularity; 10 lean, clear abs, smooth skin; 12 upper abs clear, lower abs faint; 15 faint abs, slight softness; 18 abs not visible, midsection flat but soft; 22 some belly; 27 soft midsection; 32+ rounder midsection and limbs.
If a person's midsection is visible, ALWAYS commit to a number - NEVER say you need or are missing height, age, sex, weight or measurements, and never ask for more information. If the image shows NO person, say "no person visible" and give no number.
Visual estimates tend to read a few percent high, so be realistic. Striations, abdominal veins and thin skin CONFIRM a single-digit reading when visible; if the photo cannot resolve them, judge by ab separation and how tight and dry the waist looks rather than defaulting upward.

⚠️ The DEXA figures are one subject at nine encodings, not a population result. It is the reference photograph this project has always used, and it is n=1.

⚠️ A prompt-handling bug in our own harness first rejected this model. The evaluation driver hardcoded a different prompt file for four of its five surfaces, and under that prompt v139 invents numbers on 29 of 58 blank images. Re-run with the prompt above it declines all 58. The table is the corrected measurement; the earlier one was measuring the wrong thing.

smart-coach-vision.litertlm — previous champion (v138)

Promoted 2026-08-30. sha256 8c9647a4fa963a38…, 2,795,655,584 bytes. Lineage: v27 → v31 → v34 → v38 → v42 → v44 → v46 → v47 → v48 → v51 → v54 → v55 → v69 → v85 → v127 → v134 → v137 → v138.

Background stability improved threefold and it almost never invents a number for a photo with no body in it. It is NOT more accurate than v137, and on one set it is clearly worse.

surface v137 v138
invents a number on non-body photos (58) 3/58 2/58
same body, background changed — worst swing 10.0 pp 4.0 pp
same body, background changed — mean swing 3.00 pp 1.00 pp
mean error, 21 real photographs 2.42 2.26 pp
mean error, 47-photo set 2.12 2.99 pp
mean error, 33 unseen phone photos 1.70 1.97 pp
within 2 points of truth (104 photos) 64% 54%
coaching-text defects (128 probes) 32 32

⚠️ IT IS LESS ACCURATE THAN THE MODEL IT REPLACED. It is within 2 points on 54% of photographs against v137's 64%, and on the 47-photo set it reads about 1.9 points LOW. It wins more individual photographs than v137 but misses harder when it misses. It was promoted because our test's headline score is a count of answered questions, four of five sets are now maxed out by every model, and the entire margin was a single non-body image. That is a defect in the test, and it is being fixed with harder photographs rather than by changing the model.

⚠️ The lean end is still wrong, and it moved the wrong way. On the owner's own DEXA-measured photographs it reads 7.5% as 10, and 8.0% as 4 — high on one, low on another, on the same person. The lean band has been the open defect since v69 and no round has closed it.

smart-coach-vision.litertlm — earlier champion (v137)

Promoted 2026-08-30. sha256 13074840a35877cf…. Mean error across three photo sets 2.58 → 2.08 pp and invented readings on non-body photos 12/58 → 3/58 — the largest accuracy gain recorded here, and it came from the labels rather than the method: 163 photographs re-judged by a single stronger judge with anchors packed inside the band being judged, nine computer-generated images removed, new real people added, and the 123 scan- or scale-derived labels never overwritten. The round's own experiment (training on a higher share of real photographs) was REJECTED.

smart-coach-vision.litertlm — earlier champion (v134)

Promoted 2026-08-29. sha256 3c361ff4a7c1007d…, 2,795,655,584 bytes. Lineage: v27 → v31 → v34 → v38 → v42 → v44 → v46 → v47 → v48 → v51 → v54 → v55 → v69 → v85 → v127 → v134.

Refusal on non-body photographs took its largest step, and the coach-question regression that shipped with v127 is reversed.

surface v127 v134
non-body images declined (58) 33/58 46/58
real photographs answered (23) 22/23 23/23
second photo set answered (49) 48/49 49/49
unseen photographs answered (33) 33/33 33/33
lean subjects answered (3) 3/3 3/3
counted vision test cases 139/166 154/166
coach questions (128 cases, two seeds) 105 / 105 127 / 127
background-swap, worst photo PASS 4.0 6.0
refuses a real body (must stay 0) 0 0

Measured against v127 re-run in the same session, on the same photo sets, every arm and the champion on the same backend per surface. Coach questions are scored with the merged scorer (v54), which is the only one validated for ranking; the two earlier scorers each fail in a known direction on a different suite and neither may be used alone.

Read the caveats before quoting the totals.

⚠️ The round this came from FAILED its own hypothesis. v134 tested whether giving the training descriptions twelve wording states instead of six would help the model tell adjacent bodies apart. It did not: rank correlation moved −0.0026 where the smallest detectable change is 0.031, and it moved the wrong way. The change demonstrably reached the model — more distinct values emitted, fewer ties — and converted ties into wrong orderings rather than right ones. This checkpoint won on totals, not on the idea it was built to test.

⚠️ Four of the five vision surfaces are saturated. Real photographs, the second photo set, unseen photographs and lean subjects are at or within one case of ceiling for every arm and for v127. They no longer discriminate between models. Essentially the whole vision gain is the non-body refusal surface.

⚠️ That surface swings hard on the random seed. Three arms of the identical recipe scored 24, 40 and 46 of 58 on it. v127's 33 is a low draw of its own recipe as much as v134's 46 is a high one. This is a real improvement in what ships; it is not a measured recipe advance.

⚠️ The coach-question figure is a correction, not a gain. v127 shipped with a known drop on this suite — its own notes recorded 106 of 128 against v85's 121 and dismissed it as seed noise. Twelve independent arms across two rounds have since scored above it, so that dismissal was wrong. v134 returns to roughly where v85 already was; v127 was the outlier below.

⚠️ Background stability is still worse than v127. v127's worst photo moved 4.0 points across four backdrops; v134's moves 6.0. v85's 10.0 is what put this surface on the card. Reported rather than gated, because one photograph does not decide a model that wins both totals.

⚠️ The lean end is still a bucket, unchanged since v69.

smart-coach-vision.litertlm — earlier champion (v127)

Promoted 2026-08-28. sha256 c9888d35d310da55…, 2,795,655,584 bytes. Lineage: v27 → v31 → v34 → v38 → v42 → v44 → v46 → v47 → v48 → v51 → v54 → v55 → v69 → v85 → v127.

The model can now say "that isn't a person." This card has listed that as an open defect since v55, noting that prompting could not fix it. Training data fixed it — specifically real bodyless photographs rather than synthetic ones.

surface v85 v127
grey / noise rectangles (20) fabricates on 20/20 fabricates on 8/20
real bodyless photos — walls, sofas, pets, food (30) declines 0/30 declines 14/30
unseen bodyless images (38) fabricates on 100% fabricates on 44.7%
background-swap stability FAIL — one photo moved 10.0 pp PASS — worst 4.0
counted vision test cases 104/108 106/108
refuses a real body (must stay 0) 0 0

Asked about a grey rectangle, v85 says "12% — the upper abs are clear." v127 says "I cannot see a person in this image."

Measured against v85 re-run in the same session. The controlled comparison was between arms whose refusal training used real photographs versus synthetic greys only: seed-paired, the real arms fabricated 31.6 pp less (bar set in advance at 22 pp). One synthetic-only arm scored 0/30 — identical to v85. Grey ramps teach a model to decline grey ramps.

⚠️ Honest limits

  • Improved, not solved. Still fabricates on 16 of 30 real bodyless photos.
  • Not the best seed on this surface. Three seeds ran 14, 17 and 24 of 30 declines; the promoted one is 14. Seed spread here is wider than most effects this project measures.
  • Text and day-reference point estimates are lower (106.0 vs 121.5 coach cases; 31 vs 60 relative-date). Neither is resolvable — the 2-sigma bars are 22.7 and 33.5 cases, both wider than the gap. Recorded as numbers, not as established regressions.
  • Body-fat accuracy unchanged within noise: 1.88 → 2.23 pp mean error against a 1.07 threshold.
  • The lean end is still a bucket, unchanged since v69.

smart-coach-vision.litertlm — earlier champion (v85)

Superseded by v127 on 2026-08-28. Kept because it is the model v127 was measured against, and because its body-fat range fix still stands — v127 changes abstention, not the read.

Promoted 2026-08-23. Lineage: v27 → v31 → v34 → v38 → v42 → v44 → v46 → v47 → v48 → v51 → v54 → v55 → v69 → v85. sha256 f9f62c5b9b7c3ee6…, 2,795,655,584 bytes.

Measured against v69 on the same box, same session, same backend, on a 29-row photo set that now includes ten DEXA-measured subjects. Text and follow-ups were run on two eval seeds each.

What improved

surface v69 v85
body fat, 17 real photographs MAE 1.99, slope 0.815 MAE 1.69, slope 1.043
body fat, high end (21 / 24 / 26%) −5.0 / −3.0 / −5.0 pp −5.0 / 0.0 / −2.0 pp
body fat, read bias −1.28 −0.05
coach questions (128 cases, two seeds) 123 / 121 123 / 122
conversational follow-ups (28 cases, two seeds) 17 / 16 16 / 18

The slope is the number that matters. v69 compressed the range — it read high body fat as lower than it was, calling a 24% physique 21 and a 26% physique 21. v85 tracks measured values roughly one-for-one. Coach text and follow-ups are level within noise; nothing was traded away for this.

⚠️ What did NOT change — the lean end

photograph (DEXA truth) v69 v85
5.9% 8 8
8.8% 8 8
10.0% 8 8
12.0% 12 12
13.0% 12 12

Every lean photograph reads identically to the previous model. Three different measured truths — 5.9, 8.8 and 10.0 — all get the same answer, in both models. v69's apparent strength at the lean end was never accuracy; it answers 8 to most lean physiques whatever the true value, and v85 inherits that unchanged. Fixing it needs more DEXA-measured lean subjects, not another training round.

⚠️ Honest limits of this result

  • The gain rests on three photographs. Of 17 real photographs, 13 read identically to v69, 3 improved and 1 got worse. The improvement is concentrated at the high end.
  • Not seed-confirmed — a weaker standard than v69. v69 trained three seeds on one config and won on two independent eval seeds. v85 is a single training seed. In the same round, two runs at effectively the same corpus ratio scored 3.28 and 1.69 — a 1.6-point spread, larger than this model's 0.30-point edge. The artifact measurably scores better; the recipe is not shown to reproduce it.
  • Generated-image holdout is slightly worse, within noise on error but not on bias: MAE 1.97 → 2.03, bias −0.21 → +1.06. Watch this if it grows.
  • Still answers a confident percentage for things that are not bodies (a grey rectangle reads 16–20%). Unchanged from v69 — a known open defect, not a regression.

Champion history — what each round actually fixed

Every entry here was a promoted champion, verified against the previous one on a held-out suite with a full read of every answer. Rejected rounds (v28-v30, v32, v33, v35-v37, v39, v40, v41) are not listed — they are documented internally with their real failure cases.

Round Beat What it fixed Base
v27 baseline first winning fine-tune — shorter, equally accurate general advice gemma-4-E2B-it
v31 v27 exercise-form answers reached the untouched baseline's zero-error record (v27 was wrong on 4/5 direct form questions); no more garbled or duplicated plan output. The unlock was the export recipe, not data — three consecutive data-only rounds failed first, then Hadamard-rotation int4 fixed it with zero retraining gemma-4-E2B-it
v31 export update same weights, AlgorithmName.HADAMARD_ROTATION custom op instead of the decomposed variant: 88% faster decode, ~85 MB smaller, quality statistically unchanged (5.8% vs 6.4% defect rate over 312 generations)
v34 v31 dietary-rule compliance (a "vegetarian, no nuts" request had served peanut butter); first correct full examples for face pull and plank; squat-vs-hip-thrust contrast cases gemma-4-E2B-it
v38 v34 AI challenges: unrealistic targets for low-frequency goals (150 progress photos in six weeks from zero) and non-English requests answering in English. Won over its own alternate seed on a Danish grammar defect — plural "jeres/jer" where the app addresses one person gemma-4-E2B-it
v42 v38 see above — QAT base, blockwise export, and the fenced-JSON data fix. Won over its own alternate seed, which produced a confident wrong number (subtracting a 78 kg bodyweight goal from a 106.7 kg squat 1RM) gemma-4-E2B-it-qat-q4_0-unquantized
v44 v42 Danish macro vocabulary and challenge titles. Measured cause: of 7,288 corpus rows, 13 contained any Danish/Norwegian, zero taught "kulhydrat", and ten demonstrated exactly the wrong behaviour — English macro words inside Danish prose. Localising those ten rows fixed it; /nutrition emission went 5/7 → 7/7 gemma-4-E2B-it-qat-q4_0-unquantized
v46 v44 avoid-list violations eliminated (0/36 vs 5/36) by matching the corpus to the prompt format production actually sends gemma-4-E2B-it-qat-q4_0-unquantized
v47 v46 no retraining — the vision export ran at 140 soft tokens instead of the 280 the checkpoint specifies, so every shipped build saw 48.9% of the pixel area. The asymmetry proved the mechanism: re-exporting at 280 moved body-fat rank correlation in men +0.492 → +0.704 while women were unchanged, because what separates adjacent bands in men is fine texture only a few pixels tall and downscaling is a low-pass filter gemma-4-E2B-it-qat-q4_0-unquantized
v48 v47 conversational follow-ups: the coach dropped the app's own numbers as soon as a user pushed back. Failures 16/24 → 8/24 gemma-4-E2B-it-qat-q4_0-unquantized
v51 v48 stopped abandoning the app's numbers on a user contradiction, and stopped inventing plausible detail it could not see ("right in the middle of where it usually sits" → "I can't tell what your usual is") gemma-4-E2B-it-qat-q4_0-unquantized
v54 v51 read the wrong cell of the 7-day history line: asked "what did I train yesterday?" it answered about TODAY, 18 times out of 32 gemma-4-E2B-it-qat-q4_0-unquantized
v55 v54 the body-fat read was a CONSTANT — 18% for all 42 test photos, and also for a grey rectangle, for pure noise, and for no image at all. Cause was the training data, not the vision tower: a text-only LoRA destroys vision the base model already has (sensitivity fell 0.1164 → 0.0405 across v51→v54 with ZERO vision tensors in the adapter — the language layers consume the image tokens). Mixing ~17% of the vision surface's rows back into the text corpus restored it: MAE 9.13 → 3.42, sensitivity 0.0405 → 0.2183, grey rectangle finally separating from real photos. ⚠️ It also lost the base model's striation detection while gaining the percentage read — capabilities traded, not accumulated, which is why every surface is probed at promotion now gemma-4-E2B-it-qat-q4_0-unquantized
v69 v55 relative-date reads ("what did I train yesterday") 24/32 → 32/32. v55 had a consistent off-by-one — it treated the last day in the 7-day line as yesterday instead of today, then described the wrong row accurately: fluent, confident, wrong. Six earlier rounds tried to train it away and every one made it worse. What worked was teaching the model to STATE THE ANCHOR BEFORE USING IT ("the line ends with Sun, so today is Sun; one back is Sat"), turning an indexing problem into two lookups it could already do. Body fat on 37 unseen ordinary phone photos (bathroom mirrors, kitchens, garages — not studio imagery) 2.88 → 1.88 pp, and the most common single answer fell 43% → 19% of photos. ⚠️ It also introduced a regression, fixed by addition not retreat: 100% of the new rows ask the model to locate a day BEHIND today, so it over-generalised to "behind today = not current" and started saying a logged past session doesn't count (32/32 → 27/32, identical on all three seeds) gemma-4-E2B-it-qat-q4_0-unquantized
v85 v69 body-fat reads on real photographs stopped compressing the range: slope 0.815 → 1.043, mean error 1.99 → 1.69 pp, and the high end went from reading 24% as 21 to reading it as 24. Coach text and follow-ups level on two seeds. ⚠️ the lean end did not move at all — 5.9%, 8.8% and 10.0% all still read 8, exactly as in v69 gemma-4-E2B-it-qat-q4_0-unquantized
v127 v85 gained a category for "this is not a person", the open defect since v55. A plain grey rectangle went from a confident "12%" to "I cannot see a person in this image"; real bodyless photographs — walls, sofas, pets, food — went from 0/30 declined to 14/30. Also fixed background-swap instability: the same body could be moved 10 points by changing the background in v85, worst case 4.0 in v127. The measured cause is the training set, not the objective: arms trained on synthetic greys alone scored 0/30 on real photographs, identical to v85, while arms given 15 real bodyless photographs fabricated 31.6 pp less (seed-paired, bar set in advance at 22 pp). ⚠️ Still fabricates on 16 of 30 real bodyless photographs, and the promoted seed is not the strongest of the three on this surface gemma-4-E2B-it-qat-q4_0-unquantized
v134 v127 Shipped as the downloadable weights on 2026-08-29 but NEVER GIVEN A CARD ROW UNTIL NOW - this entry is added retrospectively so the lineage is not missing a link. Measured on the current evaluation set at promotion time of its successor: composite error 2.58 pp across three photo sets, bodyless fabrication 12 of 58, background-robustness 46 of 58. Its gain over v127 is NOT restated here because v127 was never re-measured on this evaluation set, and a number that was not measured does not go on a public card. gemma-4-E2B-it-qat-q4_0-unquantized
v137 v134 mean error across three photo sets 2.58 -> 2.08 pp and invented readings on non-body photos 12/58 -> 3/58. Cause was the training labels, not the recipe: 163 photographs re-judged by a single stronger judge with anchors packed inside the band being judged, plus new real people. The round's own experiment (real-photo share) was REJECTED - the gain came from label quality gemma-4-E2B-it-qat-q4_0-unquantized
v138 v137 invented readings on non-body photos 3/58 -> 2/58, and background instability cut threefold - the same body on a different background moved 10 points worst-case in v137, 4 in v138. WARNING it REGRESSED on body-fat accuracy: within 2 points on 64% -> 54% of photographs, and the 47-photo set went 2.12 -> 2.99 pp reading about 1.9 low. Promoted on a saturated matrix by a one-image margin gemma-4-E2B-it-qat-q4_0-unquantized
v139 v138 half points, and the lean end — the open defect since v69. v138 answers the 7.5% DEXA reference photo as 6 or 10 and cannot say 7.5 under any prompt, because the capability was never trained; v139 answers 7.5 exactly on 4 of 9 encodings, mean error on that photo 2.39 → 1.22 pp and bias +2.06 → +0.78. Also declines 58/58 non-body photographs against v138's 56/58, and takes the counted vision total 131/133 → 133/133 with no surface regressing. Ranking correlation over 12 distinct men +0.688 → +0.806 with the regression slope 0.777 → 0.930. ⚠️ its training data contradicts itself — 889 rows say "ONE WHOLE NUMBER" and answer "7.5%" — so it is unusually prompt-sensitive and needs the prompt printed above gemma-4-E2B-it-qat-q4_0-unquantized

Recipe constant across every round since v22c: LoRA r=16 / alpha=32 / dropout=0.1, 2 epochs, lr 6e-5, NEFTune noise_alpha=5, completion-only loss masking (train_on_responses_only), per-task validation shards, two seeds per round with the winner chosen on behaviour rather than validation loss. Only the training data, the base, and the export recipe have moved.

Honest current weaknesses

Documented rather than hidden, because they are the targets for the next rounds:

  • Body fat at the lean end: LARGELY FIXED IN v139, and the fix was half points. Through v138 this read as a bucket — DEXA-measured 5.9%, 8.8% and 10.0% photographs all returned 8, three truths and one answer, unchanged from v69 to v85. The cause turned out to be partly the OUTPUT ALPHABET: a model that can only answer in whole numbers cannot express 7.5, and prompting it to do so changes nothing because the capability was never trained. v139 was trained with half-point targets and answers 7.5 exactly on 4 of 9 encodings of the DEXA reference photograph, cutting mean error there 2.39 → 1.22 pp. Remaining gap: this is demonstrated on ONE subject at nine encodings. More DEXA-measured lean subjects is still the lever for proving it generalises.

  • Images that are not bodies: LARGELY FIXED IN v127, not yet solved. This was listed here as unfixable-by-prompting through v85, and it was: a variant instructing the model to reply NOT_A_BODY was ignored, returning byte-identical output. What fixed it was training data — specifically real bodyless photographs, not synthetic ones. A plain grey rectangle now reads "I cannot see a person in this image" rather than "12%". Remaining gap: v127 still returns a percentage for 16 of 30 real bodyless photographs (walls, sofas, pets, plates of food), so the behaviour is much better and still not dependable. More real bodyless photographs is the known lever; synthetic ones were measured to buy almost nothing. v139 update: it now declines all 58 of the bodyless probe set, answering "no person visible" every time, against v138's 56/58. Two cautions: the probe set is largely SYNTHETIC (grey ramps and noise), which is exactly the imagery measured to prove little, and the behaviour depends on the prompt carrying an explicit refusal clause. Real bodyless photographs remain the outstanding fix.

  • The training prompt contradicts the training targets (v139). Half-point targets were added without updating the instruction the model is trained against, so 889 of 4,494 rows pair "ONE WHOLE NUMBER" with an answer of "7.5%". One row in five teaches the model to disobey its own instruction, which is why v139's readings move by more than a point on small prompt edits. The next round tests the repair directly, treated against its own control.

  • Meal-plan portions are sized by habit, not arithmetic. The model anchors on ~100 g portions rather than solving the prompt's stated calorie budget. Mostly invisible in the app, which rescales a day to its target (MealPlanScaler, clamped 0.6x–2.0x) — but one case per model is still off after that clamp, and the underlying arithmetic is unsolved.

  • Avoid-lists are not always respected — foods explicitly banned for variety reappear (2/29 held-out cases on v44, v42 and v38 alike; this is the single defect class that has survived every round so far).

  • Nordic follow-ups about an UNLOGGED past activity regressed in v44. Asked in Norwegian about a hike "yesterday" that is not in the app, v42 correctly said the gap was only a logging omission; v44 answers as though advising about today. 26 Nordic follow-up rows were added to fix exactly this and did not move it — the cause is not simply coverage.

  • Occasional Danish/Norwegian word-formation slips in v44 — "vækning" (not a word) and the hybrid "fat-mål". The macro vocabulary itself is now correct, but morphology is not reliable.

  • The /nutrition command line is improvised. The corpus contains ZERO examples of it; the format lives only in the prompt. v44 emits the line on 7/7 applicable cases (v42 omitted it entirely on 2/7) but drops the trailing fat value on 3/7, so the app applies three of the four fields. Harmless by design — NutritionCommandParser accepts any subset — but the fat target silently stays stale.

  • Within-day duplicate or misplaced exercises still appear occasionally in generated routines (e.g. a chest isolation movement landing in a Legs day). Lower real-world impact than it sounds, since the app's own parser drops duplicate slots.

  • Confabulation-despite-coverage on a few specific lifts (squat/hip-thrust blending, farmer's carry) that does not reliably respond to more training data.

  • Superset pairing — avoiding two competing-muscle compounds back to back — is imperfect.

  • Tight macro-budget precision (±8–10%) is unsolved across every model tested, including the untouched baseline.

Evaluation discipline

Every promote/reject decision reads every row of the eval suite, never a sample — an early round reported a verdict from ~12 of 52 rows and missed hard timeout loops entirely. Prose quality is judged as its own axis alongside structural correctness, because a structurally clean answer can still be flat, templated, or subtly wrong in a second language. Candidates are always compared against both the previous champion and the untouched baseline.

Files

Which file the app fetches

Two files are published. The app decides which one to fetch based on its build version; there is nothing to select and nothing to configure.

file who gets it size
smart-coach-vision.litertlm current champion — text coaching AND vision (body-fat photos, meal photos, nutrition labels) in one model. Fetched by the next app release. 2.80 GB
smart-coach.litertlm text-only, fetched by app builds already installed. Unchanged on purpose. 2.63 GB

Both carry the same v46 coach weights (v47 changes only the vision export, not the weights), so an older build is not stuck on an older coach. They exist side by side because installed builds also fetch a separate 3.66 GB vision model — handing them the larger consolidated file would raise their total download on devices already tight on RAM. See the current-champion section above for what the consolidation actually changes.

  • smart-coach-vision.litertlm — ⭐ current champion, fetched by the next app release. The v46 coach WITH a working vision tower: one model for text coaching, body-fat photos, meal photos and nutrition labels (2.80 GB). The next app release points both the coach and vision URLs here and stops downloading the separate 3.66 GB vision model.
  • smart-coach.litertlmSTABLE, text-only (2.63 GB). The file app builds already in the wild download at runtime on Android and iOS, and the one they keep using. Deliberately left unchanged: those builds also fetch the separate vision model, so giving them the larger consolidated file would raise their total download on devices that are already RAM-constrained. Same v46 coach weights, so nobody is stuck on an older coach for stability's sake.
  • coach.litertlm — the original working int8 build from the v1 era (2.59 GB), kept as the historical starting point.
  • coach-finetuned-int4.litertlm — the first int4 conversion (2.56 GB), kept because it is the artifact that exposed the LiteRT-LM chat-template .get() incompatibility.
  • model.safetensors + config.json + tokenizer files — HF-format artifacts for reference.
Downloads last month
183
Safetensors
Model size
5B params
Tensor type
BF16
·
Inference Providers NEW
This model isn't deployed by any Inference Provider. 🙋 Ask for provider support

Model tree for hanemay/smartsightCoach

Finetuned
(20)
this model