- 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>