Out-of-scope follow-up from #71.
#71's introspection commands answer "what is?". This issue is the "what should be?" companion: an analyser that walks the introspection output and surfaces actionable suggestions.
Examples of what it could suggest
- A binding has 0 dependents → flag as dead code
- A service has >5 transitive dependencies → suggest splitting
- An event has 0 listeners → flag as dead
- A route is registered but no scaffolded spec covers it → suggest scaffolding
- A middleware is declared but not in any pipeline → flag as dead
- A config key is read nowhere → flag as dead env var
Scope (high-level)
- `bin/altair doctor:suggest` (or extend the existing `doctor` command if/when it lands)
- One `SuggestionRule` per heuristic, swappable
- `--severity=warning|info` filter
- `--format=json` for MCP / CI consumption
Why deferred (out of scope for #71)
#71 ships the primitive: a stable, deterministic introspection surface. Building suggestions on top is a separate, layered concern — and the rules need to bed in against real codebases before they're worth shipping.
This is downstream of `bin/altair doctor` more broadly (correctness checks), which is itself a candidate for its own issue.
Out-of-scope follow-up from #71.
#71's introspection commands answer "what is?". This issue is the "what should be?" companion: an analyser that walks the introspection output and surfaces actionable suggestions.
Examples of what it could suggest
Scope (high-level)
Why deferred (out of scope for #71)
#71 ships the primitive: a stable, deterministic introspection surface. Building suggestions on top is a separate, layered concern — and the rules need to bed in against real codebases before they're worth shipping.
This is downstream of `bin/altair doctor` more broadly (correctness checks), which is itself a candidate for its own issue.