@emilia-protocol/gate 0.10.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.
Files changed (419) hide show
  1. package/CHANGELOG.md +91 -0
  2. package/README.md +272 -0
  3. package/action-control-manifest.js +3 -268
  4. package/action-escrow-custodian.js +4 -0
  5. package/action-escrow-evidence.js +4 -0
  6. package/action-escrow-package.js +4 -0
  7. package/action-escrow-postgres.js +4 -0
  8. package/action-escrow-state.js +4 -0
  9. package/action-escrow-verifiers.js +4 -0
  10. package/action-escrow.js +4 -0
  11. package/action-packs.js +3 -140
  12. package/adapters/_kit.js +3 -104
  13. package/adapters/aws.js +3 -108
  14. package/adapters/cloudflare.js +3 -54
  15. package/adapters/gcp.js +3 -70
  16. package/adapters/github.js +3 -109
  17. package/adapters/jira.js +3 -55
  18. package/adapters/k8s.js +3 -70
  19. package/adapters/linear.js +3 -55
  20. package/adapters/salesforce.js +3 -55
  21. package/adapters/stripe.js +3 -81
  22. package/adapters/supabase.js +3 -121
  23. package/adapters/terraform.js +3 -59
  24. package/adapters/vercel.js +3 -84
  25. package/aec-execution.js +3 -312
  26. package/breakglass.js +3 -582
  27. package/capability-receipt.js +4 -0
  28. package/cf1-conformance.js +3 -106
  29. package/challenge-store.js +3 -69
  30. package/control-plane.js +3 -340
  31. package/coverage.js +3 -721
  32. package/demo.mjs +1 -1
  33. package/deployment-attestation.js +3 -247
  34. package/dist/action-control-manifest.d.ts +82 -0
  35. package/dist/action-control-manifest.d.ts.map +1 -0
  36. package/dist/action-control-manifest.js +422 -0
  37. package/dist/action-control-manifest.js.map +1 -0
  38. package/dist/action-escrow-custodian.d.ts +74 -0
  39. package/dist/action-escrow-custodian.d.ts.map +1 -0
  40. package/dist/action-escrow-custodian.js +363 -0
  41. package/dist/action-escrow-custodian.js.map +1 -0
  42. package/dist/action-escrow-evidence.d.ts +130 -0
  43. package/dist/action-escrow-evidence.d.ts.map +1 -0
  44. package/dist/action-escrow-evidence.js +1012 -0
  45. package/dist/action-escrow-evidence.js.map +1 -0
  46. package/dist/action-escrow-package.d.ts +10 -0
  47. package/dist/action-escrow-package.d.ts.map +1 -0
  48. package/dist/action-escrow-package.js +1583 -0
  49. package/dist/action-escrow-package.js.map +1 -0
  50. package/dist/action-escrow-postgres.d.ts +62 -0
  51. package/dist/action-escrow-postgres.d.ts.map +1 -0
  52. package/dist/action-escrow-postgres.js +339 -0
  53. package/dist/action-escrow-postgres.js.map +1 -0
  54. package/dist/action-escrow-state.d.ts +141 -0
  55. package/dist/action-escrow-state.d.ts.map +1 -0
  56. package/dist/action-escrow-state.js +413 -0
  57. package/dist/action-escrow-state.js.map +1 -0
  58. package/dist/action-escrow-verifiers.d.ts +65 -0
  59. package/dist/action-escrow-verifiers.d.ts.map +1 -0
  60. package/dist/action-escrow-verifiers.js +421 -0
  61. package/dist/action-escrow-verifiers.js.map +1 -0
  62. package/dist/action-escrow.d.ts +112 -0
  63. package/dist/action-escrow.d.ts.map +1 -0
  64. package/dist/action-escrow.js +2661 -0
  65. package/dist/action-escrow.js.map +1 -0
  66. package/dist/action-packs.d.ts +54 -0
  67. package/dist/action-packs.d.ts.map +1 -0
  68. package/dist/action-packs.js +143 -0
  69. package/dist/action-packs.js.map +1 -0
  70. package/dist/adapters/_kit.d.ts +50 -0
  71. package/dist/adapters/_kit.d.ts.map +1 -0
  72. package/dist/adapters/_kit.js +98 -0
  73. package/dist/adapters/_kit.js.map +1 -0
  74. package/dist/adapters/aws.d.ts +158 -0
  75. package/dist/adapters/aws.d.ts.map +1 -0
  76. package/dist/adapters/aws.js +136 -0
  77. package/dist/adapters/aws.js.map +1 -0
  78. package/dist/adapters/cloudflare.d.ts +116 -0
  79. package/dist/adapters/cloudflare.d.ts.map +1 -0
  80. package/dist/adapters/cloudflare.js +75 -0
  81. package/dist/adapters/cloudflare.js.map +1 -0
  82. package/dist/adapters/gcp.d.ts +139 -0
  83. package/dist/adapters/gcp.d.ts.map +1 -0
  84. package/dist/adapters/gcp.js +69 -0
  85. package/dist/adapters/gcp.js.map +1 -0
  86. package/dist/adapters/github.d.ts +123 -0
  87. package/dist/adapters/github.d.ts.map +1 -0
  88. package/dist/adapters/github.js +105 -0
  89. package/dist/adapters/github.js.map +1 -0
  90. package/dist/adapters/jira.d.ts +109 -0
  91. package/dist/adapters/jira.d.ts.map +1 -0
  92. package/dist/adapters/jira.js +54 -0
  93. package/dist/adapters/jira.js.map +1 -0
  94. package/dist/adapters/k8s.d.ts +139 -0
  95. package/dist/adapters/k8s.d.ts.map +1 -0
  96. package/dist/adapters/k8s.js +69 -0
  97. package/dist/adapters/k8s.js.map +1 -0
  98. package/dist/adapters/linear.d.ts +109 -0
  99. package/dist/adapters/linear.d.ts.map +1 -0
  100. package/dist/adapters/linear.js +54 -0
  101. package/dist/adapters/linear.js.map +1 -0
  102. package/dist/adapters/salesforce.d.ts +109 -0
  103. package/dist/adapters/salesforce.d.ts.map +1 -0
  104. package/dist/adapters/salesforce.js +54 -0
  105. package/dist/adapters/salesforce.js.map +1 -0
  106. package/dist/adapters/stripe.d.ts +116 -0
  107. package/dist/adapters/stripe.d.ts.map +1 -0
  108. package/dist/adapters/stripe.js +77 -0
  109. package/dist/adapters/stripe.js.map +1 -0
  110. package/dist/adapters/supabase.d.ts +127 -0
  111. package/dist/adapters/supabase.d.ts.map +1 -0
  112. package/dist/adapters/supabase.js +112 -0
  113. package/dist/adapters/supabase.js.map +1 -0
  114. package/dist/adapters/terraform.d.ts +109 -0
  115. package/dist/adapters/terraform.d.ts.map +1 -0
  116. package/dist/adapters/terraform.js +58 -0
  117. package/dist/adapters/terraform.js.map +1 -0
  118. package/dist/adapters/vercel.d.ts +114 -0
  119. package/dist/adapters/vercel.d.ts.map +1 -0
  120. package/dist/adapters/vercel.js +81 -0
  121. package/dist/adapters/vercel.js.map +1 -0
  122. package/dist/aec-execution.d.ts +107 -0
  123. package/dist/aec-execution.d.ts.map +1 -0
  124. package/dist/aec-execution.js +334 -0
  125. package/dist/aec-execution.js.map +1 -0
  126. package/dist/breakglass.d.ts +205 -0
  127. package/dist/breakglass.d.ts.map +1 -0
  128. package/dist/breakglass.js +627 -0
  129. package/dist/breakglass.js.map +1 -0
  130. package/dist/capability-receipt.d.ts +601 -0
  131. package/dist/capability-receipt.d.ts.map +1 -0
  132. package/dist/capability-receipt.js +1177 -0
  133. package/dist/capability-receipt.js.map +1 -0
  134. package/dist/cf1-conformance.d.ts +83 -0
  135. package/dist/cf1-conformance.d.ts.map +1 -0
  136. package/dist/cf1-conformance.js +94 -0
  137. package/dist/cf1-conformance.js.map +1 -0
  138. package/dist/challenge-store.d.ts +20 -0
  139. package/dist/challenge-store.d.ts.map +1 -0
  140. package/dist/challenge-store.js +62 -0
  141. package/dist/challenge-store.js.map +1 -0
  142. package/dist/control-plane.d.ts +136 -0
  143. package/dist/control-plane.d.ts.map +1 -0
  144. package/dist/control-plane.js +349 -0
  145. package/dist/control-plane.js.map +1 -0
  146. package/dist/coverage.d.ts +156 -0
  147. package/dist/coverage.d.ts.map +1 -0
  148. package/dist/coverage.js +768 -0
  149. package/dist/coverage.js.map +1 -0
  150. package/dist/deployment-attestation.d.ts +93 -0
  151. package/dist/deployment-attestation.d.ts.map +1 -0
  152. package/dist/deployment-attestation.js +262 -0
  153. package/dist/deployment-attestation.js.map +1 -0
  154. package/dist/eg1-conformance.d.ts +286 -0
  155. package/dist/eg1-conformance.d.ts.map +1 -0
  156. package/dist/eg1-conformance.js +379 -0
  157. package/dist/eg1-conformance.js.map +1 -0
  158. package/dist/enterprise.d.ts +88 -0
  159. package/dist/enterprise.d.ts.map +1 -0
  160. package/dist/enterprise.js +194 -0
  161. package/dist/enterprise.js.map +1 -0
  162. package/dist/evidence-postgres.d.ts +123 -0
  163. package/dist/evidence-postgres.d.ts.map +1 -0
  164. package/dist/evidence-postgres.js +343 -0
  165. package/dist/evidence-postgres.js.map +1 -0
  166. package/dist/evidence.d.ts +113 -0
  167. package/dist/evidence.d.ts.map +1 -0
  168. package/dist/evidence.js +369 -0
  169. package/dist/evidence.js.map +1 -0
  170. package/dist/execution-binding.d.ts +49 -0
  171. package/dist/execution-binding.d.ts.map +1 -0
  172. package/dist/execution-binding.js +243 -0
  173. package/dist/execution-binding.js.map +1 -0
  174. package/dist/formal-runtime-map.d.ts +42 -0
  175. package/dist/formal-runtime-map.d.ts.map +1 -0
  176. package/dist/formal-runtime-map.js +23 -0
  177. package/dist/formal-runtime-map.js.map +1 -0
  178. package/dist/index.d.ts +1002 -0
  179. package/dist/index.d.ts.map +1 -0
  180. package/dist/index.js +1736 -0
  181. package/dist/index.js.map +1 -0
  182. package/dist/key-registry.d.ts +60 -0
  183. package/dist/key-registry.d.ts.map +1 -0
  184. package/dist/key-registry.js +144 -0
  185. package/dist/key-registry.js.map +1 -0
  186. package/dist/mcp.d.ts +53 -0
  187. package/dist/mcp.d.ts.map +1 -0
  188. package/dist/mcp.js +112 -0
  189. package/dist/mcp.js.map +1 -0
  190. package/dist/metering.d.ts +80 -0
  191. package/dist/metering.d.ts.map +1 -0
  192. package/dist/metering.js +227 -0
  193. package/dist/metering.js.map +1 -0
  194. package/dist/metrics.d.ts +68 -0
  195. package/dist/metrics.d.ts.map +1 -0
  196. package/dist/metrics.js +242 -0
  197. package/dist/metrics.js.map +1 -0
  198. package/dist/network-witness.d.ts +167 -0
  199. package/dist/network-witness.d.ts.map +1 -0
  200. package/dist/network-witness.js +520 -0
  201. package/dist/network-witness.js.map +1 -0
  202. package/dist/protocol-state.d.ts +141 -0
  203. package/dist/protocol-state.d.ts.map +1 -0
  204. package/dist/protocol-state.js +106 -0
  205. package/dist/protocol-state.js.map +1 -0
  206. package/dist/receipt-program.d.ts +59 -0
  207. package/dist/receipt-program.d.ts.map +1 -0
  208. package/dist/receipt-program.js +1053 -0
  209. package/dist/receipt-program.js.map +1 -0
  210. package/dist/reliance-kernel.d.ts +66 -0
  211. package/dist/reliance-kernel.d.ts.map +1 -0
  212. package/dist/reliance-kernel.js +103 -0
  213. package/dist/reliance-kernel.js.map +1 -0
  214. package/dist/reliance-packet.d.ts +67 -0
  215. package/dist/reliance-packet.d.ts.map +1 -0
  216. package/dist/reliance-packet.js +176 -0
  217. package/dist/reliance-packet.js.map +1 -0
  218. package/dist/remedy-program-postgres.d.ts +37 -0
  219. package/dist/remedy-program-postgres.d.ts.map +1 -0
  220. package/dist/remedy-program-postgres.js +291 -0
  221. package/dist/remedy-program-postgres.js.map +1 -0
  222. package/dist/remedy-program-receipt.d.ts +97 -0
  223. package/dist/remedy-program-receipt.d.ts.map +1 -0
  224. package/dist/remedy-program-receipt.js +817 -0
  225. package/dist/remedy-program-receipt.js.map +1 -0
  226. package/dist/remedy-program.d.ts +76 -0
  227. package/dist/remedy-program.d.ts.map +1 -0
  228. package/dist/remedy-program.js +1346 -0
  229. package/dist/remedy-program.js.map +1 -0
  230. package/dist/reports/art14.d.ts +101 -0
  231. package/dist/reports/art14.d.ts.map +1 -0
  232. package/dist/reports/art14.js +340 -0
  233. package/dist/reports/art14.js.map +1 -0
  234. package/dist/reports/assurance-package.d.ts +197 -0
  235. package/dist/reports/assurance-package.d.ts.map +1 -0
  236. package/dist/reports/assurance-package.js +313 -0
  237. package/dist/reports/assurance-package.js.map +1 -0
  238. package/dist/reports/auditor-workpaper.d.ts +194 -0
  239. package/dist/reports/auditor-workpaper.d.ts.map +1 -0
  240. package/dist/reports/auditor-workpaper.js +545 -0
  241. package/dist/reports/auditor-workpaper.js.map +1 -0
  242. package/dist/reports/external-verification.d.ts +76 -0
  243. package/dist/reports/external-verification.d.ts.map +1 -0
  244. package/dist/reports/external-verification.js +209 -0
  245. package/dist/reports/external-verification.js.map +1 -0
  246. package/dist/reports/reperform.d.ts +122 -0
  247. package/dist/reports/reperform.d.ts.map +1 -0
  248. package/dist/reports/reperform.js +432 -0
  249. package/dist/reports/reperform.js.map +1 -0
  250. package/dist/reports/underwriter.d.ts +127 -0
  251. package/dist/reports/underwriter.d.ts.map +1 -0
  252. package/dist/reports/underwriter.js +348 -0
  253. package/dist/reports/underwriter.js.map +1 -0
  254. package/dist/retention.d.ts +88 -0
  255. package/dist/retention.d.ts.map +1 -0
  256. package/dist/retention.js +90 -0
  257. package/dist/retention.js.map +1 -0
  258. package/dist/roster.d.ts +113 -0
  259. package/dist/roster.d.ts.map +1 -0
  260. package/dist/roster.js +261 -0
  261. package/dist/roster.js.map +1 -0
  262. package/dist/runtime-monitor.d.ts +132 -0
  263. package/dist/runtime-monitor.d.ts.map +1 -0
  264. package/dist/runtime-monitor.js +197 -0
  265. package/dist/runtime-monitor.js.map +1 -0
  266. package/dist/settlement.d.ts +68 -0
  267. package/dist/settlement.d.ts.map +1 -0
  268. package/dist/settlement.js +306 -0
  269. package/dist/settlement.js.map +1 -0
  270. package/dist/siem.d.ts +261 -0
  271. package/dist/siem.d.ts.map +1 -0
  272. package/dist/siem.js +247 -0
  273. package/dist/siem.js.map +1 -0
  274. package/dist/store-postgres.d.ts +107 -0
  275. package/dist/store-postgres.d.ts.map +1 -0
  276. package/dist/store-postgres.js +152 -0
  277. package/dist/store-postgres.js.map +1 -0
  278. package/dist/store.d.ts +95 -0
  279. package/dist/store.d.ts.map +1 -0
  280. package/dist/store.js +202 -0
  281. package/dist/store.js.map +1 -0
  282. package/dist/strict-json.d.ts +14 -0
  283. package/dist/strict-json.d.ts.map +1 -0
  284. package/dist/strict-json.js +132 -0
  285. package/dist/strict-json.js.map +1 -0
  286. package/dist/trust-program-adapters.d.ts +122 -0
  287. package/dist/trust-program-adapters.d.ts.map +1 -0
  288. package/dist/trust-program-adapters.js +802 -0
  289. package/dist/trust-program-adapters.js.map +1 -0
  290. package/dist/trust-program-postgres.d.ts +41 -0
  291. package/dist/trust-program-postgres.d.ts.map +1 -0
  292. package/dist/trust-program-postgres.js +346 -0
  293. package/dist/trust-program-postgres.js.map +1 -0
  294. package/dist/trust-program-revocation.d.ts +206 -0
  295. package/dist/trust-program-revocation.d.ts.map +1 -0
  296. package/dist/trust-program-revocation.js +600 -0
  297. package/dist/trust-program-revocation.js.map +1 -0
  298. package/dist/trust-program.d.ts +197 -0
  299. package/dist/trust-program.d.ts.map +1 -0
  300. package/dist/trust-program.js +1351 -0
  301. package/dist/trust-program.js.map +1 -0
  302. package/dist/witness-postgres.d.ts +43 -0
  303. package/dist/witness-postgres.d.ts.map +1 -0
  304. package/dist/witness-postgres.js +92 -0
  305. package/dist/witness-postgres.js.map +1 -0
  306. package/dist/zk-range-proof.d.ts +78 -0
  307. package/dist/zk-range-proof.d.ts.map +1 -0
  308. package/dist/zk-range-proof.js +228 -0
  309. package/dist/zk-range-proof.js.map +1 -0
  310. package/eg1-conformance.js +3 -404
  311. package/enterprise.js +3 -180
  312. package/ep-assure.mjs +1 -0
  313. package/evidence-postgres.js +3 -356
  314. package/evidence.js +4 -360
  315. package/execution-binding.js +3 -212
  316. package/formal-runtime-map.js +4 -0
  317. package/index.js +4 -1249
  318. package/key-registry.js +3 -134
  319. package/mcp.js +3 -109
  320. package/metering.js +3 -226
  321. package/metrics.js +3 -231
  322. package/network-witness.js +3 -499
  323. package/package.json +47 -4
  324. package/receipt-program.js +4 -0
  325. package/reliance-kernel.js +3 -112
  326. package/reliance-packet.js +3 -175
  327. package/remedy-program-postgres.js +4 -0
  328. package/remedy-program-receipt.js +4 -0
  329. package/remedy-program.js +4 -0
  330. package/reports/art14.js +0 -0
  331. package/reports/assurance-package.js +2 -312
  332. package/reports/auditor-workpaper.js +3 -537
  333. package/reports/external-verification.js +3 -222
  334. package/reports/reperform.js +3 -424
  335. package/reports/underwriter.js +3 -339
  336. package/retention.js +3 -84
  337. package/roster.js +3 -264
  338. package/runtime-monitor.js +4 -0
  339. package/settlement.js +3 -299
  340. package/siem.js +3 -235
  341. package/src/action-control-manifest.ts +424 -0
  342. package/src/action-escrow-custodian.ts +427 -0
  343. package/src/action-escrow-evidence.ts +1178 -0
  344. package/src/action-escrow-package.ts +1821 -0
  345. package/src/action-escrow-postgres.ts +366 -0
  346. package/src/action-escrow-state.ts +498 -0
  347. package/src/action-escrow-verifiers.ts +484 -0
  348. package/src/action-escrow.ts +3039 -0
  349. package/src/action-packs.ts +170 -0
  350. package/src/adapters/_kit.ts +117 -0
  351. package/src/adapters/aws.ts +142 -0
  352. package/src/adapters/cloudflare.ts +78 -0
  353. package/src/adapters/gcp.ts +71 -0
  354. package/src/adapters/github.ts +110 -0
  355. package/src/adapters/jira.ts +56 -0
  356. package/src/adapters/k8s.ts +71 -0
  357. package/src/adapters/linear.ts +56 -0
  358. package/src/adapters/salesforce.ts +56 -0
  359. package/src/adapters/stripe.ts +82 -0
  360. package/src/adapters/supabase.ts +122 -0
  361. package/src/adapters/terraform.ts +60 -0
  362. package/src/adapters/vercel.ts +85 -0
  363. package/src/aec-execution.ts +354 -0
  364. package/src/breakglass.ts +647 -0
  365. package/src/capability-receipt.ts +1258 -0
  366. package/src/cf1-conformance.ts +120 -0
  367. package/src/challenge-store.ts +70 -0
  368. package/src/control-plane.ts +374 -0
  369. package/src/coverage.ts +832 -0
  370. package/src/deployment-attestation.ts +259 -0
  371. package/src/eg1-conformance.ts +471 -0
  372. package/src/enterprise.ts +195 -0
  373. package/src/evidence-postgres.ts +374 -0
  374. package/src/evidence.ts +367 -0
  375. package/src/execution-binding.ts +236 -0
  376. package/src/formal-runtime-map.ts +24 -0
  377. package/src/index.ts +2122 -0
  378. package/src/key-registry.ts +150 -0
  379. package/src/mcp.ts +120 -0
  380. package/src/metering.ts +237 -0
  381. package/src/metrics.ts +232 -0
  382. package/src/network-witness.ts +585 -0
  383. package/src/protocol-state.ts +143 -0
  384. package/src/protocol-state.typecheck.ts +94 -0
  385. package/src/receipt-program.ts +1105 -0
  386. package/src/reliance-kernel.ts +119 -0
  387. package/src/reliance-packet.ts +206 -0
  388. package/src/remedy-program-postgres.ts +367 -0
  389. package/src/remedy-program-receipt.ts +891 -0
  390. package/src/remedy-program.ts +1388 -0
  391. package/src/reports/art14.ts +361 -0
  392. package/src/reports/assurance-package.ts +330 -0
  393. package/src/reports/auditor-workpaper.ts +558 -0
  394. package/src/reports/external-verification.ts +232 -0
  395. package/src/reports/reperform.ts +441 -0
  396. package/src/reports/underwriter.ts +356 -0
  397. package/src/retention.ts +100 -0
  398. package/src/roster.ts +273 -0
  399. package/src/runtime-monitor.ts +217 -0
  400. package/src/settlement.ts +313 -0
  401. package/src/siem.ts +247 -0
  402. package/src/store-postgres.ts +167 -0
  403. package/src/store.ts +214 -0
  404. package/src/strict-json.ts +115 -0
  405. package/src/trust-program-adapters.ts +847 -0
  406. package/src/trust-program-postgres.ts +429 -0
  407. package/src/trust-program-revocation.ts +751 -0
  408. package/src/trust-program.ts +1460 -0
  409. package/src/witness-postgres.ts +106 -0
  410. package/src/zk-range-proof.ts +250 -0
  411. package/store-postgres.js +3 -161
  412. package/store.js +4 -198
  413. package/strict-json.js +3 -85
  414. package/trust-program-adapters.js +4 -0
  415. package/trust-program-postgres.js +4 -0
  416. package/trust-program-revocation.js +4 -0
  417. package/trust-program.js +4 -0
  418. package/witness-postgres.js +3 -96
  419. 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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"}