core/recognition/registry.py
Shay 9bbdcc96aa
feat(W-008): L10 Shape B hybrid engine-state persistence (#271)
* ci: re-trigger full-pytest

* docs: ADR-0146 — L10 Shape B hybrid engine-state persistence

* feat(W-008): Shape B engine-state persistence spike (ADR-0146)

* fix(W-008): eval isolation + env-var path + empty-manifest guard

- evals/run_cognition_eval.py: all ChatRuntime() calls pass no_load_state=True
  so parallel eval workers never touch engine_state/ checkpoints
- engine_state/__init__.py: honour CORE_ENGINE_STATE_DIR env var (ADR-0146 spec)
- engine_state/__init__.py: load_manifest() skips empty file instead of crashing
  (defensive against partial writes in concurrent contexts)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

---------

Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-25 11:45:54 -07:00

40 lines
1.1 KiB
Python

"""RecognizerRegistry -- per-teaching-set recognizer store (ADR-0146).
Holds DerivedRecognizer instances keyed by teaching_set_id. Wired into
EngineStateStore for Shape B persistence. Empty registry is the valid
initial state (no teaching examples yet).
"""
from __future__ import annotations
from recognition.anti_unifier import DerivedRecognizer
class RecognizerRegistry:
def __init__(self) -> None:
self._registry: dict[str, DerivedRecognizer] = {}
def register(self, recognizer: DerivedRecognizer) -> None:
self._registry[recognizer.teaching_set_id] = recognizer
def get(self, teaching_set_id: str) -> DerivedRecognizer | None:
return self._registry.get(teaching_set_id)
def all(self) -> list[DerivedRecognizer]:
return list(self._registry.values())
def __len__(self) -> int:
return len(self._registry)
@classmethod
def from_recognizers(
cls,
recognizers: list[DerivedRecognizer],
) -> "RecognizerRegistry":
reg = cls()
for recognizer in recognizers:
reg.register(recognizer)
return reg
__all__ = ["RecognizerRegistry"]