@actuarial-ts/interchange 0.2.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 (64) hide show
  1. package/LICENSE +202 -0
  2. package/NOTICE +5 -0
  3. package/README.md +52 -0
  4. package/dist/convert/result.d.ts +45 -0
  5. package/dist/convert/result.d.ts.map +1 -0
  6. package/dist/convert/result.js +122 -0
  7. package/dist/convert/result.js.map +1 -0
  8. package/dist/convert/selection.d.ts +114 -0
  9. package/dist/convert/selection.d.ts.map +1 -0
  10. package/dist/convert/selection.js +383 -0
  11. package/dist/convert/selection.js.map +1 -0
  12. package/dist/convert/triangle.d.ts +49 -0
  13. package/dist/convert/triangle.d.ts.map +1 -0
  14. package/dist/convert/triangle.js +111 -0
  15. package/dist/convert/triangle.js.map +1 -0
  16. package/dist/envelope.d.ts +113 -0
  17. package/dist/envelope.d.ts.map +1 -0
  18. package/dist/envelope.js +139 -0
  19. package/dist/envelope.js.map +1 -0
  20. package/dist/index.d.ts +15 -0
  21. package/dist/index.d.ts.map +1 -0
  22. package/dist/index.js +15 -0
  23. package/dist/index.js.map +1 -0
  24. package/dist/parse.d.ts +38 -0
  25. package/dist/parse.d.ts.map +1 -0
  26. package/dist/parse.js +48 -0
  27. package/dist/parse.js.map +1 -0
  28. package/dist/referee/crosscheck.d.ts +38 -0
  29. package/dist/referee/crosscheck.d.ts.map +1 -0
  30. package/dist/referee/crosscheck.js +212 -0
  31. package/dist/referee/crosscheck.js.map +1 -0
  32. package/dist/referee/profiles.d.ts +36 -0
  33. package/dist/referee/profiles.d.ts.map +1 -0
  34. package/dist/referee/profiles.js +80 -0
  35. package/dist/referee/profiles.js.map +1 -0
  36. package/dist/schemas/bundle.d.ts +45 -0
  37. package/dist/schemas/bundle.d.ts.map +1 -0
  38. package/dist/schemas/bundle.js +20 -0
  39. package/dist/schemas/bundle.js.map +1 -0
  40. package/dist/schemas/crosscheck.d.ts +3567 -0
  41. package/dist/schemas/crosscheck.d.ts.map +1 -0
  42. package/dist/schemas/crosscheck.js +72 -0
  43. package/dist/schemas/crosscheck.js.map +1 -0
  44. package/dist/schemas/manifest.d.ts +43 -0
  45. package/dist/schemas/manifest.d.ts.map +1 -0
  46. package/dist/schemas/manifest.js +39 -0
  47. package/dist/schemas/manifest.js.map +1 -0
  48. package/dist/schemas/result.d.ts +2163 -0
  49. package/dist/schemas/result.d.ts.map +1 -0
  50. package/dist/schemas/result.js +95 -0
  51. package/dist/schemas/result.js.map +1 -0
  52. package/dist/schemas/selection.d.ts +10388 -0
  53. package/dist/schemas/selection.d.ts.map +1 -0
  54. package/dist/schemas/selection.js +138 -0
  55. package/dist/schemas/selection.js.map +1 -0
  56. package/dist/schemas/study.d.ts +62 -0
  57. package/dist/schemas/study.d.ts.map +1 -0
  58. package/dist/schemas/study.js +35 -0
  59. package/dist/schemas/study.js.map +1 -0
  60. package/dist/schemas/triangle.d.ts +1260 -0
  61. package/dist/schemas/triangle.d.ts.map +1 -0
  62. package/dist/schemas/triangle.js +120 -0
  63. package/dist/schemas/triangle.js.map +1 -0
  64. package/package.json +66 -0
@@ -0,0 +1,212 @@
1
+ import { ReservingError } from "@actuarial-ts/core";
2
+ import { DEFAULT_GENERATOR, INTERCHANGE_SPEC_VERSION, stampIntegrity, verifyIntegrity, } from "../envelope.js";
3
+ import { methodResultDocSchema, } from "../schemas/result.js";
4
+ import { isValueOnlySelection, selectionDocSchema, } from "../schemas/selection.js";
5
+ import { crosscheckReportDocSchema, } from "../schemas/crosscheck.js";
6
+ import { CONVENTION_PROFILES } from "./profiles.js";
7
+ function relativeDeviation(x, y) {
8
+ const scale = Math.max(Math.abs(x), Math.abs(y));
9
+ return scale === 0 ? 0 : Math.abs(x - y) / scale;
10
+ }
11
+ function validateInput(label, doc) {
12
+ const parsed = methodResultDocSchema.safeParse(doc);
13
+ if (!parsed.success) {
14
+ throw new ReservingError("BAD_INTERCHANGE", `crosscheck input "${label}" is not a valid MethodResultDoc: ${parsed.error.issues
15
+ .map((i) => `${i.path.join(".") || "$"}: ${i.message}`)
16
+ .join("; ")}`);
17
+ }
18
+ const integrity = verifyIntegrity(parsed.data);
19
+ if (!integrity.ok) {
20
+ throw new ReservingError("BAD_INTERCHANGE", `crosscheck input "${label}" fails its integrity check: stated ${integrity.actual ?? "(none)"}, ` +
21
+ `semantic body hashes to ${integrity.expected}`);
22
+ }
23
+ return parsed.data;
24
+ }
25
+ function resolveTolerance(a, b, explicit, warnings) {
26
+ if (typeof explicit === "number") {
27
+ return { central: explicit, standardError: explicit };
28
+ }
29
+ if (explicit !== undefined) {
30
+ return { central: explicit.central, standardError: explicit.standardError ?? null };
31
+ }
32
+ const profileA = a.result.engine.conventionProfile;
33
+ const profileB = b.result.engine.conventionProfile;
34
+ const shared = profileA !== undefined && profileA === profileB ? profileA : undefined;
35
+ if (shared !== undefined) {
36
+ const profile = CONVENTION_PROFILES[shared];
37
+ if (profile !== undefined) {
38
+ return { ...profile.tolerance };
39
+ }
40
+ warnings.push(`Convention profile "${shared}" is not in this package's registry; falling back to the ` +
41
+ "deterministic-cl central tolerance");
42
+ }
43
+ else {
44
+ warnings.push("No shared convention profile is stated on both results; falling back to the " +
45
+ "deterministic-cl central tolerance");
46
+ }
47
+ const fallback = CONVENTION_PROFILES["deterministic-cl"];
48
+ return { ...fallback.tolerance };
49
+ }
50
+ export function crosscheck(options) {
51
+ const a = validateInput("a", options.a);
52
+ const b = validateInput("b", options.b);
53
+ const warnings = [];
54
+ const notComparable = [];
55
+ // --- comparability: appliesTo tags (spec 5) ---
56
+ const aTo = a.result.appliesTo;
57
+ const bTo = b.result.appliesTo;
58
+ const sameTriangle = aTo.triangleIntegrity === bTo.triangleIntegrity;
59
+ const sameSelection = aTo.selectionIntegrity === bTo.selectionIntegrity;
60
+ if (!sameTriangle) {
61
+ notComparable.push(`the results apply to different triangles (${aTo.triangleIntegrity} vs ${bTo.triangleIntegrity})`);
62
+ }
63
+ if (!sameSelection) {
64
+ notComparable.push(`the results apply to different selections (${aTo.selectionIntegrity ?? "null"} vs ` +
65
+ `${bTo.selectionIntegrity ?? "null"}); comparability requires the same selection or both null`);
66
+ }
67
+ // --- comparability: convention profiles ---
68
+ const profileA = a.result.engine.conventionProfile;
69
+ const profileB = b.result.engine.conventionProfile;
70
+ if (profileA !== undefined && profileB !== undefined && profileA !== profileB) {
71
+ notComparable.push(`the results claim different convention profiles ("${profileA}" vs "${profileB}")`);
72
+ }
73
+ // --- the selection both results replayed, when supplied ---
74
+ let selection = null;
75
+ if (options.selection !== undefined) {
76
+ const parsed = selectionDocSchema.safeParse(options.selection);
77
+ if (!parsed.success) {
78
+ throw new ReservingError("BAD_INTERCHANGE", `crosscheck "selection" is not a valid SelectionDoc: ${parsed.error.issues
79
+ .map((i) => `${i.path.join(".") || "$"}: ${i.message}`)
80
+ .join("; ")}`);
81
+ }
82
+ selection = parsed.data;
83
+ if (sameSelection && aTo.selectionIntegrity !== selection.integrity) {
84
+ throw new ReservingError("BAD_INTERCHANGE", `The supplied selection's integrity (${selection.integrity}) does not match the results' ` +
85
+ `selectionIntegrity (${aTo.selectionIntegrity ?? "null"})`);
86
+ }
87
+ }
88
+ // --- comparability: origin sets ---
89
+ const aOrigins = a.result.rows.map((r) => r.origin);
90
+ for (const [label, rows] of [["a", a.result.rows], ["b", b.result.rows]]) {
91
+ const seen = new Set();
92
+ for (const row of rows) {
93
+ if (seen.has(row.origin)) {
94
+ throw new ReservingError("BAD_INTERCHANGE", `Result "${label}" lists origin "${row.origin}" more than once; per-origin comparison is ill-defined`);
95
+ }
96
+ seen.add(row.origin);
97
+ }
98
+ }
99
+ const bByOrigin = new Map(b.result.rows.map((r) => [r.origin, r]));
100
+ const aOnly = aOrigins.filter((o) => !bByOrigin.has(o));
101
+ const bOnly = b.result.rows.map((r) => r.origin).filter((o) => !a.result.rows.some((r) => r.origin === o));
102
+ if (aOnly.length > 0 || bOnly.length > 0) {
103
+ notComparable.push(`the results cover different origin sets (only in a: [${aOnly.join(", ")}]; only in b: [${bOnly.join(", ")}])`);
104
+ }
105
+ // --- requested vs effective downgrade (spec 3.2 / 5) ---
106
+ for (const [label, doc] of [
107
+ ["a", a],
108
+ ["b", b],
109
+ ]) {
110
+ if (doc.result.effectiveParameters !== undefined) {
111
+ warnings.push(`Comparability downgrade: engine "${label}" (${doc.result.engine.name}) ran with effective ` +
112
+ `parameters ${JSON.stringify(doc.result.effectiveParameters)} deviating from the requested ` +
113
+ `${JSON.stringify(doc.result.parameters)}`);
114
+ }
115
+ }
116
+ const tolerance = resolveTolerance(a, b, options.tolerance, warnings);
117
+ const compareSe = tolerance.standardError !== null;
118
+ if (!compareSe) {
119
+ const seOnBoth = a.result.rows.some((r) => r.standardError !== undefined) &&
120
+ b.result.rows.some((r) => r.standardError !== undefined);
121
+ if (seOnBoth) {
122
+ warnings.push("Both results carry standard errors but the applied tolerance has SEs out of scope; " +
123
+ "standard errors were not compared");
124
+ }
125
+ }
126
+ // --- deviations ---
127
+ let comparable = notComparable.length === 0;
128
+ const perOrigin = [];
129
+ let maxCentral = 0;
130
+ let maxSe = 0;
131
+ if (comparable) {
132
+ for (const rowA of a.result.rows) {
133
+ const rowB = bByOrigin.get(rowA.origin);
134
+ const ultimate = relativeDeviation(rowA.ultimate, rowB.ultimate);
135
+ const unpaid = relativeDeviation(rowA.unpaid, rowB.unpaid);
136
+ const standardError = compareSe && rowA.standardError !== undefined && rowB.standardError !== undefined
137
+ ? relativeDeviation(rowA.standardError, rowB.standardError)
138
+ : null;
139
+ maxCentral = Math.max(maxCentral, ultimate, unpaid);
140
+ if (standardError !== null)
141
+ maxSe = Math.max(maxSe, standardError);
142
+ perOrigin.push({ origin: rowA.origin, ultimate, unpaid, standardError });
143
+ }
144
+ }
145
+ const totalsA = a.result.totals;
146
+ const totalsB = b.result.totals;
147
+ const totals = comparable
148
+ ? {
149
+ ultimate: relativeDeviation(totalsA.ultimate, totalsB.ultimate),
150
+ unpaid: relativeDeviation(totalsA.unpaid, totalsB.unpaid),
151
+ standardError: compareSe &&
152
+ totalsA.standardError !== undefined &&
153
+ totalsB.standardError !== undefined
154
+ ? relativeDeviation(totalsA.standardError, totalsB.standardError)
155
+ : null,
156
+ }
157
+ : { ultimate: null, unpaid: null, standardError: null };
158
+ if (comparable) {
159
+ maxCentral = Math.max(maxCentral, totals.ultimate ?? 0, totals.unpaid ?? 0);
160
+ if (totals.standardError !== null)
161
+ maxSe = Math.max(maxSe, totals.standardError);
162
+ }
163
+ // --- verdict ---
164
+ let verdict;
165
+ if (!comparable) {
166
+ verdict = "not-comparable";
167
+ warnings.push(...notComparable.map((reason) => `Not comparable: ${reason}`));
168
+ }
169
+ else if (maxCentral > tolerance.central ||
170
+ (compareSe && maxSe > tolerance.standardError)) {
171
+ verdict = "disagree";
172
+ }
173
+ else if (selection !== null &&
174
+ sameSelection &&
175
+ aTo.selectionIntegrity !== null &&
176
+ isValueOnlySelection(selection.selection)) {
177
+ verdict = "verified-by-value";
178
+ warnings.push("The compared results replayed a value-only selection (every intent judgmental/external): " +
179
+ "no independent recomputation occurred; agreement verifies value transport, not methodology");
180
+ }
181
+ else {
182
+ verdict = "agree";
183
+ }
184
+ const body = {
185
+ engines: { a: a.result.engine, b: b.result.engine },
186
+ appliesTo: sameTriangle && sameSelection ? aTo : null,
187
+ parameters: {
188
+ a: { requested: a.result.parameters, effective: a.result.effectiveParameters ?? null },
189
+ b: { requested: b.result.parameters, effective: b.result.effectiveParameters ?? null },
190
+ },
191
+ tolerance: { central: tolerance.central, standardError: tolerance.standardError },
192
+ deviations: { perOrigin, totals },
193
+ verdict,
194
+ warnings,
195
+ };
196
+ const doc = stampIntegrity({
197
+ interchangeVersion: INTERCHANGE_SPEC_VERSION,
198
+ kind: "crosscheck-report",
199
+ generator: options.generator ?? DEFAULT_GENERATOR,
200
+ createdAt: options.createdAt,
201
+ extensions: {},
202
+ report: body,
203
+ });
204
+ const checked = crosscheckReportDocSchema.safeParse(doc);
205
+ if (!checked.success) {
206
+ throw new ReservingError("BAD_INTERCHANGE", `crosscheck produced an invalid report: ${checked.error.issues
207
+ .map((i) => `${i.path.join(".") || "$"}: ${i.message}`)
208
+ .join("; ")}`);
209
+ }
210
+ return checked.data;
211
+ }
212
+ //# sourceMappingURL=crosscheck.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"crosscheck.js","sourceRoot":"","sources":["../../src/referee/crosscheck.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,36 @@
1
+ /**
2
+ * Convention profiles (spec 5): normative alignment requirements as DATA,
3
+ * executable by the conformance suite. A profile names what every engine
4
+ * must pin so their numbers are comparable at the stated tolerances;
5
+ * changing an existing profile's requirements is a spec MAJOR (spec 11).
6
+ */
7
+ export interface ProfileTolerance {
8
+ /** Relative tolerance on central estimates (ultimates, unpaid/reserves). */
9
+ central: number;
10
+ /** Relative tolerance on standard errors; null = SEs out of profile scope. */
11
+ standardError: number | null;
12
+ }
13
+ /** What one engine must run for its results to claim this profile. */
14
+ export interface EngineAlignment {
15
+ /** Human-readable entry point (estimator/function/method family). */
16
+ entryPoint: string;
17
+ /** The exact parameters that must be pinned. */
18
+ parameters: Record<string, unknown>;
19
+ /** Traps the research flagged; honesty notes the referee/report surface. */
20
+ notes?: string[];
21
+ }
22
+ export interface ConventionProfile {
23
+ id: string;
24
+ description: string;
25
+ tolerance: ProfileTolerance;
26
+ alignment: {
27
+ "actuarial-ts": EngineAlignment;
28
+ "chainladder-python": EngineAlignment;
29
+ "r-chainladder": EngineAlignment;
30
+ };
31
+ }
32
+ export declare const DETERMINISTIC_CL_PROFILE: ConventionProfile;
33
+ export declare const MACK_1993_VW_PROFILE: ConventionProfile;
34
+ /** The Phase A profile registry (odp-bootstrap-distribution arrives in Phase C). */
35
+ export declare const CONVENTION_PROFILES: Readonly<Record<string, ConventionProfile>>;
36
+ //# sourceMappingURL=profiles.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"profiles.d.ts","sourceRoot":"","sources":["../../src/referee/profiles.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,WAAW,gBAAgB;IAC/B,4EAA4E;IAC5E,OAAO,EAAE,MAAM,CAAC;IAChB,8EAA8E;IAC9E,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;CAC9B;AAED,sEAAsE;AACtE,MAAM,WAAW,eAAe;IAC9B,qEAAqE;IACrE,UAAU,EAAE,MAAM,CAAC;IACnB,gDAAgD;IAChD,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACpC,4EAA4E;IAC5E,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;CAClB;AAED,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,gBAAgB,CAAC;IAC5B,SAAS,EAAE;QACT,cAAc,EAAE,eAAe,CAAC;QAChC,oBAAoB,EAAE,eAAe,CAAC;QACtC,eAAe,EAAE,eAAe,CAAC;KAClC,CAAC;CACH;AAED,eAAO,MAAM,wBAAwB,EAAE,iBA4BtC,CAAC;AAEF,eAAO,MAAM,oBAAoB,EAAE,iBAyClC,CAAC;AAEF,oFAAoF;AACpF,eAAO,MAAM,mBAAmB,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAG3E,CAAC"}
@@ -0,0 +1,80 @@
1
+ /**
2
+ * Convention profiles (spec 5): normative alignment requirements as DATA,
3
+ * executable by the conformance suite. A profile names what every engine
4
+ * must pin so their numbers are comparable at the stated tolerances;
5
+ * changing an existing profile's requirements is a spec MAJOR (spec 11).
6
+ */
7
+ export const DETERMINISTIC_CL_PROFILE = {
8
+ id: "deterministic-cl",
9
+ description: "Factor + projection point estimates: all three engines agree to ~1e-9 under identical " +
10
+ "selections; standard errors are out of scope.",
11
+ tolerance: { central: 1e-6, standardError: null },
12
+ alignment: {
13
+ "actuarial-ts": {
14
+ entryPoint: "runChainLadder",
15
+ parameters: { selections: "identical LdfSelections (values + tail)" },
16
+ },
17
+ "chainladder-python": {
18
+ entryPoint: "Chainladder",
19
+ parameters: {
20
+ development: "Development(...) per the intent equivalence table, or DevelopmentConstant for value-only selections",
21
+ },
22
+ },
23
+ "r-chainladder": {
24
+ entryPoint: "chainladder / ata-based projection",
25
+ parameters: {
26
+ factors: "identical selected factors (CLFMdelta injection where feasible)",
27
+ },
28
+ notes: [
29
+ "CLFMdelta returns per-element foundSolution; a failed injection makes the run not-comparable, never agreement",
30
+ ],
31
+ },
32
+ },
33
+ };
34
+ export const MACK_1993_VW_PROFILE = {
35
+ id: "mack1993-vw",
36
+ description: "Volume-weighted all-period factors, Mack sigma with Mack's last-column extrapolation. " +
37
+ "Central estimates at 1e-6 relative; standard errors at 0.5% relative.",
38
+ tolerance: { central: 1e-6, standardError: 0.005 },
39
+ alignment: {
40
+ "actuarial-ts": {
41
+ entryPoint: "runMack",
42
+ parameters: {
43
+ selected: "omitted (volume-weighted per Mack 1993)",
44
+ sigma: "Mack last-column extrapolation (built in)",
45
+ },
46
+ },
47
+ "chainladder-python": {
48
+ entryPoint: "MackChainladder",
49
+ parameters: {
50
+ average: "volume",
51
+ n_periods: -1,
52
+ sigma_interpolation: "mack",
53
+ },
54
+ notes: [
55
+ 'The DEFAULT sigma_interpolation ("log-linear") does NOT match this profile; "mack" must be pinned',
56
+ ],
57
+ },
58
+ "r-chainladder": {
59
+ entryPoint: "MackChainLadder",
60
+ parameters: {
61
+ alpha: 1,
62
+ "est.sigma": "Mack",
63
+ },
64
+ notes: [
65
+ 'The DEFAULT est.sigma ("log-linear") does NOT match this profile',
66
+ 'R silently falls back from est.sigma="log-linear" to "Mack" on poor regression fit; ' +
67
+ "the adapter must record the EFFECTIVE method in effectiveParameters — the referee " +
68
+ "downgrades requested≠effective comparisons",
69
+ "MackChainLadder(alpha) semantics: alpha=1 volume-weighted, alpha=0 simple, alpha=2 regression; " +
70
+ "the lower-level chainladder(delta) uses alpha = 2 − delta — never conflate the two",
71
+ ],
72
+ },
73
+ },
74
+ };
75
+ /** The Phase A profile registry (odp-bootstrap-distribution arrives in Phase C). */
76
+ export const CONVENTION_PROFILES = {
77
+ [DETERMINISTIC_CL_PROFILE.id]: DETERMINISTIC_CL_PROFILE,
78
+ [MACK_1993_VW_PROFILE.id]: MACK_1993_VW_PROFILE,
79
+ };
80
+ //# sourceMappingURL=profiles.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"profiles.js","sourceRoot":"","sources":["../../src/referee/profiles.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AA8BH,MAAM,CAAC,MAAM,wBAAwB,GAAsB;IACzD,EAAE,EAAE,kBAAkB;IACtB,WAAW,EACT,wFAAwF;QACxF,+CAA+C;IACjD,SAAS,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE;IACjD,SAAS,EAAE;QACT,cAAc,EAAE;YACd,UAAU,EAAE,gBAAgB;YAC5B,UAAU,EAAE,EAAE,UAAU,EAAE,yCAAyC,EAAE;SACtE;QACD,oBAAoB,EAAE;YACpB,UAAU,EAAE,aAAa;YACzB,UAAU,EAAE;gBACV,WAAW,EACT,qGAAqG;aACxG;SACF;QACD,eAAe,EAAE;YACf,UAAU,EAAE,oCAAoC;YAChD,UAAU,EAAE;gBACV,OAAO,EAAE,iEAAiE;aAC3E;YACD,KAAK,EAAE;gBACL,+GAA+G;aAChH;SACF;KACF;CACF,CAAC;AAEF,MAAM,CAAC,MAAM,oBAAoB,GAAsB;IACrD,EAAE,EAAE,aAAa;IACjB,WAAW,EACT,wFAAwF;QACxF,uEAAuE;IACzE,SAAS,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,aAAa,EAAE,KAAK,EAAE;IAClD,SAAS,EAAE;QACT,cAAc,EAAE;YACd,UAAU,EAAE,SAAS;YACrB,UAAU,EAAE;gBACV,QAAQ,EAAE,yCAAyC;gBACnD,KAAK,EAAE,2CAA2C;aACnD;SACF;QACD,oBAAoB,EAAE;YACpB,UAAU,EAAE,iBAAiB;YAC7B,UAAU,EAAE;gBACV,OAAO,EAAE,QAAQ;gBACjB,SAAS,EAAE,CAAC,CAAC;gBACb,mBAAmB,EAAE,MAAM;aAC5B;YACD,KAAK,EAAE;gBACL,mGAAmG;aACpG;SACF;QACD,eAAe,EAAE;YACf,UAAU,EAAE,iBAAiB;YAC7B,UAAU,EAAE;gBACV,KAAK,EAAE,CAAC;gBACR,WAAW,EAAE,MAAM;aACpB;YACD,KAAK,EAAE;gBACL,kEAAkE;gBAClE,sFAAsF;oBACpF,oFAAoF;oBACpF,4CAA4C;gBAC9C,iGAAiG;oBAC/F,oFAAoF;aACvF;SACF;KACF;CACF,CAAC;AAEF,oFAAoF;AACpF,MAAM,CAAC,MAAM,mBAAmB,GAAgD;IAC9E,CAAC,wBAAwB,CAAC,EAAE,CAAC,EAAE,wBAAwB;IACvD,CAAC,oBAAoB,CAAC,EAAE,CAAC,EAAE,oBAAoB;CAChD,CAAC"}
@@ -0,0 +1,45 @@
1
+ import { z } from "zod";
2
+ import { type GeneratorStamp } from "../envelope.js";
3
+ import { type TriangleDoc } from "./triangle.js";
4
+ import { type SelectionDoc } from "./selection.js";
5
+ import { type MethodResultDoc, type StochasticResultDoc } from "./result.js";
6
+ /**
7
+ * BundleDoc (spec 3.2) — the wrapped reproducibility bundle.
8
+ *
9
+ * - `bundle` is the host's existing canonical payload, carried opaquely
10
+ * (this package must not depend on @actuarial-ts/compliance; compliance
11
+ * depends on interchange for the wrapper, not the reverse).
12
+ * - `interchange` mirrors the bundle's triangles, selections, and results
13
+ * as interchange documents so a non-TS consumer (`load_bundle`) never
14
+ * parses the TS-native blob.
15
+ * - The OUTER integrity tag is defined over `{ bundle, interchange }`
16
+ * (spec 3.2), so the mirror cannot drift from the wrapped payload
17
+ * unnoticed. `verifyBundle`'s wrapped mode (Phase B, in compliance)
18
+ * checks the inner bundle exactly as today AND this outer tag.
19
+ *
20
+ * Interfaces are written out for the same declaration-emit reason as
21
+ * study.ts; the schema annotations keep them honest.
22
+ */
23
+ export interface BundleInterchange {
24
+ triangles: TriangleDoc[];
25
+ selections: SelectionDoc[];
26
+ results: (MethodResultDoc | StochasticResultDoc)[];
27
+ [key: string]: unknown;
28
+ }
29
+ export interface BundleDoc {
30
+ interchangeVersion: string;
31
+ kind: "bundle";
32
+ generator: GeneratorStamp & {
33
+ [key: string]: unknown;
34
+ };
35
+ createdAt: string;
36
+ extensions?: Record<string, unknown>;
37
+ integrity: string;
38
+ /** The host's existing canonical bundle payload, opaque at this layer. */
39
+ bundle: Record<string, unknown>;
40
+ interchange: BundleInterchange;
41
+ [key: string]: unknown;
42
+ }
43
+ export declare const bundleInterchangeSchema: z.ZodType<BundleInterchange>;
44
+ export declare const bundleDocSchema: z.ZodType<BundleDoc>;
45
+ //# sourceMappingURL=bundle.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bundle.d.ts","sourceRoot":"","sources":["../../src/schemas/bundle.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAiB,KAAK,cAAc,EAAE,MAAM,gBAAgB,CAAC;AACpE,OAAO,EAAE,KAAK,WAAW,EAAqB,MAAM,eAAe,CAAC;AACpE,OAAO,EAAE,KAAK,YAAY,EAAsB,MAAM,gBAAgB,CAAC;AACvE,OAAO,EACL,KAAK,eAAe,EACpB,KAAK,mBAAmB,EAGzB,MAAM,aAAa,CAAC;AAErB;;;;;;;;;;;;;;;;GAgBG;AAEH,MAAM,WAAW,iBAAiB;IAChC,SAAS,EAAE,WAAW,EAAE,CAAC;IACzB,UAAU,EAAE,YAAY,EAAE,CAAC;IAC3B,OAAO,EAAE,CAAC,eAAe,GAAG,mBAAmB,CAAC,EAAE,CAAC;IACnD,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,SAAS;IACxB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,IAAI,EAAE,QAAQ,CAAC;IACf,SAAS,EAAE,cAAc,GAAG;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;KAAE,CAAC;IACvD,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACrC,SAAS,EAAE,MAAM,CAAC;IAClB,0EAA0E;IAC1E,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChC,WAAW,EAAE,iBAAiB,CAAC;IAC/B,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,eAAO,MAAM,uBAAuB,EAAE,CAAC,CAAC,OAAO,CAAC,iBAAiB,CAMjD,CAAC;AAEjB,eAAO,MAAM,eAAe,EAAE,CAAC,CAAC,OAAO,CAAC,SAAS,CAMjC,CAAC"}
@@ -0,0 +1,20 @@
1
+ import { z } from "zod";
2
+ import { envelopeShape } from "../envelope.js";
3
+ import { triangleDocSchema } from "./triangle.js";
4
+ import { selectionDocSchema } from "./selection.js";
5
+ import { methodResultDocSchema, stochasticResultDocSchema, } from "./result.js";
6
+ export const bundleInterchangeSchema = z
7
+ .object({
8
+ triangles: z.array(triangleDocSchema),
9
+ selections: z.array(selectionDocSchema),
10
+ results: z.array(z.union([methodResultDocSchema, stochasticResultDocSchema])),
11
+ })
12
+ .passthrough();
13
+ export const bundleDocSchema = z
14
+ .object({
15
+ ...envelopeShape("bundle"),
16
+ bundle: z.record(z.unknown()),
17
+ interchange: bundleInterchangeSchema,
18
+ })
19
+ .passthrough();
20
+ //# sourceMappingURL=bundle.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bundle.js","sourceRoot":"","sources":["../../src/schemas/bundle.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,aAAa,EAAuB,MAAM,gBAAgB,CAAC;AACpE,OAAO,EAAoB,iBAAiB,EAAE,MAAM,eAAe,CAAC;AACpE,OAAO,EAAqB,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AACvE,OAAO,EAGL,qBAAqB,EACrB,yBAAyB,GAC1B,MAAM,aAAa,CAAC;AAwCrB,MAAM,CAAC,MAAM,uBAAuB,GAAiC,CAAC;KACnE,MAAM,CAAC;IACN,SAAS,EAAE,CAAC,CAAC,KAAK,CAAC,iBAAiB,CAAC;IACrC,UAAU,EAAE,CAAC,CAAC,KAAK,CAAC,kBAAkB,CAAC;IACvC,OAAO,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,qBAAqB,EAAE,yBAAyB,CAAC,CAAC,CAAC;CAC9E,CAAC;KACD,WAAW,EAAE,CAAC;AAEjB,MAAM,CAAC,MAAM,eAAe,GAAyB,CAAC;KACnD,MAAM,CAAC;IACN,GAAG,aAAa,CAAC,QAAQ,CAAC;IAC1B,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;IAC7B,WAAW,EAAE,uBAAuB;CACrC,CAAC;KACD,WAAW,EAAE,CAAC"}