@emilia-protocol/gate 0.11.0 → 0.14.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 +80 -0
- package/README.md +310 -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 +1003 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +1737 -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/proposal-to-effect.d.ts +146 -0
- package/dist/proposal-to-effect.d.ts.map +1 -0
- package/dist/proposal-to-effect.js +427 -0
- package/dist/proposal-to-effect.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 +35 -4
- package/proposal-to-effect.js +4 -0
- 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 +2127 -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/proposal-to-effect.ts +571 -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,143 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* EP Protocol-State — brand-typed handshake lifecycle (GAP-4).
|
|
3
|
+
*
|
|
4
|
+
* Purpose: make an ILLEGAL protocol-state transition a COMPILE error, not a
|
|
5
|
+
* runtime failure. Each lifecycle state is a distinct nominal (branded) type,
|
|
6
|
+
* and every transition is a function whose parameter type admits ONLY its legal
|
|
7
|
+
* predecessor state(s) and whose return type is exactly its legal successor.
|
|
8
|
+
* Passing the wrong state to a transition (e.g. `consume(initiated)` — consuming
|
|
9
|
+
* before verification) is rejected by `tsc` before the code ever runs.
|
|
10
|
+
*
|
|
11
|
+
* ── Source of truth ─────────────────────────────────────────────────────────
|
|
12
|
+
* The state graph mirrors the formally-verified model, not a toy:
|
|
13
|
+
* formal/ep_handshake.tla — abstract lifecycle + transition guards
|
|
14
|
+
* lib/handshake/invariants.js (HANDSHAKE_STATUSES) — the 6 persisted statuses
|
|
15
|
+
* lib/handshake/create.js — status:'initiated' (T1 Initiate)
|
|
16
|
+
* lib/handshake/present.js — initiated → pending_verification (T2 Present)
|
|
17
|
+
* lib/handshake/verify.js — outcome accepted/rejected/expired (T3/T4/T7)
|
|
18
|
+
* lib/handshake/consume.js — verified → consumed (T5 Consume)
|
|
19
|
+
* lib/handshake/finalize.js — → revoked (T6 Revoke)
|
|
20
|
+
*
|
|
21
|
+
* ── States (TLA `state` domain) ─────────────────────────────────────────────
|
|
22
|
+
* none | initiated | pending_verification | verified
|
|
23
|
+
* | rejected | expired | revoked | consumed
|
|
24
|
+
*
|
|
25
|
+
* Two of these are ABSTRACT lifecycle states, not DB status values:
|
|
26
|
+
* - `none` : pre-initiation. There is no persisted row yet.
|
|
27
|
+
* - `consumed` : a verified handshake that has an entry in the
|
|
28
|
+
* `handshake_consumptions` table. Consumption does NOT rewrite
|
|
29
|
+
* `handshakes.status` (it stays 'verified'); it is recorded
|
|
30
|
+
* atomically in a side table by `consume_handshake_atomic`.
|
|
31
|
+
* The TLA model abstracts (status='verified' ∧ h∈consumptions)
|
|
32
|
+
* as the distinct terminal state `consumed`. This module keeps
|
|
33
|
+
* that abstraction so "consume-once" and "no-verify-after-consume"
|
|
34
|
+
* are expressible in the type system.
|
|
35
|
+
*
|
|
36
|
+
* The other six are exactly `HANDSHAKE_STATUSES` from invariants.js and carry a
|
|
37
|
+
* `dbStatus` field equal to the persisted `handshakes.status` value.
|
|
38
|
+
*
|
|
39
|
+
* ── Legal transition graph (the ONLY edges; everything else is a type error) ─
|
|
40
|
+
* genesis() -> None
|
|
41
|
+
* initiate(None) -> Initiated
|
|
42
|
+
* present(Initiated) -> PendingVerification
|
|
43
|
+
* verifyAccept(PendingVerification) -> Verified
|
|
44
|
+
* verifyReject(PendingVerification) -> Rejected (terminal)
|
|
45
|
+
* consume(Verified) -> Consumed (terminal)
|
|
46
|
+
* revoke(Initiated|PendingVerification|Verified) -> Revoked (terminal)
|
|
47
|
+
* expire(Initiated|PendingVerification|Verified) -> Expired (terminal)
|
|
48
|
+
*
|
|
49
|
+
* Terminal states (Rejected, Expired, Revoked, Consumed) are accepted by NO
|
|
50
|
+
* transition function, so any move out of a terminal state is a compile error.
|
|
51
|
+
*
|
|
52
|
+
* Branding note: each state is nominally distinguished by a private, readonly
|
|
53
|
+
* string-literal `tag`. Distinct tags make each state a distinct type, so no
|
|
54
|
+
* legal predecessor of one transition is accidentally assignable to another.
|
|
55
|
+
* The runtime value literally is `{ tag, dbStatus }`; there is no phantom-only
|
|
56
|
+
* field, so no casts are needed and the runtime and the types cannot drift.
|
|
57
|
+
*
|
|
58
|
+
* This module is intentionally free of I/O. It is the compile-time spine that
|
|
59
|
+
* the runtime state machine (verify.js / consume.js / finalize.js) is expected
|
|
60
|
+
* to obey; it does not replace those code paths' own DB-level guards.
|
|
61
|
+
*
|
|
62
|
+
* @license Apache-2.0
|
|
63
|
+
*/
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* The six persisted `handshakes.status` values (single source: invariants.js
|
|
67
|
+
* HANDSHAKE_STATUSES). `none` and `consumed` are abstract and have no row status.
|
|
68
|
+
*/
|
|
69
|
+
export type DbHandshakeStatus = 'initiated' | 'pending_verification' | 'verified' | 'rejected' | 'expired' | 'revoked';
|
|
70
|
+
|
|
71
|
+
/** Pre-initiation. No persisted handshake exists yet. */
|
|
72
|
+
export type None = { readonly tag: 'none'; readonly dbStatus: null };
|
|
73
|
+
/** A handshake row was created (T1). DB status 'initiated'. */
|
|
74
|
+
export type Initiated = { readonly tag: 'initiated'; readonly dbStatus: 'initiated' };
|
|
75
|
+
/** A presentation was added and verification is pending (T2). DB 'pending_verification'. */
|
|
76
|
+
export type PendingVerification = { readonly tag: 'pending_verification'; readonly dbStatus: 'pending_verification' };
|
|
77
|
+
/** Verification accepted (T3). DB 'verified'. Only state from which consume is legal. */
|
|
78
|
+
export type Verified = { readonly tag: 'verified'; readonly dbStatus: 'verified' };
|
|
79
|
+
/** Verification rejected (T4). Terminal. DB 'rejected'. */
|
|
80
|
+
export type Rejected = { readonly tag: 'rejected'; readonly dbStatus: 'rejected' };
|
|
81
|
+
/** Binding expired (T7). Terminal. DB 'expired'. */
|
|
82
|
+
export type Expired = { readonly tag: 'expired'; readonly dbStatus: 'expired' };
|
|
83
|
+
/** Revoked by a party (T6). Terminal. DB 'revoked'. */
|
|
84
|
+
export type Revoked = { readonly tag: 'revoked'; readonly dbStatus: 'revoked' };
|
|
85
|
+
/**
|
|
86
|
+
* Consumed exactly once (T5). Terminal abstract state; the row keeps DB status
|
|
87
|
+
* 'verified' and gains a `handshake_consumptions` record.
|
|
88
|
+
*/
|
|
89
|
+
export type Consumed = { readonly tag: 'consumed'; readonly dbStatus: 'verified' };
|
|
90
|
+
|
|
91
|
+
/** Any state in the lifecycle. */
|
|
92
|
+
export type ProtocolState = None | Initiated | PendingVerification | Verified | Rejected | Expired | Revoked | Consumed;
|
|
93
|
+
/** States a still-active handshake can be revoked or expired from (T6/T7 domain). */
|
|
94
|
+
export type Active = Initiated | PendingVerification | Verified;
|
|
95
|
+
|
|
96
|
+
/** T0: genesis — the empty pre-initiation state. */
|
|
97
|
+
export function genesis(): None {
|
|
98
|
+
return { tag: 'none', dbStatus: null };
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
/** T1 Initiate: none -> initiated. Maps to create.js status:'initiated'. */
|
|
102
|
+
export function initiate(_s: None): Initiated {
|
|
103
|
+
return { tag: 'initiated', dbStatus: 'initiated' };
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
/** T2 Present: initiated -> pending_verification. Maps to present.js. */
|
|
107
|
+
export function present(_s: Initiated): PendingVerification {
|
|
108
|
+
return { tag: 'pending_verification', dbStatus: 'pending_verification' };
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
/** T3 VerifyAccept: pending_verification -> verified. verify.js outcome='accepted'. */
|
|
112
|
+
export function verifyAccept(_s: PendingVerification): Verified {
|
|
113
|
+
return { tag: 'verified', dbStatus: 'verified' };
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
/** T4 VerifyReject: pending_verification -> rejected (terminal). verify.js outcome='rejected'. */
|
|
117
|
+
export function verifyReject(_s: PendingVerification): Rejected {
|
|
118
|
+
return { tag: 'rejected', dbStatus: 'rejected' };
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
/**
|
|
122
|
+
* T5 Consume: verified -> consumed (terminal). consume.js requires 'verified' state
|
|
123
|
+
* and enforces consume-once at the DB level.
|
|
124
|
+
*/
|
|
125
|
+
export function consume(_s: Verified): Consumed {
|
|
126
|
+
return { tag: 'consumed', dbStatus: 'verified' };
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
/**
|
|
130
|
+
* T6 Revoke: {initiated|pending_verification|verified} -> revoked (terminal).
|
|
131
|
+
* finalize.js. Legal only from an active (pre-terminal) state.
|
|
132
|
+
*/
|
|
133
|
+
export function revoke(_s: Active): Revoked {
|
|
134
|
+
return { tag: 'revoked', dbStatus: 'revoked' };
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
/**
|
|
138
|
+
* T7 Expire: {initiated|pending_verification|verified} -> expired (terminal).
|
|
139
|
+
* verify.js outcome='expired'. Legal only from an active (pre-terminal) state.
|
|
140
|
+
*/
|
|
141
|
+
export function expire(_s: Active): Expired {
|
|
142
|
+
return { tag: 'expired', dbStatus: 'expired' };
|
|
143
|
+
}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* EP Protocol-State — TYPE-LEVEL conformance test (GAP-4).
|
|
3
|
+
*
|
|
4
|
+
* This file is checked by `tsc` under tsconfig.core.json, not run as a unit
|
|
5
|
+
* test. It asserts, at compile time, that the ONLY legal transitions of the
|
|
6
|
+
* handshake lifecycle are the ones the formal model permits:
|
|
7
|
+
*
|
|
8
|
+
* - The "legal sequences" section MUST type-check with no errors.
|
|
9
|
+
* - Every `// @ts-expect-error` line guards a transition that MUST be illegal.
|
|
10
|
+
* If any such transition ever becomes legal (a regression in the brand
|
|
11
|
+
* types), tsc reports the `@ts-expect-error` as UNUSED and the type-gate
|
|
12
|
+
* fails. This is the tripwire.
|
|
13
|
+
*
|
|
14
|
+
* These are type-only assertions; the functions are pure and the file is safe
|
|
15
|
+
* to load, but nothing here is intended to run.
|
|
16
|
+
*
|
|
17
|
+
* @license Apache-2.0
|
|
18
|
+
*/
|
|
19
|
+
|
|
20
|
+
import {
|
|
21
|
+
genesis, initiate, present, verifyAccept, verifyReject, consume, revoke, expire,
|
|
22
|
+
} from './protocol-state.js';
|
|
23
|
+
|
|
24
|
+
/* eslint-disable no-unused-vars */
|
|
25
|
+
|
|
26
|
+
// ── LEGAL SEQUENCES (must compile) ──────────────────────────────────────────
|
|
27
|
+
|
|
28
|
+
// Full happy path: none → initiated → pending_verification → verified → consumed
|
|
29
|
+
const _consumed = consume(verifyAccept(present(initiate(genesis()))));
|
|
30
|
+
|
|
31
|
+
// Reject branch: … → pending_verification → rejected
|
|
32
|
+
const _rejected = verifyReject(present(initiate(genesis())));
|
|
33
|
+
|
|
34
|
+
// Revoke is legal from every active (pre-terminal) state:
|
|
35
|
+
const _revokedFromInitiated = revoke(initiate(genesis()));
|
|
36
|
+
const _revokedFromPending = revoke(present(initiate(genesis())));
|
|
37
|
+
const _revokedFromVerified = revoke(verifyAccept(present(initiate(genesis()))));
|
|
38
|
+
|
|
39
|
+
// Expire is legal from every active (pre-terminal) state:
|
|
40
|
+
const _expiredFromInitiated = expire(initiate(genesis()));
|
|
41
|
+
const _expiredFromPending = expire(present(initiate(genesis())));
|
|
42
|
+
const _expiredFromVerified = expire(verifyAccept(present(initiate(genesis()))));
|
|
43
|
+
|
|
44
|
+
// Convenience handles to well-typed states for the illegal section below.
|
|
45
|
+
const none = genesis();
|
|
46
|
+
const initiated = initiate(none);
|
|
47
|
+
const pending = present(initiated);
|
|
48
|
+
const verified = verifyAccept(pending);
|
|
49
|
+
const consumedState = consume(verified);
|
|
50
|
+
const revokedState = revoke(initiated);
|
|
51
|
+
const rejectedState = verifyReject(pending);
|
|
52
|
+
const expiredState = expire(initiated);
|
|
53
|
+
|
|
54
|
+
// ── ILLEGAL TRANSITIONS (each MUST be a type error) ─────────────────────────
|
|
55
|
+
|
|
56
|
+
// Consume before verification — the canonical GAP-4 violation.
|
|
57
|
+
// @ts-expect-error consume requires Verified, not None
|
|
58
|
+
consume(none);
|
|
59
|
+
// @ts-expect-error consume requires Verified, not Initiated
|
|
60
|
+
consume(initiated);
|
|
61
|
+
// @ts-expect-error consume requires Verified, not PendingVerification
|
|
62
|
+
consume(pending);
|
|
63
|
+
|
|
64
|
+
// Skipping the presentation step (initiated → verified directly).
|
|
65
|
+
// @ts-expect-error verifyAccept requires PendingVerification, not Initiated
|
|
66
|
+
verifyAccept(initiated);
|
|
67
|
+
// @ts-expect-error verifyReject requires PendingVerification, not Initiated
|
|
68
|
+
verifyReject(initiated);
|
|
69
|
+
|
|
70
|
+
// Presenting after the handshake already left the initiated state.
|
|
71
|
+
// @ts-expect-error present requires Initiated, not PendingVerification
|
|
72
|
+
present(pending);
|
|
73
|
+
// @ts-expect-error present requires Initiated, not Verified
|
|
74
|
+
present(verified);
|
|
75
|
+
|
|
76
|
+
// Re-initiating something that already exists.
|
|
77
|
+
// @ts-expect-error initiate requires None, not Verified
|
|
78
|
+
initiate(verified);
|
|
79
|
+
|
|
80
|
+
// No transition may leave a TERMINAL state (consumed/revoked/rejected/expired).
|
|
81
|
+
// @ts-expect-error cannot consume a Consumed handshake (consume-once)
|
|
82
|
+
consume(consumedState);
|
|
83
|
+
// @ts-expect-error cannot revoke a Consumed handshake
|
|
84
|
+
revoke(consumedState);
|
|
85
|
+
// @ts-expect-error cannot expire a Consumed handshake
|
|
86
|
+
expire(consumedState);
|
|
87
|
+
// @ts-expect-error cannot verify a Revoked handshake
|
|
88
|
+
verifyAccept(revokedState);
|
|
89
|
+
// @ts-expect-error cannot revoke an already-Revoked handshake
|
|
90
|
+
revoke(revokedState);
|
|
91
|
+
// @ts-expect-error cannot consume a Rejected handshake
|
|
92
|
+
consume(rejectedState);
|
|
93
|
+
// @ts-expect-error cannot revoke an Expired handshake
|
|
94
|
+
revoke(expiredState);
|