- Add AIProvenance + AIResponse<T> to IAIService — all 11 methods now
return structured provenance (provider, model, source, fallbackUsed,
validationPassed) instead of bare ItemResponse<T>
- Add schemas.ts with Zod schemas for all 8 AI response types;
validateAIResponse() utility returns null on failure, never throws
- Rewrite OpenRouterAIService: every method validates AI JSON against
its Zod schema; failed validation triggers MockAIService fallback
with fallbackUsed:true — no invalid data can reach the UI
- Fix MockAIService.generateFollowUpQuestions: replace broken
mockParseNeed(JSON.stringify(criteria)) with direct ParsedNeedCriteria
field inspection; returns max 3 prioritised FollowUpQuestion objects
- Add provenance: mockProvenance() to all MockAIService responses
- Improve decisionBriefPrompt: structured JSON schema example,
confidence vocabulary, availability disclaimer
- Improve matchExplanationPrompt: score-tier vocabulary, isFutureSignal
flag forbids confirmed-availability language for future signals
- Add 102 new tests: mustHaveScorer (16), softFactorEnrichment (38),
aiSchemas (52) — 154 total, all passing; 0 TypeScript errors
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
IAIService:
+ generateMatchExplanation, summarizeTradeOffs, generateDataQualitySummary,
classifyMarketSignal (4 new methods covering all documented AI output types)
OpenRouterAIService:
- All 11 methods now make real API calls via withFallback() pattern
- Every fallback is explicit (console.warn/error) — no silent mock bleed-through
- Proper JSON extraction with type-safe parsers, no any casts
- parseNeed: AI JSON → ParseNeedResult mapping (no TODO stubs)
- generateFollowUpQuestions, generateMatchExplanation, summarizeTradeOffs,
generateDataQualitySummary, classifyMarketSignal, generateOfferEmail,
extractCriteria, generateFollowUp: fully implemented
Prompts: +followUpQuestionsPrompt, +tradeOffPrompt, +dataQualityPrompt, +marketSignalPrompt
Factory (index.ts):
- VITE_AI_PROVIDER=mock|openrouter (new, takes priority)
- VITE_USE_REAL_AI=true still supported (legacy compat)
- Missing API key → explicit console.warn + MockAIService fallback
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>