| """evidence_score_node — ISA 500 evidence score per-doc. | |
| Separate entry point (NOT Send-fan-out via the domain checks) because the | |
| score depends on doc_type and produces a per-document info-level risk. | |
| """ | |
| from __future__ import annotations | |
| from domain_checks import EvidenceScoreCheck | |
| from graph.states.pipeline_state import PipelineState, ProcessedDocument | |
| async def evidence_score_node(state: PipelineState) -> dict: | |
| documents: list[ProcessedDocument] = state.get("documents") or [] | |
| check = EvidenceScoreCheck() | |
| risks: list = [] | |
| for doc in documents: | |
| if doc.classification is None: | |
| continue | |
| doc_risks = check.apply( | |
| extracted=doc.extracted.raw if doc.extracted else {}, | |
| doc_type=doc.classification.doc_type, | |
| ) | |
| for r in doc_risks: | |
| r.affected_document = doc.ingested.file_name | |
| risks.extend(doc_risks) | |
| return {"risks": risks} if risks else {} | |