NarrativeContext
Everything the narrative finders read, gathered once.
A finder is a pure function of this context, so adding one never changes what the others see and the whole narrative can be regenerated from a graph plus the optional side reports. Fields that come from a task the user may not have run (churn, hidden coupling) default to empty rather than being nullable - a finder that needs them simply produces nothing, which is the honest result.
Parameters
The module dependency graph.
Structural metrics, computed once by GraphMetrics.compute.
Whole-graph summary (cycles, coupling, god modules).
Rule violations from the current run, if rules are configured.
Declared layers, in declaration order. Empty when none are declared.
Declared team → module glob patterns. Empty when none are declared.
Per-module commit counts from aalekhTemporal. Empty when it has not run.
Strongly co-changing pairs with no declared dependency, from aalekhTemporal.
How the project is built: plugins, catalogs, toolchains, targets, CODEOWNERS, and declared module metadata. BuildInventory.EMPTY for a graph extracted before this existed.
Contributions from third-party FindingProviders and ModuleClassifiers. ExtensionResult.EMPTY when no extension jar is on the classpath.
Constructors
Properties
Modules sorted by influence, most foundational first.
Commit counts keyed by module, empty when aalekhTemporal has not run.
True when any ownership source is configured at all - otherwise ownership findings stay quiet.
True when the project is large enough for a claim about proportions to mean anything.