import json from datetime import UTC, datetime from tht.evidence import EvidenceReceipt, replace_evidence_receipt from tht.session.filesystem_repository import FilesystemSessionRepository from tht.session.models import PrincipalContext, SessionManifest def test_receipt_replaces_only_its_semantic_stage_without_copying_evidence_content(tmp_path): repository = FilesystemSessionRepository( tmp_path, "workspace-a", PrincipalContext(issuer="test", subject="operator"), root=tmp_path / "sessions", ) session_id = "c2cdbbf5-ae30-432e-8298-837bf55abad9" repository.create(SessionManifest( id=session_id, question="q", database="d", schema="s", created_at=datetime(2026, 8, 24, tzinfo=UTC), )) replace_evidence_receipt(repository, session_id, EvidenceReceipt( stage="clarification", purpose="disambiguation", vector_generation="gen:" + "a" * 32, evidence_ids=("evidence:age",), )) replace_evidence_receipt(repository, session_id, EvidenceReceipt( stage="clarification", purpose="disambiguation", vector_generation="gen:" + "b" * 32, evidence_ids=(), )) replace_evidence_receipt(repository, session_id, EvidenceReceipt( stage="cte", purpose="sql_generation", vector_generation="gen:" + "b" * 32, evidence_ids=("evidence:age", "evidence:procedure"), )) stored = json.loads(repository.read_artifact(session_id, "evidence_receipts")) assert stored == [ {"stage": "clarification", "purpose": "disambiguation", "vector_generation": "gen:" + "b" * 32, "evidence_ids": []}, {"stage": "cte", "purpose": "sql_generation", "vector_generation": "gen:" + "b" * 32, "evidence_ids": ["evidence:age", "evidence:procedure"]}, ]