@zanii/sla 0.1.1 → 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 +4 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/slo.d.ts +186 -0
- package/dist/slo.d.ts.map +1 -0
- package/dist/slo.js +163 -0
- package/dist/slo.js.map +1 -0
- package/package.json +3 -3
- package/src/index.ts +1 -0
- package/src/slo.ts +173 -0
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
package/dist/index.d.ts.map
CHANGED
|
@@ -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
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":"AAAA;;;;GAIG;AACH,OAAO,EAA2C,KAAK,YAAY,EAAE,MAAM,aAAa,CAAC;AACzF,OAAO,EAAe,KAAK,KAAK,EAAE,MAAM,iBAAiB,CAAC;AAC1D,OAAO,EAA6C,KAAK,MAAM,EAAE,KAAK,UAAU,EAAE,KAAK,gBAAgB,EAAE,KAAK,GAAG,EAAE,KAAK,QAAQ,EAAE,MAAM,YAAY,CAAC;AAMrJ,oDAAoD;AACpD,wBAAgB,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAIrE;AAED,iGAAiG;AACjG,wBAAgB,UAAU,CAAC,KAAK,EAAE,KAAK,CAAC;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,CAAC,EAAE,MAAM,EAAE;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE;;;;;;EAI5G;AAED,qGAAqG;AACrG,wBAAgB,UAAU,CAAC,KAAK,EAAE,KAAK,CAAC;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,CAAC,EAAE,MAAM,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,aAAa,EAAE,MAAM,CAAA;CAAE;;;;;;EAI5I;AAMD,wHAAwH;AACxH,wBAAgB,cAAc,CAAC,MAAM,EAAE,gBAAgB,EAAE,GAAG,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,CAAC,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC,EAAE,MAAM,SAAS;;;;;;;;EAKlI;AAED,MAAM,MAAM,YAAY,GAAG,YAAY,CAAC;IAAE,CAAC,EAAE,CAAC,CAAC;IAAC,IAAI,EAAE,mBAAmB,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,EAAE,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC;AAE3I,+FAA+F;AAC/F,wBAAgB,YAAY,CAAC,GAAG,EAAE,GAAG,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,EAAE,CAAC,EAAE,MAAM,CAAA;CAAE,EAAE,gBAAgB,EAAE,UAAU,GAAG,YAAY,CAG9I;AAED,iGAAiG;AACjG,wBAAgB,UAAU,CAAC,MAAM,EAAE,YAAY,EAAE,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,gBAAgB,GAAG,IAAI,EAAE,GAAG,SAA2B;;;;;;;;;;;;;;;;EAMxH;AAMD,yCAAyC;AACzC,wBAAgB,QAAQ,CAAC,KAAK,EAAE,QAAQ,EAAE,kBAAkB,EAAE,UAAU,GAAG,GAAG,CAG7E;AAED,0GAA0G;AAC1G,wBAAgB,SAAS,CAAC,KAAK,EAAE,GAAG,EAAE,gBAAgB,EAAE,UAAU,GAAG,GAAG,CAKvE;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,GAAG,EAAE;;;EAa7C;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,OAAO,CAAA;CAAE,CAAC;;;;;;;;;;;;IAS9J;AAMD,MAAM,MAAM,WAAW,GAAG,YAAY,CAAC;IAAE,CAAC,EAAE,CAAC,CAAC;IAAC,IAAI,EAAE,WAAW,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,OAAO,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC;AAElI,iDAAiD;AACjD,wBAAgB,WAAW,CAAC,KAAK,EAAE;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,OAAO,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,EAAE,eAAe,EAAE,UAAU,GAAG,WAAW,CAE5I;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,WAAW,EAAE,EAAE,IAAI,EAAE;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,aAAa,EAAE,MAAM,EAAE,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE;;;;;;EAYzK;AAED,uEAAuE;AACvE,wBAAgB,YAAY,CAAC,KAAK,EAAE,KAAK,CAAC;IAAE,GAAG,EAAE,GAAG,CAAC;IAAC,MAAM,EAAE,gBAAgB,CAAA;CAAE,CAAC;UACtC,MAAM;SAAO,MAAM;iBAAe,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;GAQlG;AAED;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,QAAQ,EAAE;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,EAAE,CAAC;IAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,EAAE,MAAM,GAAE,MAAM,GAAG,SAAqB;eAGlK,KAAK,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC;;;;;;;;;EAOjG"}
|
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
|
package/dist/slo.js.map
ADDED
|
@@ -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.
|
|
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.4
|
|
37
|
-
"@zanii/payments": "^0.2.
|
|
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
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
|
+
}
|