3.2 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 database migration is required for this hardening pass.
No new dependency is required.
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.