@actuarial-ts/core 0.7.1 → 0.8.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.
- package/README.md +15 -4
- package/dist/analysisRecipe.d.ts +55 -0
- package/dist/analysisRecipe.d.ts.map +1 -0
- package/dist/analysisRecipe.js +627 -0
- package/dist/analysisRecipe.js.map +1 -0
- package/dist/classifications.d.ts +30 -0
- package/dist/classifications.d.ts.map +1 -0
- package/dist/classifications.js +207 -0
- package/dist/classifications.js.map +1 -0
- package/dist/customizationContracts.d.ts +749 -0
- package/dist/customizationContracts.d.ts.map +1 -0
- package/dist/customizationContracts.js +19 -0
- package/dist/customizationContracts.js.map +1 -0
- package/dist/descriptiveStatistics.d.ts +8 -0
- package/dist/descriptiveStatistics.d.ts.map +1 -0
- package/dist/descriptiveStatistics.js +283 -0
- package/dist/descriptiveStatistics.js.map +1 -0
- package/dist/diagnosticAggregation.d.ts.map +1 -1
- package/dist/diagnosticAggregation.js +16 -0
- package/dist/diagnosticAggregation.js.map +1 -1
- package/dist/diagnosticFreeze.d.ts +4 -0
- package/dist/diagnosticFreeze.d.ts.map +1 -0
- package/dist/diagnosticFreeze.js +37 -0
- package/dist/diagnosticFreeze.js.map +1 -0
- package/dist/diagnosticIdentityStream.d.ts +4 -0
- package/dist/diagnosticIdentityStream.d.ts.map +1 -1
- package/dist/diagnosticIdentityStream.js +32 -2
- package/dist/diagnosticIdentityStream.js.map +1 -1
- package/dist/diagnosticPreparation.d.ts +21 -0
- package/dist/diagnosticPreparation.d.ts.map +1 -1
- package/dist/diagnosticPreparation.js +231 -19
- package/dist/diagnosticPreparation.js.map +1 -1
- package/dist/diagnosticReview.d.ts.map +1 -1
- package/dist/diagnosticReview.js +43 -25
- package/dist/diagnosticReview.js.map +1 -1
- package/dist/diagnosticReviewSources.d.ts.map +1 -1
- package/dist/diagnosticReviewSources.js +25 -4
- package/dist/diagnosticReviewSources.js.map +1 -1
- package/dist/diagnosticReviewStore.d.ts +2 -0
- package/dist/diagnosticReviewStore.d.ts.map +1 -1
- package/dist/diagnosticReviewStore.js +110 -36
- package/dist/diagnosticReviewStore.js.map +1 -1
- package/dist/diagnosticRunner.d.ts.map +1 -1
- package/dist/diagnosticRunner.js +1 -8
- package/dist/diagnosticRunner.js.map +1 -1
- package/dist/exposureEarning.d.ts +12 -0
- package/dist/exposureEarning.d.ts.map +1 -0
- package/dist/exposureEarning.js +276 -0
- package/dist/exposureEarning.js.map +1 -0
- package/dist/exposureMovements.d.ts +8 -0
- package/dist/exposureMovements.d.ts.map +1 -0
- package/dist/exposureMovements.js +70 -0
- package/dist/exposureMovements.js.map +1 -0
- package/dist/exposureRevisions.d.ts +13 -0
- package/dist/exposureRevisions.d.ts.map +1 -0
- package/dist/exposureRevisions.js +161 -0
- package/dist/exposureRevisions.js.map +1 -0
- package/dist/financialPipeline.d.ts +14 -0
- package/dist/financialPipeline.d.ts.map +1 -0
- package/dist/financialPipeline.js +75 -0
- package/dist/financialPipeline.js.map +1 -0
- package/dist/financialTerms.d.ts +20 -0
- package/dist/financialTerms.d.ts.map +1 -0
- package/dist/financialTerms.js +205 -0
- package/dist/financialTerms.js.map +1 -0
- package/dist/fnvAccumulator.d.ts.map +1 -1
- package/dist/fnvAccumulator.js +11 -5
- package/dist/fnvAccumulator.js.map +1 -1
- package/dist/historyPreparation.d.ts +8 -0
- package/dist/historyPreparation.d.ts.map +1 -0
- package/dist/historyPreparation.js +557 -0
- package/dist/historyPreparation.js.map +1 -0
- package/dist/index.d.ts +15 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +15 -2
- package/dist/index.js.map +1 -1
- package/dist/policyPeriods.d.ts +29 -0
- package/dist/policyPeriods.d.ts.map +1 -0
- package/dist/policyPeriods.js +322 -0
- package/dist/policyPeriods.js.map +1 -0
- package/dist/populations.d.ts +11 -0
- package/dist/populations.d.ts.map +1 -0
- package/dist/populations.js +264 -0
- package/dist/populations.js.map +1 -0
- package/dist/reservingAdapter.d.ts +16 -0
- package/dist/reservingAdapter.d.ts.map +1 -0
- package/dist/reservingAdapter.js +74 -0
- package/dist/reservingAdapter.js.map +1 -0
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/package.json +2 -2
- package/src/analysisRecipe.ts +696 -0
- package/src/classifications.ts +231 -0
- package/src/customizationContracts.ts +763 -0
- package/src/descriptiveStatistics.ts +320 -0
- package/src/diagnosticAggregation.ts +16 -0
- package/src/diagnosticFreeze.ts +37 -0
- package/src/diagnosticIdentityStream.ts +37 -2
- package/src/diagnosticPreparation.ts +259 -26
- package/src/diagnosticReview.ts +49 -27
- package/src/diagnosticReviewSources.ts +22 -3
- package/src/diagnosticReviewStore.ts +139 -54
- package/src/diagnosticRunner.ts +1 -11
- package/src/exposureEarning.ts +314 -0
- package/src/exposureMovements.ts +78 -0
- package/src/exposureRevisions.ts +186 -0
- package/src/financialPipeline.ts +93 -0
- package/src/financialTerms.ts +263 -0
- package/src/fnvAccumulator.ts +11 -5
- package/src/historyPreparation.ts +645 -0
- package/src/index.ts +28 -1
- package/src/policyPeriods.ts +375 -0
- package/src/populations.ts +307 -0
- package/src/reservingAdapter.ts +98 -0
- package/src/version.ts +1 -1
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
import { canonicalJson, fnv1a64 } from "./canonical.js";
|
|
2
|
+
import { isRealIsoDate, snapshotDiagnosticJson } from "./diagnosticRuntime.js";
|
|
3
|
+
import { DiagnosticValidationError } from "./types.js";
|
|
4
|
+
function correctedAt(observation) {
|
|
5
|
+
return observation.revision?.correctedAt;
|
|
6
|
+
}
|
|
7
|
+
function orderValue(observation, precedence) {
|
|
8
|
+
return precedence === "sequence" ? observation.revision?.sequence : correctedAt(observation);
|
|
9
|
+
}
|
|
10
|
+
function compareOrder(left, right, precedence) {
|
|
11
|
+
const a = orderValue(left, precedence);
|
|
12
|
+
const b = orderValue(right, precedence);
|
|
13
|
+
if (a === undefined || b === undefined)
|
|
14
|
+
return 0;
|
|
15
|
+
if (a === b)
|
|
16
|
+
return left.revisionId.localeCompare(right.revisionId);
|
|
17
|
+
return a < b ? -1 : 1;
|
|
18
|
+
}
|
|
19
|
+
function economic(observation) {
|
|
20
|
+
const { source: _source, revisionId: _revisionId, revision: _revision, ...value } = observation;
|
|
21
|
+
return value;
|
|
22
|
+
}
|
|
23
|
+
/** Selects immutable exposure revisions without allowing later corrections into an as-known run. */
|
|
24
|
+
export function selectExposureRevisions(input) {
|
|
25
|
+
const issues = [];
|
|
26
|
+
if (input.selection.revisionView.kind === "as-known" &&
|
|
27
|
+
!isRealIsoDate(input.selection.revisionView.knowledgeCutoff.slice(0, 10)))
|
|
28
|
+
issues.push({
|
|
29
|
+
domain: "configuration",
|
|
30
|
+
code: "invalid-period",
|
|
31
|
+
path: "$.selection.revisionView.knowledgeCutoff",
|
|
32
|
+
message: "Exposure knowledge cutoff must begin with a real Gregorian date",
|
|
33
|
+
});
|
|
34
|
+
input.observations.forEach((observation, index) => {
|
|
35
|
+
const revision = observation.revision;
|
|
36
|
+
if (input.selection.revisionPrecedence === "sequence" && revision !== undefined && revision.sequence === undefined)
|
|
37
|
+
issues.push({ domain: "input", code: "missing-required", path: `$.observations[${index}].revision.sequence`, message: "Sequence precedence requires sequence on every revisioned exposure observation" });
|
|
38
|
+
if (input.selection.revisionPrecedence === "corrected-at" && revision !== undefined && revision.correctedAt === undefined)
|
|
39
|
+
issues.push({ domain: "input", code: "missing-required", path: `$.observations[${index}].revision.correctedAt`, message: "Corrected-at precedence requires correctedAt on every revisioned exposure observation" });
|
|
40
|
+
});
|
|
41
|
+
if (issues.length > 0)
|
|
42
|
+
throw new DiagnosticValidationError(issues);
|
|
43
|
+
const groups = new Map();
|
|
44
|
+
for (const observation of input.observations) {
|
|
45
|
+
const groupKey = canonicalJson([observation.id, observation.evaluationDate ?? null]);
|
|
46
|
+
const values = groups.get(groupKey) ?? [];
|
|
47
|
+
values.push(observation);
|
|
48
|
+
groups.set(groupKey, values);
|
|
49
|
+
}
|
|
50
|
+
const selected = [];
|
|
51
|
+
const dispositions = [];
|
|
52
|
+
const findings = [];
|
|
53
|
+
for (const [, group] of [...groups].sort(([a], [b]) => a.localeCompare(b))) {
|
|
54
|
+
const observationId = group[0].id;
|
|
55
|
+
const evaluationDate = group[0].evaluationDate;
|
|
56
|
+
const disposition = (revisionId, value) => ({
|
|
57
|
+
observationId,
|
|
58
|
+
...(evaluationDate === undefined ? {} : { evaluationDate }),
|
|
59
|
+
revisionId,
|
|
60
|
+
disposition: value,
|
|
61
|
+
});
|
|
62
|
+
const eligible = group.filter((observation) => {
|
|
63
|
+
if (input.selection.revisionView.kind !== "as-known")
|
|
64
|
+
return true;
|
|
65
|
+
const known = correctedAt(observation);
|
|
66
|
+
const include = known === undefined || known <= input.selection.revisionView.knowledgeCutoff;
|
|
67
|
+
if (!include)
|
|
68
|
+
dispositions.push(disposition(observation.revisionId, "after-knowledge-cutoff"));
|
|
69
|
+
return include;
|
|
70
|
+
});
|
|
71
|
+
if (eligible.length === 0)
|
|
72
|
+
continue;
|
|
73
|
+
eligible.sort((a, b) => compareOrder(a, b, input.selection.revisionPrecedence));
|
|
74
|
+
const winner = eligible.at(-1);
|
|
75
|
+
const sameOrder = eligible.filter((candidate) => orderValue(candidate, input.selection.revisionPrecedence) === orderValue(winner, input.selection.revisionPrecedence));
|
|
76
|
+
const distinct = new Set(sameOrder.map((candidate) => canonicalJson(economic(candidate))));
|
|
77
|
+
if (distinct.size > 1) {
|
|
78
|
+
sameOrder.forEach((candidate) => dispositions.push(disposition(candidate.revisionId, "conflict")));
|
|
79
|
+
findings.push({
|
|
80
|
+
code: "invalid-configuration",
|
|
81
|
+
capability: "exposure-earning",
|
|
82
|
+
path: `$.exposures.${observationId}`,
|
|
83
|
+
message: "Exposure revisions at the selected precedence conflict",
|
|
84
|
+
});
|
|
85
|
+
continue;
|
|
86
|
+
}
|
|
87
|
+
for (const candidate of eligible) {
|
|
88
|
+
if (candidate === winner)
|
|
89
|
+
continue;
|
|
90
|
+
dispositions.push(disposition(candidate.revisionId, sameOrder.includes(candidate) ? "duplicate" : "superseded"));
|
|
91
|
+
}
|
|
92
|
+
if (winner.revision?.action === "delete")
|
|
93
|
+
dispositions.push(disposition(winner.revisionId, "deleted"));
|
|
94
|
+
else {
|
|
95
|
+
dispositions.push(disposition(winner.revisionId, "selected"));
|
|
96
|
+
selected.push(winner);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
const economicInput = {
|
|
100
|
+
selection: input.selection,
|
|
101
|
+
observations: selected.map(economic),
|
|
102
|
+
};
|
|
103
|
+
const calculationRevisionId = `fnv1a64-jcs-v1:${fnv1a64(canonicalJson(economicInput))}`;
|
|
104
|
+
const lineageRevisionId = `fnv1a64-jcs-v1:${fnv1a64(canonicalJson({
|
|
105
|
+
calculationRevisionId,
|
|
106
|
+
selected,
|
|
107
|
+
dispositions,
|
|
108
|
+
}))}`;
|
|
109
|
+
return snapshotDiagnosticJson({
|
|
110
|
+
observations: selected,
|
|
111
|
+
dispositions,
|
|
112
|
+
calculationRevisionId,
|
|
113
|
+
lineageRevisionId,
|
|
114
|
+
findings,
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
/** Applies the declared origin-static or valuation-specific exposure view. */
|
|
118
|
+
export function selectExposureValuation(input) {
|
|
119
|
+
const mode = input.scope.valuationSelection ?? "origin-static";
|
|
120
|
+
const dated = input.observations.filter((observation) => observation.evaluationDate !== undefined);
|
|
121
|
+
const undated = input.observations.filter((observation) => observation.evaluationDate === undefined);
|
|
122
|
+
if (mode === "origin-static") {
|
|
123
|
+
if (dated.length > 0)
|
|
124
|
+
return snapshotDiagnosticJson({ observations: [], findings: [{
|
|
125
|
+
code: "incompatible-semantics", capability: "exposure-earning", path: `$.scopes.${input.scope.id}.valuationSelection`,
|
|
126
|
+
message: "Origin-static exposure cannot contain valuation-specific observations",
|
|
127
|
+
}] });
|
|
128
|
+
return snapshotDiagnosticJson({ observations: undated, findings: [] });
|
|
129
|
+
}
|
|
130
|
+
if (undated.length > 0)
|
|
131
|
+
return snapshotDiagnosticJson({ observations: [], findings: [{
|
|
132
|
+
code: "missing-prerequisite", capability: "exposure-earning", path: `$.scopes.${input.scope.id}.valuationSelection`,
|
|
133
|
+
message: "Valuation-specific exposure requires evaluationDate on every observation", requiredFields: ["evaluationDate"],
|
|
134
|
+
}] });
|
|
135
|
+
if (mode === "exact") {
|
|
136
|
+
const selected = dated.filter((observation) => observation.evaluationDate === input.evaluationDate);
|
|
137
|
+
return snapshotDiagnosticJson({ observations: selected, findings: selected.length > 0 ? [] : [{
|
|
138
|
+
code: "missing-prerequisite", capability: "exposure-earning", path: `$.exposures.${input.evaluationDate}`,
|
|
139
|
+
message: "No exact exposure valuation exists for the analysis date",
|
|
140
|
+
}] });
|
|
141
|
+
}
|
|
142
|
+
const bySeries = new Map();
|
|
143
|
+
for (const observation of dated) {
|
|
144
|
+
const seriesKey = canonicalJson([observation.id, observation.measureId, observation.startDate ?? null, observation.endDate ?? null, observation.pointDate ?? null, observation.dimensions]);
|
|
145
|
+
const values = bySeries.get(seriesKey) ?? [];
|
|
146
|
+
values.push(observation);
|
|
147
|
+
bySeries.set(seriesKey, values);
|
|
148
|
+
}
|
|
149
|
+
const selected = [...bySeries.values()].flatMap((series) => {
|
|
150
|
+
const eligible = series.filter((observation) => observation.evaluationDate <= input.evaluationDate).sort((a, b) => a.evaluationDate.localeCompare(b.evaluationDate));
|
|
151
|
+
if (eligible.length === 0)
|
|
152
|
+
return [];
|
|
153
|
+
const latest = eligible.at(-1).evaluationDate;
|
|
154
|
+
return eligible.filter((observation) => observation.evaluationDate === latest);
|
|
155
|
+
});
|
|
156
|
+
return snapshotDiagnosticJson({ observations: selected, findings: selected.length > 0 || dated.length === 0 ? [] : [{
|
|
157
|
+
code: "missing-prerequisite", capability: "exposure-earning", path: `$.exposures.${input.evaluationDate}`,
|
|
158
|
+
message: "No exposure valuation exists on or before the analysis date",
|
|
159
|
+
}] });
|
|
160
|
+
}
|
|
161
|
+
//# sourceMappingURL=exposureRevisions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"exposureRevisions.js","sourceRoot":"","sources":["../src/exposureRevisions.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { FinancialPipelineResult, FinancialPipelineStage, PreparedHistoricalObservation } from "./customizationContracts.js";
|
|
2
|
+
/** Applies caller-ordered amount transformations and shared terms with a complete audit trail. */
|
|
3
|
+
export declare function applyFinancialPipeline(input: {
|
|
4
|
+
readonly observations: readonly PreparedHistoricalObservation[];
|
|
5
|
+
readonly amountMeasureId: string;
|
|
6
|
+
readonly inputUnit: string;
|
|
7
|
+
readonly stages: readonly FinancialPipelineStage[];
|
|
8
|
+
readonly completeFinancialPopulation: boolean;
|
|
9
|
+
readonly reportingClaims?: readonly {
|
|
10
|
+
readonly sourceNamespace: string;
|
|
11
|
+
readonly claimId: string;
|
|
12
|
+
}[];
|
|
13
|
+
}): FinancialPipelineResult;
|
|
14
|
+
//# sourceMappingURL=financialPipeline.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"financialPipeline.d.ts","sourceRoot":"","sources":["../src/financialPipeline.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAEV,uBAAuB,EACvB,sBAAsB,EACtB,6BAA6B,EAC9B,MAAM,6BAA6B,CAAC;AA0BrC,kGAAkG;AAClG,wBAAgB,sBAAsB,CAAC,KAAK,EAAE;IAC5C,QAAQ,CAAC,YAAY,EAAE,SAAS,6BAA6B,EAAE,CAAC;IAChE,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,MAAM,EAAE,SAAS,sBAAsB,EAAE,CAAC;IACnD,QAAQ,CAAC,2BAA2B,EAAE,OAAO,CAAC;IAC9C,QAAQ,CAAC,eAAe,CAAC,EAAE,SAAS;QAAE,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;CACtG,GAAG,uBAAuB,CAoD1B"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import { canonicalJson, fnv1a64 } from "./canonical.js";
|
|
2
|
+
import { isRealIsoDate, snapshotDiagnosticJson } from "./diagnosticRuntime.js";
|
|
3
|
+
import { applyFinancialTerms } from "./financialTerms.js";
|
|
4
|
+
const PIPELINE_MEASURE = "financial-pipeline-amount";
|
|
5
|
+
function key(observation) {
|
|
6
|
+
return canonicalJson([observation.sourceNamespace, observation.claimId]);
|
|
7
|
+
}
|
|
8
|
+
function unavailable(input, inputUnit, outputUnit, finding) {
|
|
9
|
+
return snapshotDiagnosticJson({
|
|
10
|
+
status: "unavailable",
|
|
11
|
+
inputUnit,
|
|
12
|
+
outputUnit,
|
|
13
|
+
calculationIdentity: `fnv1a64-jcs-v1:${fnv1a64(canonicalJson(input))}`,
|
|
14
|
+
claims: [],
|
|
15
|
+
findings: [finding],
|
|
16
|
+
});
|
|
17
|
+
}
|
|
18
|
+
/** Applies caller-ordered amount transformations and shared terms with a complete audit trail. */
|
|
19
|
+
export function applyFinancialPipeline(input) {
|
|
20
|
+
const identityInput = { kind: "financial-pipeline", ...input };
|
|
21
|
+
let outputUnit = input.inputUnit;
|
|
22
|
+
const working = new Map();
|
|
23
|
+
for (const observation of input.observations) {
|
|
24
|
+
const amount = observation.measures[input.amountMeasureId];
|
|
25
|
+
if (typeof amount !== "number" || !Number.isFinite(amount))
|
|
26
|
+
return unavailable(identityInput, input.inputUnit, outputUnit, { code: "missing-prerequisite", capability: "shared-financial-terms", path: `$.observations.${observation.claimId}.measures.${input.amountMeasureId}`, message: `Financial pipeline requires finite ${input.amountMeasureId}`, requiredFields: [input.amountMeasureId] });
|
|
27
|
+
if (working.has(key(observation)))
|
|
28
|
+
return unavailable(identityInput, input.inputUnit, outputUnit, { code: "incompatible-semantics", capability: "shared-financial-terms", path: "$.observations", message: "Financial pipeline requires one selected observation per claim" });
|
|
29
|
+
working.set(key(observation), { observation, inputAmount: amount, amount, stages: [] });
|
|
30
|
+
}
|
|
31
|
+
for (const stage of input.stages) {
|
|
32
|
+
if (stage.kind === "adjustment") {
|
|
33
|
+
const adjustment = stage.adjustment;
|
|
34
|
+
if ((adjustment.kind === "scale" && (!(adjustment.factor > 0) || !Number.isFinite(adjustment.factor))) ||
|
|
35
|
+
(adjustment.kind === "currency" && (!(adjustment.rate > 0) || !Number.isFinite(adjustment.rate) || !isRealIsoDate(adjustment.rateDate))))
|
|
36
|
+
return unavailable(identityInput, input.inputUnit, outputUnit, { code: "invalid-configuration", capability: "shared-financial-terms", path: `$.stages.${adjustment.id}`, message: "Scale/currency adjustments require a positive finite factor and currency requires a real rateDate" });
|
|
37
|
+
if (adjustment.kind === "currency") {
|
|
38
|
+
if (outputUnit !== adjustment.fromUnit)
|
|
39
|
+
return unavailable(identityInput, input.inputUnit, outputUnit, { code: "incompatible-semantics", capability: "shared-financial-terms", path: `$.stages.${adjustment.id}.fromUnit`, message: `Currency adjustment expected ${adjustment.fromUnit} but current unit is ${outputUnit}` });
|
|
40
|
+
outputUnit = adjustment.toUnit;
|
|
41
|
+
}
|
|
42
|
+
for (const item of working.values()) {
|
|
43
|
+
const before = item.amount;
|
|
44
|
+
if (adjustment.kind === "scale")
|
|
45
|
+
item.amount *= adjustment.factor;
|
|
46
|
+
else if (adjustment.kind === "currency")
|
|
47
|
+
item.amount *= adjustment.rate;
|
|
48
|
+
else {
|
|
49
|
+
const measureId = adjustment.kind === "net-recovery" ? adjustment.recoveryMeasureId : adjustment.expenseMeasureId;
|
|
50
|
+
const component = item.observation.measures[measureId];
|
|
51
|
+
if (typeof component !== "number" || !Number.isFinite(component))
|
|
52
|
+
return unavailable(identityInput, input.inputUnit, outputUnit, { code: "missing-prerequisite", capability: "shared-financial-terms", path: `$.observations.${item.observation.claimId}.measures.${measureId}`, message: `Adjustment ${adjustment.id} requires finite ${measureId}`, requiredFields: [measureId] });
|
|
53
|
+
item.amount += adjustment.kind === "include-expense" ? component : -component;
|
|
54
|
+
}
|
|
55
|
+
item.stages.push({ stageId: adjustment.id, stageKind: "adjustment", inputAmount: before, outputAmount: item.amount });
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
else {
|
|
59
|
+
const observations = [...working.values()].map((item) => snapshotDiagnosticJson({ ...item.observation, measures: { ...item.observation.measures, [PIPELINE_MEASURE]: item.amount } }));
|
|
60
|
+
const terms = stage.terms.map((term) => ({ ...term, measureId: PIPELINE_MEASURE }));
|
|
61
|
+
const applied = applyFinancialTerms({ observations, terms, completeFinancialPopulation: input.completeFinancialPopulation, reportingClaims: input.reportingClaims });
|
|
62
|
+
if (applied.status === "unavailable")
|
|
63
|
+
return snapshotDiagnosticJson({ status: "unavailable", inputUnit: input.inputUnit, outputUnit, calculationIdentity: `fnv1a64-jcs-v1:${fnv1a64(canonicalJson(identityInput))}`, claims: [], findings: applied.findings });
|
|
64
|
+
for (const claim of applied.claims) {
|
|
65
|
+
const item = working.get(canonicalJson([claim.sourceNamespace, claim.claimId]));
|
|
66
|
+
const before = item.amount;
|
|
67
|
+
item.amount = claim.outputAmount;
|
|
68
|
+
item.stages.push({ stageId: stage.id, stageKind: "terms", inputAmount: before, outputAmount: item.amount });
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
const claims = [...working.values()].sort((a, b) => key(a.observation).localeCompare(key(b.observation))).map((item) => ({ sourceNamespace: item.observation.sourceNamespace, claimId: item.observation.claimId, inputAmount: item.inputAmount, outputAmount: item.amount, stages: item.stages }));
|
|
73
|
+
return snapshotDiagnosticJson({ status: "available", inputUnit: input.inputUnit, outputUnit, calculationIdentity: `fnv1a64-jcs-v1:${fnv1a64(canonicalJson(identityInput))}`, claims, findings: [] });
|
|
74
|
+
}
|
|
75
|
+
//# sourceMappingURL=financialPipeline.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"financialPipeline.js","sourceRoot":"","sources":["../src/financialPipeline.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { FinancialTermApplicationResult, FinancialTermDefinition, FinancialTermScheduleEntry, FinancialTermScheduleResolution, AnalysisMeasureDefinitionV1, PreparedHistoricalObservation } from "./customizationContracts.js";
|
|
2
|
+
/** Resolves the highest-priority applicable term schedule entry at a coverage date. */
|
|
3
|
+
export declare function resolveFinancialTermSchedule(input: {
|
|
4
|
+
readonly entries: readonly FinancialTermScheduleEntry[];
|
|
5
|
+
readonly coverageDate: string;
|
|
6
|
+
readonly policyIds: readonly string[];
|
|
7
|
+
readonly coverageIds: readonly string[];
|
|
8
|
+
}): FinancialTermScheduleResolution;
|
|
9
|
+
/** Applies ordered shared financial terms to the complete population, then marks the reporting view. */
|
|
10
|
+
export declare function applyFinancialTerms(input: {
|
|
11
|
+
readonly observations: readonly PreparedHistoricalObservation[];
|
|
12
|
+
readonly terms: readonly FinancialTermDefinition[];
|
|
13
|
+
readonly completeFinancialPopulation: boolean;
|
|
14
|
+
readonly measureDefinitions?: readonly AnalysisMeasureDefinitionV1[];
|
|
15
|
+
readonly reportingClaims?: readonly {
|
|
16
|
+
readonly sourceNamespace: string;
|
|
17
|
+
readonly claimId: string;
|
|
18
|
+
}[];
|
|
19
|
+
}): FinancialTermApplicationResult;
|
|
20
|
+
//# sourceMappingURL=financialTerms.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"financialTerms.d.ts","sourceRoot":"","sources":["../src/financialTerms.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAGV,8BAA8B,EAC9B,uBAAuB,EACvB,0BAA0B,EAC1B,+BAA+B,EAC/B,2BAA2B,EAC3B,6BAA6B,EAC9B,MAAM,6BAA6B,CAAC;AAqBrC,uFAAuF;AACvF,wBAAgB,4BAA4B,CAAC,KAAK,EAAE;IAClD,QAAQ,CAAC,OAAO,EAAE,SAAS,0BAA0B,EAAE,CAAC;IACxD,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,SAAS,EAAE,SAAS,MAAM,EAAE,CAAC;IACtC,QAAQ,CAAC,WAAW,EAAE,SAAS,MAAM,EAAE,CAAC;CACzC,GAAG,+BAA+B,CAmDlC;AAqCD,wGAAwG;AACxG,wBAAgB,mBAAmB,CAAC,KAAK,EAAE;IACzC,QAAQ,CAAC,YAAY,EAAE,SAAS,6BAA6B,EAAE,CAAC;IAChE,QAAQ,CAAC,KAAK,EAAE,SAAS,uBAAuB,EAAE,CAAC;IACnD,QAAQ,CAAC,2BAA2B,EAAE,OAAO,CAAC;IAC9C,QAAQ,CAAC,kBAAkB,CAAC,EAAE,SAAS,2BAA2B,EAAE,CAAC;IACrE,QAAQ,CAAC,eAAe,CAAC,EAAE,SAAS;QAAE,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;CACtG,GAAG,8BAA8B,CAkIjC"}
|
|
@@ -0,0 +1,205 @@
|
|
|
1
|
+
import { canonicalJson, fnv1a64 } from "./canonical.js";
|
|
2
|
+
import { isRealIsoDate, snapshotDiagnosticJson } from "./diagnosticRuntime.js";
|
|
3
|
+
function claimKey(sourceNamespace, claimId) {
|
|
4
|
+
return canonicalJson([sourceNamespace, claimId]);
|
|
5
|
+
}
|
|
6
|
+
function finding(code, message, requiredFields) {
|
|
7
|
+
return {
|
|
8
|
+
code,
|
|
9
|
+
capability: "shared-financial-terms",
|
|
10
|
+
path: "$.financialTerms",
|
|
11
|
+
message,
|
|
12
|
+
...(requiredFields === undefined ? {} : { requiredFields }),
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
/** Resolves the highest-priority applicable term schedule entry at a coverage date. */
|
|
16
|
+
export function resolveFinancialTermSchedule(input) {
|
|
17
|
+
if (!isRealIsoDate(input.coverageDate))
|
|
18
|
+
return snapshotDiagnosticJson({
|
|
19
|
+
status: "unavailable",
|
|
20
|
+
entryId: null,
|
|
21
|
+
termIds: [],
|
|
22
|
+
finding: finding("missing-prerequisite", "A valid coverage date is required", ["coverageDate"]),
|
|
23
|
+
});
|
|
24
|
+
if (input.entries.some((entry) => !isRealIsoDate(entry.effectiveStart) ||
|
|
25
|
+
!isRealIsoDate(entry.effectiveEnd) ||
|
|
26
|
+
entry.effectiveStart >= entry.effectiveEnd ||
|
|
27
|
+
!Number.isSafeInteger(entry.priority)))
|
|
28
|
+
return snapshotDiagnosticJson({
|
|
29
|
+
status: "unavailable",
|
|
30
|
+
entryId: null,
|
|
31
|
+
termIds: [],
|
|
32
|
+
finding: finding("invalid-configuration", "Term schedule entries require valid intervals and safe-integer priorities"),
|
|
33
|
+
});
|
|
34
|
+
const applicable = input.entries.filter((entry) => {
|
|
35
|
+
const dateMatches = entry.effectiveStart <= input.coverageDate && input.coverageDate < entry.effectiveEnd;
|
|
36
|
+
const policyMatches = entry.policyIds === undefined || entry.policyIds.some((id) => input.policyIds.includes(id));
|
|
37
|
+
const coverageMatches = entry.coverageIds === undefined || entry.coverageIds.some((id) => input.coverageIds.includes(id));
|
|
38
|
+
return dateMatches && policyMatches && coverageMatches;
|
|
39
|
+
});
|
|
40
|
+
if (applicable.length === 0)
|
|
41
|
+
return snapshotDiagnosticJson({
|
|
42
|
+
status: "unavailable",
|
|
43
|
+
entryId: null,
|
|
44
|
+
termIds: [],
|
|
45
|
+
finding: finding("missing-prerequisite", "No financial term schedule entry applies"),
|
|
46
|
+
});
|
|
47
|
+
const priority = Math.max(...applicable.map((entry) => entry.priority));
|
|
48
|
+
const selected = applicable.filter((entry) => entry.priority === priority);
|
|
49
|
+
if (selected.length !== 1)
|
|
50
|
+
return snapshotDiagnosticJson({
|
|
51
|
+
status: "ambiguous",
|
|
52
|
+
entryId: null,
|
|
53
|
+
termIds: [],
|
|
54
|
+
finding: finding("ambiguous-attribution", `Multiple financial term schedule entries share priority ${priority}`),
|
|
55
|
+
});
|
|
56
|
+
return snapshotDiagnosticJson({
|
|
57
|
+
status: "resolved",
|
|
58
|
+
entryId: selected[0].id,
|
|
59
|
+
termIds: selected[0].termIds,
|
|
60
|
+
finding: null,
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
function limitedAmount(total, attachment, limit) {
|
|
64
|
+
const excess = Math.max(total - attachment, 0);
|
|
65
|
+
return limit === null ? excess : Math.min(excess, limit);
|
|
66
|
+
}
|
|
67
|
+
function unavailable(observations, terms, issues) {
|
|
68
|
+
const identity = `fnv1a64-jcs-v1:${fnv1a64(canonicalJson({ kind: "financial-terms", observations, terms }))}`;
|
|
69
|
+
return snapshotDiagnosticJson({
|
|
70
|
+
status: "unavailable",
|
|
71
|
+
calculationIdentity: identity,
|
|
72
|
+
inputTotal: null,
|
|
73
|
+
outputTotal: null,
|
|
74
|
+
claims: [],
|
|
75
|
+
findings: issues,
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
/** Applies ordered shared financial terms to the complete population, then marks the reporting view. */
|
|
79
|
+
export function applyFinancialTerms(input) {
|
|
80
|
+
if (!input.completeFinancialPopulation)
|
|
81
|
+
return unavailable(input.observations, input.terms, [
|
|
82
|
+
finding("incomplete-financial-population", "Shared financial terms require the complete related population"),
|
|
83
|
+
]);
|
|
84
|
+
if (input.terms.some((term) => term.kind === "policy-aggregate" && term.allocation === "chronological"))
|
|
85
|
+
return unavailable(input.observations, input.terms, [
|
|
86
|
+
finding("unsupported-operation", "Chronological aggregate allocation requires ordered transaction input", ["ordered transactions"]),
|
|
87
|
+
]);
|
|
88
|
+
const sourceMeasure = (id) => {
|
|
89
|
+
const definition = input.measureDefinitions?.find((measure) => measure.id === id);
|
|
90
|
+
if (definition === undefined)
|
|
91
|
+
return input.measureDefinitions === undefined ? id : undefined;
|
|
92
|
+
return definition.statistic.kind === "sum" ? definition.statistic.measureId : undefined;
|
|
93
|
+
};
|
|
94
|
+
const measureIds = [...new Set(input.terms.map((term) => sourceMeasure(term.measureId)))];
|
|
95
|
+
if (measureIds.includes(undefined))
|
|
96
|
+
return unavailable(input.observations, input.terms, [
|
|
97
|
+
finding("incompatible-semantics", "Financial terms require a referenced sum measure"),
|
|
98
|
+
]);
|
|
99
|
+
if (measureIds.length > 1)
|
|
100
|
+
return unavailable(input.observations, input.terms, [
|
|
101
|
+
finding("incompatible-semantics", "One ordered financial term application must use a single amount measure"),
|
|
102
|
+
]);
|
|
103
|
+
const measureId = measureIds[0];
|
|
104
|
+
if (measureId === undefined)
|
|
105
|
+
return unavailable(input.observations, input.terms, [
|
|
106
|
+
finding("invalid-configuration", "At least one financial term is required"),
|
|
107
|
+
]);
|
|
108
|
+
const seen = new Set();
|
|
109
|
+
const working = [];
|
|
110
|
+
for (const observation of input.observations) {
|
|
111
|
+
const key = claimKey(observation.sourceNamespace, observation.claimId);
|
|
112
|
+
if (seen.has(key))
|
|
113
|
+
return unavailable(input.observations, input.terms, [
|
|
114
|
+
finding("incompatible-semantics", "Financial input must contain one selected observation per claim"),
|
|
115
|
+
]);
|
|
116
|
+
seen.add(key);
|
|
117
|
+
const amount = observation.measures[measureId];
|
|
118
|
+
if (typeof amount !== "number" || !Number.isFinite(amount))
|
|
119
|
+
return unavailable(input.observations, input.terms, [
|
|
120
|
+
finding("missing-prerequisite", `Claim ${observation.claimId} lacks finite measure ${measureId}`, [measureId]),
|
|
121
|
+
]);
|
|
122
|
+
if (amount < 0)
|
|
123
|
+
return unavailable(input.observations, input.terms, [
|
|
124
|
+
finding("unsupported-operation", "Negative amounts and recoveries require a separately declared financial convention"),
|
|
125
|
+
]);
|
|
126
|
+
working.push({ observation, key, inputAmount: amount, amount, stages: [] });
|
|
127
|
+
}
|
|
128
|
+
working.sort((left, right) => left.key.localeCompare(right.key));
|
|
129
|
+
for (const term of input.terms) {
|
|
130
|
+
const groups = new Map();
|
|
131
|
+
for (const claim of working) {
|
|
132
|
+
let groupId;
|
|
133
|
+
if (term.kind === "claim-layer")
|
|
134
|
+
groupId = claim.key;
|
|
135
|
+
else if (term.kind === "occurrence-layer") {
|
|
136
|
+
const occurrenceId = claim.observation.relationships.occurrenceId;
|
|
137
|
+
if (occurrenceId !== undefined)
|
|
138
|
+
groupId = canonicalJson([claim.observation.sourceNamespace, occurrenceId]);
|
|
139
|
+
}
|
|
140
|
+
else {
|
|
141
|
+
const policyIds = claim.observation.relationships.policyIds;
|
|
142
|
+
if (policyIds?.length === 1)
|
|
143
|
+
groupId = canonicalJson([claim.observation.sourceNamespace, policyIds[0]]);
|
|
144
|
+
}
|
|
145
|
+
if (groupId === undefined)
|
|
146
|
+
return unavailable(input.observations, input.terms, [
|
|
147
|
+
finding("missing-prerequisite", `${term.kind} requires one unambiguous grouping identifier for claim ${claim.observation.claimId}`, [term.kind === "occurrence-layer" ? "occurrenceId" : "policyId"]),
|
|
148
|
+
]);
|
|
149
|
+
const group = groups.get(groupId);
|
|
150
|
+
if (group === undefined)
|
|
151
|
+
groups.set(groupId, [claim]);
|
|
152
|
+
else
|
|
153
|
+
group.push(claim);
|
|
154
|
+
}
|
|
155
|
+
for (const [groupId, group] of groups) {
|
|
156
|
+
const total = group.reduce((sum, claim) => sum + claim.amount, 0);
|
|
157
|
+
const output = term.kind === "policy-aggregate"
|
|
158
|
+
? limitedAmount(total, term.deductible, term.limit)
|
|
159
|
+
: limitedAmount(total, term.attachment, term.limit);
|
|
160
|
+
let allocated = 0;
|
|
161
|
+
group.forEach((claim, index) => {
|
|
162
|
+
const before = claim.amount;
|
|
163
|
+
const after = index === group.length - 1
|
|
164
|
+
? output - allocated
|
|
165
|
+
: total === 0
|
|
166
|
+
? 0
|
|
167
|
+
: output * (before / total);
|
|
168
|
+
allocated += after;
|
|
169
|
+
claim.amount = Object.is(after, -0) ? 0 : after;
|
|
170
|
+
claim.stages.push({
|
|
171
|
+
termId: term.id,
|
|
172
|
+
groupId,
|
|
173
|
+
inputAmount: before,
|
|
174
|
+
outputAmount: claim.amount,
|
|
175
|
+
removedAmount: before - claim.amount,
|
|
176
|
+
});
|
|
177
|
+
});
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
const reported = new Set(input.reportingClaims?.map((claim) => claimKey(claim.sourceNamespace, claim.claimId)) ?? working.map((claim) => claim.key));
|
|
181
|
+
const claims = working
|
|
182
|
+
.sort((left, right) => left.key.localeCompare(right.key))
|
|
183
|
+
.map((claim) => ({
|
|
184
|
+
sourceNamespace: claim.observation.sourceNamespace,
|
|
185
|
+
claimId: claim.observation.claimId,
|
|
186
|
+
reported: reported.has(claim.key),
|
|
187
|
+
inputAmount: claim.inputAmount,
|
|
188
|
+
outputAmount: claim.amount,
|
|
189
|
+
stages: claim.stages,
|
|
190
|
+
}));
|
|
191
|
+
const identityValue = {
|
|
192
|
+
kind: "financial-terms",
|
|
193
|
+
population: [...input.observations].sort((left, right) => claimKey(left.sourceNamespace, left.claimId).localeCompare(claimKey(right.sourceNamespace, right.claimId))),
|
|
194
|
+
terms: input.terms,
|
|
195
|
+
};
|
|
196
|
+
return snapshotDiagnosticJson({
|
|
197
|
+
status: "available",
|
|
198
|
+
calculationIdentity: `fnv1a64-jcs-v1:${fnv1a64(canonicalJson(identityValue))}`,
|
|
199
|
+
inputTotal: claims.reduce((total, claim) => total + claim.inputAmount, 0),
|
|
200
|
+
outputTotal: claims.reduce((total, claim) => total + claim.outputAmount, 0),
|
|
201
|
+
claims,
|
|
202
|
+
findings: [],
|
|
203
|
+
});
|
|
204
|
+
}
|
|
205
|
+
//# sourceMappingURL=financialTerms.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"financialTerms.js","sourceRoot":"","sources":["../src/financialTerms.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fnvAccumulator.d.ts","sourceRoot":"","sources":["../src/fnvAccumulator.ts"],"names":[],"mappings":"AAAA,8EAA8E;AAC9E,wBAAgB,oBAAoB;kBAIlB,UAAU;;
|
|
1
|
+
{"version":3,"file":"fnvAccumulator.d.ts","sourceRoot":"","sources":["../src/fnvAccumulator.ts"],"names":[],"mappings":"AAAA,8EAA8E;AAC9E,wBAAgB,oBAAoB;kBAIlB,UAAU;;EAoB3B"}
|
package/dist/fnvAccumulator.js
CHANGED
|
@@ -4,14 +4,20 @@ export function createFnvAccumulator() {
|
|
|
4
4
|
let low = 0x84222325;
|
|
5
5
|
return {
|
|
6
6
|
update(bytes) {
|
|
7
|
-
|
|
8
|
-
|
|
7
|
+
// Keep the hot byte loop's words local rather than writing captured
|
|
8
|
+
// accumulator state on every byte. Chunk boundaries do not affect FNV.
|
|
9
|
+
let nextHigh = high;
|
|
10
|
+
let nextLow = low;
|
|
11
|
+
for (let index = 0; index < bytes.length; index++) {
|
|
12
|
+
nextLow = (nextLow ^ bytes[index]) >>> 0;
|
|
9
13
|
// FNV_PRIME = 2^40 + 435. Every intermediate stays below 2^42,
|
|
10
14
|
// preserving the exact modular multiplication of the BigInt form.
|
|
11
|
-
const product =
|
|
12
|
-
|
|
13
|
-
|
|
15
|
+
const product = nextLow * 0x1b3;
|
|
16
|
+
nextHigh = (nextHigh * 0x1b3 + Math.floor(product / 0x100000000) + (nextLow << 8)) >>> 0;
|
|
17
|
+
nextLow = product >>> 0;
|
|
14
18
|
}
|
|
19
|
+
high = nextHigh;
|
|
20
|
+
low = nextLow;
|
|
15
21
|
},
|
|
16
22
|
digest() {
|
|
17
23
|
return high.toString(16).padStart(8, "0") + low.toString(16).padStart(8, "0");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fnvAccumulator.js","sourceRoot":"","sources":["../src/fnvAccumulator.ts"],"names":[],"mappings":"AAAA,8EAA8E;AAC9E,MAAM,UAAU,oBAAoB;IAClC,IAAI,IAAI,GAAG,UAAU,CAAC;IACtB,IAAI,GAAG,GAAG,UAAU,CAAC;IACrB,OAAO;QACL,MAAM,CAAC,KAAiB;YACtB,
|
|
1
|
+
{"version":3,"file":"fnvAccumulator.js","sourceRoot":"","sources":["../src/fnvAccumulator.ts"],"names":[],"mappings":"AAAA,8EAA8E;AAC9E,MAAM,UAAU,oBAAoB;IAClC,IAAI,IAAI,GAAG,UAAU,CAAC;IACtB,IAAI,GAAG,GAAG,UAAU,CAAC;IACrB,OAAO;QACL,MAAM,CAAC,KAAiB;YACtB,oEAAoE;YACpE,uEAAuE;YACvE,IAAI,QAAQ,GAAG,IAAI,CAAC;YACpB,IAAI,OAAO,GAAG,GAAG,CAAC;YAClB,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,KAAK,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC;gBAClD,OAAO,GAAG,CAAC,OAAO,GAAG,KAAK,CAAC,KAAK,CAAE,CAAC,KAAK,CAAC,CAAC;gBAC1C,+DAA+D;gBAC/D,kEAAkE;gBAClE,MAAM,OAAO,GAAG,OAAO,GAAG,KAAK,CAAC;gBAChC,QAAQ,GAAG,CAAC,QAAQ,GAAG,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,WAAW,CAAC,GAAG,CAAC,OAAO,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;gBACzF,OAAO,GAAG,OAAO,KAAK,CAAC,CAAC;YAC1B,CAAC;YACD,IAAI,GAAG,QAAQ,CAAC;YAChB,GAAG,GAAG,OAAO,CAAC;QAChB,CAAC;QACD,MAAM;YACJ,OAAO,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;QAChF,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { type HistoricalDatasetInput, type PreparedHistoricalDataset } from "./customizationContracts.js";
|
|
2
|
+
/**
|
|
3
|
+
* Selects immutable source revisions and assembles claim observations without
|
|
4
|
+
* using arrival order. Unknown input should first pass the data-package Zod
|
|
5
|
+
* boundary; this pure core boundary independently protects its typed contract.
|
|
6
|
+
*/
|
|
7
|
+
export declare function prepareHistoricalDataset(input: HistoricalDatasetInput): PreparedHistoricalDataset;
|
|
8
|
+
//# sourceMappingURL=historyPreparation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"historyPreparation.d.ts","sourceRoot":"","sources":["../src/historyPreparation.ts"],"names":[],"mappings":"AAEA,OAAO,EAGL,KAAK,sBAAsB,EAI3B,KAAK,yBAAyB,EAE/B,MAAM,6BAA6B,CAAC;AA0drC;;;;GAIG;AACH,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,sBAAsB,GAAG,yBAAyB,CA0JjG"}
|