Deliberately never throws on a data-quality finding (a compatibility
issue, an undocumented variable, an abandoned contract, ...) -- every one
of those becomes a Finding in the returned model's finding field
instead. This is a real difference from generateEnvManifest(), which
throws by default: that's a "should I write this artifact" gate, while
Evidence Model assembly is a read-only snapshot whose entire purpose is
representing such issues as data for a consumer's own projection to act
on (see ADR 0024's mission statement). It still throws
EnvProjectGenerationError for a genuine configuration error --
previousSnapshotLocation escaping root.
The dependency-graph scan underlying Dependency Model (via
buildDependencyModel()) and the one underlying Finding Model's
ownership-related findings (via computeUsage()) each run their own,
independent pass over the repository -- a real, accepted cost of calling
each half's already-tested public building block directly rather than
hand-deriving a second copy of either's logic here. Both are Node-only,
dev/CI-time-only work (never a runtime hot path), so the redundant I/O is
an honest tradeoff, not an oversight.
Node-only assembly orchestrator (ADR 0024, ADR 0031): runs schema discovery and linking once (via
assembleProject(), shared withcomputeArtifacts()), then builds all seven canonical fact models by calling each model's own public builder directly -- this function introduces no derivation logic of its own, only sequencing and the shared discovery/linking every builder needs. The result isdeepFreeze()-d before being returned.