Nourmio historical photo test: method and reproduction notes Test date: October 22, 2026. Offline verification: October 30, 2026. Model identifier: google/gemini-3-flash-preview via RouterAI. Reasoning: low. Input: one overhead color image for every dish in the official Nutrition5k depth-test list, 507 unique dishes. Reference weight, nutrients and depth data were not supplied to the model. No official train IDs were selected. Scoring: the first returned candidate and the application's calorie calculation. SDK retries: zero. Terminal request retries: zero. Concurrency: two. The existing recognition path's 20-second budget/fallback behavior was retained. Source product-service Git/LF SHA-256: 0146785466e735123ccd5b6c6b3ae3591dac9a70514404297e89d3c61b9ad677 Matching historical source commit: be45331da091e7f5c1d235e2901ab138b2d84876 Frozen protocol SHA-256: 7dda43088d7753b561b3337e33bbde980d73902b00eb1a00960c4c5431e91c3a Official depth test IDs file SHA-256: 6e43a5334a72bd06fa9c0d4b3bc86e2f57e5342b0b260d3fa003a76f7e39eca2 The table contains 507 rows. A usable first candidate was returned for 506. For dish_1557861216 the provider response had no candidates. Its reference is 0 kcal and 1 g. Both predictions remain literal null, rather than numeric zero. All 506 completed calorie references are positive. Calorie error metrics use these 506 pairs, not the failed case and not an imputed prediction. Mean absolute calorie error: 75.27872331620553 kcal. Mean absolute per-dish percentage error: 39.879548501967356%. Sum absolute errors / sum reference calories: 29.408976382329783%. 90th percentile absolute percentage error: 76.08695652173914%. Percentile method: nearest rank, ceil(0.9 * 506), rank 456 using 1-based indexing. Coverage is separate from error. Do not call 506/507 an accuracy percentage. Recalculate from the downloaded CSV using Python's standard library: import csv, math with open('nutrition5k-gemini-2026-10-22.csv', newline='', encoding='utf-8') as f: rows = list(csv.DictReader(f)) pairs = [(float(r['referenceKcal']), float(r['predictedKcal'])) for r in rows if r['status'] == 'completed'] errors = [abs(p - r) for r, p in pairs] percentages = sorted(e / r * 100 for (r, _), e in zip(pairs, errors)) print('attempted', len(rows), 'scored', len(pairs)) print('MAE kcal', sum(errors) / len(pairs)) print('MAPE percent', sum(percentages) / len(pairs)) print('PMAE percent', sum(errors) / sum(r for r, _ in pairs) * 100) print('p90 APE percent', percentages[math.ceil(0.9 * len(pairs)) - 1]) Limitations: this is a dated cafeteria-image test. It does not measure current provider behavior, new iPhone captures, every cuisine, total-sugar accuracy or clinical outcomes. An October 30 comparison found product-service code identical after exact CRLF-to-LF conversion. Current normalization reproduced all saved 507 outputs. Neither comparison is a fresh model inference or a new food study. Other experimental model arms from the historical project are not compared here. Whether the provider model saw Nutrition5k during pretraining is unknown. The official dataset split alone does not establish pretraining independence. Dataset attribution: Quin Thames and colleagues, Google Research, Nutrition5k: Towards Automatic Nutritional Understanding of Generic Food, CVPR 2021. https://arxiv.org/abs/2103.03375 https://github.com/google-research-datasets/Nutrition5k Dataset license: Creative Commons Attribution 4.0 International (CC BY 4.0). https://creativecommons.org/licenses/by/4.0/ The CSV is a derived numerical table combining dataset reference values with saved Nourmio predictions. The reference values were not re-measured by Nourmio. No dataset photographs, provider responses, credentials or personal food logs are included in this download.