fix(ai): las aldrig gissade utgangsdatum – skarpt prompt + rimlighetssparr

Gemini gissade fel artal pa kryptiska tryckstamplar (t.ex. "2024" pa en farsk
gradde) vilket kan trigga falska "utgangen"-varningar. Tva lager:
- Prompt: modellen far aldrig gissa artal, returnerar null vid tvetydiga/
  kryptiska koder (buildFridgePrompt + buildExpiryPrompt).
- Kod: ny isPlausibleFoodDate() nollar orimligt gamla/framtida datum i
  toDetectedItems. Hellre inget datum an ett felaktigt (spec §13).
promptVersion -> gemini-fridge-v2. Tester 7/7 grona.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WZdew6cWn1MeHqoYWFfxzo
This commit is contained in:
Claude
2026-08-18 11:29:11 +00:00
parent e66d9aee72
commit 5cf9f8ab0d
2 changed files with 50 additions and 6 deletions
+17 -1
View File
@@ -1,5 +1,5 @@
import { describe, it, expect } from "vitest";
import { GeminiAamosClient, MemoryBudgetStore, parseDate } from "../src/gemini.js";
import { GeminiAamosClient, MemoryBudgetStore, parseDate, isPlausibleFoodDate } from "../src/gemini.js";
import type { AamosRequestEnvelope } from "../src/tasks.js";
const FIXTURE_RESPONSE = {
@@ -170,3 +170,19 @@ describe("parseDate (svenska bäst-före-stämplar)", () => {
expect(parseDate("skräp")).toBeNull();
});
});
describe("isPlausibleFoodDate (rimlighetsspärr mot feltolkade årtal)", () => {
const TODAY = new Date("2026-08-18T00:00:00Z");
it("släpper igenom rimliga datum (nära i tid och framåt)", () => {
expect(isPlausibleFoodDate("2026-09-04", TODAY)).toBe(true); // ~2 v framåt
expect(isPlausibleFoodDate("2026-08-01", TODAY)).toBe(true); // nyss passerat
expect(isPlausibleFoodDate("2027-06-01", TODAY)).toBe(true); // torrvara framåt
});
it("kastar orimliga datum grovt feltolkat årtal", () => {
// Grädden i fälttestet: stämpel lästes som 2024 → ~2 år bak = feltolkning, inte utgången vara.
expect(isPlausibleFoodDate("2024-09-26", TODAY)).toBe(false);
expect(isPlausibleFoodDate("2035-01-01", TODAY)).toBe(false); // orimligt långt fram
expect(isPlausibleFoodDate(null, TODAY)).toBe(false);
expect(isPlausibleFoodDate("skräp", TODAY)).toBe(false);
});
});