2. Architecture Constraints
What was fixed before any design decision was made, and therefore shaped all of them.
2.1 Technical constraints
Constraint |
Detail |
|---|---|
Python, near-stdlib |
|
|
Sets the language floor. Newer syntax is only usable behind |
Single-process CLI, no daemon |
denver is invoked, resolves config, runs stages, and then |
Runnable without installation |
|
Version derived from git tags |
|
Subprocess-shaped integration with every tool |
denver never imports |
Config is data, not a language |
|
100 % coverage, enforced |
|
Cognitive-complexity gate |
|
Lint, type and security gates |
ruff (lint + format), mypy, pyright, bandit and pip-audit all run in |
2.2 Organizational constraints
Constraint |
Detail |
|---|---|
|
Nothing under |
Pre-1.0: breaking changes are made directly |
The schema has been renamed repeatedly within its own lifetime ( |
Docs live beside the code |
|
|
|
2.3 Conventions
Convention |
Detail |
|---|---|
Kebab-case in config, snake_case in Python |
|
Runtime toggles come only from flags |
|
Fail loud on the unexpected |
An unknown top-level key, an unknown key in a stage’s section, a stage id that isn’t declared, a provider that isn’t registered — each is a fatal error naming the mistake (and, where possible, the closest match), never a silent no-op. |
|
|