Skip to content
← How we build

adr

ADR-005: Centralize All Registry Configuration Under config/

Status

Accepted

Context

Phase 1 v1 placed skills/registry.yaml and tools/registry.yaml inside their respective source packages (backend/src/skills/, backend/src/tools/), while routing configuration already correctly lived under top-level config/routing/. This inconsistency was flagged in review: it contradicts the project's own stated principle of configuration-driven architecture and creates two different conventions for what is conceptually the same kind of artifact (a registry mapping names to implementations/config).

Decision

Move all registry configuration to a single top-level hierarchy:

config/
├── routing/
│   ├── skills_routing.yaml
│   └── thresholds.yaml
├── skills/
│   └── registry.yaml
└── tools/
    └── registry.yaml

backend/src/skills/ and backend/src/tools/ retain only code: base contracts, concrete Skill/Tool classes, and the loader logic that reads the corresponding config/ file. backend/src/config/settings.py gains explicit path settings (SKILLS_REGISTRY_PATH, TOOLS_REGISTRY_PATH) alongside the existing routing config paths.

Alternatives Considered

A. Leave registries in src/, only routing config in config/ (status quo) Rejected: this is the exact inconsistency the review flagged — no principled reason exists for routing config to be external while functionally identical Skill/Tool registries are not.

B. Put everything, including secrets, in config/ Rejected: secrets (API keys, credentials) correctly remain in .env/settings.py, never committed as YAML. config/ is for non-secret, structural/behavioral configuration only — this ADR does not change that boundary.

C. A single monolithic config/app.yaml for routing + skills + tools Rejected: the three concerns (routing rules, skill registry, tool registry) have different owners conceptually and change independently; keeping them in separate files under a shared top-level directory preserves clarity without forcing a shared schema across unrelated concerns.

Consequences

Positive:

  • One consistent place (config/) for every non-secret behavioral configuration artifact — matches the architecture documentation's own descriptions exactly, reducing "the docs say one thing, the repo does another" drift.
  • Environment-specific overrides (e.g. disabling a Skill in staging, pointing at a different Tool provider) become a config/ concern, deployable independently of a code build.
  • No schema or interface changes — this is a pure file relocation plus two settings-path updates.

Negative / accepted tradeoffs:

  • Minor migration cost (two file moves, two path constants) — accepted as low-risk since, as of this revision, Phase 1 has not yet been implemented in code, so there is no runtime data migration, only a documentation update ahead of implementation.

Interview Talking Point

Consistency of convention matters as much as the convention itself — having one correct pattern (routing config external) sitting next to a different, incorrect pattern (skills/tools config internal) is worse for maintainability than either extreme applied uniformly. This ADR is really about closing that gap before it gets implemented and copied forward.

Source: docs/adr/ADR-005-centralized-configuration.md

Follow the work.

Occasional updates on SignalFoundry, MarketCompass, and what we are building at CompassFoundry Labs.

No spam. Unsubscribe anytime.