@actuarial-ts/compliance 0.1.0 → 0.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.
@@ -30,12 +30,41 @@ function describeBasis(b) {
30
30
  }[b.laeTreatment];
31
31
  return `${gross}, ${lae}`;
32
32
  }
33
+ /**
34
+ * Neutralizes document-sourced free text before it is interpolated into the
35
+ * disclosure. Ledger rationales and sources, crosscheck warnings and data
36
+ * review details all originate in DOCUMENTS — and a study's narrative flows
37
+ * into the ledger source with no human edit box in between (the promotion
38
+ * chain writes sourceRef verbatim). Unescaped, a crafted value breaks out of
39
+ * its context and renders as body prose: the demonstrated attack fabricated
40
+ * a certification paragraph in an ASOP 41 disclosure.
41
+ *
42
+ * Division of labour, so nothing is escaped twice: this helper neutralizes
43
+ * CONTENT constructs — backticks (code spans), `<` (raw HTML), newlines
44
+ * (paragraph/bullet breaks) — at the sites where document text is
45
+ * interpolated. mdTable below owns the TABLE-structural escape (pipes) for
46
+ * every cell. Deliberately not a markdown stripper: bold or italics in a
47
+ * rationale render harmlessly inline; only constructs that change document
48
+ * structure are neutralized.
49
+ */
50
+ function renderUntrusted(text) {
51
+ return text
52
+ .replace(/`/g, "\\`")
53
+ .replace(/</g, "&lt;")
54
+ .replace(/\r?\n/g, " ");
55
+ }
33
56
  function mdTable(header, rows) {
57
+ // Structural escaping for EVERY cell, trusted or not: a pipe or newline in
58
+ // any cell breaks the table for every cell after it. GFM renders \| as a
59
+ // literal pipe, including inside code spans, so code-span cells built from
60
+ // canonicalJson survive intact. Pipes are escaped HERE and only here;
61
+ // renderUntrusted never touches them, so nothing double-escapes.
62
+ const cell = (value) => value.replace(/\|/g, "\\|").replace(/\r?\n/g, " ");
34
63
  const out = [];
35
64
  out.push(`| ${header.join(" | ")} |`);
36
65
  out.push(`|${header.map(() => "---").join("|")}|`);
37
66
  for (const r of rows)
38
- out.push(`| ${r.join(" | ")} |`);
67
+ out.push(`| ${r.map(cell).join(" | ")} |`);
39
68
  return out;
40
69
  }
41
70
  function parameterLines(parameters) {
@@ -44,6 +73,24 @@ function parameterLines(parameters) {
44
73
  const json = canonicalJson(parameters);
45
74
  return json.length > 400 ? `${json.slice(0, 400)}… (truncated; full value in the reproducibility bundle)` : json;
46
75
  }
76
+ /** REQUIRED Section 4b boilerplate — verbatim per interchange spec section 5. */
77
+ const CROSS_IMPLEMENTATION_BOILERPLATE = "Agreement between independent implementations supports, but does not by itself constitute, the model validation contemplated by ASOP No. 56; model appropriateness to the book remains a separate professional judgment.";
78
+ /** Relative deviations/tolerances render in scientific notation (they live at 1e-9…1e-2 scale). */
79
+ const fmtDeviation = (v) => v === null ? "—" : v === 0 ? "0" : v.toExponential(2);
80
+ function maxAbsDeviation(report, pick) {
81
+ const cells = [...report.deviations.perOrigin, report.deviations.totals];
82
+ const values = cells.flatMap((cell) => pick(cell).filter((v) => v !== null).map(Math.abs));
83
+ return values.length === 0 ? null : Math.max(...values);
84
+ }
85
+ const engineLabel = (e) => `${e.name} v${e.version}`;
86
+ /**
87
+ * `verified-by-value` renders as exactly "verified by value (no independent
88
+ * recomputation)" — spec 5: the disclosure must not overstate what was
89
+ * checked when the selection was value-only.
90
+ */
91
+ function verdictLabel(verdict) {
92
+ return verdict === "verified-by-value" ? "verified by value (no independent recomputation)" : verdict;
93
+ }
47
94
  /** Renders the ASOP 41-oriented methods-assumptions-and-data appendix. */
48
95
  export function generateDisclosure(input) {
49
96
  const L = [];
@@ -89,7 +136,8 @@ export function generateDisclosure(input) {
89
136
  c.id,
90
137
  c.description,
91
138
  c.status.toUpperCase(),
92
- c.details.length === 0 ? "none" : c.details.join("<br>"),
139
+ // The <br> is OURS (one cell, many findings); the details are NOT.
140
+ c.details.length === 0 ? "none" : c.details.map(renderUntrusted).join("<br>"),
93
141
  ])));
94
142
  }
95
143
  else {
@@ -126,6 +174,47 @@ export function generateDisclosure(input) {
126
174
  }
127
175
  L.push("");
128
176
  }
177
+ // 4b. Cross-implementation verification (interchange spec 5) — rendered
178
+ // only when referee reports were actually provided.
179
+ if (input.crossImplementation !== undefined && input.crossImplementation.length > 0) {
180
+ L.push("## 4b. Cross-implementation verification");
181
+ L.push("");
182
+ L.push("The computations were cross-checked against independent implementations via the actuarial-interchange referee. Each row is one referee report (relative deviations; SE = standard error):");
183
+ L.push("");
184
+ L.push(...mdTable([
185
+ "Engine A",
186
+ "Engine B",
187
+ "Profile",
188
+ "Max deviation (central)",
189
+ "Max deviation (SE)",
190
+ "Tolerance (central / SE)",
191
+ "Verdict",
192
+ ], input.crossImplementation.map((doc) => {
193
+ const r = doc.report;
194
+ return [
195
+ engineLabel(r.engines.a),
196
+ engineLabel(r.engines.b),
197
+ r.engines.a.conventionProfile ?? r.engines.b.conventionProfile ?? "—",
198
+ fmtDeviation(maxAbsDeviation(r, (cell) => [cell.ultimate, cell.unpaid])),
199
+ fmtDeviation(maxAbsDeviation(r, (cell) => [cell.standardError])),
200
+ `${fmtDeviation(r.tolerance.central)} / ${fmtDeviation(r.tolerance.standardError)}`,
201
+ verdictLabel(r.verdict),
202
+ ];
203
+ })));
204
+ for (const doc of input.crossImplementation) {
205
+ const r = doc.report;
206
+ if (r.warnings.length === 0)
207
+ continue;
208
+ L.push("");
209
+ L.push(`**Warnings — ${engineLabel(r.engines.a)} vs ${engineLabel(r.engines.b)}:**`);
210
+ L.push("");
211
+ for (const w of r.warnings)
212
+ L.push(`- ${renderUntrusted(w)}`);
213
+ }
214
+ L.push("");
215
+ L.push(CROSS_IMPLEMENTATION_BOILERPLATE);
216
+ L.push("");
217
+ }
129
218
  // 5. Assumptions and judgments.
130
219
  L.push("## 5. Assumptions and judgments");
131
220
  L.push("");
@@ -138,7 +227,12 @@ export function generateDisclosure(input) {
138
227
  e.actor,
139
228
  e.field,
140
229
  `\`${canonicalJson(e.value)}\``,
141
- [e.rationale, e.source ? `(source: ${e.source})` : ""].filter(Boolean).join(" ") || "—",
230
+ [
231
+ e.rationale === undefined ? "" : renderUntrusted(e.rationale),
232
+ e.source ? `(source: ${renderUntrusted(e.source)})` : "",
233
+ ]
234
+ .filter(Boolean)
235
+ .join(" ") || "—",
142
236
  ])));
143
237
  }
144
238
  else {
@@ -192,12 +286,18 @@ export function generateDisclosure(input) {
192
286
  // 8. Reproducibility.
193
287
  L.push("## 8. Reproducibility");
194
288
  L.push("");
195
- const inputHash = fnv1a64(canonicalJson({
196
- metadata: input.metadata,
197
- methods: input.methods,
198
- ledger: input.ledger ?? null,
199
- }));
200
- L.push(`This disclosure derives deterministically from its inputs (integrity tag \`${inputHash}\`, actuarial-ts v${input.sdkVersion}). Rerunning the same inputs on the same SDK version reproduces the analysis and this document byte for byte; pair with a reproducibility bundle for auditor/examiner requests under ASOP No. 21.`);
289
+ // The tag covers the WHOLE disclosed input, not a subset. It previously
290
+ // hashed only metadata/methods/ledger, so fabricating the entire data-review
291
+ // section or swapping the named preparer did not move it — while this
292
+ // sentence presented it as certifying the document. Excluded on purpose:
293
+ // generatedAt (a timestamp is not content) and sdkVersion (stated in clear
294
+ // text beside the tag, so a reader checks it directly).
295
+ const { generatedAt: _generatedAt, sdkVersion: _sdkVersion, ...disclosed } = input;
296
+ // canonicalJson refuses undefined on purpose; an absent section and an
297
+ // explicitly-undefined one are the same disclosure, so both hash identically.
298
+ const hashable = Object.fromEntries(Object.entries(disclosed).filter(([, value]) => value !== undefined));
299
+ const inputHash = fnv1a64(canonicalJson({ ...hashable, ledger: input.ledger ?? null }));
300
+ L.push(`This disclosure derives deterministically from its inputs (integrity tag \`${inputHash}\` over every disclosed section, actuarial-ts v${input.sdkVersion}). Rerunning the same inputs on the same SDK version reproduces the analysis and this document byte for byte; pair with a reproducibility bundle for auditor/examiner requests under ASOP No. 21.`);
201
301
  L.push("");
202
302
  return L.join("\n");
203
303
  }
@@ -1 +1 @@
1
- {"version":3,"file":"disclosure.js","sourceRoot":"","sources":["../src/disclosure.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"disclosure.js","sourceRoot":"","sources":["../src/disclosure.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@actuarial-ts/compliance",
3
- "version": "0.1.0",
3
+ "version": "0.3.0",
4
4
  "description": "ASOP-compliance-support layer for the actuarial-ts SDK: estimate metadata, assumption ledger, ASOP 41 disclosure generation, ASOP 56 model cards, reproducibility bundles, and actual-vs-expected roll-forward. Responsibility for compliance remains with the credentialed actuary.",
5
5
  "license": "Apache-2.0",
6
6
  "type": "module",
@@ -15,6 +15,7 @@
15
15
  },
16
16
  "files": [
17
17
  "dist",
18
+ "src",
18
19
  "README.md",
19
20
  "LICENSE",
20
21
  "NOTICE"
@@ -45,9 +46,11 @@
45
46
  "prepack": "tsc -p tsconfig.build.json"
46
47
  },
47
48
  "dependencies": {
48
- "@actuarial-ts/core": "^0.1.0"
49
+ "@actuarial-ts/core": "^0.3.0",
50
+ "@actuarial-ts/interchange": "^0.3.0"
49
51
  },
50
52
  "devDependencies": {
53
+ "@types/node": "^22.10.5",
51
54
  "typescript": "^5.7.3",
52
55
  "vitest": "^3.0.5"
53
56
  },
package/src/ave.ts ADDED
@@ -0,0 +1,132 @@
1
+ /**
2
+ * Actual-vs-expected roll-forward: the back-test that asks "did losses emerge
3
+ * between the prior and current valuations the way the prior analysis
4
+ * expected?" — the standard bridge exhibit for the ASOP 41 changes-from-prior
5
+ * discussion and for judging whether prior assumptions still hold (ASOP 43).
6
+ *
7
+ * Ground truth (per origin):
8
+ * - expectedEmergence = priorUltimate x (expectedPercentAtCurrent - expectedPercentAtPrior)
9
+ * - actualEmergence = currentLatest - priorLatest
10
+ * - difference = actualEmergence - expectedEmergence (positive = worse
11
+ * than expected on a loss basis)
12
+ * - ratio = actualEmergence / expectedEmergence, and null — never
13
+ * NaN or Infinity — when expectedEmergence is 0, matching core's
14
+ * null-safety philosophy (no factor, not an exception).
15
+ * - totals sum the rows; the total ratio follows the same null rule.
16
+ * - Suspicious inputs produce WARNINGS, not errors: a development pattern
17
+ * that goes backwards (expectedPercentAtCurrent < expectedPercentAtPrior)
18
+ * or a percent outside [0, 1.05] is reportable, but the arithmetic is still
19
+ * well-defined and the actuary decides what it means. (Slightly above 1 is
20
+ * legitimate: paid patterns can overshoot ultimate before salvage/subro.)
21
+ *
22
+ * Errors follow the package's ComplianceError style (see bundle.ts):
23
+ * `percentDevelopedFromCdfs` throws BAD_CDF on a non-positive or non-finite
24
+ * CDF because no percent-developed interpretation exists for it.
25
+ *
26
+ * These utilities are designed to support the actuary's compliance with
27
+ * ASOP Nos. 41 and 43; responsibility for compliance remains with the
28
+ * credentialed actuary.
29
+ */
30
+
31
+ import { ComplianceError } from "./bundle.js";
32
+
33
+ export interface AveInputRow {
34
+ /** Origin period label (e.g. "2021"). */
35
+ origin: string;
36
+ /** The prior analysis's selected ultimate for this origin. */
37
+ priorUltimate: number;
38
+ /** Latest observed value (paid or incurred, matching the pattern basis) at the prior valuation. */
39
+ priorLatest: number;
40
+ /** Latest observed value at the current valuation, same basis as priorLatest. */
41
+ currentLatest: number;
42
+ /** Prior analysis's expected percent developed at the prior valuation age (fraction). */
43
+ expectedPercentAtPrior: number;
44
+ /** Prior analysis's expected percent developed at the current valuation age (fraction). */
45
+ expectedPercentAtCurrent: number;
46
+ }
47
+
48
+ export interface AveResultRow {
49
+ origin: string;
50
+ expectedEmergence: number;
51
+ actualEmergence: number;
52
+ /** actualEmergence - expectedEmergence. */
53
+ difference: number;
54
+ /** actualEmergence / expectedEmergence; null when expectedEmergence is 0. */
55
+ ratio: number | null;
56
+ }
57
+
58
+ export interface AveRollForwardResult {
59
+ rows: AveResultRow[];
60
+ totals: {
61
+ expectedEmergence: number;
62
+ actualEmergence: number;
63
+ difference: number;
64
+ /** Total actual / total expected; null when total expected is 0. */
65
+ ratio: number | null;
66
+ };
67
+ warnings: string[];
68
+ }
69
+
70
+ /** Percents above this are flagged (slightly above 1 is legitimate; see doc block). */
71
+ const PERCENT_MAX = 1.05;
72
+
73
+ /** Rolls the prior analysis forward and compares expected to actual emergence per origin. */
74
+ export function aveRollForward(rows: AveInputRow[]): AveRollForwardResult {
75
+ const outRows: AveResultRow[] = [];
76
+ const warnings: string[] = [];
77
+ let totalExpected = 0;
78
+ let totalActual = 0;
79
+
80
+ for (const row of rows) {
81
+ const pctPrior = row.expectedPercentAtPrior;
82
+ const pctCurrent = row.expectedPercentAtCurrent;
83
+ if (pctCurrent < pctPrior) {
84
+ warnings.push(
85
+ `origin ${row.origin}: pattern goes backwards (expectedPercentAtCurrent ${pctCurrent} < expectedPercentAtPrior ${pctPrior})`,
86
+ );
87
+ }
88
+ for (const [name, pct] of [
89
+ ["expectedPercentAtPrior", pctPrior],
90
+ ["expectedPercentAtCurrent", pctCurrent],
91
+ ] as const) {
92
+ if (pct < 0 || pct > PERCENT_MAX) {
93
+ warnings.push(`origin ${row.origin}: ${name} ${pct} outside [0, ${PERCENT_MAX}]`);
94
+ }
95
+ }
96
+
97
+ const expectedEmergence = row.priorUltimate * (pctCurrent - pctPrior);
98
+ const actualEmergence = row.currentLatest - row.priorLatest;
99
+ const difference = actualEmergence - expectedEmergence;
100
+ const ratio = expectedEmergence === 0 ? null : actualEmergence / expectedEmergence;
101
+ outRows.push({ origin: row.origin, expectedEmergence, actualEmergence, difference, ratio });
102
+ totalExpected += expectedEmergence;
103
+ totalActual += actualEmergence;
104
+ }
105
+
106
+ return {
107
+ rows: outRows,
108
+ totals: {
109
+ expectedEmergence: totalExpected,
110
+ actualEmergence: totalActual,
111
+ difference: totalActual - totalExpected,
112
+ ratio: totalExpected === 0 ? null : totalActual / totalExpected,
113
+ },
114
+ warnings,
115
+ };
116
+ }
117
+
118
+ /**
119
+ * Percent developed per age from a CDF vector: percent[j] = 1 / cdfs[j]
120
+ * (cdfs[j] = cumulative factor from ages[j] to ultimate, tail included, per
121
+ * core's ChainLadderResult convention). Convenience for pattern-based callers
122
+ * building aveRollForward inputs. Throws ComplianceError("BAD_CDF") on a
123
+ * non-positive or non-finite CDF.
124
+ */
125
+ export function percentDevelopedFromCdfs(cdfs: number[]): number[] {
126
+ return cdfs.map((cdf, index) => {
127
+ if (!Number.isFinite(cdf) || cdf <= 0) {
128
+ throw new ComplianceError("BAD_CDF", `cdf at index ${index} is ${cdf}; every CDF must be a finite number > 0`);
129
+ }
130
+ return 1 / cdf;
131
+ });
132
+ }