fix(evidence): bind corpus to workspace identity

This commit is contained in:
2026-07-12 05:57:23 +02:00
parent 78ff360882
commit db35ddb041
6 changed files with 109 additions and 10 deletions
+13 -5
View File
@@ -85,6 +85,16 @@ class CorpusPipeline:
self.retain_published_generations = retain_published_generations
self.workspace_id = workspace_id
def _assert_workspace_binding(self) -> None:
manifest = self.store.active_manifest()
if manifest is None:
return
persisted = manifest.metadata.get("workspace_id")
if persisted != self.workspace_id:
raise PipelineError(
"corpus belongs to a different workspace; use a new corpus root or explicit rebuild"
)
def _protected_generations(self, workspace_root: Path) -> set[str]:
protected = {value for value in (self.store.active_generation(),) if value}
runs = workspace_root / ".tht-jobs" / "evidence" / "runs"
@@ -102,11 +112,7 @@ class CorpusPipeline:
return protected
def gc(self, *, workspace_root: Path, dry_run: bool = False) -> dict:
active_manifest = self.store.active_manifest()
if active_manifest is not None:
persisted_workspace = active_manifest.metadata.get("workspace_id")
if isinstance(persisted_workspace, str):
self.workspace_id = persisted_workspace
self._assert_workspace_binding()
published = self.store.published_generations()
list_vectors = getattr(self.vector_store, "list_evidence_generations", None)
vector_generations = set(list_vectors("evidence", self.workspace_id)) if list_vectors else set()
@@ -166,11 +172,13 @@ class CorpusPipeline:
def run(self, *, dry_run: bool = False, resume: str | None = None) -> PipelineResult:
with self.store.writer_lock():
self._assert_workspace_binding()
return self._run(dry_run=dry_run, resume=resume)
def run_as_job(self, **kwargs) -> PipelineResult:
self.workspace_id = kwargs["workspace_id"]
with self.store.writer_lock():
self._assert_workspace_binding()
return self._run_as_job(**kwargs)
def _run_as_job(