# pkg/loader

Abstract **component loader** pattern: shared state as atomics, callback on state change, configurable timeouts (default config + profile/thematic overrides). The **retryable component** is implemented as **`Runner`**: one-shot load with wait-for-completion channel and timeout.

- **Design:** Component loader pattern with atomic state, retryable `Runner`, and timeout cascading.
- **Types:** `LoadState`, `LoaderTimeoutConfig`, `StateChangeCallback`, `ComponentLoader`, `LoadFn`
- **Runner:** `NewRunner(name, loadFn, opts...)`, `Load(ctx)`, `ResetLoaded()`, `WithCallback`, `WithTimeoutConfig`
- **Config:** `LoadLoaderTimeoutConfig(configPath)`, `MergeLoaderTimeoutOverrides(base, overrides)`, `GetLoaderTimeoutConfig(loaderName)`

**Loaders using Runner:** ID validator (`id_patterns`), `BucketingConfigRegistry` (`bucketing_config`), `BucketStrategyLoader` (`bucket_strategy_loader`), `SpecLoader.EnsureReady` (`spec_loader`), `LifecycleLoader.EnsureReady` (`lifecycle`), `KindSynonymResolver.Initialize` (`kind_synonym_resolver`).

**Retries:** This package configures **timeouts** only (wait-for-completion, publish-channel, load-operation). It does **not** configure retries (retry on load failure). Retries are in `pkg/storage/operation_helper.go` (RetryConfig), `pkg/graph/provider/retry.go`, and scheduler job config (`retry_count`, `retry_delay_seconds`).
