# tinker_cookbook.stores.RunRegistry ## *class* [**tinker_cookbook.stores.RunRegistry**](https://github.com/thinking-machines-lab/tinker-cookbook/blob/main/tinker_cookbook/stores/registry.py#L50)() Discovers training runs and provides stores for each. Supports multiple storage backends. Each run is tracked with its source storage so stores route to the correct backend. ### *property* [**storage_count**](https://github.com/thinking-machines-lab/tinker-cookbook/blob/main/tinker_cookbook/stores/registry.py#L72) Number of storage backends registered. **Returns:** *int* ### *property* [**primary_storage**](https://github.com/thinking-machines-lab/tinker-cookbook/blob/main/tinker_cookbook/stores/registry.py#L77) The first (default) storage backend. **Returns:** *[Storage](https://tinker-docs.thinkingmachines.ai/cookbook/api-reference/stores/storage/index.md)* ### [**storage_for**](https://github.com/thinking-machines-lab/tinker-cookbook/blob/main/tinker_cookbook/stores/registry.py#L81)(*run_id*) Return the storage backend that owns a run (falls back to primary). **Parameters:** - [**run_id**](https://github.com/thinking-machines-lab/tinker-cookbook/blob/main/tinker_cookbook/stores/registry.py#L81) (*str*) **Returns:** *[Storage](https://tinker-docs.thinkingmachines.ai/cookbook/api-reference/stores/storage/index.md)* ### [**refresh**](https://github.com/thinking-machines-lab/tinker-cookbook/blob/main/tinker_cookbook/stores/registry.py#L85)() Re-scan all storages. Clears cached stores. **Returns:** *list\[[RunInfo](https://tinker-docs.thinkingmachines.ai/cookbook/api-reference/stores/runinfo/index.md)\]* ### [**get_runs**](https://github.com/thinking-machines-lab/tinker-cookbook/blob/main/tinker_cookbook/stores/registry.py#L103)() Return all discovered runs (lazy — calls `refresh` on first access). **Returns:** *list\[[RunInfo](https://tinker-docs.thinkingmachines.ai/cookbook/api-reference/stores/runinfo/index.md)\]* ### [**get_run**](https://github.com/thinking-machines-lab/tinker-cookbook/blob/main/tinker_cookbook/stores/registry.py#L110)(*run_id*) Look up a single run by ID, or `None` if not found. **Parameters:** - [**run_id**](https://github.com/thinking-machines-lab/tinker-cookbook/blob/main/tinker_cookbook/stores/registry.py#L110) (*str*) **Returns:** *[RunInfo](https://tinker-docs.thinkingmachines.ai/cookbook/api-reference/stores/runinfo/index.md) | None* ### [**get_training_store**](https://github.com/thinking-machines-lab/tinker-cookbook/blob/main/tinker_cookbook/stores/registry.py#L117)(*run_id*) Get a TrainingRunStore for a specific run. **Parameters:** - [**run_id**](https://github.com/thinking-machines-lab/tinker-cookbook/blob/main/tinker_cookbook/stores/registry.py#L117) (*str*) **Returns:** *[TrainingRunStore](https://tinker-docs.thinkingmachines.ai/cookbook/api-reference/stores/trainingrunstore/index.md)* ### [**get_eval_store**](https://github.com/thinking-machines-lab/tinker-cookbook/blob/main/tinker_cookbook/stores/registry.py#L126)() Get the EvalStore if eval data exists (cached after first call). Returns None if no eval data found. Import is deferred to avoid circular deps with eval/**init**.py. Probes `eval_prefixes` (configurable via constructor) for a `runs.jsonl` file. **Returns:** *Any | None*