@uwmd/core 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (214) hide show
  1. package/README.md +79 -0
  2. package/dist/agents/bancroft.d.ts +32 -0
  3. package/dist/agents/bancroft.d.ts.map +1 -0
  4. package/dist/agents/bancroft.js +292 -0
  5. package/dist/agents/bancroft.js.map +1 -0
  6. package/dist/agents/schemas.d.ts +13 -0
  7. package/dist/agents/schemas.d.ts.map +1 -0
  8. package/dist/agents/schemas.js +74 -0
  9. package/dist/agents/schemas.js.map +1 -0
  10. package/dist/bindings.d.ts +85 -0
  11. package/dist/bindings.d.ts.map +1 -0
  12. package/dist/bindings.js +293 -0
  13. package/dist/bindings.js.map +1 -0
  14. package/dist/browser.d.ts +66 -0
  15. package/dist/browser.d.ts.map +1 -0
  16. package/dist/browser.js +53 -0
  17. package/dist/browser.js.map +1 -0
  18. package/dist/calc/builtins.d.ts +4 -0
  19. package/dist/calc/builtins.d.ts.map +1 -0
  20. package/dist/calc/builtins.js +329 -0
  21. package/dist/calc/builtins.js.map +1 -0
  22. package/dist/calc/dependencies.d.ts +34 -0
  23. package/dist/calc/dependencies.d.ts.map +1 -0
  24. package/dist/calc/dependencies.js +101 -0
  25. package/dist/calc/dependencies.js.map +1 -0
  26. package/dist/calc/errors.d.ts +8 -0
  27. package/dist/calc/errors.d.ts.map +1 -0
  28. package/dist/calc/errors.js +18 -0
  29. package/dist/calc/errors.js.map +1 -0
  30. package/dist/calc/evaluator.d.ts +5 -0
  31. package/dist/calc/evaluator.d.ts.map +1 -0
  32. package/dist/calc/evaluator.js +184 -0
  33. package/dist/calc/evaluator.js.map +1 -0
  34. package/dist/calc/index.d.ts +14 -0
  35. package/dist/calc/index.d.ts.map +1 -0
  36. package/dist/calc/index.js +56 -0
  37. package/dist/calc/index.js.map +1 -0
  38. package/dist/calc/parser.d.ts +32 -0
  39. package/dist/calc/parser.d.ts.map +1 -0
  40. package/dist/calc/parser.js +361 -0
  41. package/dist/calc/parser.js.map +1 -0
  42. package/dist/cascade.d.ts +85 -0
  43. package/dist/cascade.d.ts.map +1 -0
  44. package/dist/cascade.js +172 -0
  45. package/dist/cascade.js.map +1 -0
  46. package/dist/cli.d.ts +3 -0
  47. package/dist/cli.d.ts.map +1 -0
  48. package/dist/cli.js +843 -0
  49. package/dist/cli.js.map +1 -0
  50. package/dist/codec.d.ts +25 -0
  51. package/dist/codec.d.ts.map +1 -0
  52. package/dist/codec.js +62 -0
  53. package/dist/codec.js.map +1 -0
  54. package/dist/codecs.d.ts +6 -0
  55. package/dist/codecs.d.ts.map +1 -0
  56. package/dist/codecs.js +12 -0
  57. package/dist/codecs.js.map +1 -0
  58. package/dist/compactor.d.ts +11 -0
  59. package/dist/compactor.d.ts.map +1 -0
  60. package/dist/compactor.js +84 -0
  61. package/dist/compactor.js.map +1 -0
  62. package/dist/context-profiles.d.ts +30 -0
  63. package/dist/context-profiles.d.ts.map +1 -0
  64. package/dist/context-profiles.js +225 -0
  65. package/dist/context-profiles.js.map +1 -0
  66. package/dist/context.d.ts +55 -0
  67. package/dist/context.d.ts.map +1 -0
  68. package/dist/context.js +288 -0
  69. package/dist/context.js.map +1 -0
  70. package/dist/dcf.d.ts +9 -0
  71. package/dist/dcf.d.ts.map +1 -0
  72. package/dist/dcf.js +75 -0
  73. package/dist/dcf.js.map +1 -0
  74. package/dist/debt.d.ts +11 -0
  75. package/dist/debt.d.ts.map +1 -0
  76. package/dist/debt.js +85 -0
  77. package/dist/debt.js.map +1 -0
  78. package/dist/defaults.d.ts +104 -0
  79. package/dist/defaults.d.ts.map +1 -0
  80. package/dist/defaults.js +622 -0
  81. package/dist/defaults.js.map +1 -0
  82. package/dist/derived.d.ts +17 -0
  83. package/dist/derived.d.ts.map +1 -0
  84. package/dist/derived.js +29 -0
  85. package/dist/derived.js.map +1 -0
  86. package/dist/editor.d.ts +76 -0
  87. package/dist/editor.d.ts.map +1 -0
  88. package/dist/editor.js +502 -0
  89. package/dist/editor.js.map +1 -0
  90. package/dist/envelope.d.ts +51 -0
  91. package/dist/envelope.d.ts.map +1 -0
  92. package/dist/envelope.js +213 -0
  93. package/dist/envelope.js.map +1 -0
  94. package/dist/format.d.ts +60 -0
  95. package/dist/format.d.ts.map +1 -0
  96. package/dist/format.js +115 -0
  97. package/dist/format.js.map +1 -0
  98. package/dist/gaps.d.ts +62 -0
  99. package/dist/gaps.d.ts.map +1 -0
  100. package/dist/gaps.js +272 -0
  101. package/dist/gaps.js.map +1 -0
  102. package/dist/index.d.ts +75 -0
  103. package/dist/index.d.ts.map +1 -0
  104. package/dist/index.js +47 -0
  105. package/dist/index.js.map +1 -0
  106. package/dist/init.d.ts +15 -0
  107. package/dist/init.d.ts.map +1 -0
  108. package/dist/init.js +169 -0
  109. package/dist/init.js.map +1 -0
  110. package/dist/integrity-canonical.d.ts +17 -0
  111. package/dist/integrity-canonical.d.ts.map +1 -0
  112. package/dist/integrity-canonical.js +124 -0
  113. package/dist/integrity-canonical.js.map +1 -0
  114. package/dist/integrity.d.ts +54 -0
  115. package/dist/integrity.d.ts.map +1 -0
  116. package/dist/integrity.js +244 -0
  117. package/dist/integrity.js.map +1 -0
  118. package/dist/modules.d.ts +24 -0
  119. package/dist/modules.d.ts.map +1 -0
  120. package/dist/modules.js +322 -0
  121. package/dist/modules.js.map +1 -0
  122. package/dist/negotiation.d.ts +19 -0
  123. package/dist/negotiation.d.ts.map +1 -0
  124. package/dist/negotiation.js +70 -0
  125. package/dist/negotiation.js.map +1 -0
  126. package/dist/opstatement.d.ts +9 -0
  127. package/dist/opstatement.d.ts.map +1 -0
  128. package/dist/opstatement.js +80 -0
  129. package/dist/opstatement.js.map +1 -0
  130. package/dist/packs/excel-emit.d.ts +21 -0
  131. package/dist/packs/excel-emit.d.ts.map +1 -0
  132. package/dist/packs/excel-emit.js +135 -0
  133. package/dist/packs/excel-emit.js.map +1 -0
  134. package/dist/packs/index.d.ts +13 -0
  135. package/dist/packs/index.d.ts.map +1 -0
  136. package/dist/packs/index.js +37 -0
  137. package/dist/packs/index.js.map +1 -0
  138. package/dist/packs/industrial.d.ts +3 -0
  139. package/dist/packs/industrial.d.ts.map +1 -0
  140. package/dist/packs/industrial.js +115 -0
  141. package/dist/packs/industrial.js.map +1 -0
  142. package/dist/packs/multifamily.d.ts +3 -0
  143. package/dist/packs/multifamily.d.ts.map +1 -0
  144. package/dist/packs/multifamily.js +82 -0
  145. package/dist/packs/multifamily.js.map +1 -0
  146. package/dist/packs/office.d.ts +3 -0
  147. package/dist/packs/office.d.ts.map +1 -0
  148. package/dist/packs/office.js +108 -0
  149. package/dist/packs/office.js.map +1 -0
  150. package/dist/packs/retail.d.ts +3 -0
  151. package/dist/packs/retail.d.ts.map +1 -0
  152. package/dist/packs/retail.js +115 -0
  153. package/dist/packs/retail.js.map +1 -0
  154. package/dist/packs/self-storage.d.ts +3 -0
  155. package/dist/packs/self-storage.d.ts.map +1 -0
  156. package/dist/packs/self-storage.js +105 -0
  157. package/dist/packs/self-storage.js.map +1 -0
  158. package/dist/parser.d.ts +15 -0
  159. package/dist/parser.d.ts.map +1 -0
  160. package/dist/parser.js +430 -0
  161. package/dist/parser.js.map +1 -0
  162. package/dist/protocol.d.ts +389 -0
  163. package/dist/protocol.d.ts.map +1 -0
  164. package/dist/protocol.js +714 -0
  165. package/dist/protocol.js.map +1 -0
  166. package/dist/refinement.d.ts +63 -0
  167. package/dist/refinement.d.ts.map +1 -0
  168. package/dist/refinement.js +242 -0
  169. package/dist/refinement.js.map +1 -0
  170. package/dist/renderer.d.ts +22 -0
  171. package/dist/renderer.d.ts.map +1 -0
  172. package/dist/renderer.js +478 -0
  173. package/dist/renderer.js.map +1 -0
  174. package/dist/rentroll.d.ts +21 -0
  175. package/dist/rentroll.d.ts.map +1 -0
  176. package/dist/rentroll.js +256 -0
  177. package/dist/rentroll.js.map +1 -0
  178. package/dist/report.d.ts +29 -0
  179. package/dist/report.d.ts.map +1 -0
  180. package/dist/report.js +924 -0
  181. package/dist/report.js.map +1 -0
  182. package/dist/runner.d.ts +43 -0
  183. package/dist/runner.d.ts.map +1 -0
  184. package/dist/runner.js +288 -0
  185. package/dist/runner.js.map +1 -0
  186. package/dist/sourcesuses.d.ts +14 -0
  187. package/dist/sourcesuses.d.ts.map +1 -0
  188. package/dist/sourcesuses.js +63 -0
  189. package/dist/sourcesuses.js.map +1 -0
  190. package/dist/types.d.ts +248 -0
  191. package/dist/types.d.ts.map +1 -0
  192. package/dist/types.js +15 -0
  193. package/dist/types.js.map +1 -0
  194. package/dist/uwcsv.d.ts +23 -0
  195. package/dist/uwcsv.d.ts.map +1 -0
  196. package/dist/uwcsv.js +877 -0
  197. package/dist/uwcsv.js.map +1 -0
  198. package/dist/uwjson.d.ts +19 -0
  199. package/dist/uwjson.d.ts.map +1 -0
  200. package/dist/uwjson.js +61 -0
  201. package/dist/uwjson.js.map +1 -0
  202. package/dist/uwxml.d.ts +18 -0
  203. package/dist/uwxml.d.ts.map +1 -0
  204. package/dist/uwxml.js +297 -0
  205. package/dist/uwxml.js.map +1 -0
  206. package/dist/validator.d.ts +35 -0
  207. package/dist/validator.d.ts.map +1 -0
  208. package/dist/validator.js +553 -0
  209. package/dist/validator.js.map +1 -0
  210. package/dist/valuation.d.ts +9 -0
  211. package/dist/valuation.d.ts.map +1 -0
  212. package/dist/valuation.js +34 -0
  213. package/dist/valuation.js.map +1 -0
  214. package/package.json +58 -0
@@ -0,0 +1,553 @@
1
+ // .uw.md validator — financial validity checks (§5.2) + cross-section consistency (§5.3)
2
+ // Spec: UW_FORMAT_SPEC_v1.md Part V
3
+ import { DEFAULT_THRESHOLDS } from './types.js';
4
+ import { getSection, getSectionVariant, deepGet } from './parser.js';
5
+ import { BUILTIN_REMEDIATIONS, BUILTIN_INCOMPLETE_DATA_POLICIES, lookupIncompleteDataPolicy } from './protocol.js';
6
+ import { readGapsContent } from './gaps.js';
7
+ // ─── BUILTIN_REMEDIATIONS lookup (UW_PROTOCOL_v1.md §III.6) ──────────────────
8
+ //
9
+ // Validator constructs inline messages with deal-specific values, but the
10
+ // registry provides canonical title/remediation/spec_ref copy keyed by code.
11
+ // `lookupRemediation` is also exported from the package index so module
12
+ // authors can extend the registry uniformly.
13
+ const REMEDIATION_INDEX = (() => {
14
+ const idx = {};
15
+ for (const r of BUILTIN_REMEDIATIONS)
16
+ idx[r.code] = r;
17
+ return Object.freeze(idx);
18
+ })();
19
+ export function lookupRemediation(code) {
20
+ return REMEDIATION_INDEX[code];
21
+ }
22
+ function enrichWithRemediation(msg) {
23
+ const reg = REMEDIATION_INDEX[msg.code];
24
+ if (!reg)
25
+ return msg;
26
+ return {
27
+ ...msg,
28
+ title: msg.title ?? reg.title,
29
+ remediation: msg.remediation ?? reg.remediation,
30
+ spec_ref: msg.spec_ref ?? reg.spec_ref,
31
+ };
32
+ }
33
+ // ─── Financial-validity code mapping (Phase 1.4) ─────────────────────────────
34
+ //
35
+ // Legacy `FV_*` string codes are renamed to `FV-NN` numeric form. The legacy
36
+ // code travels alongside the new code as `legacy_code` for one release; v1.2
37
+ // drops `legacy_code` entirely. See protocol §III.6a.
38
+ const FV_CODE_MAP = Object.freeze({
39
+ FV_CAP_RATE_BELOW_THRESHOLD: 'FV-01',
40
+ FV_CAP_RATE_ABOVE_THRESHOLD: 'FV-02',
41
+ FV_DEBT_YIELD_BELOW_THRESHOLD: 'FV-03',
42
+ FV_DSCR_BELOW_THRESHOLD: 'FV-04',
43
+ FV_EQUITY_MULTIPLE_BELOW_MIN: 'FV-05',
44
+ FV_EQUITY_MULTIPLE_ABOVE_MAX: 'FV-06',
45
+ FV_IRR_PROJECTED_BELOW_THRESHOLD: 'FV-07',
46
+ FV_IRR_PROJECTED_ABOVE_THRESHOLD: 'FV-08',
47
+ FV_LTV_ABOVE_THRESHOLD: 'FV-09',
48
+ FV_OPEX_BELOW_MIN: 'FV-10',
49
+ FV_OPEX_ABOVE_MAX: 'FV-11',
50
+ FV_RENT_GROWTH_ABOVE_MAX: 'FV-12',
51
+ FV_VACANCY_BELOW_MIN: 'FV-13',
52
+ FV_VACANCY_ABOVE_MAX: 'FV-14',
53
+ });
54
+ /** Resolve a legacy `FV_*` string to its `FV-NN` form. Returns the input if no mapping exists. */
55
+ function fvCode(legacy) {
56
+ const mapped = FV_CODE_MAP[legacy];
57
+ return mapped ? { code: mapped, legacy_code: legacy } : { code: legacy, legacy_code: legacy };
58
+ }
59
+ export const STAGE_REQUIREMENTS = {
60
+ scope: {
61
+ required_sections: ['property'],
62
+ required_field_paths: ['property.address', 'property.asset_class'],
63
+ required_one_of: [['property.asking_price', 'property.units']],
64
+ },
65
+ screening: { required_sections: ['property', 'debt_structure', 'validation'] },
66
+ term_sheet: { required_sections: ['property', 'debt_structure', 'validation', 'rent_roll', 'borrower_sponsor', 'preliminary_sizing'] },
67
+ full_underwrite: { required_sections: ['property', 'debt_structure', 'validation', 'rent_roll', 'borrower_sponsor', 'preliminary_sizing', 'noi_model', 'valuation', 'sources_uses', 'market_analysis'] },
68
+ credit_approval: { required_sections: ['property', 'debt_structure', 'validation', 'rent_roll', 'borrower_sponsor', 'preliminary_sizing', 'noi_model', 'valuation', 'sources_uses', 'market_analysis', 'dcf', 'stress_tests', 'risk_assessment', 'compliance', 'assumptions'] },
69
+ closing: { required_sections: ['property', 'debt_structure', 'validation', 'rent_roll', 'borrower_sponsor', 'preliminary_sizing', 'noi_model', 'valuation', 'sources_uses', 'market_analysis', 'dcf', 'stress_tests', 'risk_assessment', 'compliance', 'assumptions', 'due_diligence'] },
70
+ monitoring: { required_sections: ['property', 'debt_structure', 'validation', 'rent_roll', 'borrower_sponsor', 'preliminary_sizing', 'noi_model', 'valuation', 'sources_uses', 'market_analysis', 'dcf', 'stress_tests', 'risk_assessment', 'compliance', 'assumptions', 'due_diligence'] },
71
+ };
72
+ /**
73
+ * Legacy helper that returns just the section-list portion of a stage's
74
+ * requirements. Preserved for callers that pre-date the widened
75
+ * `StageRequirement` shape; new code SHOULD consult `STAGE_REQUIREMENTS`
76
+ * directly.
77
+ */
78
+ export function getRequiredSections(stage) {
79
+ return STAGE_REQUIREMENTS[stage].required_sections;
80
+ }
81
+ /**
82
+ * Resolve a dot-notated path of the form `<section>.<field>...` against
83
+ * the parsed file's content blocks. Returns `undefined` when any segment
84
+ * is missing. Variant maps are not traversed; multi-variant sections must
85
+ * use a section-only check.
86
+ */
87
+ function resolveSectionFieldPath(parsed, path) {
88
+ const dot = path.indexOf('.');
89
+ const sectionId = dot === -1 ? path : path.slice(0, dot);
90
+ const rest = dot === -1 ? '' : path.slice(dot + 1);
91
+ const block = parsed.sections[sectionId];
92
+ if (!block || isVariantMap(block))
93
+ return undefined;
94
+ const content = block.content;
95
+ if (rest === '')
96
+ return content;
97
+ return deepGet(content, rest);
98
+ }
99
+ // ─── Main validate function ───────────────────────────────────────────────────
100
+ export function validateUWFile(parsed, thresholdOverrides) {
101
+ const thresholds = { ...DEFAULT_THRESHOLDS, ...thresholdOverrides };
102
+ const issues = [];
103
+ checkFinancialValidity(parsed, thresholds, issues);
104
+ checkCrossSectionConsistency(parsed, issues);
105
+ checkMetaIntegrity(parsed, issues);
106
+ checkScopeReadiness(parsed, issues);
107
+ checkDataQuality(parsed, issues);
108
+ // Enrich every issue with BUILTIN_REMEDIATIONS title/remediation/spec_ref
109
+ // when the code matches the registry. Keeps inline messages (which carry
110
+ // deal-specific values) and adds canonical remediation copy.
111
+ for (let i = 0; i < issues.length; i++)
112
+ issues[i] = enrichWithRemediation(issues[i]);
113
+ const errors = issues.filter(i => i.severity === 'error');
114
+ const warnings = issues.filter(i => i.severity === 'warning');
115
+ const info = issues.filter(i => i.severity === 'info');
116
+ const blocking = (parsed.frontmatter.blocking_flags?.length ?? 0) > 0;
117
+ const overall_status = blocking ? 'blocking'
118
+ : errors.length > 0 ? 'errors'
119
+ : warnings.length > 0 ? 'warnings'
120
+ : 'clean';
121
+ return {
122
+ overall_status,
123
+ stage_readiness: computeStageReadiness(parsed),
124
+ issues,
125
+ errors,
126
+ warnings,
127
+ info,
128
+ };
129
+ }
130
+ // ─── §5.2 Financial validity thresholds ──────────────────────────────────────
131
+ function checkFinancialValidity(parsed, t, issues) {
132
+ const qm = parsed.frontmatter.quick_metrics ?? {};
133
+ const checks = [
134
+ {
135
+ metric: 'dscr',
136
+ value: qm.dscr,
137
+ section: 'debt_structure',
138
+ rules: [
139
+ { type: 'error', direction: 'below', limit: t.dscr.error_below },
140
+ { type: 'warning', direction: 'below', limit: t.dscr.warning_below },
141
+ ],
142
+ },
143
+ {
144
+ metric: 'ltv',
145
+ value: qm.ltv,
146
+ section: 'debt_structure',
147
+ rules: [
148
+ { type: 'warning', direction: 'above', limit: t.ltv.warning_above },
149
+ { type: 'error', direction: 'above', limit: t.ltv.error_above },
150
+ ],
151
+ },
152
+ {
153
+ metric: 'debt_yield',
154
+ value: qm.debt_yield,
155
+ section: 'debt_structure',
156
+ rules: [
157
+ { type: 'warning', direction: 'below', limit: t.debt_yield.warning_below },
158
+ ],
159
+ },
160
+ {
161
+ metric: 'cap_rate',
162
+ value: qm.cap_rate,
163
+ section: 'valuation',
164
+ rules: [
165
+ { type: 'warning', direction: 'below', limit: t.cap_rate.warning_below },
166
+ { type: 'warning', direction: 'above', limit: t.cap_rate.warning_above },
167
+ ],
168
+ },
169
+ {
170
+ metric: 'irr_projected',
171
+ value: qm.irr_projected,
172
+ section: 'dcf',
173
+ rules: [
174
+ { type: 'warning', direction: 'below', limit: t.irr.warning_below },
175
+ { type: 'warning', direction: 'above', limit: t.irr.warning_above },
176
+ ],
177
+ },
178
+ ];
179
+ for (const check of checks) {
180
+ if (check.value == null)
181
+ continue;
182
+ for (const rule of check.rules) {
183
+ const hit = rule.direction === 'below'
184
+ ? check.value < rule.limit
185
+ : check.value > rule.limit;
186
+ if (hit) {
187
+ const legacy = `FV_${check.metric.toUpperCase()}_${rule.direction.toUpperCase()}_THRESHOLD`;
188
+ issues.push({
189
+ ...fvCode(legacy),
190
+ severity: rule.type,
191
+ section: check.section,
192
+ field: check.metric,
193
+ message: `${check.metric.toUpperCase()} ${check.value.toFixed(4)} is ${rule.direction} ${rule.type} threshold of ${rule.limit}`,
194
+ value: check.value,
195
+ threshold: rule.direction === 'below'
196
+ ? { min: rule.limit }
197
+ : { max: rule.limit },
198
+ });
199
+ }
200
+ }
201
+ }
202
+ // Vacancy and OpEx ratio come from noi_model content, not quick_metrics
203
+ const noiBlock = getSection(parsed, 'noi_model');
204
+ if (noiBlock) {
205
+ const vacancyRate = deepGet(noiBlock.content, 'vacancy_rate');
206
+ const egi = deepGet(noiBlock.content, 'effective_gross_income');
207
+ const opex = deepGet(noiBlock.content, 'total_operating_expenses');
208
+ if (vacancyRate != null) {
209
+ if (vacancyRate < t.vacancy_rate.warning_below) {
210
+ issues.push({ ...fvCode('FV_VACANCY_BELOW_MIN'), severity: 'warning', section: 'noi_model', field: 'vacancy_rate', message: `Vacancy rate ${(vacancyRate * 100).toFixed(1)}% is unusually low (below ${(t.vacancy_rate.warning_below * 100).toFixed(0)}%)`, value: vacancyRate, threshold: { min: t.vacancy_rate.warning_below } });
211
+ }
212
+ if (vacancyRate > t.vacancy_rate.warning_above) {
213
+ issues.push({ ...fvCode('FV_VACANCY_ABOVE_MAX'), severity: 'warning', section: 'noi_model', field: 'vacancy_rate', message: `Vacancy rate ${(vacancyRate * 100).toFixed(1)}% is unusually high (above ${(t.vacancy_rate.warning_above * 100).toFixed(0)}%)`, value: vacancyRate, threshold: { max: t.vacancy_rate.warning_above } });
214
+ }
215
+ }
216
+ if (egi != null && opex != null && egi > 0) {
217
+ const opexRatio = opex / egi;
218
+ if (opexRatio < t.opex_ratio.warning_below) {
219
+ issues.push({ ...fvCode('FV_OPEX_BELOW_MIN'), severity: 'warning', section: 'noi_model', field: 'total_operating_expenses', message: `OpEx ratio ${(opexRatio * 100).toFixed(1)}% of EGI is suspiciously low (below ${(t.opex_ratio.warning_below * 100).toFixed(0)}%)`, value: opexRatio, threshold: { min: t.opex_ratio.warning_below } });
220
+ }
221
+ if (opexRatio > t.opex_ratio.warning_above) {
222
+ issues.push({ ...fvCode('FV_OPEX_ABOVE_MAX'), severity: 'warning', section: 'noi_model', field: 'total_operating_expenses', message: `OpEx ratio ${(opexRatio * 100).toFixed(1)}% of EGI is unusually high (above ${(t.opex_ratio.warning_above * 100).toFixed(0)}%)`, value: opexRatio, threshold: { max: t.opex_ratio.warning_above } });
223
+ }
224
+ }
225
+ }
226
+ // Annual rent growth from dcf assumptions
227
+ const dcfBlock = getSection(parsed, 'dcf');
228
+ if (dcfBlock) {
229
+ const rentGrowth = deepGet(dcfBlock.content, 'assumptions.annual_rent_growth')
230
+ ?? deepGet(dcfBlock.content, 'rent_growth_assumption');
231
+ if (rentGrowth != null && rentGrowth > t.annual_rent_growth.warning_above) {
232
+ issues.push({ ...fvCode('FV_RENT_GROWTH_ABOVE_MAX'), severity: 'warning', section: 'dcf', field: 'annual_rent_growth', message: `Annual rent growth assumption ${(rentGrowth * 100).toFixed(1)}% is above the ${(t.annual_rent_growth.warning_above * 100).toFixed(0)}% warning threshold`, value: rentGrowth, threshold: { max: t.annual_rent_growth.warning_above } });
233
+ }
234
+ const equityMultiple = deepGet(dcfBlock.content, 'levered_equity_multiple')
235
+ ?? deepGet(dcfBlock.content, 'summary.equity_multiple');
236
+ if (equityMultiple != null) {
237
+ if (equityMultiple < t.equity_multiple.warning_below) {
238
+ issues.push({ ...fvCode('FV_EQUITY_MULTIPLE_BELOW_MIN'), severity: 'warning', section: 'dcf', field: 'equity_multiple', message: `Equity multiple ${equityMultiple.toFixed(2)}x is below ${t.equity_multiple.warning_below}x warning threshold`, value: equityMultiple, threshold: { min: t.equity_multiple.warning_below } });
239
+ }
240
+ if (equityMultiple > t.equity_multiple.warning_above) {
241
+ issues.push({ ...fvCode('FV_EQUITY_MULTIPLE_ABOVE_MAX'), severity: 'warning', section: 'dcf', field: 'equity_multiple', message: `Equity multiple ${equityMultiple.toFixed(2)}x is above ${t.equity_multiple.warning_above}x warning threshold`, value: equityMultiple, threshold: { max: t.equity_multiple.warning_above } });
242
+ }
243
+ }
244
+ }
245
+ }
246
+ // ─── §5.3 Cross-section consistency checks ───────────────────────────────────
247
+ function checkCrossSectionConsistency(parsed, issues) {
248
+ const rentRoll = getSection(parsed, 'rent_roll');
249
+ const os = getSectionVariant(parsed, 'operating_statement', 't12')
250
+ ?? getSectionVariant(parsed, 'operating_statement', 'default')
251
+ ?? getSection(parsed, 'operating_statement');
252
+ const debtStructure = getSection(parsed, 'debt_structure');
253
+ const sourcesUses = getSection(parsed, 'sources_uses');
254
+ const valuation = getSection(parsed, 'valuation');
255
+ const noiModel = getSection(parsed, 'noi_model');
256
+ const dcf = getSection(parsed, 'dcf');
257
+ const stressTests = getSection(parsed, 'stress_tests')
258
+ ?? getSectionVariant(parsed, 'stress_tests', 'default');
259
+ const dueDiligence = getSection(parsed, 'due_diligence');
260
+ // CC-01: Rent roll GPR must match OS GPR within 3%
261
+ if (rentRoll && os) {
262
+ const rrGPR = deepGet(rentRoll.content, 'gross_potential_rent')
263
+ ?? deepGet(rentRoll.content, 'totals.gross_potential_rent');
264
+ const osGPR = deepGet(os.content, 'gross_potential_rent')
265
+ ?? deepGet(os.content, 'income.gross_potential_rent');
266
+ if (rrGPR != null && osGPR != null && osGPR !== 0) {
267
+ const pctDiff = Math.abs(rrGPR - osGPR) / osGPR;
268
+ if (pctDiff > 0.03) {
269
+ issues.push({ code: 'CC-01', severity: 'warning', section: 'rent_roll', message: `CC-01: Rent roll GPR ($${rrGPR.toLocaleString()}) differs from Operating Statement GPR ($${osGPR.toLocaleString()}) by ${(pctDiff * 100).toFixed(1)}% (threshold: 3%)`, value: pctDiff });
270
+ }
271
+ }
272
+ }
273
+ // CC-02: UW value in valuation must match LTV denominator in debt_structure
274
+ if (valuation && debtStructure) {
275
+ const uwValue = deepGet(valuation.content, 'underwritten_value')
276
+ ?? deepGet(valuation.content, 'purchase_price');
277
+ const loanAmt = deepGet(debtStructure.content, 'loan_amount');
278
+ const ltvInDebt = deepGet(debtStructure.content, 'ltv');
279
+ if (uwValue != null && loanAmt != null && ltvInDebt != null && uwValue > 0) {
280
+ const impliedLTV = loanAmt / uwValue;
281
+ const diff = Math.abs(impliedLTV - ltvInDebt);
282
+ if (diff > 0.005) {
283
+ issues.push({ code: 'CC-02', severity: 'warning', section: 'debt_structure', message: `CC-02: Implied LTV (${(impliedLTV * 100).toFixed(2)}%) from loan/value does not match stated LTV (${(ltvInDebt * 100).toFixed(2)}%) — check valuation.underwritten_value vs debt_structure.ltv`, value: diff });
284
+ }
285
+ }
286
+ }
287
+ // CC-03: Loan amount in sources_uses must match debt_structure.loan_amount
288
+ if (sourcesUses && debtStructure) {
289
+ const suLoan = deepGet(sourcesUses.content, 'sources.loan_amount')
290
+ ?? deepGet(sourcesUses.content, 'sources.debt_proceeds');
291
+ const dsLoan = deepGet(debtStructure.content, 'loan_amount');
292
+ if (suLoan != null && dsLoan != null && Math.abs(suLoan - dsLoan) > 100) {
293
+ issues.push({ code: 'CC-03', severity: 'error', section: 'sources_uses', message: `CC-03: Loan amount in Sources & Uses ($${suLoan.toLocaleString()}) does not match Debt Structure loan amount ($${dsLoan.toLocaleString()})`, value: Math.abs(suLoan - dsLoan) });
294
+ }
295
+ }
296
+ // CC-04: Sources must equal uses in sources_uses (within $1)
297
+ if (sourcesUses) {
298
+ const totalSources = deepGet(sourcesUses.content, 'total_sources');
299
+ const totalUses = deepGet(sourcesUses.content, 'total_uses');
300
+ if (totalSources != null && totalUses != null && Math.abs(totalSources - totalUses) > 1) {
301
+ issues.push({ code: 'CC-04', severity: 'error', section: 'sources_uses', message: `CC-04: Sources ($${totalSources.toLocaleString()}) do not equal Uses ($${totalUses.toLocaleString()}) — difference: $${Math.abs(totalSources - totalUses).toLocaleString()}`, value: Math.abs(totalSources - totalUses) });
302
+ }
303
+ }
304
+ // CC-05: NOI used for DSCR must match noi_model.net_operating_income within 1%
305
+ if (noiModel && debtStructure) {
306
+ const modelNOI = deepGet(noiModel.content, 'net_operating_income');
307
+ const debtNOI = deepGet(debtStructure.content, 'underwritten_noi')
308
+ ?? deepGet(debtStructure.content, 'noi_used_for_dscr');
309
+ if (modelNOI != null && debtNOI != null && modelNOI > 0) {
310
+ const pctDiff = Math.abs(modelNOI - debtNOI) / modelNOI;
311
+ if (pctDiff > 0.01) {
312
+ issues.push({ code: 'CC-05', severity: 'warning', section: 'debt_structure', message: `CC-05: NOI used for DSCR ($${debtNOI.toLocaleString()}) differs from noi_model NOI ($${modelNOI.toLocaleString()}) by ${(pctDiff * 100).toFixed(2)}% (threshold: 1%)`, value: pctDiff });
313
+ }
314
+ }
315
+ }
316
+ // CC-06: DCF Year 1 NOI must be consistent with noi_model projections
317
+ if (noiModel && dcf) {
318
+ const modelNOI = deepGet(noiModel.content, 'net_operating_income');
319
+ const dcfY1NOI = deepGet(dcf.content, 'annual_cash_flows[0].noi')
320
+ ?? deepGet(dcf.content, 'annual_cash_flows[0].net_operating_income');
321
+ if (modelNOI != null && dcfY1NOI != null && modelNOI > 0) {
322
+ const pctDiff = Math.abs(modelNOI - dcfY1NOI) / modelNOI;
323
+ if (pctDiff > 0.02) {
324
+ issues.push({ code: 'CC-06', severity: 'warning', section: 'dcf', message: `CC-06: DCF Year 1 NOI ($${dcfY1NOI.toLocaleString()}) deviates from noi_model NOI ($${modelNOI.toLocaleString()}) by ${(pctDiff * 100).toFixed(2)}%`, value: pctDiff });
325
+ }
326
+ }
327
+ }
328
+ // CC-07: Exit cap rate in dcf must be consistent with stress test cap rate scenarios
329
+ if (dcf && stressTests) {
330
+ const dcfExitCap = deepGet(dcf.content, 'assumptions.exit_cap_rate')
331
+ ?? deepGet(dcf.content, 'exit_cap_rate');
332
+ const stressExitCap = deepGet(stressTests.content, 'base_case.exit_cap_rate');
333
+ if (dcfExitCap != null && stressExitCap != null && Math.abs(dcfExitCap - stressExitCap) > 0.005) {
334
+ issues.push({ code: 'CC-07', severity: 'warning', section: 'stress_tests', message: `CC-07: Exit cap rate in DCF (${(dcfExitCap * 100).toFixed(2)}%) differs from stress test base case (${(stressExitCap * 100).toFixed(2)}%)`, value: Math.abs(dcfExitCap - stressExitCap) });
335
+ }
336
+ }
337
+ // CC-08: Appraised value in due_diligence must match valuation.appraised_value
338
+ if (dueDiligence && valuation) {
339
+ const ddAppraisedVal = deepGet(dueDiligence.content, 'appraisal.appraised_value');
340
+ const valAppraisedVal = deepGet(valuation.content, 'appraised_value');
341
+ if (ddAppraisedVal != null && valAppraisedVal != null && Math.abs(ddAppraisedVal - valAppraisedVal) > 1000) {
342
+ issues.push({ code: 'CC-08', severity: 'warning', section: 'due_diligence', message: `CC-08: Appraised value in due_diligence ($${ddAppraisedVal.toLocaleString()}) does not match valuation.appraised_value ($${valAppraisedVal.toLocaleString()})`, value: Math.abs(ddAppraisedVal - valAppraisedVal) });
343
+ }
344
+ }
345
+ // CC-09: Annual debt service in stress_tests base case must match debt_structure.annual_debt_service
346
+ if (stressTests && debtStructure) {
347
+ const stressADS = deepGet(stressTests.content, 'base_case.annual_debt_service');
348
+ const debtADS = deepGet(debtStructure.content, 'annual_debt_service');
349
+ if (stressADS != null && debtADS != null && Math.abs(stressADS - debtADS) > 500) {
350
+ issues.push({ code: 'CC-09', severity: 'warning', section: 'stress_tests', message: `CC-09: Annual debt service in stress test base case ($${stressADS.toLocaleString()}) differs from debt_structure ($${debtADS.toLocaleString()}) by $${Math.abs(stressADS - debtADS).toLocaleString()}`, value: Math.abs(stressADS - debtADS) });
351
+ }
352
+ }
353
+ // CC-10: Purchase price in sources_uses.uses must match valuation.purchase_price
354
+ if (sourcesUses && valuation) {
355
+ const suPP = deepGet(sourcesUses.content, 'uses.purchase_price');
356
+ const valPP = deepGet(valuation.content, 'purchase_price');
357
+ if (suPP != null && valPP != null && Math.abs(suPP - valPP) > 100) {
358
+ issues.push({ code: 'CC-10', severity: 'error', section: 'sources_uses', message: `CC-10: Purchase price in Sources & Uses ($${suPP.toLocaleString()}) does not match valuation.purchase_price ($${valPP.toLocaleString()})`, value: Math.abs(suPP - valPP) });
359
+ }
360
+ }
361
+ }
362
+ // ─── Meta integrity checks ────────────────────────────────────────────────────
363
+ function checkMetaIntegrity(parsed, issues) {
364
+ const REQUIRED_META_FIELDS = ['section', 'version', 'source', 'timestamp', 'confidence'];
365
+ for (const [sectionId, entry] of Object.entries(parsed.sections)) {
366
+ const blocks = isVariantMap(entry)
367
+ ? Object.values(entry)
368
+ : [entry];
369
+ for (const block of blocks) {
370
+ if (!block.meta || Object.keys(block.meta).length === 0) {
371
+ issues.push({ code: 'META_MISSING', severity: 'warning', section: sectionId, message: `Section ${sectionId} is missing _meta object` });
372
+ continue;
373
+ }
374
+ for (const field of REQUIRED_META_FIELDS) {
375
+ if (block.meta[field] == null) {
376
+ issues.push({ code: `META_FIELD_MISSING_${field.toUpperCase()}`, severity: 'warning', section: sectionId, field, message: `Section ${sectionId} _meta is missing required field: ${field}` });
377
+ }
378
+ }
379
+ // `confidence` and `human_review_required` are orthogonal (spec §3.5):
380
+ // confidence is a quality estimate; human_review_required is a workflow
381
+ // gate. The combination "low confidence + no review flag" is a common
382
+ // smell — drafts often forget to flag — but it is not normatively wrong.
383
+ // This emission is therefore informational only; do not promote it to a
384
+ // warning without changing the spec.
385
+ if (block.meta.confidence === 'low' && !block.meta.human_review_required) {
386
+ issues.push({ code: 'META_LOW_CONFIDENCE_NO_REVIEW_FLAG', severity: 'info', section: sectionId, message: `Section ${sectionId} has low confidence but human_review_required is not set to true` });
387
+ }
388
+ }
389
+ }
390
+ }
391
+ // ─── Stage readiness ──────────────────────────────────────────────────────────
392
+ function computeStageReadiness(parsed) {
393
+ const hasSection = (id) => {
394
+ if (id === 'operating_statement') {
395
+ return !!(parsed.sections[id] || getSectionVariant(parsed, id, 't12') || getSectionVariant(parsed, id, 'default'));
396
+ }
397
+ if (id === 'stress_tests' || id === 'due_diligence') {
398
+ return !!(parsed.sections[id]);
399
+ }
400
+ return !!parsed.sections[id];
401
+ };
402
+ const hasFieldPath = (path) => {
403
+ const v = resolveSectionFieldPath(parsed, path);
404
+ return v !== undefined && v !== null && v !== '';
405
+ };
406
+ const stageReady = (stage) => {
407
+ const req = STAGE_REQUIREMENTS[stage];
408
+ if (!req.required_sections.every(s => hasSection(s)))
409
+ return false;
410
+ if (req.required_field_paths && !req.required_field_paths.every(hasFieldPath))
411
+ return false;
412
+ if (req.required_one_of && !req.required_one_of.every(group => group.some(hasFieldPath)))
413
+ return false;
414
+ return true;
415
+ };
416
+ return {
417
+ scope: stageReady('scope'),
418
+ screening: stageReady('screening'),
419
+ term_sheet: stageReady('term_sheet'),
420
+ full_underwrite: stageReady('full_underwrite'),
421
+ credit_approval: stageReady('credit_approval'),
422
+ closing: stageReady('closing'),
423
+ monitoring: stageReady('monitoring'),
424
+ };
425
+ }
426
+ // ─── DQ-04: scope-stage readiness ────────────────────────────────────────────
427
+ //
428
+ // Emitted when a file declares `deal_stage: scope` (or has no stage and is
429
+ // being checked against scope-readiness) and one of the scope-required
430
+ // fields is missing. Field-level rather than section-level so the message
431
+ // can name the exact path. Sectional gaps are still reported via
432
+ // stage_readiness.
433
+ function checkScopeReadiness(parsed, issues) {
434
+ if (parsed.frontmatter.deal_stage !== 'scope')
435
+ return;
436
+ const req = STAGE_REQUIREMENTS.scope;
437
+ const missing = (path) => {
438
+ const v = resolveSectionFieldPath(parsed, path);
439
+ return v === undefined || v === null || v === '';
440
+ };
441
+ for (const path of req.required_field_paths ?? []) {
442
+ if (missing(path)) {
443
+ issues.push({
444
+ code: 'DQ-04',
445
+ severity: 'error',
446
+ field: path,
447
+ message: `Scope-stage readiness requires ${path}; field is missing.`,
448
+ });
449
+ }
450
+ }
451
+ for (const group of req.required_one_of ?? []) {
452
+ if (group.every(missing)) {
453
+ issues.push({
454
+ code: 'DQ-04',
455
+ severity: 'error',
456
+ field: group.join('|'),
457
+ message: `Scope-stage readiness requires at least one of: ${group.join(', ')}.`,
458
+ });
459
+ }
460
+ }
461
+ }
462
+ function isVariantMap(val) {
463
+ if (typeof val !== 'object' || val === null)
464
+ return false;
465
+ return !('annotation' in val);
466
+ }
467
+ // ─── DQ-01..03 / DQ-05: data quality checks ──────────────────────────────────
468
+ //
469
+ // DQ-01: provisional block not referenced from the gaps section
470
+ // DQ-02: provisional value consumed at a stage whose policy is `halt`
471
+ // DQ-03: partial block without field-level enumeration
472
+ // DQ-05: stale `gaps` item (last_checked older than threshold)
473
+ const DEFAULT_GAP_STALENESS_DAYS = 14;
474
+ export function checkDataQuality(parsed, issues, opts = {}) {
475
+ const policies = opts.policies ?? BUILTIN_INCOMPLETE_DATA_POLICIES;
476
+ const stage = parsed.frontmatter.deal_stage ?? 'scope';
477
+ const gaps = readGapsContent(parsed);
478
+ const gapKeys = new Set();
479
+ if (gaps) {
480
+ for (const item of gaps.items) {
481
+ gapKeys.add(`${item.section}::`);
482
+ if (item.field_path)
483
+ gapKeys.add(`${item.section}::${item.field_path}`);
484
+ }
485
+ }
486
+ // Walk every present section's _meta for provisional/partial flags
487
+ for (const sectionId of Object.keys(parsed.sections)) {
488
+ const entry = parsed.sections[sectionId];
489
+ if (!entry)
490
+ continue;
491
+ const blocks = isVariantMap(entry)
492
+ ? Object.values(entry)
493
+ : [entry];
494
+ for (const block of blocks) {
495
+ const m = block.meta;
496
+ // DQ-01: provisional block not in gaps
497
+ if (m.provisional) {
498
+ const referenced = gapKeys.has(`${sectionId}::`) ||
499
+ // Any field-level gap counts as referencing the section
500
+ [...gapKeys].some((k) => k.startsWith(`${sectionId}::`) && k !== `${sectionId}::`);
501
+ if (!referenced) {
502
+ issues.push({
503
+ code: 'DQ-01',
504
+ severity: 'warning',
505
+ section: sectionId,
506
+ message: `Block ${sectionId} is provisional but no gaps entry references it.`,
507
+ });
508
+ }
509
+ // DQ-02: provisional value consumed at a `halt` stage
510
+ const policy = lookupIncompleteDataPolicy(sectionId, undefined, stage, policies);
511
+ if (policy?.action.kind === 'halt') {
512
+ issues.push({
513
+ code: 'DQ-02',
514
+ severity: 'error',
515
+ section: sectionId,
516
+ message: `Provisional ${sectionId} cannot be consumed at stage '${stage}' (policy: halt).`,
517
+ });
518
+ }
519
+ }
520
+ // DQ-03: partial without enumeration
521
+ if (m.partial && (!m.field_overrides || m.field_overrides.length === 0)) {
522
+ issues.push({
523
+ code: 'DQ-03',
524
+ severity: 'warning',
525
+ section: sectionId,
526
+ message: `Block ${sectionId} is marked partial but has no field_overrides[] enumeration.`,
527
+ });
528
+ }
529
+ }
530
+ }
531
+ // DQ-05: stale gaps
532
+ if (gaps) {
533
+ const now = opts.now ? Date.parse(opts.now) : Date.now();
534
+ const thresholdMs = (opts.gap_staleness_days ?? DEFAULT_GAP_STALENESS_DAYS) * 86_400_000;
535
+ for (const item of gaps.items) {
536
+ if (!item.last_checked)
537
+ continue;
538
+ const last = Date.parse(item.last_checked);
539
+ if (Number.isNaN(last))
540
+ continue;
541
+ if (now - last > thresholdMs) {
542
+ issues.push({
543
+ code: 'DQ-05',
544
+ severity: 'info',
545
+ section: item.section,
546
+ field: item.field_path,
547
+ message: `Gap last checked ${item.last_checked}; exceeds staleness threshold (${opts.gap_staleness_days ?? DEFAULT_GAP_STALENESS_DAYS}d).`,
548
+ });
549
+ }
550
+ }
551
+ }
552
+ }
553
+ //# sourceMappingURL=validator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validator.js","sourceRoot":"","sources":["../src/validator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import { type DerivedField } from './derived.js';
2
+ type Row = Record<string, unknown>;
3
+ export interface ValuationDerivation {
4
+ fields: DerivedField[];
5
+ }
6
+ /** Foot a valuation content block. Pure: never mutates `content`. */
7
+ export declare function deriveValuation(content: Row): ValuationDerivation;
8
+ export {};
9
+ //# sourceMappingURL=valuation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"valuation.d.ts","sourceRoot":"","sources":["../src/valuation.ts"],"names":[],"mappings":"AAaA,OAAO,EAAwB,KAAK,YAAY,EAAE,MAAM,cAAc,CAAC;AAEvE,KAAK,GAAG,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAKnC,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,YAAY,EAAE,CAAC;CACxB;AAED,qEAAqE;AACrE,wBAAgB,eAAe,CAAC,OAAO,EAAE,GAAG,GAAG,mBAAmB,CAuBjE"}