from pathlib import Path from tht.decisions import DecisionRecord from tht.session.models import SchemaLinking def _find_evidence_file(evidence_root: Path, evidence_id: str) -> str: # New deployments resolve only immutable materialized files from ACTIVE. Keep # the legacy curated-tree fallback for sessions created before a corpus exists. corpus_root = evidence_root.parent.parent / "corpus" if corpus_root.exists(): from tht.corpus.store import CorpusStore from tht.search.evidence import resolve_evidence_file return resolve_evidence_file(CorpusStore(corpus_root), evidence_id) for match in evidence_root.rglob(f"{evidence_id}.md"): return str(match) return "" def build_evidence_entries( decisions: list[DecisionRecord], linking: SchemaLinking, evidence_root: Path, ) -> list[dict]: """Elenco {id, file, esito, decision_seq}: evidence citate nello schema linking (esito 'usata') e decisioni esplicite del reviewer (accettata/scartata, che prevalgono sul linking).""" entries: dict[str, dict] = {} for candidate in linking.candidates: for evidence_id in candidate.evidence: entries.setdefault(evidence_id, { "id": evidence_id, "file": _find_evidence_file(evidence_root, evidence_id), "esito": "usata", "decision_seq": candidate.decision_seq, }) for d in decisions: if d.type not in ("evidence_accepted", "evidence_rejected"): continue entries[d.subject] = { "id": d.subject, "file": _find_evidence_file(evidence_root, d.subject), "esito": "accettata" if d.type == "evidence_accepted" else "scartata", "decision_seq": d.seq, } return list(entries.values())