Skip to content

ADR-118: Four-Level Configuration Hierarchy

Status: Accepted Date: 2026-02-02 Issue: #297 Supersedes: ADR-102

Context

ADR-102 established a three-level configuration hierarchy (Entity > Resource > System). However, this design lacks a way to set entity-wide defaults that apply to all resources for that entity without duplicating configuration for each resource.

Operators need to set per-entity defaults (e.g., premium tier limits) that apply across all resources, while still allowing resource-specific entity overrides for edge cases.

Decision

Extend the hierarchy to four levels: Entity (resource-specific) > Entity (_default_) > Resource > System > Constructor defaults.

When resolving limits for acquire(entity_id, resource): 1. Check entity config for the specific resource 2. Check entity config for _default_ (fallback for all resources) 3. Check resource-level defaults 4. Check system-level defaults 5. Use constructor override parameter

Entity _default_ config is treated as a default for TTL purposes (TTL applied), distinguishing it from resource-specific entity config (no TTL).

Consequences

Positive: - Premium users can have elevated limits on all resources with a single config entry - Resource-specific entity overrides still take precedence when needed - Backward compatible—existing three-level configs work unchanged

Negative: - One additional cache lookup per resolution when entity+resource config misses - Slightly more complex resolution logic

Alternatives Considered

Keep three-level hierarchy

Rejected because: Operators would need to duplicate entity config for every resource, which is error-prone and tedious.

Treat entity _default_ as custom config (no TTL)

Rejected because: Entity _default_ is semantically a default, not a resource-specific customization; TTL should apply.