@llm-dev-ops/agentics-cli 2.1.5 → 2.3.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 (76) hide show
  1. package/dist/pipeline/auto-chain.d.ts +73 -0
  2. package/dist/pipeline/auto-chain.d.ts.map +1 -1
  3. package/dist/pipeline/auto-chain.js +525 -38
  4. package/dist/pipeline/auto-chain.js.map +1 -1
  5. package/dist/pipeline/phase2/phases/prompt-generator.d.ts.map +1 -1
  6. package/dist/pipeline/phase2/phases/prompt-generator.js +53 -6
  7. package/dist/pipeline/phase2/phases/prompt-generator.js.map +1 -1
  8. package/dist/pipeline/phase2/schemas.d.ts +10 -10
  9. package/dist/pipeline/phase4/phases/http-server-generator.d.ts +12 -0
  10. package/dist/pipeline/phase4/phases/http-server-generator.d.ts.map +1 -1
  11. package/dist/pipeline/phase4/phases/http-server-generator.js +92 -25
  12. package/dist/pipeline/phase4/phases/http-server-generator.js.map +1 -1
  13. package/dist/pipeline/phase5-build/phase5-build-coordinator.d.ts.map +1 -1
  14. package/dist/pipeline/phase5-build/phase5-build-coordinator.js +44 -0
  15. package/dist/pipeline/phase5-build/phase5-build-coordinator.js.map +1 -1
  16. package/dist/pipeline/phase5-build/phases/post-generation-validator.d.ts +75 -0
  17. package/dist/pipeline/phase5-build/phases/post-generation-validator.d.ts.map +1 -0
  18. package/dist/pipeline/phase5-build/phases/post-generation-validator.js +728 -0
  19. package/dist/pipeline/phase5-build/phases/post-generation-validator.js.map +1 -0
  20. package/dist/pipeline/phase5-build/types.d.ts +1 -1
  21. package/dist/pipeline/phase5-build/types.d.ts.map +1 -1
  22. package/dist/pipeline/types.d.ts +84 -0
  23. package/dist/pipeline/types.d.ts.map +1 -1
  24. package/dist/pipeline/types.js +43 -1
  25. package/dist/pipeline/types.js.map +1 -1
  26. package/dist/synthesis/consensus-svg.d.ts +19 -0
  27. package/dist/synthesis/consensus-svg.d.ts.map +1 -0
  28. package/dist/synthesis/consensus-svg.js +95 -0
  29. package/dist/synthesis/consensus-svg.js.map +1 -0
  30. package/dist/synthesis/consensus-tiers.d.ts +99 -0
  31. package/dist/synthesis/consensus-tiers.d.ts.map +1 -0
  32. package/dist/synthesis/consensus-tiers.js +285 -0
  33. package/dist/synthesis/consensus-tiers.js.map +1 -0
  34. package/dist/synthesis/domain-labor-classifier.d.ts +101 -0
  35. package/dist/synthesis/domain-labor-classifier.d.ts.map +1 -0
  36. package/dist/synthesis/domain-labor-classifier.js +312 -0
  37. package/dist/synthesis/domain-labor-classifier.js.map +1 -0
  38. package/dist/synthesis/domain-unit-registry.d.ts +59 -0
  39. package/dist/synthesis/domain-unit-registry.d.ts.map +1 -0
  40. package/dist/synthesis/domain-unit-registry.js +294 -0
  41. package/dist/synthesis/domain-unit-registry.js.map +1 -0
  42. package/dist/synthesis/financial-claim-extractor.d.ts +52 -0
  43. package/dist/synthesis/financial-claim-extractor.d.ts.map +1 -0
  44. package/dist/synthesis/financial-claim-extractor.js +351 -0
  45. package/dist/synthesis/financial-claim-extractor.js.map +1 -0
  46. package/dist/synthesis/financial-consistency-rules.d.ts +66 -0
  47. package/dist/synthesis/financial-consistency-rules.d.ts.map +1 -0
  48. package/dist/synthesis/financial-consistency-rules.js +432 -0
  49. package/dist/synthesis/financial-consistency-rules.js.map +1 -0
  50. package/dist/synthesis/financial-consistency-runner.d.ts +73 -0
  51. package/dist/synthesis/financial-consistency-runner.d.ts.map +1 -0
  52. package/dist/synthesis/financial-consistency-runner.js +131 -0
  53. package/dist/synthesis/financial-consistency-runner.js.map +1 -0
  54. package/dist/synthesis/forbidden-spin-phrases.d.ts +32 -0
  55. package/dist/synthesis/forbidden-spin-phrases.d.ts.map +1 -0
  56. package/dist/synthesis/forbidden-spin-phrases.js +84 -0
  57. package/dist/synthesis/forbidden-spin-phrases.js.map +1 -0
  58. package/dist/synthesis/phase-gate-thresholds.d.ts +30 -0
  59. package/dist/synthesis/phase-gate-thresholds.d.ts.map +1 -0
  60. package/dist/synthesis/phase-gate-thresholds.js +34 -0
  61. package/dist/synthesis/phase-gate-thresholds.js.map +1 -0
  62. package/dist/synthesis/prompts/index.d.ts.map +1 -1
  63. package/dist/synthesis/prompts/index.js +22 -0
  64. package/dist/synthesis/prompts/index.js.map +1 -1
  65. package/dist/synthesis/simulation-artifact-generator.d.ts.map +1 -1
  66. package/dist/synthesis/simulation-artifact-generator.js +89 -1
  67. package/dist/synthesis/simulation-artifact-generator.js.map +1 -1
  68. package/dist/synthesis/simulation-renderers.d.ts +105 -2
  69. package/dist/synthesis/simulation-renderers.d.ts.map +1 -1
  70. package/dist/synthesis/simulation-renderers.js +1056 -92
  71. package/dist/synthesis/simulation-renderers.js.map +1 -1
  72. package/dist/synthesis/unit-economics-loader.d.ts +71 -0
  73. package/dist/synthesis/unit-economics-loader.d.ts.map +1 -0
  74. package/dist/synthesis/unit-economics-loader.js +200 -0
  75. package/dist/synthesis/unit-economics-loader.js.map +1 -0
  76. package/package.json +1 -1
@@ -0,0 +1,351 @@
1
+ /**
2
+ * ADR-PIPELINE-067: Financial Claim Extractor
3
+ *
4
+ * Parses rendered executive markdown and returns a structured list of
5
+ * FinancialClaim records. Used by the cross-document consistency runner to
6
+ * compare dollar figures, timelines, and scope labels across documents.
7
+ *
8
+ * Pure functions. Regex-based — no LLM calls.
9
+ *
10
+ * Renderers can short-circuit extraction by emitting an HTML comment tag
11
+ * immediately before the figure:
12
+ *
13
+ * <!-- fcv:kind=investment scope=pilot -->
14
+ * **Pilot investment:** $1.0M–$1.4M
15
+ */
16
+ // ============================================================================
17
+ // Currency / money parsing
18
+ // ============================================================================
19
+ const CURRENCY_SUFFIX = {
20
+ K: 1_000,
21
+ M: 1_000_000,
22
+ B: 1_000_000_000,
23
+ };
24
+ /**
25
+ * Parse a single currency token like "$1.2M", "$600K", "$1,200,000",
26
+ * "USD 1.2M", or "1.2 million dollars". Returns NaN when the input does not
27
+ * look like a currency amount.
28
+ */
29
+ export function parseCurrency(token) {
30
+ const cleaned = token.trim().replace(/\s+/g, ' ');
31
+ // "$1.2M" / "$600K" / "$1.2B"
32
+ const suffixMatch = cleaned.match(/^\$?\s*([\d.]+)\s*([KMB])\b/i);
33
+ if (suffixMatch) {
34
+ const num = parseFloat(suffixMatch[1]);
35
+ const mult = CURRENCY_SUFFIX[suffixMatch[2].toUpperCase()] ?? 1;
36
+ if (!Number.isNaN(num))
37
+ return num * mult;
38
+ }
39
+ // "USD 1.2M"
40
+ const usdMatch = cleaned.match(/^USD\s*([\d.]+)\s*([KMB])?\b/i);
41
+ if (usdMatch) {
42
+ const num = parseFloat(usdMatch[1]);
43
+ const mult = usdMatch[2] ? (CURRENCY_SUFFIX[usdMatch[2].toUpperCase()] ?? 1) : 1;
44
+ if (!Number.isNaN(num))
45
+ return num * mult;
46
+ }
47
+ // "1.2 million dollars" / "600 thousand dollars" — check BEFORE plain match
48
+ // so the magnitude word is consumed before the bare number branch.
49
+ const spelledMatch = cleaned.match(/^([\d.]+)\s*(thousand|million|billion)\s*(?:dollars?|USD)?/i);
50
+ if (spelledMatch) {
51
+ const num = parseFloat(spelledMatch[1]);
52
+ const mults = { thousand: 1_000, million: 1_000_000, billion: 1_000_000_000 };
53
+ const mult = mults[spelledMatch[2].toLowerCase()] ?? 1;
54
+ if (!Number.isNaN(num))
55
+ return num * mult;
56
+ }
57
+ // "$1,200,000" or "$600,000" — bare number must have a $ prefix to avoid
58
+ // consuming the "1.2" in "1.2 million" before the spelled branch runs.
59
+ const plainMatch = cleaned.match(/^\$\s*([\d,]+(?:\.\d+)?)\b/);
60
+ if (plainMatch) {
61
+ const num = parseFloat(plainMatch[1].replace(/,/g, ''));
62
+ if (!Number.isNaN(num) && num > 0)
63
+ return num;
64
+ }
65
+ return NaN;
66
+ }
67
+ // Currency range: "$1.2M–$1.4M" / "$1.2M - $1.4M" / "$1.2M to $1.4M"
68
+ const CURRENCY_RANGE_RE = /\$[\d.,]+\s*[KMB]?(?:\s*(?:[-–—]|to)\s*\$?[\d.,]+\s*[KMB]?)?/gi;
69
+ // ============================================================================
70
+ // Scope label detection
71
+ // ============================================================================
72
+ const SCOPE_PATTERNS = [
73
+ { re: /\b(?:pilot|phase[\s-]?1|first[\s-]phase)\b/i, scope: 'phase-1' },
74
+ { re: /\bphase[\s-]?2\b/i, scope: 'phase-2' },
75
+ { re: /\bphase[\s-]?3\b/i, scope: 'phase-3' },
76
+ { re: /\b(?:full\s*(?:program|deployment|rollout|scale)|enterprise[\s-]wide|full[\s-]program)\b/i, scope: 'full-program' },
77
+ ];
78
+ function detectScope(context) {
79
+ const lower = context.toLowerCase();
80
+ if (/\bpilot\b/.test(lower))
81
+ return 'pilot';
82
+ for (const { re, scope } of SCOPE_PATTERNS) {
83
+ if (re.test(context))
84
+ return scope;
85
+ }
86
+ return 'unscoped';
87
+ }
88
+ /**
89
+ * Scope detection around a specific match index. Scans a ±WINDOW char
90
+ * window centered on the match and chooses the nearest scope keyword. This
91
+ * lets a single line like "$1.0M pilot, $2.7M–$4.1M full deployment"
92
+ * assign different scopes to each figure.
93
+ */
94
+ function detectScopeNearIndex(context, matchStart, matchEnd) {
95
+ const WINDOW = 60;
96
+ const start = Math.max(0, matchStart - WINDOW);
97
+ const end = Math.min(context.length, matchEnd + WINDOW);
98
+ const window = context.slice(start, end);
99
+ const hits = [];
100
+ const scanners = [
101
+ { re: /\bpilot\b/gi, scope: 'pilot' },
102
+ { re: /\bphase[\s-]?1\b|first[\s-]phase/gi, scope: 'phase-1' },
103
+ { re: /\bphase[\s-]?2\b/gi, scope: 'phase-2' },
104
+ { re: /\bphase[\s-]?3\b/gi, scope: 'phase-3' },
105
+ { re: /\b(?:full\s*(?:program|deployment|rollout|scale)|enterprise[\s-]wide|full[\s-]program)\b/gi, scope: 'full-program' },
106
+ ];
107
+ for (const s of scanners) {
108
+ let m;
109
+ s.re.lastIndex = 0;
110
+ while ((m = s.re.exec(window)) !== null) {
111
+ const absIdx = start + m.index;
112
+ const distance = absIdx < matchStart ? matchStart - absIdx : absIdx - matchEnd;
113
+ hits.push({ scope: s.scope, distance });
114
+ if (m.index === s.re.lastIndex)
115
+ s.re.lastIndex++;
116
+ }
117
+ }
118
+ if (hits.length === 0) {
119
+ // Fall back to a broader context scan — may return 'pilot' etc.
120
+ return detectScope(context);
121
+ }
122
+ hits.sort((a, b) => a.distance - b.distance);
123
+ return hits[0].scope;
124
+ }
125
+ const TAG_RE = /<!--\s*fcv:([^>]+?)\s*-->/;
126
+ function parseTag(line) {
127
+ const m = line.match(TAG_RE);
128
+ if (!m)
129
+ return null;
130
+ const tag = {};
131
+ for (const pair of m[1].split(/\s+/)) {
132
+ const eq = pair.indexOf('=');
133
+ if (eq === -1)
134
+ continue;
135
+ const key = pair.slice(0, eq).trim();
136
+ const val = pair.slice(eq + 1).trim();
137
+ if (key === 'kind')
138
+ tag.kind = val;
139
+ else if (key === 'scope')
140
+ tag.scope = val;
141
+ else if (key === 'unit')
142
+ tag.unit = val;
143
+ }
144
+ return tag;
145
+ }
146
+ // ============================================================================
147
+ // Kind inference from surrounding prose
148
+ // ============================================================================
149
+ function detectKind(context, defaultKind) {
150
+ const lower = context.toLowerCase();
151
+ if (/\b(?:5[-\s]?year\s*)?npv\b/.test(lower))
152
+ return 'npv';
153
+ if (/\broi\b|return\s+on\s+investment/.test(lower))
154
+ return 'roi';
155
+ if (/\bsavings?\b|annual\s+(?:value|impact|benefit)/.test(lower))
156
+ return 'savings';
157
+ if (/\binvestment\b|\bcapex\b|\bcost\b|\bbudget\b|\bspend\b/.test(lower))
158
+ return 'investment';
159
+ return defaultKind;
160
+ }
161
+ // ============================================================================
162
+ // Section tracker — most-recent H1/H2/H3 heading
163
+ // ============================================================================
164
+ function updateSection(current, line) {
165
+ const m = line.match(/^(#{1,3})\s+(.*?)\s*$/);
166
+ if (!m)
167
+ return current;
168
+ return m[2].trim();
169
+ }
170
+ // ============================================================================
171
+ // Entry point
172
+ // ============================================================================
173
+ /**
174
+ * Extract FinancialClaim records from a markdown document. The document name
175
+ * is recorded on every claim and becomes the primary key for
176
+ * cross-document rule evaluation.
177
+ *
178
+ * Scoping heuristic:
179
+ * 1. If an HTML fcv: tag precedes the figure (same line or prior line),
180
+ * use its declared kind/scope verbatim.
181
+ * 2. Otherwise scan a ±60 char window around the figure for scope words
182
+ * ("pilot", "phase 1", "full program", ...).
183
+ */
184
+ export function extractClaims(markdown, document) {
185
+ const claims = [];
186
+ const lines = markdown.split(/\r?\n/);
187
+ let section = '(preamble)';
188
+ let pendingTag = null;
189
+ for (let i = 0; i < lines.length; i++) {
190
+ const line = lines[i];
191
+ section = updateSection(section, line);
192
+ // Accumulate a pending tag on its own line — consume it on the next
193
+ // non-empty, non-tag line.
194
+ const tag = parseTag(line);
195
+ if (tag) {
196
+ // Inline tag on the same line as the figure is also supported.
197
+ // In that case we use it immediately and skip the pending cycle.
198
+ const withoutTag = line.replace(TAG_RE, '').trim();
199
+ if (withoutTag.length > 0) {
200
+ extractFromLine(withoutTag, i + 1, section, tag, claims, document);
201
+ }
202
+ else {
203
+ pendingTag = tag;
204
+ }
205
+ continue;
206
+ }
207
+ if (line.trim().length === 0)
208
+ continue;
209
+ const useTag = pendingTag;
210
+ pendingTag = null;
211
+ extractFromLine(line, i + 1, section, useTag, claims, document);
212
+ }
213
+ return claims;
214
+ }
215
+ function extractFromLine(line, lineNumber, section, tag, out, document) {
216
+ // Currency claims
217
+ const currencyMatches = Array.from(line.matchAll(CURRENCY_RANGE_RE));
218
+ for (const match of currencyMatches) {
219
+ const raw = match[0];
220
+ // Ignore obvious context-only mentions like "$/sqft" or "$0"
221
+ if (/\$\s*\/|\$0\b|\$\s*X\b/i.test(raw))
222
+ continue;
223
+ const hasRange = /[-–—]|to/.test(raw);
224
+ let rangeLow;
225
+ let rangeHigh;
226
+ let pointValue;
227
+ if (hasRange) {
228
+ const parts = raw.split(/\s*(?:[-–—]|to)\s*/i);
229
+ if (parts.length === 2) {
230
+ const a = parseCurrency(parts[0]);
231
+ const b = parseCurrency(parts[1]);
232
+ if (!Number.isNaN(a) && !Number.isNaN(b)) {
233
+ rangeLow = Math.min(a, b);
234
+ rangeHigh = Math.max(a, b);
235
+ }
236
+ else if (!Number.isNaN(a)) {
237
+ pointValue = a;
238
+ }
239
+ }
240
+ }
241
+ else {
242
+ const v = parseCurrency(raw);
243
+ if (!Number.isNaN(v))
244
+ pointValue = v;
245
+ }
246
+ if (rangeLow === undefined && pointValue === undefined)
247
+ continue;
248
+ // Small-dollar amounts (< $1000) are almost never "financial claims" in
249
+ // an executive doc — they're unit prices, per-capita figures, etc.
250
+ // Skip them to reduce false positives. Real investment/savings figures
251
+ // are always ≥ $1K.
252
+ const anchorValue = pointValue ?? rangeLow ?? 0;
253
+ if (anchorValue < 1_000)
254
+ continue;
255
+ const context = line;
256
+ const kindDefault = 'investment';
257
+ const matchStart = match.index ?? 0;
258
+ const matchEnd = matchStart + raw.length;
259
+ const kind = tag?.kind ?? detectKind(context, kindDefault);
260
+ const scope = tag?.scope ?? detectScopeNearIndex(context, matchStart, matchEnd);
261
+ const claim = {
262
+ document,
263
+ section,
264
+ kind,
265
+ scope,
266
+ ...(rangeLow !== undefined ? { rangeLow } : {}),
267
+ ...(rangeHigh !== undefined ? { rangeHigh } : {}),
268
+ ...(pointValue !== undefined ? { pointValue } : {}),
269
+ unit: 'USD',
270
+ rawText: raw,
271
+ line: lineNumber,
272
+ tagged: tag !== null,
273
+ };
274
+ out.push(claim);
275
+ }
276
+ // Timeline claims — weeks or months
277
+ const timelineMatches = Array.from(line.matchAll(/(\d+)[\s-]*(week|month|year)s?/gi));
278
+ for (const tm of timelineMatches) {
279
+ const value = parseInt(tm[1], 10);
280
+ if (!Number.isFinite(value) || value <= 0)
281
+ continue;
282
+ const unitWord = tm[2].toLowerCase();
283
+ const unit = unitWord.startsWith('week') ? 'weeks' :
284
+ unitWord.startsWith('month') ? 'months' : 'years';
285
+ const tmStart = tm.index ?? 0;
286
+ const tmEnd = tmStart + tm[0].length;
287
+ const HISTORY_WINDOW = 30;
288
+ const windowStart = Math.max(0, tmStart - HISTORY_WINDOW);
289
+ const windowEnd = Math.min(line.length, tmEnd + HISTORY_WINDOW);
290
+ const window = line.slice(windowStart, windowEnd).toLowerCase();
291
+ // Ignore history references like "last 3 years" — check ONLY the window
292
+ // around this match, not the whole line, so legitimate forward-looking
293
+ // timelines aren't dropped when a history reference appears elsewhere.
294
+ if (/\b(last|past|previous|over the (?:past|last))\b/.test(window))
295
+ continue;
296
+ // Ignore payback-style tokens — those are covered by FCR-006 ROI, not timeline.
297
+ if (/payback/.test(window))
298
+ continue;
299
+ const scope = tag?.scope ?? detectScopeNearIndex(line, tmStart, tmEnd);
300
+ out.push({
301
+ document,
302
+ section,
303
+ kind: 'timeline',
304
+ scope,
305
+ pointValue: value,
306
+ unit,
307
+ rawText: tm[0],
308
+ line: lineNumber,
309
+ tagged: tag !== null,
310
+ });
311
+ }
312
+ // Headcount claims — "91,000 employees" / "3,200 roles"
313
+ const headcountMatches = Array.from(line.matchAll(/([\d][\d,]{2,})\s*(?:employees|roles|headcount|staff)\b/gi));
314
+ for (const hm of headcountMatches) {
315
+ const v = parseInt(hm[1].replace(/,/g, ''), 10);
316
+ if (!Number.isFinite(v) || v <= 0)
317
+ continue;
318
+ out.push({
319
+ document,
320
+ section,
321
+ kind: 'headcount',
322
+ scope: tag?.scope ?? detectScope(line),
323
+ pointValue: v,
324
+ unit: 'count',
325
+ rawText: hm[0],
326
+ line: lineNumber,
327
+ tagged: tag !== null,
328
+ });
329
+ }
330
+ // ROI percent claims — "217% projected" / "ROI 300%"
331
+ const roiMatches = Array.from(line.matchAll(/(\d+)\s*%/g));
332
+ for (const rm of roiMatches) {
333
+ if (!/\broi\b|return\s+on\s+investment/i.test(line))
334
+ continue;
335
+ const v = parseInt(rm[1], 10);
336
+ if (!Number.isFinite(v))
337
+ continue;
338
+ out.push({
339
+ document,
340
+ section,
341
+ kind: 'roi',
342
+ scope: tag?.scope ?? detectScope(line),
343
+ pointValue: v,
344
+ unit: 'percent',
345
+ rawText: rm[0],
346
+ line: lineNumber,
347
+ tagged: tag !== null,
348
+ });
349
+ }
350
+ }
351
+ //# sourceMappingURL=financial-claim-extractor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"financial-claim-extractor.js","sourceRoot":"","sources":["../../src/synthesis/financial-claim-extractor.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AA4CH,+EAA+E;AAC/E,2BAA2B;AAC3B,+EAA+E;AAE/E,MAAM,eAAe,GAA2B;IAC9C,CAAC,EAAE,KAAK;IACR,CAAC,EAAE,SAAS;IACZ,CAAC,EAAE,aAAa;CACjB,CAAC;AAEF;;;;GAIG;AACH,MAAM,UAAU,aAAa,CAAC,KAAa;IACzC,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAElD,8BAA8B;IAC9B,MAAM,WAAW,GAAG,OAAO,CAAC,KAAK,CAAC,8BAA8B,CAAC,CAAC;IAClE,IAAI,WAAW,EAAE,CAAC;QAChB,MAAM,GAAG,GAAG,UAAU,CAAC,WAAW,CAAC,CAAC,CAAE,CAAC,CAAC;QACxC,MAAM,IAAI,GAAG,eAAe,CAAC,WAAW,CAAC,CAAC,CAAE,CAAC,WAAW,EAAE,CAAC,IAAI,CAAC,CAAC;QACjE,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC;YAAE,OAAO,GAAG,GAAG,IAAI,CAAC;IAC5C,CAAC;IAED,aAAa;IACb,MAAM,QAAQ,GAAG,OAAO,CAAC,KAAK,CAAC,+BAA+B,CAAC,CAAC;IAChE,IAAI,QAAQ,EAAE,CAAC;QACb,MAAM,GAAG,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAE,CAAC,CAAC;QACrC,MAAM,IAAI,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC,CAAE,CAAC,WAAW,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAClF,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC;YAAE,OAAO,GAAG,GAAG,IAAI,CAAC;IAC5C,CAAC;IAED,4EAA4E;IAC5E,mEAAmE;IACnE,MAAM,YAAY,GAAG,OAAO,CAAC,KAAK,CAAC,6DAA6D,CAAC,CAAC;IAClG,IAAI,YAAY,EAAE,CAAC;QACjB,MAAM,GAAG,GAAG,UAAU,CAAC,YAAY,CAAC,CAAC,CAAE,CAAC,CAAC;QACzC,MAAM,KAAK,GAA2B,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,aAAa,EAAE,CAAC;QACtG,MAAM,IAAI,GAAG,KAAK,CAAC,YAAY,CAAC,CAAC,CAAE,CAAC,WAAW,EAAE,CAAC,IAAI,CAAC,CAAC;QACxD,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC;YAAE,OAAO,GAAG,GAAG,IAAI,CAAC;IAC5C,CAAC;IAED,yEAAyE;IACzE,uEAAuE;IACvE,MAAM,UAAU,GAAG,OAAO,CAAC,KAAK,CAAC,4BAA4B,CAAC,CAAC;IAC/D,IAAI,UAAU,EAAE,CAAC;QACf,MAAM,GAAG,GAAG,UAAU,CAAC,UAAU,CAAC,CAAC,CAAE,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC;QACzD,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,GAAG,GAAG,CAAC;YAAE,OAAO,GAAG,CAAC;IAChD,CAAC;IAED,OAAO,GAAG,CAAC;AACb,CAAC;AAED,qEAAqE;AACrE,MAAM,iBAAiB,GACrB,gEAAgE,CAAC;AAEnE,+EAA+E;AAC/E,wBAAwB;AACxB,+EAA+E;AAE/E,MAAM,cAAc,GAAsD;IACxE,EAAE,EAAE,EAAE,6CAA6C,EAAE,KAAK,EAAE,SAAS,EAAE;IACvE,EAAE,EAAE,EAAE,mBAAmB,EAAE,KAAK,EAAE,SAAS,EAAE;IAC7C,EAAE,EAAE,EAAE,mBAAmB,EAAE,KAAK,EAAE,SAAS,EAAE;IAC7C,EAAE,EAAE,EAAE,2FAA2F,EAAE,KAAK,EAAE,cAAc,EAAE;CAC3H,CAAC;AAEF,SAAS,WAAW,CAAC,OAAe;IAClC,MAAM,KAAK,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IACpC,IAAI,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC;QAAE,OAAO,OAAO,CAAC;IAC5C,KAAK,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,cAAc,EAAE,CAAC;QAC3C,IAAI,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC;YAAE,OAAO,KAAK,CAAC;IACrC,CAAC;IACD,OAAO,UAAU,CAAC;AACpB,CAAC;AAED;;;;;GAKG;AACH,SAAS,oBAAoB,CAC3B,OAAe,EACf,UAAkB,EAClB,QAAgB;IAEhB,MAAM,MAAM,GAAG,EAAE,CAAC;IAClB,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,UAAU,GAAG,MAAM,CAAC,CAAC;IAC/C,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,EAAE,QAAQ,GAAG,MAAM,CAAC,CAAC;IACxD,MAAM,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IAIzC,MAAM,IAAI,GAAU,EAAE,CAAC;IACvB,MAAM,QAAQ,GAAsD;QAClE,EAAE,EAAE,EAAE,aAAa,EAAE,KAAK,EAAE,OAAO,EAAE;QACrC,EAAE,EAAE,EAAE,oCAAoC,EAAE,KAAK,EAAE,SAAS,EAAE;QAC9D,EAAE,EAAE,EAAE,oBAAoB,EAAE,KAAK,EAAE,SAAS,EAAE;QAC9C,EAAE,EAAE,EAAE,oBAAoB,EAAE,KAAK,EAAE,SAAS,EAAE;QAC9C,EAAE,EAAE,EAAE,4FAA4F,EAAE,KAAK,EAAE,cAAc,EAAE;KAC5H,CAAC;IAEF,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;QACzB,IAAI,CAAyB,CAAC;QAC9B,CAAC,CAAC,EAAE,CAAC,SAAS,GAAG,CAAC,CAAC;QACnB,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;YACxC,MAAM,MAAM,GAAG,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC;YAC/B,MAAM,QAAQ,GACZ,MAAM,GAAG,UAAU,CAAC,CAAC,CAAC,UAAU,GAAG,MAAM,CAAC,CAAC,CAAC,MAAM,GAAG,QAAQ,CAAC;YAChE,IAAI,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;YACxC,IAAI,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,EAAE,CAAC,SAAS;gBAAE,CAAC,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC;QACnD,CAAC;IACH,CAAC;IAED,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtB,gEAAgE;QAChE,OAAO,WAAW,CAAC,OAAO,CAAC,CAAC;IAC9B,CAAC;IACD,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC;IAC7C,OAAO,IAAI,CAAC,CAAC,CAAE,CAAC,KAAK,CAAC;AACxB,CAAC;AAYD,MAAM,MAAM,GAAG,2BAA2B,CAAC;AAE3C,SAAS,QAAQ,CAAC,IAAY;IAC5B,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IAC7B,IAAI,CAAC,CAAC;QAAE,OAAO,IAAI,CAAC;IACpB,MAAM,GAAG,GAAQ,EAAE,CAAC;IACpB,KAAK,MAAM,IAAI,IAAI,CAAC,CAAC,CAAC,CAAE,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC;QACtC,MAAM,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QAC7B,IAAI,EAAE,KAAK,CAAC,CAAC;YAAE,SAAS;QACxB,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;QACrC,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QACtC,IAAI,GAAG,KAAK,MAAM;YAAE,GAAG,CAAC,IAAI,GAAG,GAAyB,CAAC;aACpD,IAAI,GAAG,KAAK,OAAO;YAAE,GAAG,CAAC,KAAK,GAAG,GAA0B,CAAC;aAC5D,IAAI,GAAG,KAAK,MAAM;YAAE,GAAG,CAAC,IAAI,GAAG,GAAyB,CAAC;IAChE,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,+EAA+E;AAC/E,wCAAwC;AACxC,+EAA+E;AAE/E,SAAS,UAAU,CAAC,OAAe,EAAE,WAA+B;IAClE,MAAM,KAAK,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IACpC,IAAI,4BAA4B,CAAC,IAAI,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IAC3D,IAAI,kCAAkC,CAAC,IAAI,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IACjE,IAAI,gDAAgD,CAAC,IAAI,CAAC,KAAK,CAAC;QAAE,OAAO,SAAS,CAAC;IACnF,IAAI,wDAAwD,CAAC,IAAI,CAAC,KAAK,CAAC;QAAE,OAAO,YAAY,CAAC;IAC9F,OAAO,WAAW,CAAC;AACrB,CAAC;AAED,+EAA+E;AAC/E,iDAAiD;AACjD,+EAA+E;AAE/E,SAAS,aAAa,CAAC,OAAe,EAAE,IAAY;IAClD,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,uBAAuB,CAAC,CAAC;IAC9C,IAAI,CAAC,CAAC;QAAE,OAAO,OAAO,CAAC;IACvB,OAAO,CAAC,CAAC,CAAC,CAAE,CAAC,IAAI,EAAE,CAAC;AACtB,CAAC;AAED,+EAA+E;AAC/E,cAAc;AACd,+EAA+E;AAE/E;;;;;;;;;;GAUG;AACH,MAAM,UAAU,aAAa,CAC3B,QAAgB,EAChB,QAAgC;IAEhC,MAAM,MAAM,GAAqB,EAAE,CAAC;IACpC,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAEtC,IAAI,OAAO,GAAG,YAAY,CAAC;IAC3B,IAAI,UAAU,GAAe,IAAI,CAAC;IAElC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACtC,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAE,CAAC;QACvB,OAAO,GAAG,aAAa,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;QAEvC,oEAAoE;QACpE,2BAA2B;QAC3B,MAAM,GAAG,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;QAC3B,IAAI,GAAG,EAAE,CAAC;YACR,+DAA+D;YAC/D,iEAAiE;YACjE,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;YACnD,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC1B,eAAe,CAAC,UAAU,EAAE,CAAC,GAAG,CAAC,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;YACrE,CAAC;iBAAM,CAAC;gBACN,UAAU,GAAG,GAAG,CAAC;YACnB,CAAC;YACD,SAAS;QACX,CAAC;QAED,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC;YAAE,SAAS;QAEvC,MAAM,MAAM,GAAG,UAAU,CAAC;QAC1B,UAAU,GAAG,IAAI,CAAC;QAElB,eAAe,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;IAClE,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,eAAe,CACtB,IAAY,EACZ,UAAkB,EAClB,OAAe,EACf,GAAe,EACf,GAAqB,EACrB,QAAgC;IAEhC,kBAAkB;IAClB,MAAM,eAAe,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,iBAAiB,CAAC,CAAC,CAAC;IACrE,KAAK,MAAM,KAAK,IAAI,eAAe,EAAE,CAAC;QACpC,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QACrB,6DAA6D;QAC7D,IAAI,yBAAyB,CAAC,IAAI,CAAC,GAAG,CAAC;YAAE,SAAS;QAElD,MAAM,QAAQ,GAAG,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACtC,IAAI,QAA4B,CAAC;QACjC,IAAI,SAA6B,CAAC;QAClC,IAAI,UAA8B,CAAC;QAEnC,IAAI,QAAQ,EAAE,CAAC;YACb,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,qBAAqB,CAAC,CAAC;YAC/C,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACvB,MAAM,CAAC,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC,CAAE,CAAC,CAAC;gBACnC,MAAM,CAAC,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC,CAAE,CAAC,CAAC;gBACnC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;oBACzC,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;oBAC1B,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;gBAC7B,CAAC;qBAAM,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;oBAC5B,UAAU,GAAG,CAAC,CAAC;gBACjB,CAAC;YACH,CAAC;QACH,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC;YAC7B,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;gBAAE,UAAU,GAAG,CAAC,CAAC;QACvC,CAAC;QAED,IAAI,QAAQ,KAAK,SAAS,IAAI,UAAU,KAAK,SAAS;YAAE,SAAS;QAEjE,wEAAwE;QACxE,mEAAmE;QACnE,uEAAuE;QACvE,oBAAoB;QACpB,MAAM,WAAW,GAAG,UAAU,IAAI,QAAQ,IAAI,CAAC,CAAC;QAChD,IAAI,WAAW,GAAG,KAAK;YAAE,SAAS;QAElC,MAAM,OAAO,GAAG,IAAI,CAAC;QACrB,MAAM,WAAW,GAAuB,YAAY,CAAC;QACrD,MAAM,UAAU,GAAG,KAAK,CAAC,KAAK,IAAI,CAAC,CAAC;QACpC,MAAM,QAAQ,GAAG,UAAU,GAAG,GAAG,CAAC,MAAM,CAAC;QACzC,MAAM,IAAI,GAAG,GAAG,EAAE,IAAI,IAAI,UAAU,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;QAC3D,MAAM,KAAK,GAAG,GAAG,EAAE,KAAK,IAAI,oBAAoB,CAAC,OAAO,EAAE,UAAU,EAAE,QAAQ,CAAC,CAAC;QAEhF,MAAM,KAAK,GAAmB;YAC5B,QAAQ;YACR,OAAO;YACP,IAAI;YACJ,KAAK;YACL,GAAG,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC/C,GAAG,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACjD,GAAG,CAAC,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACnD,IAAI,EAAE,KAAK;YACX,OAAO,EAAE,GAAG;YACZ,IAAI,EAAE,UAAU;YAChB,MAAM,EAAE,GAAG,KAAK,IAAI;SACrB,CAAC;QACF,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAClB,CAAC;IAED,oCAAoC;IACpC,MAAM,eAAe,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,kCAAkC,CAAC,CAAC,CAAC;IACtF,KAAK,MAAM,EAAE,IAAI,eAAe,EAAE,CAAC;QACjC,MAAM,KAAK,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAE,EAAE,EAAE,CAAC,CAAC;QACnC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC;YAAE,SAAS;QACpD,MAAM,QAAQ,GAAG,EAAE,CAAC,CAAC,CAAE,CAAC,WAAW,EAAE,CAAC;QACtC,MAAM,IAAI,GACR,QAAQ,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;YACvC,QAAQ,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC;QAEpD,MAAM,OAAO,GAAG,EAAE,CAAC,KAAK,IAAI,CAAC,CAAC;QAC9B,MAAM,KAAK,GAAG,OAAO,GAAG,EAAE,CAAC,CAAC,CAAE,CAAC,MAAM,CAAC;QACtC,MAAM,cAAc,GAAG,EAAE,CAAC;QAC1B,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,GAAG,cAAc,CAAC,CAAC;QAC1D,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,KAAK,GAAG,cAAc,CAAC,CAAC;QAChE,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC,WAAW,EAAE,CAAC;QAEhE,wEAAwE;QACxE,uEAAuE;QACvE,uEAAuE;QACvE,IAAI,iDAAiD,CAAC,IAAI,CAAC,MAAM,CAAC;YAAE,SAAS;QAC7E,gFAAgF;QAChF,IAAI,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC;YAAE,SAAS;QAErC,MAAM,KAAK,GAAG,GAAG,EAAE,KAAK,IAAI,oBAAoB,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC;QACvE,GAAG,CAAC,IAAI,CAAC;YACP,QAAQ;YACR,OAAO;YACP,IAAI,EAAE,UAAU;YAChB,KAAK;YACL,UAAU,EAAE,KAAK;YACjB,IAAI;YACJ,OAAO,EAAE,EAAE,CAAC,CAAC,CAAE;YACf,IAAI,EAAE,UAAU;YAChB,MAAM,EAAE,GAAG,KAAK,IAAI;SACrB,CAAC,CAAC;IACL,CAAC;IAED,wDAAwD;IACxD,MAAM,gBAAgB,GAAG,KAAK,CAAC,IAAI,CACjC,IAAI,CAAC,QAAQ,CAAC,2DAA2D,CAAC,CAC3E,CAAC;IACF,KAAK,MAAM,EAAE,IAAI,gBAAgB,EAAE,CAAC;QAClC,MAAM,CAAC,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAE,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;QACjD,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;YAAE,SAAS;QAC5C,GAAG,CAAC,IAAI,CAAC;YACP,QAAQ;YACR,OAAO;YACP,IAAI,EAAE,WAAW;YACjB,KAAK,EAAE,GAAG,EAAE,KAAK,IAAI,WAAW,CAAC,IAAI,CAAC;YACtC,UAAU,EAAE,CAAC;YACb,IAAI,EAAE,OAAO;YACb,OAAO,EAAE,EAAE,CAAC,CAAC,CAAE;YACf,IAAI,EAAE,UAAU;YAChB,MAAM,EAAE,GAAG,KAAK,IAAI;SACrB,CAAC,CAAC;IACL,CAAC;IAED,qDAAqD;IACrD,MAAM,UAAU,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC,CAAC;IAC3D,KAAK,MAAM,EAAE,IAAI,UAAU,EAAE,CAAC;QAC5B,IAAI,CAAC,mCAAmC,CAAC,IAAI,CAAC,IAAI,CAAC;YAAE,SAAS;QAC9D,MAAM,CAAC,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAE,EAAE,EAAE,CAAC,CAAC;QAC/B,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC;YAAE,SAAS;QAClC,GAAG,CAAC,IAAI,CAAC;YACP,QAAQ;YACR,OAAO;YACP,IAAI,EAAE,KAAK;YACX,KAAK,EAAE,GAAG,EAAE,KAAK,IAAI,WAAW,CAAC,IAAI,CAAC;YACtC,UAAU,EAAE,CAAC;YACb,IAAI,EAAE,SAAS;YACf,OAAO,EAAE,EAAE,CAAC,CAAC,CAAE;YACf,IAAI,EAAE,UAAU;YAChB,MAAM,EAAE,GAAG,KAAK,IAAI;SACrB,CAAC,CAAC;IACL,CAAC;AACH,CAAC"}
@@ -0,0 +1,66 @@
1
+ /**
2
+ * ADR-PIPELINE-067: Financial Consistency Rules (FCR-001..009)
3
+ *
4
+ * Pure functions over the output of financial-claim-extractor + an optional
5
+ * unit-economics manifest. Each rule returns zero or more Violation objects.
6
+ *
7
+ * Rule IDs:
8
+ * FCR-001 Same scope + same kind across documents ⇒ numeric ranges must overlap
9
+ * FCR-002 Pilot investment MUST be ≤ full-program investment
10
+ * FCR-003 Phase-1 range MUST be a subset of full-program range
11
+ * FCR-004 Every currency claim MUST have a non-unscoped scope
12
+ * FCR-005 Timeline claims for the same scope MUST match within ±1 week
13
+ * FCR-006 Savings + investment for the same scope MUST yield the ROI stated
14
+ * FCR-007 When unit-economics manifest exists, top-line figures match ±1%
15
+ * FCR-008 Pilot savings × (enterprise/pilot units) MUST equal enterprise savings ±5%
16
+ * FCR-009 At most one "headline" figure per document
17
+ */
18
+ import type { FinancialClaim, FinancialClaimDocument, FinancialClaimKind, FinancialClaimScope } from './financial-claim-extractor.js';
19
+ import type { UnitEconomics } from '../pipeline/types.js';
20
+ import type { ConsensusSnapshot } from './consensus-tiers.js';
21
+ export type Severity = 'error' | 'warn';
22
+ export interface Violation {
23
+ readonly ruleId: string;
24
+ readonly severity: Severity;
25
+ readonly message: string;
26
+ readonly claims: readonly FinancialClaim[];
27
+ readonly suggestedFix?: string;
28
+ }
29
+ declare function ruleFcr001(claims: readonly FinancialClaim[]): Violation[];
30
+ declare function ruleFcr002and003(claims: readonly FinancialClaim[]): Violation[];
31
+ declare function ruleFcr004(claims: readonly FinancialClaim[]): Violation[];
32
+ declare function ruleFcr005(claims: readonly FinancialClaim[]): Violation[];
33
+ declare function ruleFcr006(claims: readonly FinancialClaim[]): Violation[];
34
+ declare function ruleFcr007(claims: readonly FinancialClaim[], manifest: UnitEconomics | null): Violation[];
35
+ declare function ruleFcr008(claims: readonly FinancialClaim[], manifest: UnitEconomics | null): Violation[];
36
+ declare function ruleFcr009(claims: readonly FinancialClaim[]): Violation[];
37
+ export interface DocumentBody {
38
+ readonly document: FinancialClaimDocument;
39
+ readonly content: string;
40
+ }
41
+ declare function ruleFcr010(documents: readonly DocumentBody[], consensus: ConsensusSnapshot | null): Violation[];
42
+ export interface RunRulesInput {
43
+ readonly claims: readonly FinancialClaim[];
44
+ readonly manifest?: UnitEconomics | null;
45
+ readonly documents?: readonly DocumentBody[];
46
+ readonly consensus?: ConsensusSnapshot | null;
47
+ }
48
+ export declare function runConsistencyRules(input: RunRulesInput): Violation[];
49
+ export declare const __internal: {
50
+ ruleFcr001: typeof ruleFcr001;
51
+ ruleFcr002and003: typeof ruleFcr002and003;
52
+ ruleFcr004: typeof ruleFcr004;
53
+ ruleFcr005: typeof ruleFcr005;
54
+ ruleFcr006: typeof ruleFcr006;
55
+ ruleFcr007: typeof ruleFcr007;
56
+ ruleFcr008: typeof ruleFcr008;
57
+ ruleFcr009: typeof ruleFcr009;
58
+ ruleFcr010: typeof ruleFcr010;
59
+ };
60
+ export declare function countViolations(vs: readonly Violation[]): {
61
+ errors: number;
62
+ warnings: number;
63
+ };
64
+ export declare function violationsByDocument(vs: readonly Violation[]): Map<FinancialClaimDocument, Violation[]>;
65
+ export type { FinancialClaim, FinancialClaimDocument, FinancialClaimKind, FinancialClaimScope };
66
+ //# sourceMappingURL=financial-consistency-rules.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"financial-consistency-rules.d.ts","sourceRoot":"","sources":["../../src/synthesis/financial-consistency-rules.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,KAAK,EACV,cAAc,EACd,sBAAsB,EACtB,kBAAkB,EAClB,mBAAmB,EACpB,MAAM,gCAAgC,CAAC;AACxC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAG9D,MAAM,MAAM,QAAQ,GAAG,OAAO,GAAG,MAAM,CAAC;AAExC,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC;IAC5B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,MAAM,EAAE,SAAS,cAAc,EAAE,CAAC;IAC3C,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;CAChC;AAoDD,iBAAS,UAAU,CAAC,MAAM,EAAE,SAAS,cAAc,EAAE,GAAG,SAAS,EAAE,CAmDlE;AAOD,iBAAS,gBAAgB,CAAC,MAAM,EAAE,SAAS,cAAc,EAAE,GAAG,SAAS,EAAE,CAwDxE;AAMD,iBAAS,UAAU,CAAC,MAAM,EAAE,SAAS,cAAc,EAAE,GAAG,SAAS,EAAE,CAclE;AAgBD,iBAAS,UAAU,CAAC,MAAM,EAAE,SAAS,cAAc,EAAE,GAAG,SAAS,EAAE,CAmClE;AAMD,iBAAS,UAAU,CAAC,MAAM,EAAE,SAAS,cAAc,EAAE,GAAG,SAAS,EAAE,CAkClE;AAMD,iBAAS,UAAU,CACjB,MAAM,EAAE,SAAS,cAAc,EAAE,EACjC,QAAQ,EAAE,aAAa,GAAG,IAAI,GAC7B,SAAS,EAAE,CAkCb;AAMD,iBAAS,UAAU,CACjB,MAAM,EAAE,SAAS,cAAc,EAAE,EACjC,QAAQ,EAAE,aAAa,GAAG,IAAI,GAC7B,SAAS,EAAE,CAoCb;AAMD,iBAAS,UAAU,CAAC,MAAM,EAAE,SAAS,cAAc,EAAE,GAAG,SAAS,EAAE,CA4BlE;AAMD,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,QAAQ,EAAE,sBAAsB,CAAC;IAC1C,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B;AAED,iBAAS,UAAU,CACjB,SAAS,EAAE,SAAS,YAAY,EAAE,EAClC,SAAS,EAAE,iBAAiB,GAAG,IAAI,GAClC,SAAS,EAAE,CA+Bb;AAMD,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,MAAM,EAAE,SAAS,cAAc,EAAE,CAAC;IAC3C,QAAQ,CAAC,QAAQ,CAAC,EAAE,aAAa,GAAG,IAAI,CAAC;IACzC,QAAQ,CAAC,SAAS,CAAC,EAAE,SAAS,YAAY,EAAE,CAAC;IAC7C,QAAQ,CAAC,SAAS,CAAC,EAAE,iBAAiB,GAAG,IAAI,CAAC;CAC/C;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,aAAa,GAAG,SAAS,EAAE,CAarE;AAGD,eAAO,MAAM,UAAU;;;;;;;;;;CAUtB,CAAC;AAGF,wBAAgB,eAAe,CAAC,EAAE,EAAE,SAAS,SAAS,EAAE,GAAG;IACzD,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;CAClB,CAQA;AAGD,wBAAgB,oBAAoB,CAClC,EAAE,EAAE,SAAS,SAAS,EAAE,GACvB,GAAG,CAAC,sBAAsB,EAAE,SAAS,EAAE,CAAC,CAU1C;AAGD,YAAY,EAAE,cAAc,EAAE,sBAAsB,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,CAAC"}