Files
ThothII/harness/tht/session/artifacts.py
T

47 lines
1.8 KiB
Python

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())