@zanii/sla 0.1.2 → 0.1.3

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 CHANGED
@@ -51,3 +51,7 @@ Receipts prove what was *recorded* — an action taken entirely off the rails is
51
51
  credential-custody problem, not an SLA one. A gap breach proves **silence on the
52
52
  ledger**, which the SLA defines as breach; that definition is the parties' agreement,
53
53
  not a law of nature.
54
+
55
+ ## Changelog
56
+
57
+ - **0.1.3** — Latency (p50/p95/p99) and quality objectives, service credits, breach notices with cure periods, offer/accept, subcontractor chains, DORA-style third-party register rows, quorum uptime from independent signed probes, vendor dashboard, outage reports with DORA deadlines.
package/dist/index.d.ts CHANGED
@@ -89,4 +89,5 @@ export interface ComplianceReport {
89
89
  export declare function assessCompliance(sla: Sla, receipts: Receipt[], opts?: {
90
90
  asOf?: string;
91
91
  }): ComplianceReport;
92
+ export * from './slo.js';
92
93
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -202,4 +202,5 @@ export function assessCompliance(sla, receipts, opts = {}) {
202
202
  }
203
203
  return { ok: breaches.length === 0, breaches, metrics: { actions: matching.length, max_gap_ms: maxGap } };
204
204
  }
205
+ export * from './slo.js';
205
206
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/slo.d.ts ADDED
@@ -0,0 +1,186 @@
1
+ /**
2
+ * More SLA machinery: latency and quality objectives, service credits, a DORA-style
3
+ * third-party register, subcontractor chains, offers and acceptance, independent uptime
4
+ * probes, breach notices with cure periods, a vendor dashboard and outage reports.
5
+ */
6
+ import { type SignedObject } from '@zanii/core';
7
+ import { type Money } from '@zanii/payments';
8
+ import { type Breach, type BreachKind, type ComplianceReport, type Sla, type SlaInput } from './index.js';
9
+ /** Nearest-rank percentile of a list of numbers. */
10
+ export declare function percentile(values: number[], p: number): number | null;
11
+ /** Latency from paired request/response timestamps (e.g. a2a receipts), against a p95 target. */
12
+ export declare function latencySlo(pairs: Array<{
13
+ requestTs: string;
14
+ responseTs: string;
15
+ }>, target: {
16
+ p95Ms: number;
17
+ }): {
18
+ samples: number;
19
+ p50: number | null;
20
+ p95: number | null;
21
+ p99: number | null;
22
+ ok: boolean;
23
+ };
24
+ /** Quality from committed evaluation results (scores in milli-units, 0..1000) on an agreed suite. */
25
+ export declare function qualitySlo(evals: Array<{
26
+ ts: string;
27
+ suite: string;
28
+ score_milli: number;
29
+ }>, target: {
30
+ suite: string;
31
+ minScoreMilli: number;
32
+ }): {
33
+ runs: number;
34
+ otherSuites: number;
35
+ minScore: number | null;
36
+ failing: string[];
37
+ ok: boolean;
38
+ };
39
+ /** Service credits: basis points of the fee per breach kind, summed and capped. Exact, in minor units, rounded down. */
40
+ export declare function serviceCredits(report: ComplianceReport, fee: Money, schedule: Partial<Record<BreachKind, number>>, capBps?: number): {
41
+ kinds: BreachKind[];
42
+ bps: number;
43
+ credit: {
44
+ currency: string;
45
+ minor: string;
46
+ display: string;
47
+ };
48
+ };
49
+ export type BreachNotice = SignedObject<{
50
+ v: 1;
51
+ type: 'sla.breach_notice';
52
+ sla: string;
53
+ breaches: Breach[];
54
+ cure_by: string;
55
+ ts: string;
56
+ }>;
57
+ /** A formal breach notice from the client, naming the SLA by hash and giving a cure period. */
58
+ export declare function breachNotice(sla: Sla, breaches: Breach[], opts: {
59
+ cureDays: number;
60
+ ts?: string;
61
+ }, clientPrivateKey: Uint8Array): BreachNotice;
62
+ /** After the cure period: cured when a later assessment has none of the noticed breach kinds. */
63
+ export declare function cureStatus(notice: BreachNotice, sla: Sla, later: ComplianceReport | null, now?: string): {
64
+ status: "invalid-notice";
65
+ cureBy?: undefined;
66
+ remaining?: undefined;
67
+ } | {
68
+ status: "cure-period";
69
+ cureBy: string;
70
+ remaining?: undefined;
71
+ } | {
72
+ status: "uncured";
73
+ remaining: Breach[];
74
+ cureBy?: undefined;
75
+ } | {
76
+ status: "cured";
77
+ cureBy?: undefined;
78
+ remaining?: undefined;
79
+ };
80
+ /** The provider offers terms, signed. */
81
+ export declare function offerSla(input: SlaInput, providerPrivateKey: Uint8Array): Sla;
82
+ /** The client accepts an offer by countersigning the same terms; the result verifies with `verifySla`. */
83
+ export declare function acceptSla(offer: Sla, clientPrivateKey: Uint8Array): Sla;
84
+ /**
85
+ * Subcontractor chain, top first: each SLA's client is the previous SLA's provider, all are
86
+ * valid, and no tier promises less than the tier above relies on.
87
+ */
88
+ export declare function verifyChainOfSlas(chain: Sla[]): {
89
+ ok: boolean;
90
+ reasons: string[];
91
+ };
92
+ /**
93
+ * Rows for an ICT third-party register (DORA Art. 28(3)) from live SLAs plus the provider
94
+ * details you hold. A starting point for the register of information, not the full template.
95
+ */
96
+ export declare function thirdPartyRegister(slas: Sla[], providers: Record<string, {
97
+ name: string;
98
+ lei?: string;
99
+ country: string;
100
+ function: string;
101
+ critical: boolean;
102
+ }>): {
103
+ contract: string;
104
+ provider_did: string;
105
+ provider_name: string | null;
106
+ lei: string | null;
107
+ country: string | null;
108
+ function: string | null;
109
+ critical_or_important: boolean | null;
110
+ service_scope: string;
111
+ start: string;
112
+ end: string;
113
+ complete: boolean;
114
+ }[];
115
+ export type ProbeResult = SignedObject<{
116
+ v: 1;
117
+ type: 'sla.probe';
118
+ target: string;
119
+ ts: string;
120
+ up: boolean;
121
+ latency_ms?: number;
122
+ }>;
123
+ /** An independent probe's signed observation. */
124
+ export declare function probeResult(input: {
125
+ target: string;
126
+ ts: string;
127
+ up: boolean;
128
+ latencyMs?: number;
129
+ }, probePrivateKey: Uint8Array): ProbeResult;
130
+ /**
131
+ * Availability by interval: an interval counts as up when at least `quorum` trusted probes
132
+ * signed "up" in it. Intervals with too few probe reports are "unknown", not up.
133
+ */
134
+ export declare function uptimeFromProbes(results: ProbeResult[], opts: {
135
+ target: string;
136
+ trustedProbes: string[];
137
+ quorum: number;
138
+ start: string;
139
+ end: string;
140
+ intervalMs: number;
141
+ }): {
142
+ intervals: number;
143
+ up: number;
144
+ down: number;
145
+ unknown: number;
146
+ availabilityPermille: number | null;
147
+ };
148
+ /** Per provider: SLAs, how many are met, and the breach kinds seen. */
149
+ export declare function slaDashboard(items: Array<{
150
+ sla: Sla;
151
+ report: ComplianceReport;
152
+ }>): Record<string, {
153
+ slas: number;
154
+ met: number;
155
+ breachKinds: Record<string, number>;
156
+ }>;
157
+ /**
158
+ * An outage report skeleton with its duration and, for DORA major ICT incidents, the
159
+ * reporting deadlines: initial within 24 h of awareness (and 4 h of classification),
160
+ * intermediate within 72 h of the initial notification, final within one month of the
161
+ * intermediate report. Times assume each report is filed at its deadline.
162
+ */
163
+ export declare function outageReport(incident: {
164
+ id: string;
165
+ start: string;
166
+ end?: string;
167
+ awareAt: string;
168
+ classifiedAt?: string;
169
+ services: string[];
170
+ usersAffected?: number;
171
+ cause?: string;
172
+ }, regime?: 'dora' | 'generic'): {
173
+ deadlines: Array<{
174
+ report: string;
175
+ due: string;
176
+ }>;
177
+ id: string;
178
+ start: string;
179
+ end: string | null;
180
+ durationMinutes: number | null;
181
+ services: string[];
182
+ usersAffected: number | null;
183
+ cause: string | null;
184
+ hash: string;
185
+ };
186
+ //# sourceMappingURL=slo.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"slo.d.ts","sourceRoot":"","sources":["../src/slo.ts"],"names":[],"mappings":"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"}
package/dist/slo.js ADDED
@@ -0,0 +1,163 @@
1
+ /**
2
+ * More SLA machinery: latency and quality objectives, service credits, a DORA-style
3
+ * third-party register, subcontractor chains, offers and acceptance, independent uptime
4
+ * probes, breach notices with cure periods, a vendor dashboard and outage reports.
5
+ */
6
+ import { jcsHash, signObject, verifySignedObject } from '@zanii/core';
7
+ import { formatMoney } from '@zanii/payments';
8
+ import { buildSlaBody, signSla, slaHash, verifySla } from './index.js';
9
+ // ------------------------------------------------------------------------------ //
10
+ // Objectives
11
+ // ------------------------------------------------------------------------------ //
12
+ /** Nearest-rank percentile of a list of numbers. */
13
+ export function percentile(values, p) {
14
+ if (values.length === 0)
15
+ return null;
16
+ const sorted = [...values].sort((a, b) => a - b);
17
+ return sorted[Math.min(sorted.length - 1, Math.max(0, Math.ceil((p / 100) * sorted.length) - 1))];
18
+ }
19
+ /** Latency from paired request/response timestamps (e.g. a2a receipts), against a p95 target. */
20
+ export function latencySlo(pairs, target) {
21
+ const lat = pairs.map((p) => Date.parse(p.responseTs) - Date.parse(p.requestTs)).filter((x) => Number.isFinite(x) && x >= 0);
22
+ const p95 = percentile(lat, 95);
23
+ return { samples: lat.length, p50: percentile(lat, 50), p95, p99: percentile(lat, 99), ok: p95 !== null && p95 <= target.p95Ms };
24
+ }
25
+ /** Quality from committed evaluation results (scores in milli-units, 0..1000) on an agreed suite. */
26
+ export function qualitySlo(evals, target) {
27
+ const mine = evals.filter((e) => e.suite === target.suite);
28
+ const failing = mine.filter((e) => e.score_milli < target.minScoreMilli);
29
+ return { runs: mine.length, otherSuites: evals.length - mine.length, minScore: mine.length ? Math.min(...mine.map((e) => e.score_milli)) : null, failing: failing.map((e) => e.ts), ok: mine.length > 0 && failing.length === 0 };
30
+ }
31
+ // ------------------------------------------------------------------------------ //
32
+ // Remedies
33
+ // ------------------------------------------------------------------------------ //
34
+ /** Service credits: basis points of the fee per breach kind, summed and capped. Exact, in minor units, rounded down. */
35
+ export function serviceCredits(report, fee, schedule, capBps = 10_000) {
36
+ const kinds = [...new Set(report.breaches.map((b) => b.kind))];
37
+ const bps = Math.min(capBps, kinds.reduce((s, k) => s + (schedule[k] ?? 0), 0));
38
+ const minor = (BigInt(fee.minor) * BigInt(bps)) / 10000n;
39
+ return { kinds, bps, credit: { currency: fee.currency, minor: minor.toString(), display: `${formatMoney(minor, fee.currency)} ${fee.currency}` } };
40
+ }
41
+ /** A formal breach notice from the client, naming the SLA by hash and giving a cure period. */
42
+ export function breachNotice(sla, breaches, opts, clientPrivateKey) {
43
+ const ts = opts.ts ?? new Date().toISOString();
44
+ return signObject({ v: 1, type: 'sla.breach_notice', sla: slaHash(sla), breaches, cure_by: new Date(Date.parse(ts) + opts.cureDays * 86_400_000).toISOString(), ts }, clientPrivateKey);
45
+ }
46
+ /** After the cure period: cured when a later assessment has none of the noticed breach kinds. */
47
+ export function cureStatus(notice, sla, later, now = new Date().toISOString()) {
48
+ if (!verifySignedObject(notice) || notice.signer !== sla.body.client || notice.sla !== slaHash(sla))
49
+ return { status: 'invalid-notice' };
50
+ if (now < notice.cure_by)
51
+ return { status: 'cure-period', cureBy: notice.cure_by };
52
+ const noticed = new Set(notice.breaches.map((b) => b.kind));
53
+ const remaining = (later?.breaches ?? notice.breaches).filter((b) => noticed.has(b.kind));
54
+ return remaining.length ? { status: 'uncured', remaining } : { status: 'cured' };
55
+ }
56
+ // ------------------------------------------------------------------------------ //
57
+ // Agreements: offers, chains, registers
58
+ // ------------------------------------------------------------------------------ //
59
+ /** The provider offers terms, signed. */
60
+ export function offerSla(input, providerPrivateKey) {
61
+ const body = buildSlaBody(input);
62
+ return { body, signatures: [signSla(body, input.provider, providerPrivateKey)] };
63
+ }
64
+ /** The client accepts an offer by countersigning the same terms; the result verifies with `verifySla`. */
65
+ export function acceptSla(offer, clientPrivateKey) {
66
+ const sla = { body: offer.body, signatures: [...offer.signatures, signSla(offer.body, offer.body.client, clientPrivateKey)] };
67
+ const check = verifySla(sla);
68
+ if (!check.ok)
69
+ throw new Error(`sla: cannot accept: ${check.reasons.join('; ')}`);
70
+ return sla;
71
+ }
72
+ /**
73
+ * Subcontractor chain, top first: each SLA's client is the previous SLA's provider, all are
74
+ * valid, and no tier promises less than the tier above relies on.
75
+ */
76
+ export function verifyChainOfSlas(chain) {
77
+ const reasons = [];
78
+ chain.forEach((s, i) => {
79
+ const v = verifySla(s);
80
+ if (!v.ok)
81
+ reasons.push(`tier ${i}: ${v.reasons.join('; ')}`);
82
+ if (i === 0)
83
+ return;
84
+ const up = chain[i - 1].body;
85
+ const b = s.body;
86
+ if (b.client !== up.provider)
87
+ reasons.push(`tier ${i}: client is not the provider of tier ${i - 1}`);
88
+ if (up.commitments.max_gap_ms !== undefined && (b.commitments.max_gap_ms === undefined || b.commitments.max_gap_ms > up.commitments.max_gap_ms))
89
+ reasons.push(`tier ${i}: allows longer gaps than tier ${i - 1} promises`);
90
+ if (up.commitments.min_actions !== undefined && (b.commitments.min_actions ?? 0) < up.commitments.min_actions)
91
+ reasons.push(`tier ${i}: commits to fewer actions than tier ${i - 1}`);
92
+ });
93
+ return { ok: reasons.length === 0, reasons };
94
+ }
95
+ /**
96
+ * Rows for an ICT third-party register (DORA Art. 28(3)) from live SLAs plus the provider
97
+ * details you hold. A starting point for the register of information, not the full template.
98
+ */
99
+ export function thirdPartyRegister(slas, providers) {
100
+ return slas.map((s) => {
101
+ const p = providers[s.body.provider];
102
+ return {
103
+ contract: slaHash(s), provider_did: s.body.provider, provider_name: p?.name ?? null, lei: p?.lei ?? null, country: p?.country ?? null,
104
+ function: p?.function ?? null, critical_or_important: p?.critical ?? null, service_scope: s.body.scope, start: s.body.window.start, end: s.body.window.end,
105
+ complete: !!p && !!p.lei,
106
+ };
107
+ });
108
+ }
109
+ /** An independent probe's signed observation. */
110
+ export function probeResult(input, probePrivateKey) {
111
+ return signObject({ v: 1, type: 'sla.probe', target: input.target, ts: input.ts, up: input.up, ...(input.latencyMs !== undefined ? { latency_ms: input.latencyMs } : {}) }, probePrivateKey);
112
+ }
113
+ /**
114
+ * Availability by interval: an interval counts as up when at least `quorum` trusted probes
115
+ * signed "up" in it. Intervals with too few probe reports are "unknown", not up.
116
+ */
117
+ export function uptimeFromProbes(results, opts) {
118
+ const start = Date.parse(opts.start);
119
+ const n = Math.ceil((Date.parse(opts.end) - start) / opts.intervalMs);
120
+ const buckets = Array.from({ length: n }, () => ({ up: new Set(), down: new Set() }));
121
+ for (const r of results) {
122
+ if (r.target !== opts.target || !opts.trustedProbes.includes(r.signer) || !verifySignedObject(r))
123
+ continue;
124
+ const i = Math.floor((Date.parse(r.ts) - start) / opts.intervalMs);
125
+ if (i >= 0 && i < n)
126
+ (r.up ? buckets[i].up : buckets[i].down).add(r.signer);
127
+ }
128
+ const states = buckets.map((b) => (b.up.size >= opts.quorum ? 'up' : b.down.size >= opts.quorum ? 'down' : 'unknown'));
129
+ const known = states.filter((s) => s !== 'unknown').length;
130
+ return { intervals: n, up: states.filter((s) => s === 'up').length, down: states.filter((s) => s === 'down').length, unknown: n - known, availabilityPermille: known ? Math.round((states.filter((s) => s === 'up').length / known) * 1000) : null };
131
+ }
132
+ /** Per provider: SLAs, how many are met, and the breach kinds seen. */
133
+ export function slaDashboard(items) {
134
+ const byProvider = {};
135
+ for (const { sla, report } of items) {
136
+ const row = (byProvider[sla.body.provider] ??= { slas: 0, met: 0, breachKinds: {} });
137
+ row.slas++;
138
+ if (report.ok)
139
+ row.met++;
140
+ for (const b of report.breaches)
141
+ row.breachKinds[b.kind] = (row.breachKinds[b.kind] ?? 0) + 1;
142
+ }
143
+ return byProvider;
144
+ }
145
+ /**
146
+ * An outage report skeleton with its duration and, for DORA major ICT incidents, the
147
+ * reporting deadlines: initial within 24 h of awareness (and 4 h of classification),
148
+ * intermediate within 72 h of the initial notification, final within one month of the
149
+ * intermediate report. Times assume each report is filed at its deadline.
150
+ */
151
+ export function outageReport(incident, regime = 'generic') {
152
+ const duration = incident.end ? Date.parse(incident.end) - Date.parse(incident.start) : null;
153
+ const base = { id: incident.id, start: incident.start, end: incident.end ?? null, durationMinutes: duration === null ? null : Math.round(duration / 60_000), services: incident.services, usersAffected: incident.usersAffected ?? null, cause: incident.cause ?? null, hash: jcsHash(incident) };
154
+ if (regime !== 'dora')
155
+ return { ...base, deadlines: [] };
156
+ const plus = (iso, h) => new Date(Date.parse(iso) + h * 3_600_000).toISOString();
157
+ const initial = [plus(incident.awareAt, 24), ...(incident.classifiedAt ? [plus(incident.classifiedAt, 4)] : [])].sort()[0];
158
+ const intermediate = plus(initial, 72);
159
+ const final = new Date(intermediate);
160
+ final.setUTCMonth(final.getUTCMonth() + 1);
161
+ return { ...base, deadlines: [{ report: 'initial', due: initial }, { report: 'intermediate', due: intermediate }, { report: 'final', due: final.toISOString() }] };
162
+ }
163
+ //# sourceMappingURL=slo.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"slo.js","sourceRoot":"","sources":["../src/slo.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@zanii/sla",
3
- "version": "0.1.2",
3
+ "version": "0.1.3",
4
4
  "description": "Machine-verifiable service agreements between agents - co-signed terms (scope, window, volume, max-gap uptime proxy) with compliance computed deterministically from receipts. The per-agent hash chain closes the omission hole: a broken prev-link is an INCOMPLETE_RECORD breach, so a provider cannot hide the bad hour. Disputes become arithmetic, and breaches cite receipts.",
5
5
  "license": "Apache-2.0",
6
6
  "homepage": "https://ledger.zanii.agency",
@@ -33,8 +33,8 @@
33
33
  "dependencies": {
34
34
  "@noble/curves": "^1.8.1",
35
35
  "@noble/hashes": "^1.7.1",
36
- "@zanii/core": "^0.5.2",
37
- "@zanii/payments": "^0.2.0"
36
+ "@zanii/core": "^0.5.4",
37
+ "@zanii/payments": "^0.2.1"
38
38
  },
39
39
  "scripts": {
40
40
  "build": "tsc -p tsconfig.build.json",
package/src/index.ts CHANGED
@@ -277,3 +277,4 @@ export function assessCompliance(sla: Sla, receipts: Receipt[], opts: { asOf?: s
277
277
 
278
278
  return { ok: breaches.length === 0, breaches, metrics: { actions: matching.length, max_gap_ms: maxGap } };
279
279
  }
280
+ export * from './slo.js';
package/src/slo.ts ADDED
@@ -0,0 +1,173 @@
1
+ /**
2
+ * More SLA machinery: latency and quality objectives, service credits, a DORA-style
3
+ * third-party register, subcontractor chains, offers and acceptance, independent uptime
4
+ * probes, breach notices with cure periods, a vendor dashboard and outage reports.
5
+ */
6
+ import { jcsHash, signObject, verifySignedObject, type SignedObject } from '@zanii/core';
7
+ import { formatMoney, type Money } from '@zanii/payments';
8
+ import { buildSlaBody, signSla, slaHash, verifySla, type Breach, type BreachKind, type ComplianceReport, type Sla, type SlaInput } from './index.js';
9
+
10
+ // ------------------------------------------------------------------------------ //
11
+ // Objectives
12
+ // ------------------------------------------------------------------------------ //
13
+
14
+ /** Nearest-rank percentile of a list of numbers. */
15
+ export function percentile(values: number[], p: number): number | null {
16
+ if (values.length === 0) return null;
17
+ const sorted = [...values].sort((a, b) => a - b);
18
+ return sorted[Math.min(sorted.length - 1, Math.max(0, Math.ceil((p / 100) * sorted.length) - 1))]!;
19
+ }
20
+
21
+ /** Latency from paired request/response timestamps (e.g. a2a receipts), against a p95 target. */
22
+ export function latencySlo(pairs: Array<{ requestTs: string; responseTs: string }>, target: { p95Ms: number }) {
23
+ const lat = pairs.map((p) => Date.parse(p.responseTs) - Date.parse(p.requestTs)).filter((x) => Number.isFinite(x) && x >= 0);
24
+ const p95 = percentile(lat, 95);
25
+ return { samples: lat.length, p50: percentile(lat, 50), p95, p99: percentile(lat, 99), ok: p95 !== null && p95 <= target.p95Ms };
26
+ }
27
+
28
+ /** Quality from committed evaluation results (scores in milli-units, 0..1000) on an agreed suite. */
29
+ export function qualitySlo(evals: Array<{ ts: string; suite: string; score_milli: number }>, target: { suite: string; minScoreMilli: number }) {
30
+ const mine = evals.filter((e) => e.suite === target.suite);
31
+ const failing = mine.filter((e) => e.score_milli < target.minScoreMilli);
32
+ return { runs: mine.length, otherSuites: evals.length - mine.length, minScore: mine.length ? Math.min(...mine.map((e) => e.score_milli)) : null, failing: failing.map((e) => e.ts), ok: mine.length > 0 && failing.length === 0 };
33
+ }
34
+
35
+ // ------------------------------------------------------------------------------ //
36
+ // Remedies
37
+ // ------------------------------------------------------------------------------ //
38
+
39
+ /** Service credits: basis points of the fee per breach kind, summed and capped. Exact, in minor units, rounded down. */
40
+ export function serviceCredits(report: ComplianceReport, fee: Money, schedule: Partial<Record<BreachKind, number>>, capBps = 10_000) {
41
+ const kinds = [...new Set(report.breaches.map((b) => b.kind))];
42
+ const bps = Math.min(capBps, kinds.reduce((s, k) => s + (schedule[k] ?? 0), 0));
43
+ const minor = (BigInt(fee.minor) * BigInt(bps)) / 10_000n;
44
+ return { kinds, bps, credit: { currency: fee.currency, minor: minor.toString(), display: `${formatMoney(minor, fee.currency)} ${fee.currency}` } };
45
+ }
46
+
47
+ export type BreachNotice = SignedObject<{ v: 1; type: 'sla.breach_notice'; sla: string; breaches: Breach[]; cure_by: string; ts: string }>;
48
+
49
+ /** A formal breach notice from the client, naming the SLA by hash and giving a cure period. */
50
+ export function breachNotice(sla: Sla, breaches: Breach[], opts: { cureDays: number; ts?: string }, clientPrivateKey: Uint8Array): BreachNotice {
51
+ const ts = opts.ts ?? new Date().toISOString();
52
+ return signObject({ v: 1 as const, type: 'sla.breach_notice' as const, sla: slaHash(sla), breaches, cure_by: new Date(Date.parse(ts) + opts.cureDays * 86_400_000).toISOString(), ts }, clientPrivateKey);
53
+ }
54
+
55
+ /** After the cure period: cured when a later assessment has none of the noticed breach kinds. */
56
+ export function cureStatus(notice: BreachNotice, sla: Sla, later: ComplianceReport | null, now = new Date().toISOString()) {
57
+ if (!verifySignedObject(notice) || notice.signer !== sla.body.client || notice.sla !== slaHash(sla)) return { status: 'invalid-notice' as const };
58
+ if (now < notice.cure_by) return { status: 'cure-period' as const, cureBy: notice.cure_by };
59
+ const noticed = new Set(notice.breaches.map((b) => b.kind));
60
+ const remaining = (later?.breaches ?? notice.breaches).filter((b) => noticed.has(b.kind));
61
+ return remaining.length ? { status: 'uncured' as const, remaining } : { status: 'cured' as const };
62
+ }
63
+
64
+ // ------------------------------------------------------------------------------ //
65
+ // Agreements: offers, chains, registers
66
+ // ------------------------------------------------------------------------------ //
67
+
68
+ /** The provider offers terms, signed. */
69
+ export function offerSla(input: SlaInput, providerPrivateKey: Uint8Array): Sla {
70
+ const body = buildSlaBody(input);
71
+ return { body, signatures: [signSla(body, input.provider, providerPrivateKey)] };
72
+ }
73
+
74
+ /** The client accepts an offer by countersigning the same terms; the result verifies with `verifySla`. */
75
+ export function acceptSla(offer: Sla, clientPrivateKey: Uint8Array): Sla {
76
+ const sla = { body: offer.body, signatures: [...offer.signatures, signSla(offer.body, offer.body.client, clientPrivateKey)] };
77
+ const check = verifySla(sla);
78
+ if (!check.ok) throw new Error(`sla: cannot accept: ${check.reasons.join('; ')}`);
79
+ return sla;
80
+ }
81
+
82
+ /**
83
+ * Subcontractor chain, top first: each SLA's client is the previous SLA's provider, all are
84
+ * valid, and no tier promises less than the tier above relies on.
85
+ */
86
+ export function verifyChainOfSlas(chain: Sla[]) {
87
+ const reasons: string[] = [];
88
+ chain.forEach((s, i) => {
89
+ const v = verifySla(s);
90
+ if (!v.ok) reasons.push(`tier ${i}: ${v.reasons.join('; ')}`);
91
+ if (i === 0) return;
92
+ const up = chain[i - 1]!.body;
93
+ const b = s.body;
94
+ if (b.client !== up.provider) reasons.push(`tier ${i}: client is not the provider of tier ${i - 1}`);
95
+ if (up.commitments.max_gap_ms !== undefined && (b.commitments.max_gap_ms === undefined || b.commitments.max_gap_ms > up.commitments.max_gap_ms)) reasons.push(`tier ${i}: allows longer gaps than tier ${i - 1} promises`);
96
+ if (up.commitments.min_actions !== undefined && (b.commitments.min_actions ?? 0) < up.commitments.min_actions) reasons.push(`tier ${i}: commits to fewer actions than tier ${i - 1}`);
97
+ });
98
+ return { ok: reasons.length === 0, reasons };
99
+ }
100
+
101
+ /**
102
+ * Rows for an ICT third-party register (DORA Art. 28(3)) from live SLAs plus the provider
103
+ * details you hold. A starting point for the register of information, not the full template.
104
+ */
105
+ export function thirdPartyRegister(slas: Sla[], providers: Record<string, { name: string; lei?: string; country: string; function: string; critical: boolean }>) {
106
+ return slas.map((s) => {
107
+ const p = providers[s.body.provider];
108
+ return {
109
+ contract: slaHash(s), provider_did: s.body.provider, provider_name: p?.name ?? null, lei: p?.lei ?? null, country: p?.country ?? null,
110
+ function: p?.function ?? null, critical_or_important: p?.critical ?? null, service_scope: s.body.scope, start: s.body.window.start, end: s.body.window.end,
111
+ complete: !!p && !!p.lei,
112
+ };
113
+ });
114
+ }
115
+
116
+ // ------------------------------------------------------------------------------ //
117
+ // Probes, dashboards, outages
118
+ // ------------------------------------------------------------------------------ //
119
+
120
+ export type ProbeResult = SignedObject<{ v: 1; type: 'sla.probe'; target: string; ts: string; up: boolean; latency_ms?: number }>;
121
+
122
+ /** An independent probe's signed observation. */
123
+ export function probeResult(input: { target: string; ts: string; up: boolean; latencyMs?: number }, probePrivateKey: Uint8Array): ProbeResult {
124
+ return signObject({ v: 1 as const, type: 'sla.probe' as const, target: input.target, ts: input.ts, up: input.up, ...(input.latencyMs !== undefined ? { latency_ms: input.latencyMs } : {}) }, probePrivateKey);
125
+ }
126
+
127
+ /**
128
+ * Availability by interval: an interval counts as up when at least `quorum` trusted probes
129
+ * signed "up" in it. Intervals with too few probe reports are "unknown", not up.
130
+ */
131
+ export function uptimeFromProbes(results: ProbeResult[], opts: { target: string; trustedProbes: string[]; quorum: number; start: string; end: string; intervalMs: number }) {
132
+ const start = Date.parse(opts.start);
133
+ const n = Math.ceil((Date.parse(opts.end) - start) / opts.intervalMs);
134
+ const buckets = Array.from({ length: n }, () => ({ up: new Set<string>(), down: new Set<string>() }));
135
+ for (const r of results) {
136
+ if (r.target !== opts.target || !opts.trustedProbes.includes(r.signer) || !verifySignedObject(r)) continue;
137
+ const i = Math.floor((Date.parse(r.ts) - start) / opts.intervalMs);
138
+ if (i >= 0 && i < n) (r.up ? buckets[i]!.up : buckets[i]!.down).add(r.signer);
139
+ }
140
+ const states = buckets.map((b) => (b.up.size >= opts.quorum ? 'up' : b.down.size >= opts.quorum ? 'down' : 'unknown'));
141
+ const known = states.filter((s) => s !== 'unknown').length;
142
+ return { intervals: n, up: states.filter((s) => s === 'up').length, down: states.filter((s) => s === 'down').length, unknown: n - known, availabilityPermille: known ? Math.round((states.filter((s) => s === 'up').length / known) * 1000) : null };
143
+ }
144
+
145
+ /** Per provider: SLAs, how many are met, and the breach kinds seen. */
146
+ export function slaDashboard(items: Array<{ sla: Sla; report: ComplianceReport }>) {
147
+ const byProvider: Record<string, { slas: number; met: number; breachKinds: Record<string, number> }> = {};
148
+ for (const { sla, report } of items) {
149
+ const row = (byProvider[sla.body.provider] ??= { slas: 0, met: 0, breachKinds: {} });
150
+ row.slas++;
151
+ if (report.ok) row.met++;
152
+ for (const b of report.breaches) row.breachKinds[b.kind] = (row.breachKinds[b.kind] ?? 0) + 1;
153
+ }
154
+ return byProvider;
155
+ }
156
+
157
+ /**
158
+ * An outage report skeleton with its duration and, for DORA major ICT incidents, the
159
+ * reporting deadlines: initial within 24 h of awareness (and 4 h of classification),
160
+ * intermediate within 72 h of the initial notification, final within one month of the
161
+ * intermediate report. Times assume each report is filed at its deadline.
162
+ */
163
+ export function outageReport(incident: { id: string; start: string; end?: string; awareAt: string; classifiedAt?: string; services: string[]; usersAffected?: number; cause?: string }, regime: 'dora' | 'generic' = 'generic') {
164
+ const duration = incident.end ? Date.parse(incident.end) - Date.parse(incident.start) : null;
165
+ const base = { id: incident.id, start: incident.start, end: incident.end ?? null, durationMinutes: duration === null ? null : Math.round(duration / 60_000), services: incident.services, usersAffected: incident.usersAffected ?? null, cause: incident.cause ?? null, hash: jcsHash(incident) };
166
+ if (regime !== 'dora') return { ...base, deadlines: [] as Array<{ report: string; due: string }> };
167
+ const plus = (iso: string, h: number) => new Date(Date.parse(iso) + h * 3_600_000).toISOString();
168
+ const initial = [plus(incident.awareAt, 24), ...(incident.classifiedAt ? [plus(incident.classifiedAt, 4)] : [])].sort()[0]!;
169
+ const intermediate = plus(initial, 72);
170
+ const final = new Date(intermediate);
171
+ final.setUTCMonth(final.getUTCMonth() + 1);
172
+ return { ...base, deadlines: [{ report: 'initial', due: initial }, { report: 'intermediate', due: intermediate }, { report: 'final', due: final.toISOString() }] };
173
+ }