@emilia-protocol/gate 0.11.0 → 0.13.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +58 -0
- package/README.md +252 -0
- package/action-control-manifest.js +3 -268
- package/action-escrow-custodian.js +3 -394
- package/action-escrow-evidence.js +3 -858
- package/action-escrow-package.js +3 -1668
- package/action-escrow-postgres.js +3 -337
- package/action-escrow-state.js +3 -396
- package/action-escrow-verifiers.js +3 -331
- package/action-escrow.js +3 -2447
- package/action-packs.js +3 -140
- package/adapters/_kit.js +3 -104
- package/adapters/aws.js +3 -108
- package/adapters/cloudflare.js +3 -54
- package/adapters/gcp.js +3 -70
- package/adapters/github.js +3 -109
- package/adapters/jira.js +3 -55
- package/adapters/k8s.js +3 -70
- package/adapters/linear.js +3 -55
- package/adapters/salesforce.js +3 -55
- package/adapters/stripe.js +3 -81
- package/adapters/supabase.js +3 -121
- package/adapters/terraform.js +3 -59
- package/adapters/vercel.js +3 -84
- package/aec-execution.js +3 -312
- package/breakglass.js +3 -582
- package/capability-receipt.js +4 -0
- package/cf1-conformance.js +3 -106
- package/challenge-store.js +3 -69
- package/control-plane.js +3 -340
- package/coverage.js +3 -721
- package/demo.mjs +1 -1
- package/deployment-attestation.js +3 -247
- package/dist/action-control-manifest.d.ts +82 -0
- package/dist/action-control-manifest.d.ts.map +1 -0
- package/dist/action-control-manifest.js +422 -0
- package/dist/action-control-manifest.js.map +1 -0
- package/dist/action-escrow-custodian.d.ts +74 -0
- package/dist/action-escrow-custodian.d.ts.map +1 -0
- package/dist/action-escrow-custodian.js +363 -0
- package/dist/action-escrow-custodian.js.map +1 -0
- package/dist/action-escrow-evidence.d.ts +130 -0
- package/dist/action-escrow-evidence.d.ts.map +1 -0
- package/dist/action-escrow-evidence.js +1012 -0
- package/dist/action-escrow-evidence.js.map +1 -0
- package/dist/action-escrow-package.d.ts +10 -0
- package/dist/action-escrow-package.d.ts.map +1 -0
- package/dist/action-escrow-package.js +1583 -0
- package/dist/action-escrow-package.js.map +1 -0
- package/dist/action-escrow-postgres.d.ts +62 -0
- package/dist/action-escrow-postgres.d.ts.map +1 -0
- package/dist/action-escrow-postgres.js +339 -0
- package/dist/action-escrow-postgres.js.map +1 -0
- package/dist/action-escrow-state.d.ts +141 -0
- package/dist/action-escrow-state.d.ts.map +1 -0
- package/dist/action-escrow-state.js +413 -0
- package/dist/action-escrow-state.js.map +1 -0
- package/dist/action-escrow-verifiers.d.ts +65 -0
- package/dist/action-escrow-verifiers.d.ts.map +1 -0
- package/dist/action-escrow-verifiers.js +421 -0
- package/dist/action-escrow-verifiers.js.map +1 -0
- package/dist/action-escrow.d.ts +112 -0
- package/dist/action-escrow.d.ts.map +1 -0
- package/dist/action-escrow.js +2661 -0
- package/dist/action-escrow.js.map +1 -0
- package/dist/action-packs.d.ts +54 -0
- package/dist/action-packs.d.ts.map +1 -0
- package/dist/action-packs.js +143 -0
- package/dist/action-packs.js.map +1 -0
- package/dist/adapters/_kit.d.ts +50 -0
- package/dist/adapters/_kit.d.ts.map +1 -0
- package/dist/adapters/_kit.js +98 -0
- package/dist/adapters/_kit.js.map +1 -0
- package/dist/adapters/aws.d.ts +158 -0
- package/dist/adapters/aws.d.ts.map +1 -0
- package/dist/adapters/aws.js +136 -0
- package/dist/adapters/aws.js.map +1 -0
- package/dist/adapters/cloudflare.d.ts +116 -0
- package/dist/adapters/cloudflare.d.ts.map +1 -0
- package/dist/adapters/cloudflare.js +75 -0
- package/dist/adapters/cloudflare.js.map +1 -0
- package/dist/adapters/gcp.d.ts +139 -0
- package/dist/adapters/gcp.d.ts.map +1 -0
- package/dist/adapters/gcp.js +69 -0
- package/dist/adapters/gcp.js.map +1 -0
- package/dist/adapters/github.d.ts +123 -0
- package/dist/adapters/github.d.ts.map +1 -0
- package/dist/adapters/github.js +105 -0
- package/dist/adapters/github.js.map +1 -0
- package/dist/adapters/jira.d.ts +109 -0
- package/dist/adapters/jira.d.ts.map +1 -0
- package/dist/adapters/jira.js +54 -0
- package/dist/adapters/jira.js.map +1 -0
- package/dist/adapters/k8s.d.ts +139 -0
- package/dist/adapters/k8s.d.ts.map +1 -0
- package/dist/adapters/k8s.js +69 -0
- package/dist/adapters/k8s.js.map +1 -0
- package/dist/adapters/linear.d.ts +109 -0
- package/dist/adapters/linear.d.ts.map +1 -0
- package/dist/adapters/linear.js +54 -0
- package/dist/adapters/linear.js.map +1 -0
- package/dist/adapters/salesforce.d.ts +109 -0
- package/dist/adapters/salesforce.d.ts.map +1 -0
- package/dist/adapters/salesforce.js +54 -0
- package/dist/adapters/salesforce.js.map +1 -0
- package/dist/adapters/stripe.d.ts +116 -0
- package/dist/adapters/stripe.d.ts.map +1 -0
- package/dist/adapters/stripe.js +77 -0
- package/dist/adapters/stripe.js.map +1 -0
- package/dist/adapters/supabase.d.ts +127 -0
- package/dist/adapters/supabase.d.ts.map +1 -0
- package/dist/adapters/supabase.js +112 -0
- package/dist/adapters/supabase.js.map +1 -0
- package/dist/adapters/terraform.d.ts +109 -0
- package/dist/adapters/terraform.d.ts.map +1 -0
- package/dist/adapters/terraform.js +58 -0
- package/dist/adapters/terraform.js.map +1 -0
- package/dist/adapters/vercel.d.ts +114 -0
- package/dist/adapters/vercel.d.ts.map +1 -0
- package/dist/adapters/vercel.js +81 -0
- package/dist/adapters/vercel.js.map +1 -0
- package/dist/aec-execution.d.ts +107 -0
- package/dist/aec-execution.d.ts.map +1 -0
- package/dist/aec-execution.js +334 -0
- package/dist/aec-execution.js.map +1 -0
- package/dist/breakglass.d.ts +205 -0
- package/dist/breakglass.d.ts.map +1 -0
- package/dist/breakglass.js +627 -0
- package/dist/breakglass.js.map +1 -0
- package/dist/capability-receipt.d.ts +601 -0
- package/dist/capability-receipt.d.ts.map +1 -0
- package/dist/capability-receipt.js +1177 -0
- package/dist/capability-receipt.js.map +1 -0
- package/dist/cf1-conformance.d.ts +83 -0
- package/dist/cf1-conformance.d.ts.map +1 -0
- package/dist/cf1-conformance.js +94 -0
- package/dist/cf1-conformance.js.map +1 -0
- package/dist/challenge-store.d.ts +20 -0
- package/dist/challenge-store.d.ts.map +1 -0
- package/dist/challenge-store.js +62 -0
- package/dist/challenge-store.js.map +1 -0
- package/dist/control-plane.d.ts +136 -0
- package/dist/control-plane.d.ts.map +1 -0
- package/dist/control-plane.js +349 -0
- package/dist/control-plane.js.map +1 -0
- package/dist/coverage.d.ts +156 -0
- package/dist/coverage.d.ts.map +1 -0
- package/dist/coverage.js +768 -0
- package/dist/coverage.js.map +1 -0
- package/dist/deployment-attestation.d.ts +93 -0
- package/dist/deployment-attestation.d.ts.map +1 -0
- package/dist/deployment-attestation.js +262 -0
- package/dist/deployment-attestation.js.map +1 -0
- package/dist/eg1-conformance.d.ts +286 -0
- package/dist/eg1-conformance.d.ts.map +1 -0
- package/dist/eg1-conformance.js +379 -0
- package/dist/eg1-conformance.js.map +1 -0
- package/dist/enterprise.d.ts +88 -0
- package/dist/enterprise.d.ts.map +1 -0
- package/dist/enterprise.js +194 -0
- package/dist/enterprise.js.map +1 -0
- package/dist/evidence-postgres.d.ts +123 -0
- package/dist/evidence-postgres.d.ts.map +1 -0
- package/dist/evidence-postgres.js +343 -0
- package/dist/evidence-postgres.js.map +1 -0
- package/dist/evidence.d.ts +113 -0
- package/dist/evidence.d.ts.map +1 -0
- package/dist/evidence.js +369 -0
- package/dist/evidence.js.map +1 -0
- package/dist/execution-binding.d.ts +49 -0
- package/dist/execution-binding.d.ts.map +1 -0
- package/dist/execution-binding.js +243 -0
- package/dist/execution-binding.js.map +1 -0
- package/dist/formal-runtime-map.d.ts +42 -0
- package/dist/formal-runtime-map.d.ts.map +1 -0
- package/dist/formal-runtime-map.js +23 -0
- package/dist/formal-runtime-map.js.map +1 -0
- package/dist/index.d.ts +1002 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +1736 -0
- package/dist/index.js.map +1 -0
- package/dist/key-registry.d.ts +60 -0
- package/dist/key-registry.d.ts.map +1 -0
- package/dist/key-registry.js +144 -0
- package/dist/key-registry.js.map +1 -0
- package/dist/mcp.d.ts +53 -0
- package/dist/mcp.d.ts.map +1 -0
- package/dist/mcp.js +112 -0
- package/dist/mcp.js.map +1 -0
- package/dist/metering.d.ts +80 -0
- package/dist/metering.d.ts.map +1 -0
- package/dist/metering.js +227 -0
- package/dist/metering.js.map +1 -0
- package/dist/metrics.d.ts +68 -0
- package/dist/metrics.d.ts.map +1 -0
- package/dist/metrics.js +242 -0
- package/dist/metrics.js.map +1 -0
- package/dist/network-witness.d.ts +167 -0
- package/dist/network-witness.d.ts.map +1 -0
- package/dist/network-witness.js +520 -0
- package/dist/network-witness.js.map +1 -0
- package/dist/protocol-state.d.ts +141 -0
- package/dist/protocol-state.d.ts.map +1 -0
- package/dist/protocol-state.js +106 -0
- package/dist/protocol-state.js.map +1 -0
- package/dist/receipt-program.d.ts +59 -0
- package/dist/receipt-program.d.ts.map +1 -0
- package/dist/receipt-program.js +1053 -0
- package/dist/receipt-program.js.map +1 -0
- package/dist/reliance-kernel.d.ts +66 -0
- package/dist/reliance-kernel.d.ts.map +1 -0
- package/dist/reliance-kernel.js +103 -0
- package/dist/reliance-kernel.js.map +1 -0
- package/dist/reliance-packet.d.ts +67 -0
- package/dist/reliance-packet.d.ts.map +1 -0
- package/dist/reliance-packet.js +176 -0
- package/dist/reliance-packet.js.map +1 -0
- package/dist/remedy-program-postgres.d.ts +37 -0
- package/dist/remedy-program-postgres.d.ts.map +1 -0
- package/dist/remedy-program-postgres.js +291 -0
- package/dist/remedy-program-postgres.js.map +1 -0
- package/dist/remedy-program-receipt.d.ts +97 -0
- package/dist/remedy-program-receipt.d.ts.map +1 -0
- package/dist/remedy-program-receipt.js +817 -0
- package/dist/remedy-program-receipt.js.map +1 -0
- package/dist/remedy-program.d.ts +76 -0
- package/dist/remedy-program.d.ts.map +1 -0
- package/dist/remedy-program.js +1346 -0
- package/dist/remedy-program.js.map +1 -0
- package/dist/reports/art14.d.ts +101 -0
- package/dist/reports/art14.d.ts.map +1 -0
- package/dist/reports/art14.js +340 -0
- package/dist/reports/art14.js.map +1 -0
- package/dist/reports/assurance-package.d.ts +197 -0
- package/dist/reports/assurance-package.d.ts.map +1 -0
- package/dist/reports/assurance-package.js +313 -0
- package/dist/reports/assurance-package.js.map +1 -0
- package/dist/reports/auditor-workpaper.d.ts +194 -0
- package/dist/reports/auditor-workpaper.d.ts.map +1 -0
- package/dist/reports/auditor-workpaper.js +545 -0
- package/dist/reports/auditor-workpaper.js.map +1 -0
- package/dist/reports/external-verification.d.ts +76 -0
- package/dist/reports/external-verification.d.ts.map +1 -0
- package/dist/reports/external-verification.js +209 -0
- package/dist/reports/external-verification.js.map +1 -0
- package/dist/reports/reperform.d.ts +122 -0
- package/dist/reports/reperform.d.ts.map +1 -0
- package/dist/reports/reperform.js +432 -0
- package/dist/reports/reperform.js.map +1 -0
- package/dist/reports/underwriter.d.ts +127 -0
- package/dist/reports/underwriter.d.ts.map +1 -0
- package/dist/reports/underwriter.js +348 -0
- package/dist/reports/underwriter.js.map +1 -0
- package/dist/retention.d.ts +88 -0
- package/dist/retention.d.ts.map +1 -0
- package/dist/retention.js +90 -0
- package/dist/retention.js.map +1 -0
- package/dist/roster.d.ts +113 -0
- package/dist/roster.d.ts.map +1 -0
- package/dist/roster.js +261 -0
- package/dist/roster.js.map +1 -0
- package/dist/runtime-monitor.d.ts +132 -0
- package/dist/runtime-monitor.d.ts.map +1 -0
- package/dist/runtime-monitor.js +197 -0
- package/dist/runtime-monitor.js.map +1 -0
- package/dist/settlement.d.ts +68 -0
- package/dist/settlement.d.ts.map +1 -0
- package/dist/settlement.js +306 -0
- package/dist/settlement.js.map +1 -0
- package/dist/siem.d.ts +261 -0
- package/dist/siem.d.ts.map +1 -0
- package/dist/siem.js +247 -0
- package/dist/siem.js.map +1 -0
- package/dist/store-postgres.d.ts +107 -0
- package/dist/store-postgres.d.ts.map +1 -0
- package/dist/store-postgres.js +152 -0
- package/dist/store-postgres.js.map +1 -0
- package/dist/store.d.ts +95 -0
- package/dist/store.d.ts.map +1 -0
- package/dist/store.js +202 -0
- package/dist/store.js.map +1 -0
- package/dist/strict-json.d.ts +14 -0
- package/dist/strict-json.d.ts.map +1 -0
- package/dist/strict-json.js +132 -0
- package/dist/strict-json.js.map +1 -0
- package/dist/trust-program-adapters.d.ts +122 -0
- package/dist/trust-program-adapters.d.ts.map +1 -0
- package/dist/trust-program-adapters.js +802 -0
- package/dist/trust-program-adapters.js.map +1 -0
- package/dist/trust-program-postgres.d.ts +41 -0
- package/dist/trust-program-postgres.d.ts.map +1 -0
- package/dist/trust-program-postgres.js +346 -0
- package/dist/trust-program-postgres.js.map +1 -0
- package/dist/trust-program-revocation.d.ts +206 -0
- package/dist/trust-program-revocation.d.ts.map +1 -0
- package/dist/trust-program-revocation.js +600 -0
- package/dist/trust-program-revocation.js.map +1 -0
- package/dist/trust-program.d.ts +197 -0
- package/dist/trust-program.d.ts.map +1 -0
- package/dist/trust-program.js +1351 -0
- package/dist/trust-program.js.map +1 -0
- package/dist/witness-postgres.d.ts +43 -0
- package/dist/witness-postgres.d.ts.map +1 -0
- package/dist/witness-postgres.js +92 -0
- package/dist/witness-postgres.js.map +1 -0
- package/dist/zk-range-proof.d.ts +78 -0
- package/dist/zk-range-proof.d.ts.map +1 -0
- package/dist/zk-range-proof.js +228 -0
- package/dist/zk-range-proof.js.map +1 -0
- package/eg1-conformance.js +3 -404
- package/enterprise.js +3 -180
- package/ep-assure.mjs +1 -0
- package/evidence-postgres.js +3 -356
- package/evidence.js +4 -360
- package/execution-binding.js +3 -212
- package/formal-runtime-map.js +4 -0
- package/index.js +4 -1249
- package/key-registry.js +3 -134
- package/mcp.js +3 -109
- package/metering.js +3 -226
- package/metrics.js +3 -231
- package/network-witness.js +3 -499
- package/package.json +31 -2
- package/receipt-program.js +4 -0
- package/reliance-kernel.js +3 -112
- package/reliance-packet.js +3 -175
- package/remedy-program-postgres.js +4 -0
- package/remedy-program-receipt.js +4 -0
- package/remedy-program.js +4 -0
- package/reports/art14.js +0 -0
- package/reports/assurance-package.js +2 -312
- package/reports/auditor-workpaper.js +3 -537
- package/reports/external-verification.js +3 -222
- package/reports/reperform.js +3 -424
- package/reports/underwriter.js +3 -339
- package/retention.js +3 -84
- package/roster.js +3 -264
- package/runtime-monitor.js +4 -0
- package/settlement.js +3 -299
- package/siem.js +3 -235
- package/src/action-control-manifest.ts +424 -0
- package/src/action-escrow-custodian.ts +427 -0
- package/src/action-escrow-evidence.ts +1178 -0
- package/src/action-escrow-package.ts +1821 -0
- package/src/action-escrow-postgres.ts +366 -0
- package/src/action-escrow-state.ts +498 -0
- package/src/action-escrow-verifiers.ts +484 -0
- package/src/action-escrow.ts +3039 -0
- package/src/action-packs.ts +170 -0
- package/src/adapters/_kit.ts +117 -0
- package/src/adapters/aws.ts +142 -0
- package/src/adapters/cloudflare.ts +78 -0
- package/src/adapters/gcp.ts +71 -0
- package/src/adapters/github.ts +110 -0
- package/src/adapters/jira.ts +56 -0
- package/src/adapters/k8s.ts +71 -0
- package/src/adapters/linear.ts +56 -0
- package/src/adapters/salesforce.ts +56 -0
- package/src/adapters/stripe.ts +82 -0
- package/src/adapters/supabase.ts +122 -0
- package/src/adapters/terraform.ts +60 -0
- package/src/adapters/vercel.ts +85 -0
- package/src/aec-execution.ts +354 -0
- package/src/breakglass.ts +647 -0
- package/src/capability-receipt.ts +1258 -0
- package/src/cf1-conformance.ts +120 -0
- package/src/challenge-store.ts +70 -0
- package/src/control-plane.ts +374 -0
- package/src/coverage.ts +832 -0
- package/src/deployment-attestation.ts +259 -0
- package/src/eg1-conformance.ts +471 -0
- package/src/enterprise.ts +195 -0
- package/src/evidence-postgres.ts +374 -0
- package/src/evidence.ts +367 -0
- package/src/execution-binding.ts +236 -0
- package/src/formal-runtime-map.ts +24 -0
- package/src/index.ts +2122 -0
- package/src/key-registry.ts +150 -0
- package/src/mcp.ts +120 -0
- package/src/metering.ts +237 -0
- package/src/metrics.ts +232 -0
- package/src/network-witness.ts +585 -0
- package/src/protocol-state.ts +143 -0
- package/src/protocol-state.typecheck.ts +94 -0
- package/src/receipt-program.ts +1105 -0
- package/src/reliance-kernel.ts +119 -0
- package/src/reliance-packet.ts +206 -0
- package/src/remedy-program-postgres.ts +367 -0
- package/src/remedy-program-receipt.ts +891 -0
- package/src/remedy-program.ts +1388 -0
- package/src/reports/art14.ts +361 -0
- package/src/reports/assurance-package.ts +330 -0
- package/src/reports/auditor-workpaper.ts +558 -0
- package/src/reports/external-verification.ts +232 -0
- package/src/reports/reperform.ts +441 -0
- package/src/reports/underwriter.ts +356 -0
- package/src/retention.ts +100 -0
- package/src/roster.ts +273 -0
- package/src/runtime-monitor.ts +217 -0
- package/src/settlement.ts +313 -0
- package/src/siem.ts +247 -0
- package/src/store-postgres.ts +167 -0
- package/src/store.ts +214 -0
- package/src/strict-json.ts +115 -0
- package/src/trust-program-adapters.ts +847 -0
- package/src/trust-program-postgres.ts +429 -0
- package/src/trust-program-revocation.ts +751 -0
- package/src/trust-program.ts +1460 -0
- package/src/witness-postgres.ts +106 -0
- package/src/zk-range-proof.ts +250 -0
- package/store-postgres.js +3 -161
- package/store.js +4 -198
- package/strict-json.js +3 -102
- package/trust-program-adapters.js +4 -0
- package/trust-program-postgres.js +4 -0
- package/trust-program-revocation.js +4 -0
- package/trust-program.js +4 -0
- package/witness-postgres.js +3 -96
- package/zk-range-proof.js +4 -0
|
@@ -0,0 +1,348 @@
|
|
|
1
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
2
|
+
/**
|
|
3
|
+
* EMILIA Gate — underwriter control attestation (AI-liability loss-run analogue).
|
|
4
|
+
*
|
|
5
|
+
* The artifact an AI-liability underwriter prices premium credit against — the
|
|
6
|
+
* MFA-for-cyber analogue: evidence that a deny-by-default authorization control
|
|
7
|
+
* was IN FORCE and OPERATING over the policy period, computed from the gate's
|
|
8
|
+
* tamper-evident evidence log. Pure function: same entries + same options in,
|
|
9
|
+
* identical JSON out (pin `now` for a byte-stable artifact).
|
|
10
|
+
*
|
|
11
|
+
* HONESTY BOUNDARY (carried inside the artifact): this attests CONTROL
|
|
12
|
+
* OPERATION only. It does not attest the business correctness of any authorized
|
|
13
|
+
* action, and it is not an insurance document until adopted by the carrier.
|
|
14
|
+
* Near-miss / remediation narrative belongs to the broker — the builder emits
|
|
15
|
+
* those fields as null and NEVER fabricates prose.
|
|
16
|
+
*
|
|
17
|
+
* Fail closed: a missing insured or an invalid period is an error, not a guess.
|
|
18
|
+
* Entries that cannot be verified as log records (unparseable time, missing
|
|
19
|
+
* hash, unknown kind, decision without an allow verdict) are EXCLUDED from every
|
|
20
|
+
* attested count and surfaced as integrity_warnings — the attestation never
|
|
21
|
+
* counts what it cannot account for. A zero-activity period is a valid (boring)
|
|
22
|
+
* attestation, not an error.
|
|
23
|
+
*/
|
|
24
|
+
export const UNDERWRITER_ATTESTATION_VERSION = 'EP-GATE-UNDERWRITER-ATTESTATION-v1';
|
|
25
|
+
// The gate's assurance vocabulary. `software` is the single-approver baseline;
|
|
26
|
+
// the distribution always carries all three so an underwriter can see zeros.
|
|
27
|
+
const KNOWN_TIERS = ['class_a', 'quorum', 'software'];
|
|
28
|
+
function toMs(t) {
|
|
29
|
+
if (t == null)
|
|
30
|
+
return null;
|
|
31
|
+
const ms = typeof t === 'number' ? t : Date.parse(t);
|
|
32
|
+
return Number.isFinite(ms) ? ms : null;
|
|
33
|
+
}
|
|
34
|
+
/** Deterministic object from a Map: keys sorted, never insertion-ordered. */
|
|
35
|
+
function sortedObject(map) {
|
|
36
|
+
const out = {};
|
|
37
|
+
for (const k of [...map.keys()].sort())
|
|
38
|
+
out[k] = map.get(k);
|
|
39
|
+
return out;
|
|
40
|
+
}
|
|
41
|
+
function countBy(items, keyFn) {
|
|
42
|
+
const m = new Map();
|
|
43
|
+
for (const it of items) {
|
|
44
|
+
const k = keyFn(it);
|
|
45
|
+
m.set(k, (m.get(k) || 0) + 1);
|
|
46
|
+
}
|
|
47
|
+
return m;
|
|
48
|
+
}
|
|
49
|
+
/** Tier histogram seeded with the known tiers so zeros are explicit. */
|
|
50
|
+
function tierDistribution(values) {
|
|
51
|
+
const m = new Map(KNOWN_TIERS.map((t) => [t, 0]));
|
|
52
|
+
for (const v of values) {
|
|
53
|
+
const k = typeof v === 'string' && v.length ? v : 'unspecified';
|
|
54
|
+
m.set(k, (m.get(k) || 0) + 1);
|
|
55
|
+
}
|
|
56
|
+
return sortedObject(m);
|
|
57
|
+
}
|
|
58
|
+
/** Action family = the namespace segment ('payment.release' -> 'payment'). */
|
|
59
|
+
function actionFamily(action) {
|
|
60
|
+
if (typeof action !== 'string' || action.length === 0)
|
|
61
|
+
return 'unknown';
|
|
62
|
+
const dot = action.indexOf('.');
|
|
63
|
+
return dot > 0 ? action.slice(0, dot) : action;
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Build the underwriter attestation over a slice of the evidence log.
|
|
67
|
+
* @param {Array<object>} entries evidence.all() (or a durable export of it)
|
|
68
|
+
* @param {object} [o]
|
|
69
|
+
* @param {string} [o.insured] named insured (required)
|
|
70
|
+
* @param {string|null} [o.policyRef] carrier policy/submission reference (null until bound)
|
|
71
|
+
* @param {string|number} [o.periodStart] inclusive period start (ISO or epoch ms)
|
|
72
|
+
* @param {string|number} [o.periodEnd] inclusive period end (ISO or epoch ms)
|
|
73
|
+
* @param {number|Function} [o.now] clock for generated_at (pin for determinism)
|
|
74
|
+
* @returns {object} EP-GATE-UNDERWRITER-ATTESTATION-v1 document
|
|
75
|
+
*/
|
|
76
|
+
export function buildUnderwriterAttestation(entries = [], { insured, policyRef = null, periodStart, periodEnd, now = Date.now, } = {}) {
|
|
77
|
+
if (!insured || typeof insured !== 'string') {
|
|
78
|
+
throw new Error('underwriter attestation: insured (named insured) is required');
|
|
79
|
+
}
|
|
80
|
+
const startMs = toMs(periodStart);
|
|
81
|
+
const endMs = toMs(periodEnd);
|
|
82
|
+
if (startMs == null || endMs == null) {
|
|
83
|
+
throw new Error('underwriter attestation: periodStart and periodEnd must be valid ISO strings or epoch ms');
|
|
84
|
+
}
|
|
85
|
+
if (startMs > endMs) {
|
|
86
|
+
throw new Error('underwriter attestation: periodStart must not be after periodEnd');
|
|
87
|
+
}
|
|
88
|
+
if (!Array.isArray(entries)) {
|
|
89
|
+
throw new Error('underwriter attestation: entries must be an array (evidence.all())');
|
|
90
|
+
}
|
|
91
|
+
// Scope + integrity pass. Out-of-window records are simply out of scope;
|
|
92
|
+
// records we cannot verify as log entries are warned AND excluded — never
|
|
93
|
+
// attested over. Exclusion is the conservative direction for premium credit.
|
|
94
|
+
const warnings = [];
|
|
95
|
+
const inScope = [];
|
|
96
|
+
entries.forEach((e, index) => {
|
|
97
|
+
const ref = { index, seq: e && typeof e === 'object' && Number.isInteger(e.seq) ? e.seq : null };
|
|
98
|
+
if (!e || typeof e !== 'object') {
|
|
99
|
+
warnings.push({ ...ref, reason: 'not_an_object' });
|
|
100
|
+
return;
|
|
101
|
+
}
|
|
102
|
+
const t = toMs(e.at);
|
|
103
|
+
if (t == null) {
|
|
104
|
+
warnings.push({ ...ref, reason: 'unparseable_at' });
|
|
105
|
+
return;
|
|
106
|
+
}
|
|
107
|
+
if (t < startMs || t > endMs)
|
|
108
|
+
return;
|
|
109
|
+
if (typeof e.hash !== 'string' || e.hash.length === 0) {
|
|
110
|
+
warnings.push({ ...ref, reason: 'missing_hash' });
|
|
111
|
+
return;
|
|
112
|
+
}
|
|
113
|
+
if (e.kind !== 'decision' && e.kind !== 'execution') {
|
|
114
|
+
warnings.push({ ...ref, reason: 'unknown_kind' });
|
|
115
|
+
return;
|
|
116
|
+
}
|
|
117
|
+
if (e.kind === 'decision' && typeof e.allow !== 'boolean') {
|
|
118
|
+
warnings.push({ ...ref, reason: 'decision_missing_allow' });
|
|
119
|
+
return;
|
|
120
|
+
}
|
|
121
|
+
inScope.push({ entry: e, t });
|
|
122
|
+
});
|
|
123
|
+
const decisions = inScope.filter((x) => x.entry.kind === 'decision');
|
|
124
|
+
const executions = inScope.filter((x) => x.entry.kind === 'execution').map((x) => x.entry);
|
|
125
|
+
// 'not_guarded' pass-throughs ran WITHOUT the control — they are the
|
|
126
|
+
// uncontrolled surface, reported separately from protected-action volume.
|
|
127
|
+
const uncontrolled = decisions.filter((x) => x.entry.reason === 'not_guarded').map((x) => x.entry);
|
|
128
|
+
const guarded = decisions.filter((x) => x.entry.reason !== 'not_guarded');
|
|
129
|
+
const guardedAllows = guarded.filter((x) => x.entry.allow === true).map((x) => x.entry);
|
|
130
|
+
const denies = guarded.filter((x) => x.entry.allow === false).map((x) => x.entry);
|
|
131
|
+
const families = new Map();
|
|
132
|
+
for (const { entry: d } of guarded) {
|
|
133
|
+
const fam = actionFamily(d.action);
|
|
134
|
+
const f = families.get(fam) || { decisions: 0, allowed: 0, denied: 0 };
|
|
135
|
+
f.decisions += 1;
|
|
136
|
+
if (d.allow)
|
|
137
|
+
f.allowed += 1;
|
|
138
|
+
else
|
|
139
|
+
f.denied += 1;
|
|
140
|
+
families.set(fam, f);
|
|
141
|
+
}
|
|
142
|
+
const reasons = sortedObject(countBy(denies, (d) => String(d.reason ?? 'unspecified')));
|
|
143
|
+
const replayBlocked = denies.filter((d) => d.reason === 'replay_refused').length;
|
|
144
|
+
// Hard actions = quorum required by the manifest, per the recorded decision.
|
|
145
|
+
const hard = guarded.filter((x) => x.entry.required_tier === 'quorum');
|
|
146
|
+
const hardAllowed = hard.filter((x) => x.entry.allow === true).length;
|
|
147
|
+
// Replay defense bypassed = the gate authorized with consumptionMode 'none'
|
|
148
|
+
// (one-time consumption explicitly skipped). An underwriter must see this.
|
|
149
|
+
const replayBypassed = guardedAllows.filter((a) => a.consumption_mode === 'none').length;
|
|
150
|
+
let firstAt = null;
|
|
151
|
+
let lastAt = null;
|
|
152
|
+
for (const { entry: d, t } of decisions) {
|
|
153
|
+
if (firstAt === null || t < firstAt.t)
|
|
154
|
+
firstAt = { t, at: d.at };
|
|
155
|
+
if (lastAt === null || t > lastAt.t)
|
|
156
|
+
lastAt = { t, at: d.at };
|
|
157
|
+
}
|
|
158
|
+
const nowMs = typeof now === 'function' ? now() : now;
|
|
159
|
+
return {
|
|
160
|
+
'@version': UNDERWRITER_ATTESTATION_VERSION,
|
|
161
|
+
product: 'EMILIA Gate',
|
|
162
|
+
generated_at: new Date(nowMs).toISOString(),
|
|
163
|
+
insured,
|
|
164
|
+
policy_ref: policyRef ?? null,
|
|
165
|
+
period: { start: new Date(startMs).toISOString(), end: new Date(endMs).toISOString() },
|
|
166
|
+
honesty: {
|
|
167
|
+
attests: 'Operation of a deny-by-default authorization control (EMILIA Gate) over the stated period, computed from the gate\'s tamper-evident evidence log.',
|
|
168
|
+
does_not_attest: [
|
|
169
|
+
'The business correctness or wisdom of any authorized action.',
|
|
170
|
+
'Identity proofing, authority enrollment, or issuer/approver key custody, which remain external trust roots.',
|
|
171
|
+
'Any period, system, or enforcement point outside the supplied evidence log.',
|
|
172
|
+
],
|
|
173
|
+
status: 'Not an insurance document. This attestation carries no coverage effect until adopted by the carrier.',
|
|
174
|
+
},
|
|
175
|
+
control_in_force: {
|
|
176
|
+
control: 'EMILIA Gate — Consequence Firewall',
|
|
177
|
+
mode: 'deny_by_default',
|
|
178
|
+
statement: 'Guarded actions execute only with a valid, in-scope, sufficiently-assured, fresh, one-time authorization receipt; absent or insufficient proof is refused, and every decision is appended to a hash-chained evidence log.',
|
|
179
|
+
guarded_decisions: guarded.length,
|
|
180
|
+
first_decision_at: firstAt?.at ?? null,
|
|
181
|
+
last_decision_at: lastAt?.at ?? null,
|
|
182
|
+
},
|
|
183
|
+
volume: {
|
|
184
|
+
guarded_decisions: guarded.length,
|
|
185
|
+
allowed: guardedAllows.length,
|
|
186
|
+
denied: denies.length,
|
|
187
|
+
by_action_family: sortedObject(families),
|
|
188
|
+
},
|
|
189
|
+
denials: {
|
|
190
|
+
total: denies.length,
|
|
191
|
+
// 0/0 is 'no guarded activity', not a 0% denial rate — represent as null.
|
|
192
|
+
rate: guarded.length === 0 ? null : denies.length / guarded.length,
|
|
193
|
+
reasons,
|
|
194
|
+
},
|
|
195
|
+
replay: { attempts_blocked: replayBlocked },
|
|
196
|
+
assurance: {
|
|
197
|
+
required_tier_distribution: tierDistribution(guarded.map((x) => x.entry.required_tier)),
|
|
198
|
+
credited_tier_distribution_on_allow: tierDistribution(guardedAllows.map((a) => a.have_tier)),
|
|
199
|
+
},
|
|
200
|
+
quorum_usage: {
|
|
201
|
+
hard_action_decisions: hard.length,
|
|
202
|
+
allowed: hardAllowed,
|
|
203
|
+
denied: hard.length - hardAllowed,
|
|
204
|
+
},
|
|
205
|
+
exceptions: {
|
|
206
|
+
uncontrolled_passthroughs: uncontrolled.length,
|
|
207
|
+
uncontrolled_actions: [...new Set(uncontrolled.map((d) => (typeof d.action === 'string' && d.action) || 'unknown'))].sort(),
|
|
208
|
+
replay_defense_bypassed: replayBypassed,
|
|
209
|
+
},
|
|
210
|
+
executions: {
|
|
211
|
+
recorded: executions.length,
|
|
212
|
+
executed: executions.filter((x) => x.outcome === 'executed').length,
|
|
213
|
+
failed: executions.filter((x) => x.outcome === 'failed').length,
|
|
214
|
+
},
|
|
215
|
+
// Broker fields. NEVER machine-generated — the builder only ever emits null.
|
|
216
|
+
narrative: { near_misses: null, remediation: null, completed_by: 'broker' },
|
|
217
|
+
evidence: {
|
|
218
|
+
log_entries_supplied: entries.length,
|
|
219
|
+
in_scope: inScope.length,
|
|
220
|
+
first_hash: inScope[0]?.entry.hash ?? null,
|
|
221
|
+
last_hash: inScope[inScope.length - 1]?.entry.hash ?? null,
|
|
222
|
+
integrity_warnings: warnings,
|
|
223
|
+
},
|
|
224
|
+
};
|
|
225
|
+
}
|
|
226
|
+
/* ------------------------------- markdown ------------------------------- */
|
|
227
|
+
/**
|
|
228
|
+
* Table cells must not break the table; the source strings are log-derived.
|
|
229
|
+
* Backslash is escaped FIRST: escaping only the pipe turns a log-derived
|
|
230
|
+
* `a\|b` into `a\\|b`, where the `\\` renders as a literal backslash and
|
|
231
|
+
* leaves the pipe live as a cell delimiter, letting an action or refusal
|
|
232
|
+
* reason split its cell and shift every column after it.
|
|
233
|
+
*/
|
|
234
|
+
function cell(v) {
|
|
235
|
+
return String(v ?? '—')
|
|
236
|
+
.replace(/\\/g, '\\\\')
|
|
237
|
+
.replace(/\|/g, '\\|')
|
|
238
|
+
.replace(/\r?\n/g, ' ');
|
|
239
|
+
}
|
|
240
|
+
function pct(rate) {
|
|
241
|
+
return rate == null ? 'n/a' : `${(rate * 100).toFixed(2)}%`;
|
|
242
|
+
}
|
|
243
|
+
function countTable(header, obj) {
|
|
244
|
+
const keys = Object.keys(obj);
|
|
245
|
+
if (keys.length === 0)
|
|
246
|
+
return ['_None in period._'];
|
|
247
|
+
return [
|
|
248
|
+
`| ${header} | Count |`,
|
|
249
|
+
'|---|---:|',
|
|
250
|
+
...keys.map((k) => `| ${cell(k)} | ${obj[k]} |`),
|
|
251
|
+
];
|
|
252
|
+
}
|
|
253
|
+
const BROKER_PLACEHOLDER = '_(left to the broker — not machine-generated)_';
|
|
254
|
+
/**
|
|
255
|
+
* Render the attestation for a submission packet. Refuses any document that is
|
|
256
|
+
* not an EP-GATE-UNDERWRITER-ATTESTATION-v1 — never renders what it cannot
|
|
257
|
+
* vouch the shape of. Narrative fields render exactly as present in the pack
|
|
258
|
+
* (the broker fills them into the JSON); null renders as a placeholder.
|
|
259
|
+
*/
|
|
260
|
+
export function renderMarkdown(pack) {
|
|
261
|
+
if (!pack || typeof pack !== 'object' || pack['@version'] !== UNDERWRITER_ATTESTATION_VERSION) {
|
|
262
|
+
throw new Error(`renderMarkdown requires an ${UNDERWRITER_ATTESTATION_VERSION} document`);
|
|
263
|
+
}
|
|
264
|
+
const fams = pack.volume.by_action_family;
|
|
265
|
+
const famKeys = Object.keys(fams);
|
|
266
|
+
const req = pack.assurance.required_tier_distribution;
|
|
267
|
+
const cred = pack.assurance.credited_tier_distribution_on_allow;
|
|
268
|
+
const tierKeys = [...new Set([...Object.keys(req), ...Object.keys(cred)])].sort();
|
|
269
|
+
const warnings = pack.evidence.integrity_warnings;
|
|
270
|
+
const lines = [
|
|
271
|
+
'# Underwriter Control Attestation — EMILIA Gate',
|
|
272
|
+
'',
|
|
273
|
+
`\`${UNDERWRITER_ATTESTATION_VERSION}\` · generated ${pack.generated_at}`,
|
|
274
|
+
'',
|
|
275
|
+
`**Insured:** ${cell(pack.insured)} · **Policy:** ${cell(pack.policy_ref)} · **Period:** ${pack.period.start} → ${pack.period.end}`,
|
|
276
|
+
'',
|
|
277
|
+
`> **Attests:** ${pack.honesty.attests}`,
|
|
278
|
+
`> **Does not attest:** ${pack.honesty.does_not_attest.join(' ')}`,
|
|
279
|
+
`> **Status:** ${pack.honesty.status}`,
|
|
280
|
+
'',
|
|
281
|
+
'## Control in force',
|
|
282
|
+
'',
|
|
283
|
+
`- Control: ${pack.control_in_force.control} (${pack.control_in_force.mode})`,
|
|
284
|
+
`- ${pack.control_in_force.statement}`,
|
|
285
|
+
`- Guarded decisions in period: ${pack.control_in_force.guarded_decisions}`
|
|
286
|
+
+ (pack.control_in_force.first_decision_at
|
|
287
|
+
? ` (first ${pack.control_in_force.first_decision_at}, last ${pack.control_in_force.last_decision_at})`
|
|
288
|
+
: ''),
|
|
289
|
+
'',
|
|
290
|
+
'## Protected-action volume',
|
|
291
|
+
'',
|
|
292
|
+
...(famKeys.length === 0
|
|
293
|
+
? ['_No guarded decisions in the period._']
|
|
294
|
+
: [
|
|
295
|
+
'| Action family | Decisions | Allowed | Denied |',
|
|
296
|
+
'|---|---:|---:|---:|',
|
|
297
|
+
...famKeys.map((k) => `| ${cell(k)} | ${fams[k].decisions} | ${fams[k].allowed} | ${fams[k].denied} |`),
|
|
298
|
+
]),
|
|
299
|
+
'',
|
|
300
|
+
'## Denials',
|
|
301
|
+
'',
|
|
302
|
+
`- Denials: ${pack.denials.total} of ${pack.volume.guarded_decisions} guarded decisions (${pct(pack.denials.rate)})`,
|
|
303
|
+
'',
|
|
304
|
+
...countTable('Denial reason', pack.denials.reasons),
|
|
305
|
+
'',
|
|
306
|
+
'## Replay defense',
|
|
307
|
+
'',
|
|
308
|
+
`- Replay attempts blocked: ${pack.replay.attempts_blocked}`,
|
|
309
|
+
'',
|
|
310
|
+
'## Assurance tiers',
|
|
311
|
+
'',
|
|
312
|
+
'| Tier | Required (guarded) | Credited (allowed) |',
|
|
313
|
+
'|---|---:|---:|',
|
|
314
|
+
...tierKeys.map((t) => `| ${cell(t)} | ${req[t] ?? 0} | ${cred[t] ?? 0} |`),
|
|
315
|
+
'',
|
|
316
|
+
'## Quorum usage on hard actions',
|
|
317
|
+
'',
|
|
318
|
+
`- Decisions requiring quorum: ${pack.quorum_usage.hard_action_decisions} (allowed ${pack.quorum_usage.allowed}, denied ${pack.quorum_usage.denied})`,
|
|
319
|
+
'',
|
|
320
|
+
'## Exceptions / uncontrolled actions',
|
|
321
|
+
'',
|
|
322
|
+
`- Uncontrolled pass-throughs (not guarded by manifest): ${pack.exceptions.uncontrolled_passthroughs}`,
|
|
323
|
+
`- Uncontrolled actions: ${pack.exceptions.uncontrolled_actions.length ? pack.exceptions.uncontrolled_actions.map(cell).join(', ') : '—'}`,
|
|
324
|
+
`- Replay defense bypassed (consumption mode "none"): ${pack.exceptions.replay_defense_bypassed}`,
|
|
325
|
+
'',
|
|
326
|
+
'## Executions',
|
|
327
|
+
'',
|
|
328
|
+
`- Recorded: ${pack.executions.recorded} (executed ${pack.executions.executed}, failed ${pack.executions.failed})`,
|
|
329
|
+
'',
|
|
330
|
+
'## Near-miss narrative (broker)',
|
|
331
|
+
'',
|
|
332
|
+
`- Near misses: ${pack.narrative.near_misses == null ? BROKER_PLACEHOLDER : cell(pack.narrative.near_misses)}`,
|
|
333
|
+
`- Remediation: ${pack.narrative.remediation == null ? BROKER_PLACEHOLDER : cell(pack.narrative.remediation)}`,
|
|
334
|
+
'',
|
|
335
|
+
'## Evidence basis',
|
|
336
|
+
'',
|
|
337
|
+
`- Log entries supplied: ${pack.evidence.log_entries_supplied} · in scope: ${pack.evidence.in_scope}`,
|
|
338
|
+
`- First hash: ${cell(pack.evidence.first_hash)} · Last hash: ${cell(pack.evidence.last_hash)}`,
|
|
339
|
+
`- Integrity warnings: ${warnings.length}`,
|
|
340
|
+
...(warnings.length
|
|
341
|
+
? warnings.map((w) => ` - index ${w.index}${w.seq != null ? ` (seq ${w.seq})` : ''}: ${cell(w.reason)}`)
|
|
342
|
+
: []),
|
|
343
|
+
'',
|
|
344
|
+
];
|
|
345
|
+
return lines.join('\n');
|
|
346
|
+
}
|
|
347
|
+
export default { UNDERWRITER_ATTESTATION_VERSION, buildUnderwriterAttestation, renderMarkdown };
|
|
348
|
+
//# sourceMappingURL=underwriter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"underwriter.js","sourceRoot":"","sources":["../../src/reports/underwriter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* EMILIA Gate — evidence retention policy (production audit custody).
|
|
3
|
+
*
|
|
4
|
+
* The evidence log is the compliance/insurance artifact. Production custody adds
|
|
5
|
+
* a retention POLICY over it: classify each decision/execution record as HOT
|
|
6
|
+
* (recent, fast access), COLD (older, archival), or EXPIRED (past the retention
|
|
7
|
+
* horizon, eligible for deletion) — and honor a LEGAL HOLD that pins records so
|
|
8
|
+
* they are never expired. `EP_AUDIT_HOT_DAYS` / `EP_AUDIT_COLD_DAYS` set the
|
|
9
|
+
* horizons; legal hold is a set of evidence hashes.
|
|
10
|
+
*
|
|
11
|
+
* Pure functions over the evidence entries (each has `.at` ISO and `.hash`); the
|
|
12
|
+
* gate never deletes anything itself — it tells the operator what is eligible.
|
|
13
|
+
*/
|
|
14
|
+
type EvidenceEntry = {
|
|
15
|
+
at: string;
|
|
16
|
+
hash?: string;
|
|
17
|
+
kind?: string;
|
|
18
|
+
};
|
|
19
|
+
type TaggedEntry = {
|
|
20
|
+
hash: string | null;
|
|
21
|
+
at: string | null;
|
|
22
|
+
kind: string | null;
|
|
23
|
+
};
|
|
24
|
+
type RetentionOptions = {
|
|
25
|
+
hotDays?: number;
|
|
26
|
+
coldDays?: number;
|
|
27
|
+
now?: number;
|
|
28
|
+
legalHold?: Set<string> | string[];
|
|
29
|
+
};
|
|
30
|
+
/**
|
|
31
|
+
* Classify evidence entries into retention buckets.
|
|
32
|
+
* @param {Array<{at:string, hash?:string, kind?:string}>} entries evidence.all()
|
|
33
|
+
* @param {object} o
|
|
34
|
+
* @param {number} [o.hotDays=365]
|
|
35
|
+
* @param {number} [o.coldDays=2190] (6y)
|
|
36
|
+
* @param {number} [o.now=Date.now()]
|
|
37
|
+
* @param {Set<string>|string[]} [o.legalHold] hashes pinned indefinitely
|
|
38
|
+
* @returns {{hot:object[], cold:object[], expired:object[], legal_hold:object[], unknown:object[], summary:object}}
|
|
39
|
+
*/
|
|
40
|
+
export declare function classifyRetention(entries?: EvidenceEntry[], { hotDays, coldDays, now, legalHold, }?: RetentionOptions): {
|
|
41
|
+
summary: {
|
|
42
|
+
total: number;
|
|
43
|
+
hot: number;
|
|
44
|
+
cold: number;
|
|
45
|
+
expired: number;
|
|
46
|
+
legal_hold: number;
|
|
47
|
+
unknown: number;
|
|
48
|
+
hot_days: number;
|
|
49
|
+
cold_days: number;
|
|
50
|
+
};
|
|
51
|
+
hot: TaggedEntry[];
|
|
52
|
+
cold: TaggedEntry[];
|
|
53
|
+
expired: TaggedEntry[];
|
|
54
|
+
legal_hold: TaggedEntry[];
|
|
55
|
+
unknown: TaggedEntry[];
|
|
56
|
+
};
|
|
57
|
+
/**
|
|
58
|
+
* Build an export manifest (the artifact handed to an auditor / SIEM). Includes
|
|
59
|
+
* the evidence head so the export is verifiably tied to a chain state.
|
|
60
|
+
*/
|
|
61
|
+
export declare function buildRetentionExport(entries?: EvidenceEntry[], opts?: RetentionOptions): {
|
|
62
|
+
'@version': string;
|
|
63
|
+
generated_at: string;
|
|
64
|
+
hot_days: number;
|
|
65
|
+
cold_days: number;
|
|
66
|
+
evidence_head: string | null;
|
|
67
|
+
counts: {
|
|
68
|
+
total: number;
|
|
69
|
+
hot: number;
|
|
70
|
+
cold: number;
|
|
71
|
+
expired: number;
|
|
72
|
+
legal_hold: number;
|
|
73
|
+
unknown: number;
|
|
74
|
+
};
|
|
75
|
+
entries: {
|
|
76
|
+
hash: string | null;
|
|
77
|
+
at: string;
|
|
78
|
+
kind: string | null;
|
|
79
|
+
}[];
|
|
80
|
+
};
|
|
81
|
+
export declare const RETENTION_EXPORT_VERSION = "EP-GATE-RETENTION-EXPORT-v1";
|
|
82
|
+
declare const _default: {
|
|
83
|
+
classifyRetention: typeof classifyRetention;
|
|
84
|
+
buildRetentionExport: typeof buildRetentionExport;
|
|
85
|
+
RETENTION_EXPORT_VERSION: string;
|
|
86
|
+
};
|
|
87
|
+
export default _default;
|
|
88
|
+
//# sourceMappingURL=retention.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"retention.d.ts","sourceRoot":"","sources":["../src/retention.ts"],"names":[],"mappings":"AACA;;;;;;;;;;;;GAYG;AAIH,KAAK,aAAa,GAAG;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAClE,KAAK,WAAW,GAAG;IAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,EAAE,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CAAC;AACnF,KAAK,gBAAgB,GAAG;IACtB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,MAAM,EAAE,CAAC;CACpC,CAAC;AAQF;;;;;;;;;GASG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,GAAE,aAAa,EAAO,EAAE,EAC/D,OAAa,EAAE,QAAe,EAAE,GAAgB,EAAE,SAAS,GAC5D,GAAE,gBAAqB;;;;;;;;;;;SAGf,WAAW,EAAE;UACZ,WAAW,EAAE;aACV,WAAW,EAAE;gBACV,WAAW,EAAE;aAChB,WAAW,EAAE;EAwBzB;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,GAAE,aAAa,EAAO,EAAE,IAAI,GAAE,gBAAqB;;;;;;;;;;;;;;;;;;;EAe9F;AAED,eAAO,MAAM,wBAAwB,gCAAgC,CAAC;;;;;;AACtE,wBAAqF"}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
// @ts-nocheck
|
|
2
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
3
|
+
/**
|
|
4
|
+
* EMILIA Gate — evidence retention policy (production audit custody).
|
|
5
|
+
*
|
|
6
|
+
* The evidence log is the compliance/insurance artifact. Production custody adds
|
|
7
|
+
* a retention POLICY over it: classify each decision/execution record as HOT
|
|
8
|
+
* (recent, fast access), COLD (older, archival), or EXPIRED (past the retention
|
|
9
|
+
* horizon, eligible for deletion) — and honor a LEGAL HOLD that pins records so
|
|
10
|
+
* they are never expired. `EP_AUDIT_HOT_DAYS` / `EP_AUDIT_COLD_DAYS` set the
|
|
11
|
+
* horizons; legal hold is a set of evidence hashes.
|
|
12
|
+
*
|
|
13
|
+
* Pure functions over the evidence entries (each has `.at` ISO and `.hash`); the
|
|
14
|
+
* gate never deletes anything itself — it tells the operator what is eligible.
|
|
15
|
+
*/
|
|
16
|
+
const DAY_MS = 24 * 60 * 60 * 1000;
|
|
17
|
+
function ageDays(atISO, nowMs) {
|
|
18
|
+
const t = Date.parse(atISO);
|
|
19
|
+
if (!Number.isFinite(t))
|
|
20
|
+
return null;
|
|
21
|
+
return (nowMs - t) / DAY_MS;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Classify evidence entries into retention buckets.
|
|
25
|
+
* @param {Array<{at:string, hash?:string, kind?:string}>} entries evidence.all()
|
|
26
|
+
* @param {object} o
|
|
27
|
+
* @param {number} [o.hotDays=365]
|
|
28
|
+
* @param {number} [o.coldDays=2190] (6y)
|
|
29
|
+
* @param {number} [o.now=Date.now()]
|
|
30
|
+
* @param {Set<string>|string[]} [o.legalHold] hashes pinned indefinitely
|
|
31
|
+
* @returns {{hot:object[], cold:object[], expired:object[], legal_hold:object[], unknown:object[], summary:object}}
|
|
32
|
+
*/
|
|
33
|
+
export function classifyRetention(entries = [], { hotDays = 365, coldDays = 2190, now = Date.now(), legalHold, } = {}) {
|
|
34
|
+
const held = legalHold instanceof Set ? legalHold : new Set(legalHold || []);
|
|
35
|
+
const buckets = { hot: [], cold: [], expired: [], legal_hold: [], unknown: [] };
|
|
36
|
+
for (const e of entries) {
|
|
37
|
+
const tagged = { hash: e.hash ?? null, at: e.at ?? null, kind: e.kind ?? null };
|
|
38
|
+
if (e.hash && held.has(e.hash)) {
|
|
39
|
+
buckets.legal_hold.push(tagged);
|
|
40
|
+
continue;
|
|
41
|
+
}
|
|
42
|
+
const age = ageDays(e.at, now);
|
|
43
|
+
if (age == null) {
|
|
44
|
+
buckets.unknown.push(tagged);
|
|
45
|
+
continue;
|
|
46
|
+
}
|
|
47
|
+
if (age <= hotDays)
|
|
48
|
+
buckets.hot.push(tagged);
|
|
49
|
+
else if (age <= coldDays)
|
|
50
|
+
buckets.cold.push(tagged);
|
|
51
|
+
else
|
|
52
|
+
buckets.expired.push(tagged);
|
|
53
|
+
}
|
|
54
|
+
return {
|
|
55
|
+
...buckets,
|
|
56
|
+
summary: {
|
|
57
|
+
total: entries.length,
|
|
58
|
+
hot: buckets.hot.length,
|
|
59
|
+
cold: buckets.cold.length,
|
|
60
|
+
expired: buckets.expired.length,
|
|
61
|
+
legal_hold: buckets.legal_hold.length,
|
|
62
|
+
unknown: buckets.unknown.length,
|
|
63
|
+
hot_days: hotDays,
|
|
64
|
+
cold_days: coldDays,
|
|
65
|
+
},
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Build an export manifest (the artifact handed to an auditor / SIEM). Includes
|
|
70
|
+
* the evidence head so the export is verifiably tied to a chain state.
|
|
71
|
+
*/
|
|
72
|
+
export function buildRetentionExport(entries = [], opts = {}) {
|
|
73
|
+
const cls = classifyRetention(entries, opts);
|
|
74
|
+
const last = entries[entries.length - 1] || null;
|
|
75
|
+
return {
|
|
76
|
+
'@version': 'EP-GATE-RETENTION-EXPORT-v1',
|
|
77
|
+
generated_at: new Date(opts.now || Date.now()).toISOString(),
|
|
78
|
+
hot_days: cls.summary.hot_days,
|
|
79
|
+
cold_days: cls.summary.cold_days,
|
|
80
|
+
evidence_head: last?.hash ?? null,
|
|
81
|
+
counts: {
|
|
82
|
+
total: cls.summary.total, hot: cls.summary.hot, cold: cls.summary.cold,
|
|
83
|
+
expired: cls.summary.expired, legal_hold: cls.summary.legal_hold, unknown: cls.summary.unknown,
|
|
84
|
+
},
|
|
85
|
+
entries: entries.map((e) => ({ hash: e.hash ?? null, at: e.at ?? null, kind: e.kind ?? null })),
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
export const RETENTION_EXPORT_VERSION = 'EP-GATE-RETENTION-EXPORT-v1';
|
|
89
|
+
export default { classifyRetention, buildRetentionExport, RETENTION_EXPORT_VERSION };
|
|
90
|
+
//# sourceMappingURL=retention.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"retention.js","sourceRoot":"","sources":["../src/retention.ts"],"names":[],"mappings":"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"}
|