3.3 KiB
Harden AI Analysis Path Design
Overview
This change is an in-place hardening pass over the existing AI MVP. It keeps the current module boundaries and synchronous workflow, then adds tests and narrows citation behavior.
Boundaries
Backend AI module
modules/ai/types.ts- Keep runtime validators as the source of truth for output shape.
- Add/adjust helpers only if needed for citation ID validation.
modules/ai/server/analysis.ts- Validate model output against the allowed citation set before persisting a completed history row.
- Derive final persisted/display citations from citation IDs actually referenced by findings/recommendations.
- Keep all provider and validation failures sanitized.
modules/ai/server/knowledge.ts- Preserve current save-time embedding and scope-filtered retrieval behavior.
- Add tests around existing behavior rather than introducing background embedding state.
API routes
app/api/ai/elders/[id]/analyses/route.tsapp/api/ai/knowledge/route.tsapp/api/ai/knowledge/[id]/route.ts
Route behavior stays unchanged except tests protect permission ordering, structured failures, and audit behavior.
Frontend
modules/ai/components/KnowledgeManagementClient.tsx- Make AI configuration / vector generation failures more explicit.
modules/ai/components/ElderAiAnalysisDialog.tsx- Make failed latest history state clearer without exposing raw errors.
Permissions
modules/core/server/permissions.ts- Clarify
ai:manageas reserved/currently governance-oriented wording only.
- Clarify
Citation Contract
Allowed citations are built by buildElderAiContext plus knowledge retrieval. The model may reference only these IDs.
Final persisted result.citations must be derived from actual references:
- Collect citation IDs from all
keyFindings[].citationIdsandrecommendations[].citationIds. - If any referenced ID is absent from the allowed citation map, reject the output as
schema_validation_failed. - Persist/display only the allowed citations whose IDs were referenced.
- Preserve stable ordering from the original allowed citation list.
This avoids showing unused evidence and prevents hallucinated source IDs.
Test Strategy
Tests should mock database/provider boundaries and assert observable contracts, not implementation details.
- Validator tests use pure functions.
- Knowledge tests mock
getDatabaseandOpenAIEmbeddingsor use light fake query builders where practical. - Analysis tests mock config, elder context, knowledge retrieval, model invocation, database insert, and audit logging.
- Route tests mock
requirePermission, AI services, validation as needed, and audit logging.
Compatibility
No new dependency is required.
Deployment hardening additionally changes the still-unapplied 0007 AI migration from pgvector to JSONB embeddings, so production PostgreSQL 18 Alpine can run the migration without a vector extension.
Existing persisted resultJson.citations remain readable; new analyses will have stricter citation lists.
Rollback
- Revert citation strictness if a provider cannot satisfy citation references, but keep tests documenting expected loosened behavior.
- Revert UI message changes independently if copy causes product concern.
- Tests are additive and can stay even if implementation is adjusted.