Task #21. The verification page used to manage a separate VerificationItem
entity that the expert had to populate by hand — disjoint from the actual
mitigations list. With the is_relevant flag from migration 029, the
verification step has a natural definition: confirm completion for every
mitigation the expert flagged as relevant for this project.
Page is now a derived view on useMitigations(): filter is_relevant=true,
group by title (same dedupe as Massnahmen page), expose two actions per
hazard×mitigation row:
1. "Kundenstandard" — already implemented at the customer's site, no
evidence file required. Sets is_customer_standard=true and
status='verified'.
2. "Verifizieren…" — opens a modal asking for a textual evidence
reference (Prüfprotokoll-Nr, audit reference, etc.). Calls the
existing POST /mitigations/:mid/verify with verification_result.
File upload is deferred to phase 2 once an object-storage backend
is in place — the modal explains this.
When a row is verified, a "Zurücksetzen" link reverts status to
'implemented' for accidental confirmations.
Header counters: total relevant / open / verified / Kundenstandard.
Maßnahmen-page polish (same commit):
- "Lösch."-column header removed — the trash icon is self-explanatory
- groupByTitle now additionally deduplicates by hazard_id within a
group (engine occasionally emits duplicate (name, hazard_id) pairs
when Reinit is clicked twice; a follow-up migration 030 will add
a UNIQUE constraint to prevent these upstream)
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
- SuggestEvidenceModal: Suchfeld + max 20 Ergebnisse statt alle Kacheln
- Verification page: Mitigations nur on-demand laden (nicht beim Seitenstart)
- Deutlich schnellerer Seitenaufbau
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Phase 5 — Frontend Integration:
- components/page.tsx: ComponentLibraryModal with 120 components + 20 energy sources
- hazards/page.tsx: AutoSuggestPanel with 3-column pattern matching review
- mitigations/page.tsx: SuggestMeasuresModal per hazard with 3-level grouping
- verification/page.tsx: SuggestEvidenceModal per mitigation with evidence types
Phase 6 — RAG Library Search:
- Added bp_iace_libraries to AllowedCollections whitelist in rag_handlers.go
- SearchLibrary endpoint: POST /iace/library-search (semantic search across libraries)
- EnrichTechFileSection endpoint: POST /projects/:id/tech-file/:section/enrich
- Created ingest-iace-libraries.sh ingestion script for Qdrant collection
Tests (123 passing):
- tag_taxonomy_test.go: 8 tests for taxonomy entries, domains, essential tags
- controls_library_test.go: 7 tests for measures, reduction types, subtypes
- integration_test.go: 7 integration tests for full match flow and library consistency
- Extended tag_resolver_test.go: 9 new tests for FindByTags and cross-category resolution
Documentation:
- Updated iace.md with Hazard-Matching-Engine, RAG enrichment, and new DB tables
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>