- Shipped
- 4 Julai 2026, 19:51 UTC
- Author
- Kamo
- Commit
- 923f4e3
D1/D45 broadens BorrowerScenarioProfile consumption. Populates the dormant factsJson and makes it the shared source of truth for borrower/loan facts: - ScenarioFactKeys: single canonical fact-key vocabulary + tier (structural vs enrichment) + normalize(); the D21 whitelist/deriver/consumers reference these. - ScenarioFactDeriver: promotes the D18 LTV/CLTV/HCLTV + categorical derivation out of MLOSPricingService into shared-lib (one home for entity-derived facts). - BorrowerScenarioProfileService: produceFromUrla now populates structural facts (preserving enrichment); resolveFacts() for advisory gap-fill; mergeFacts() write-back that filters to the enrichment tier (genesis owns structural, D45.3). - ScenarioFacts.fillGapsFrom(): advisory merge (request wins, profile fills gaps). - InvestorOverlayMatcher: pure fail-safe matcher (present-and-violating only). No schema/KI change (factsJson column pre-exists). 27 targeted tests green.