@vauban-org/agent-sdk 0.17.4 → 1.2.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 (506) hide show
  1. package/CONTRACT.md +6401 -813
  2. package/dist/adapters/llm/anthropic-direct.d.ts +1 -0
  3. package/dist/adapters/llm/anthropic-direct.d.ts.map +1 -1
  4. package/dist/adapters/llm/anthropic-direct.js +43 -0
  5. package/dist/adapters/llm/anthropic-direct.js.map +1 -1
  6. package/dist/adapters/llm/cascade.d.ts.map +1 -1
  7. package/dist/adapters/llm/cascade.js +57 -14
  8. package/dist/adapters/llm/cascade.js.map +1 -1
  9. package/dist/adapters/llm/litellm.d.ts +2 -0
  10. package/dist/adapters/llm/litellm.d.ts.map +1 -1
  11. package/dist/adapters/llm/litellm.js +44 -0
  12. package/dist/adapters/llm/litellm.js.map +1 -1
  13. package/dist/compute/difficulty-estimator.d.ts +53 -0
  14. package/dist/compute/difficulty-estimator.d.ts.map +1 -0
  15. package/dist/compute/difficulty-estimator.js +82 -0
  16. package/dist/compute/difficulty-estimator.js.map +1 -0
  17. package/dist/compute/strategies/mixture-of-agents.d.ts +40 -0
  18. package/dist/compute/strategies/mixture-of-agents.d.ts.map +1 -0
  19. package/dist/compute/strategies/mixture-of-agents.js +110 -0
  20. package/dist/compute/strategies/mixture-of-agents.js.map +1 -0
  21. package/dist/compute/strategies/tree-of-thoughts.d.ts +48 -0
  22. package/dist/compute/strategies/tree-of-thoughts.d.ts.map +1 -0
  23. package/dist/compute/strategies/tree-of-thoughts.js +242 -0
  24. package/dist/compute/strategies/tree-of-thoughts.js.map +1 -0
  25. package/dist/compute/strategies/two-phase-orient.d.ts +72 -0
  26. package/dist/compute/strategies/two-phase-orient.d.ts.map +1 -0
  27. package/dist/compute/strategies/two-phase-orient.js +85 -0
  28. package/dist/compute/strategies/two-phase-orient.js.map +1 -0
  29. package/dist/constitution/types.d.ts +10 -10
  30. package/dist/container/protocol.d.ts +134 -0
  31. package/dist/container/protocol.d.ts.map +1 -0
  32. package/dist/container/protocol.js +157 -0
  33. package/dist/container/protocol.js.map +1 -0
  34. package/dist/container/runtime.d.ts +140 -0
  35. package/dist/container/runtime.d.ts.map +1 -0
  36. package/dist/container/runtime.js +256 -0
  37. package/dist/container/runtime.js.map +1 -0
  38. package/dist/events/catalogue.d.ts +327 -30
  39. package/dist/events/catalogue.d.ts.map +1 -1
  40. package/dist/events/catalogue.js +18 -0
  41. package/dist/events/catalogue.js.map +1 -1
  42. package/dist/events/index.d.ts +9 -0
  43. package/dist/events/index.d.ts.map +1 -1
  44. package/dist/events/index.js +9 -0
  45. package/dist/events/index.js.map +1 -1
  46. package/dist/events/schemas/agent.completed.v1.d.ts +4 -4
  47. package/dist/events/schemas/agent.failed.v1.d.ts +2 -2
  48. package/dist/events/schemas/agent.hitl_resolved.v1.d.ts +2 -2
  49. package/dist/events/schemas/agent.started.v1.d.ts +2 -2
  50. package/dist/events/schemas/brain.skill.extracted.v1.d.ts +4 -4
  51. package/dist/events/schemas/cc.cost.anomaly_detected.v1.d.ts +2 -2
  52. package/dist/events/schemas/cc.cost.recorded.v1.d.ts +4 -4
  53. package/dist/events/schemas/citadel.sprint.analyzed.v1.d.ts +55 -0
  54. package/dist/events/schemas/citadel.sprint.analyzed.v1.d.ts.map +1 -0
  55. package/dist/events/schemas/citadel.sprint.analyzed.v1.js +22 -0
  56. package/dist/events/schemas/citadel.sprint.analyzed.v1.js.map +1 -0
  57. package/dist/events/schemas/citadel.sprint.closed.v1.d.ts +2 -2
  58. package/dist/events/schemas/forge.inbox.reply_classified.v1.d.ts +33 -0
  59. package/dist/events/schemas/forge.inbox.reply_classified.v1.d.ts.map +1 -0
  60. package/dist/events/schemas/forge.inbox.reply_classified.v1.js +15 -0
  61. package/dist/events/schemas/forge.inbox.reply_classified.v1.js.map +1 -0
  62. package/dist/events/schemas/forge.lead.qualified.v1.d.ts +2 -2
  63. package/dist/events/schemas/forge.outreach.sent.v1.d.ts +4 -4
  64. package/dist/events/schemas/incident.detected.v1.d.ts +2 -2
  65. package/dist/events/schemas/vauban-finance.forecast.generated.v1.d.ts +21 -0
  66. package/dist/events/schemas/vauban-finance.forecast.generated.v1.d.ts.map +1 -0
  67. package/dist/events/schemas/vauban-finance.forecast.generated.v1.js +11 -0
  68. package/dist/events/schemas/vauban-finance.forecast.generated.v1.js.map +1 -0
  69. package/dist/events/schemas/vauban-finance.trade.executed.v1.d.ts +24 -0
  70. package/dist/events/schemas/vauban-finance.trade.executed.v1.d.ts.map +1 -0
  71. package/dist/events/schemas/vauban-finance.trade.executed.v1.js +12 -0
  72. package/dist/events/schemas/vauban-finance.trade.executed.v1.js.map +1 -0
  73. package/dist/events/schemas/vauban.goal.checked.v1.d.ts +21 -0
  74. package/dist/events/schemas/vauban.goal.checked.v1.d.ts.map +1 -0
  75. package/dist/events/schemas/vauban.goal.checked.v1.js +11 -0
  76. package/dist/events/schemas/vauban.goal.checked.v1.js.map +1 -0
  77. package/dist/events/schemas/vauban.rebalancing.checked.v1.d.ts +21 -0
  78. package/dist/events/schemas/vauban.rebalancing.checked.v1.d.ts.map +1 -0
  79. package/dist/events/schemas/vauban.rebalancing.checked.v1.js +11 -0
  80. package/dist/events/schemas/vauban.rebalancing.checked.v1.js.map +1 -0
  81. package/dist/events/schemas/vauban.tax.checked.v1.d.ts +21 -0
  82. package/dist/events/schemas/vauban.tax.checked.v1.d.ts.map +1 -0
  83. package/dist/events/schemas/vauban.tax.checked.v1.js +11 -0
  84. package/dist/events/schemas/vauban.tax.checked.v1.js.map +1 -0
  85. package/dist/events/schemas/vauban.vault.analyzed.v1.d.ts +59 -0
  86. package/dist/events/schemas/vauban.vault.analyzed.v1.d.ts.map +1 -0
  87. package/dist/events/schemas/vauban.vault.analyzed.v1.js +19 -0
  88. package/dist/events/schemas/vauban.vault.analyzed.v1.js.map +1 -0
  89. package/dist/events/schemas/vauban.vault.compounded.v1.d.ts +24 -0
  90. package/dist/events/schemas/vauban.vault.compounded.v1.d.ts.map +1 -0
  91. package/dist/events/schemas/vauban.vault.compounded.v1.js +12 -0
  92. package/dist/events/schemas/vauban.vault.compounded.v1.js.map +1 -0
  93. package/dist/identity/agent-persona.d.ts +73 -0
  94. package/dist/identity/agent-persona.d.ts.map +1 -0
  95. package/dist/identity/agent-persona.js +165 -0
  96. package/dist/identity/agent-persona.js.map +1 -0
  97. package/dist/identity/persona-prompt.d.ts +25 -0
  98. package/dist/identity/persona-prompt.d.ts.map +1 -0
  99. package/dist/identity/persona-prompt.js +71 -0
  100. package/dist/identity/persona-prompt.js.map +1 -0
  101. package/dist/identity/persona-schema.d.ts +120 -0
  102. package/dist/identity/persona-schema.d.ts.map +1 -0
  103. package/dist/identity/persona-schema.js +103 -0
  104. package/dist/identity/persona-schema.js.map +1 -0
  105. package/dist/index.d.ts +37 -2
  106. package/dist/index.d.ts.map +1 -1
  107. package/dist/index.js +29 -1
  108. package/dist/index.js.map +1 -1
  109. package/dist/loop/index.d.ts +1 -1
  110. package/dist/loop/index.d.ts.map +1 -1
  111. package/dist/loop/index.js.map +1 -1
  112. package/dist/loop/minimal-loop.js +293 -287
  113. package/dist/loop/sdk-loop.d.ts +1 -3
  114. package/dist/loop/sdk-loop.d.ts.map +1 -1
  115. package/dist/loop/sdk-loop.js +1 -1
  116. package/dist/loop/sdk-loop.js.map +1 -1
  117. package/dist/memory/episodic-rrf.d.ts +114 -0
  118. package/dist/memory/episodic-rrf.d.ts.map +1 -0
  119. package/dist/memory/episodic-rrf.js +148 -0
  120. package/dist/memory/episodic-rrf.js.map +1 -0
  121. package/dist/mesh/attenuation.d.ts +78 -0
  122. package/dist/mesh/attenuation.d.ts.map +1 -0
  123. package/dist/mesh/attenuation.js +141 -0
  124. package/dist/mesh/attenuation.js.map +1 -0
  125. package/dist/mesh/delegate.d.ts +96 -0
  126. package/dist/mesh/delegate.d.ts.map +1 -0
  127. package/dist/mesh/delegate.js +172 -0
  128. package/dist/mesh/delegate.js.map +1 -0
  129. package/dist/mesh/dispatcher.d.ts +119 -0
  130. package/dist/mesh/dispatcher.d.ts.map +1 -0
  131. package/dist/mesh/dispatcher.js +207 -0
  132. package/dist/mesh/dispatcher.js.map +1 -0
  133. package/dist/mesh/index.d.ts +12 -0
  134. package/dist/mesh/index.d.ts.map +1 -0
  135. package/dist/mesh/index.js +11 -0
  136. package/dist/mesh/index.js.map +1 -0
  137. package/dist/mesh/types.d.ts +30 -0
  138. package/dist/mesh/types.d.ts.map +1 -0
  139. package/dist/mesh/types.js +11 -0
  140. package/dist/mesh/types.js.map +1 -0
  141. package/dist/orchestration/ooda/skills.d.ts +104 -0
  142. package/dist/orchestration/ooda/skills.d.ts.map +1 -1
  143. package/dist/orchestration/ooda/skills.js +106 -0
  144. package/dist/orchestration/ooda/skills.js.map +1 -1
  145. package/dist/orchestration/ooda/types.d.ts +3 -8
  146. package/dist/orchestration/ooda/types.d.ts.map +1 -1
  147. package/dist/ports/bastion-action.contract.test.d.ts +11 -0
  148. package/dist/ports/bastion-action.contract.test.d.ts.map +1 -0
  149. package/dist/ports/bastion-action.contract.test.js +238 -0
  150. package/dist/ports/bastion-action.contract.test.js.map +1 -0
  151. package/dist/ports/bastion-action.d.ts +133 -0
  152. package/dist/ports/bastion-action.d.ts.map +1 -0
  153. package/dist/ports/bastion-action.js +73 -0
  154. package/dist/ports/bastion-action.js.map +1 -0
  155. package/dist/ports/brain.d.ts +31 -0
  156. package/dist/ports/brain.d.ts.map +1 -1
  157. package/dist/ports/brain.js +115 -1
  158. package/dist/ports/brain.js.map +1 -1
  159. package/dist/ports/citadel-action.contract.test.d.ts +11 -0
  160. package/dist/ports/citadel-action.contract.test.d.ts.map +1 -0
  161. package/dist/ports/citadel-action.contract.test.js +317 -0
  162. package/dist/ports/citadel-action.contract.test.js.map +1 -0
  163. package/dist/ports/citadel-action.d.ts +111 -0
  164. package/dist/ports/citadel-action.d.ts.map +1 -0
  165. package/dist/ports/citadel-action.js +62 -0
  166. package/dist/ports/citadel-action.js.map +1 -0
  167. package/dist/ports/compliance-contract.d.ts +123 -0
  168. package/dist/ports/compliance-contract.d.ts.map +1 -0
  169. package/dist/ports/compliance-contract.js +35 -0
  170. package/dist/ports/compliance-contract.js.map +1 -0
  171. package/dist/ports/db.d.ts +38 -0
  172. package/dist/ports/db.d.ts.map +1 -1
  173. package/dist/ports/db.js +88 -1
  174. package/dist/ports/db.js.map +1 -1
  175. package/dist/ports/delegation.contract.test.d.ts +9 -0
  176. package/dist/ports/delegation.contract.test.d.ts.map +1 -0
  177. package/dist/ports/delegation.contract.test.js +337 -0
  178. package/dist/ports/delegation.contract.test.js.map +1 -0
  179. package/dist/ports/delegation.d.ts +134 -0
  180. package/dist/ports/delegation.d.ts.map +1 -0
  181. package/dist/ports/delegation.js +105 -0
  182. package/dist/ports/delegation.js.map +1 -0
  183. package/dist/ports/event-bus.d.ts +29 -13
  184. package/dist/ports/event-bus.d.ts.map +1 -1
  185. package/dist/ports/event-bus.js +106 -1
  186. package/dist/ports/event-bus.js.map +1 -1
  187. package/dist/ports/federation.contract.test.d.ts +9 -0
  188. package/dist/ports/federation.contract.test.d.ts.map +1 -0
  189. package/dist/ports/federation.contract.test.js +279 -0
  190. package/dist/ports/federation.contract.test.js.map +1 -0
  191. package/dist/ports/federation.d.ts +140 -0
  192. package/dist/ports/federation.d.ts.map +1 -0
  193. package/dist/ports/federation.js +57 -0
  194. package/dist/ports/federation.js.map +1 -0
  195. package/dist/ports/index.d.ts +28 -2
  196. package/dist/ports/index.d.ts.map +1 -1
  197. package/dist/ports/index.js +17 -2
  198. package/dist/ports/index.js.map +1 -1
  199. package/dist/ports/llm-provider.d.ts +37 -0
  200. package/dist/ports/llm-provider.d.ts.map +1 -1
  201. package/dist/ports/llm-provider.js +99 -1
  202. package/dist/ports/llm-provider.js.map +1 -1
  203. package/dist/ports/logger.d.ts +27 -0
  204. package/dist/ports/logger.d.ts.map +1 -1
  205. package/dist/ports/logger.js +87 -0
  206. package/dist/ports/logger.js.map +1 -1
  207. package/dist/ports/manifest-registry.contract.test.d.ts +9 -0
  208. package/dist/ports/manifest-registry.contract.test.d.ts.map +1 -0
  209. package/dist/ports/manifest-registry.contract.test.js +246 -0
  210. package/dist/ports/manifest-registry.contract.test.js.map +1 -0
  211. package/dist/ports/manifest-registry.d.ts +116 -0
  212. package/dist/ports/manifest-registry.d.ts.map +1 -0
  213. package/dist/ports/manifest-registry.js +79 -0
  214. package/dist/ports/manifest-registry.js.map +1 -0
  215. package/dist/ports/observability.contract.test.d.ts +12 -0
  216. package/dist/ports/observability.contract.test.d.ts.map +1 -0
  217. package/dist/ports/observability.contract.test.js +260 -0
  218. package/dist/ports/observability.contract.test.js.map +1 -0
  219. package/dist/ports/observability.d.ts +98 -0
  220. package/dist/ports/observability.d.ts.map +1 -0
  221. package/dist/ports/observability.js +59 -0
  222. package/dist/ports/observability.js.map +1 -0
  223. package/dist/ports/outcome.d.ts +26 -0
  224. package/dist/ports/outcome.d.ts.map +1 -1
  225. package/dist/ports/outcome.js +62 -1
  226. package/dist/ports/outcome.js.map +1 -1
  227. package/dist/ports/privacy.contract.test.d.ts +12 -0
  228. package/dist/ports/privacy.contract.test.d.ts.map +1 -0
  229. package/dist/ports/privacy.contract.test.js +325 -0
  230. package/dist/ports/privacy.contract.test.js.map +1 -0
  231. package/dist/ports/privacy.d.ts +132 -0
  232. package/dist/ports/privacy.d.ts.map +1 -0
  233. package/dist/ports/privacy.js +83 -0
  234. package/dist/ports/privacy.js.map +1 -0
  235. package/dist/ports/tenant-context.contract.test.d.ts +14 -0
  236. package/dist/ports/tenant-context.contract.test.d.ts.map +1 -0
  237. package/dist/ports/tenant-context.contract.test.js +352 -0
  238. package/dist/ports/tenant-context.contract.test.js.map +1 -0
  239. package/dist/ports/tenant-context.d.ts +103 -0
  240. package/dist/ports/tenant-context.d.ts.map +1 -0
  241. package/dist/ports/tenant-context.js +48 -0
  242. package/dist/ports/tenant-context.js.map +1 -0
  243. package/dist/ports/vauban-finance-action.contract.test.d.ts +11 -0
  244. package/dist/ports/vauban-finance-action.contract.test.d.ts.map +1 -0
  245. package/dist/ports/vauban-finance-action.contract.test.js +260 -0
  246. package/dist/ports/vauban-finance-action.contract.test.js.map +1 -0
  247. package/dist/ports/vauban-finance-action.d.ts +106 -0
  248. package/dist/ports/vauban-finance-action.d.ts.map +1 -0
  249. package/dist/ports/vauban-finance-action.js +60 -0
  250. package/dist/ports/vauban-finance-action.js.map +1 -0
  251. package/dist/ports/workflow-runtime.d.ts +204 -0
  252. package/dist/ports/workflow-runtime.d.ts.map +1 -0
  253. package/dist/ports/workflow-runtime.js +72 -0
  254. package/dist/ports/workflow-runtime.js.map +1 -0
  255. package/dist/proof/cert-verify.d.ts +80 -0
  256. package/dist/proof/cert-verify.d.ts.map +1 -0
  257. package/dist/proof/cert-verify.js +178 -0
  258. package/dist/proof/cert-verify.js.map +1 -0
  259. package/dist/replay/replay.d.ts.map +1 -1
  260. package/dist/replay/replay.js +5 -1
  261. package/dist/replay/replay.js.map +1 -1
  262. package/dist/retry/index.d.ts +129 -0
  263. package/dist/retry/index.d.ts.map +1 -0
  264. package/dist/retry/index.js +156 -0
  265. package/dist/retry/index.js.map +1 -0
  266. package/dist/retry/presets.d.ts +39 -0
  267. package/dist/retry/presets.d.ts.map +1 -0
  268. package/dist/retry/presets.js +69 -0
  269. package/dist/retry/presets.js.map +1 -0
  270. package/dist/skill-loop/ab-runner.d.ts +67 -0
  271. package/dist/skill-loop/ab-runner.d.ts.map +1 -0
  272. package/dist/skill-loop/ab-runner.js +160 -0
  273. package/dist/skill-loop/ab-runner.js.map +1 -0
  274. package/dist/skill-loop/adoption.d.ts +67 -0
  275. package/dist/skill-loop/adoption.d.ts.map +1 -0
  276. package/dist/skill-loop/adoption.js +126 -0
  277. package/dist/skill-loop/adoption.js.map +1 -0
  278. package/dist/skill-loop/candidate.d.ts +45 -0
  279. package/dist/skill-loop/candidate.d.ts.map +1 -0
  280. package/dist/skill-loop/candidate.js +43 -0
  281. package/dist/skill-loop/candidate.js.map +1 -0
  282. package/dist/skill-loop/evaluator.d.ts +42 -0
  283. package/dist/skill-loop/evaluator.d.ts.map +1 -0
  284. package/dist/skill-loop/evaluator.js +184 -0
  285. package/dist/skill-loop/evaluator.js.map +1 -0
  286. package/dist/skill-loop/index.d.ts +27 -0
  287. package/dist/skill-loop/index.d.ts.map +1 -0
  288. package/dist/skill-loop/index.js +27 -0
  289. package/dist/skill-loop/index.js.map +1 -0
  290. package/dist/skill-loop/reflexion-replay.d.ts +87 -0
  291. package/dist/skill-loop/reflexion-replay.d.ts.map +1 -0
  292. package/dist/skill-loop/reflexion-replay.js +110 -0
  293. package/dist/skill-loop/reflexion-replay.js.map +1 -0
  294. package/dist/skill-loop/sign-off.d.ts +88 -0
  295. package/dist/skill-loop/sign-off.d.ts.map +1 -0
  296. package/dist/skill-loop/sign-off.js +146 -0
  297. package/dist/skill-loop/sign-off.js.map +1 -0
  298. package/dist/skill-loop/value-metric.d.ts +55 -0
  299. package/dist/skill-loop/value-metric.d.ts.map +1 -0
  300. package/dist/skill-loop/value-metric.js +69 -0
  301. package/dist/skill-loop/value-metric.js.map +1 -0
  302. package/dist/skill-loop/versioning.d.ts +36 -0
  303. package/dist/skill-loop/versioning.d.ts.map +1 -0
  304. package/dist/skill-loop/versioning.js +47 -0
  305. package/dist/skill-loop/versioning.js.map +1 -0
  306. package/dist/skill-manifest/anchor.d.ts +91 -0
  307. package/dist/skill-manifest/anchor.d.ts.map +1 -0
  308. package/dist/skill-manifest/anchor.js +331 -0
  309. package/dist/skill-manifest/anchor.js.map +1 -0
  310. package/dist/skill-manifest/builder.d.ts +47 -0
  311. package/dist/skill-manifest/builder.d.ts.map +1 -0
  312. package/dist/skill-manifest/builder.js +93 -0
  313. package/dist/skill-manifest/builder.js.map +1 -0
  314. package/dist/skill-manifest/index.d.ts +13 -0
  315. package/dist/skill-manifest/index.d.ts.map +1 -0
  316. package/dist/skill-manifest/index.js +9 -0
  317. package/dist/skill-manifest/index.js.map +1 -0
  318. package/dist/skill-manifest/types.d.ts +67 -0
  319. package/dist/skill-manifest/types.d.ts.map +1 -0
  320. package/dist/skill-manifest/types.js +16 -0
  321. package/dist/skill-manifest/types.js.map +1 -0
  322. package/dist/skill-manifest/verifier.d.ts +42 -0
  323. package/dist/skill-manifest/verifier.d.ts.map +1 -0
  324. package/dist/skill-manifest/verifier.js +136 -0
  325. package/dist/skill-manifest/verifier.js.map +1 -0
  326. package/dist/skills/brain-query.d.ts +4 -4
  327. package/dist/skills/brain-store.d.ts +6 -6
  328. package/dist/skills/errors.d.ts +15 -0
  329. package/dist/skills/errors.d.ts.map +1 -1
  330. package/dist/skills/errors.js +21 -0
  331. package/dist/skills/errors.js.map +1 -1
  332. package/dist/skills/hitl-request.d.ts +2 -2
  333. package/dist/skills/index.d.ts +3 -1
  334. package/dist/skills/index.d.ts.map +1 -1
  335. package/dist/skills/index.js +4 -1
  336. package/dist/skills/index.js.map +1 -1
  337. package/dist/skills/markdown/loader.d.ts +52 -0
  338. package/dist/skills/markdown/loader.d.ts.map +1 -0
  339. package/dist/skills/markdown/loader.js +93 -0
  340. package/dist/skills/markdown/loader.js.map +1 -0
  341. package/dist/skills/markdown/schema.d.ts +432 -0
  342. package/dist/skills/markdown/schema.d.ts.map +1 -0
  343. package/dist/skills/markdown/schema.js +121 -0
  344. package/dist/skills/markdown/schema.js.map +1 -0
  345. package/dist/skills/poc-md-loader/markdown-loader.d.ts +77 -0
  346. package/dist/skills/poc-md-loader/markdown-loader.d.ts.map +1 -0
  347. package/dist/skills/poc-md-loader/markdown-loader.js +125 -0
  348. package/dist/skills/poc-md-loader/markdown-loader.js.map +1 -0
  349. package/dist/skills/poc-md-loader/runner.d.ts +24 -0
  350. package/dist/skills/poc-md-loader/runner.d.ts.map +1 -0
  351. package/dist/skills/poc-md-loader/runner.js +57 -0
  352. package/dist/skills/poc-md-loader/runner.js.map +1 -0
  353. package/dist/skills/poc-md-loader/vitest.poc.config.d.ts +3 -0
  354. package/dist/skills/poc-md-loader/vitest.poc.config.d.ts.map +1 -0
  355. package/dist/skills/poc-md-loader/vitest.poc.config.js +13 -0
  356. package/dist/skills/poc-md-loader/vitest.poc.config.js.map +1 -0
  357. package/dist/skills/poc-md-loader/web-search/script.d.ts +33 -0
  358. package/dist/skills/poc-md-loader/web-search/script.d.ts.map +1 -0
  359. package/dist/skills/poc-md-loader/web-search/script.js +75 -0
  360. package/dist/skills/poc-md-loader/web-search/script.js.map +1 -0
  361. package/dist/skills/record-outcome.d.ts +4 -4
  362. package/dist/skills/send-email.d.ts.map +1 -1
  363. package/dist/skills/send-email.js +15 -3
  364. package/dist/skills/send-email.js.map +1 -1
  365. package/dist/skills/slack-notify.d.ts +4 -4
  366. package/dist/skills/starknet-balance.d.ts +1 -1
  367. package/dist/skills/telegram-notify.d.ts +4 -4
  368. package/dist/skills/web-search.d.ts +1 -1
  369. package/dist/testing/contracts/event-bus.contract.d.ts.map +1 -1
  370. package/dist/testing/contracts/event-bus.contract.js +14 -12
  371. package/dist/testing/contracts/event-bus.contract.js.map +1 -1
  372. package/dist/testing/index.d.ts +3 -0
  373. package/dist/testing/test-brain-port.d.ts +4 -0
  374. package/dist/testing/test-brain-port.d.ts.map +1 -1
  375. package/dist/testing/test-brain-port.js +75 -20
  376. package/dist/testing/test-brain-port.js.map +1 -1
  377. package/dist/testing/test-event-bus.d.ts.map +1 -1
  378. package/dist/testing/test-event-bus.js +89 -36
  379. package/dist/testing/test-event-bus.js.map +1 -1
  380. package/dist/trace/schema.d.ts +1 -1
  381. package/dist/trace/schema.d.ts.map +1 -1
  382. package/dist/trace/schema.js +1 -1
  383. package/dist/trace/schema.js.map +1 -1
  384. package/dist/verify/formal/index.d.ts +44 -0
  385. package/dist/verify/formal/index.d.ts.map +1 -0
  386. package/dist/verify/formal/index.js +98 -0
  387. package/dist/verify/formal/index.js.map +1 -0
  388. package/dist/verify/formal/policy.d.ts +105 -0
  389. package/dist/verify/formal/policy.d.ts.map +1 -0
  390. package/dist/verify/formal/policy.js +159 -0
  391. package/dist/verify/formal/policy.js.map +1 -0
  392. package/dist/verify/formal/result.d.ts +50 -0
  393. package/dist/verify/formal/result.d.ts.map +1 -0
  394. package/dist/verify/formal/result.js +21 -0
  395. package/dist/verify/formal/result.js.map +1 -0
  396. package/dist/verify/formal/solver.d.ts +67 -0
  397. package/dist/verify/formal/solver.d.ts.map +1 -0
  398. package/dist/verify/formal/solver.js +184 -0
  399. package/dist/verify/formal/solver.js.map +1 -0
  400. package/dist/verify/formal/spec-language.d.ts +80 -0
  401. package/dist/verify/formal/spec-language.d.ts.map +1 -0
  402. package/dist/verify/formal/spec-language.js +219 -0
  403. package/dist/verify/formal/spec-language.js.map +1 -0
  404. package/docs/attestation.md +199 -0
  405. package/docs/identity.md +193 -0
  406. package/package.json +22 -1
  407. package/src/adapters/llm/anthropic-direct.ts +51 -0
  408. package/src/adapters/llm/cascade.ts +64 -19
  409. package/src/adapters/llm/litellm.ts +49 -0
  410. package/src/compute/difficulty-estimator.ts +111 -0
  411. package/src/compute/strategies/mixture-of-agents.ts +150 -0
  412. package/src/compute/strategies/tree-of-thoughts.ts +293 -0
  413. package/src/compute/strategies/two-phase-orient.ts +147 -0
  414. package/src/container/protocol.ts +243 -0
  415. package/src/container/runtime.ts +424 -0
  416. package/src/db/migrations/026_formal_verify_results.sql +30 -0
  417. package/src/events/catalogue.ts +54 -0
  418. package/src/events/index.ts +9 -0
  419. package/src/events/schemas/citadel.sprint.analyzed.v1.ts +23 -0
  420. package/src/events/schemas/forge.inbox.reply_classified.v1.ts +15 -0
  421. package/src/events/schemas/vauban-finance.forecast.generated.v1.ts +11 -0
  422. package/src/events/schemas/vauban-finance.trade.executed.v1.ts +12 -0
  423. package/src/events/schemas/vauban.goal.checked.v1.ts +11 -0
  424. package/src/events/schemas/vauban.rebalancing.checked.v1.ts +11 -0
  425. package/src/events/schemas/vauban.tax.checked.v1.ts +11 -0
  426. package/src/events/schemas/vauban.vault.analyzed.v1.ts +21 -0
  427. package/src/events/schemas/vauban.vault.compounded.v1.ts +12 -0
  428. package/src/identity/agent-persona.ts +203 -0
  429. package/src/identity/persona-prompt.ts +84 -0
  430. package/src/identity/persona-schema.ts +127 -0
  431. package/src/index.ts +338 -1
  432. package/src/loop/index.ts +0 -1
  433. package/src/loop/sdk-loop.ts +5 -8
  434. package/src/memory/episodic-rrf.ts +224 -0
  435. package/src/mesh/attenuation.ts +190 -0
  436. package/src/mesh/delegate.ts +254 -0
  437. package/src/mesh/dispatcher.ts +301 -0
  438. package/src/mesh/index.ts +39 -0
  439. package/src/mesh/types.ts +31 -0
  440. package/src/orchestration/ooda/skills.ts +177 -0
  441. package/src/orchestration/ooda/types.ts +3 -9
  442. package/src/ports/bastion-action.contract.test.ts +355 -0
  443. package/src/ports/bastion-action.ts +198 -0
  444. package/src/ports/brain.ts +177 -15
  445. package/src/ports/citadel-action.contract.test.ts +430 -0
  446. package/src/ports/citadel-action.ts +174 -0
  447. package/src/ports/compliance-contract.ts +191 -0
  448. package/src/ports/db.ts +98 -0
  449. package/src/ports/delegation.contract.test.ts +428 -0
  450. package/src/ports/delegation.ts +211 -0
  451. package/src/ports/event-bus.ts +133 -18
  452. package/src/ports/federation.contract.test.ts +355 -0
  453. package/src/ports/federation.ts +190 -0
  454. package/src/ports/index.ts +186 -1
  455. package/src/ports/llm-provider.ts +123 -0
  456. package/src/ports/logger.ts +104 -0
  457. package/src/ports/manifest-registry.contract.test.ts +324 -0
  458. package/src/ports/manifest-registry.ts +188 -0
  459. package/src/ports/observability.contract.test.ts +315 -0
  460. package/src/ports/observability.ts +150 -0
  461. package/src/ports/outcome.ts +69 -0
  462. package/src/ports/privacy.contract.test.ts +413 -0
  463. package/src/ports/privacy.ts +207 -0
  464. package/src/ports/tenant-context.contract.test.ts +454 -0
  465. package/src/ports/tenant-context.ts +150 -0
  466. package/src/ports/vauban-finance-action.contract.test.ts +335 -0
  467. package/src/ports/vauban-finance-action.ts +166 -0
  468. package/src/ports/workflow-runtime.ts +327 -0
  469. package/src/proof/cert-verify.ts +249 -0
  470. package/src/replay/replay.ts +11 -8
  471. package/src/retry/index.ts +227 -0
  472. package/src/retry/presets.ts +75 -0
  473. package/src/skill-loop/ab-runner.ts +196 -0
  474. package/src/skill-loop/adoption.ts +188 -0
  475. package/src/skill-loop/candidate.ts +75 -0
  476. package/src/skill-loop/evaluator.ts +238 -0
  477. package/src/skill-loop/index.ts +51 -0
  478. package/src/skill-loop/reflexion-replay.ts +173 -0
  479. package/src/skill-loop/sign-off.ts +247 -0
  480. package/src/skill-loop/value-metric.ts +120 -0
  481. package/src/skill-loop/versioning.ts +75 -0
  482. package/src/skill-manifest/anchor.ts +401 -0
  483. package/src/skill-manifest/builder.ts +129 -0
  484. package/src/skill-manifest/index.ts +18 -0
  485. package/src/skill-manifest/types.ts +72 -0
  486. package/src/skill-manifest/verifier.ts +198 -0
  487. package/src/skills/errors.ts +30 -2
  488. package/src/skills/index.ts +19 -0
  489. package/src/skills/markdown/loader.ts +129 -0
  490. package/src/skills/markdown/schema.ts +144 -0
  491. package/src/skills/poc-md-loader/e2e-parity.test.ts +237 -0
  492. package/src/skills/poc-md-loader/markdown-loader.ts +161 -0
  493. package/src/skills/poc-md-loader/runner.ts +82 -0
  494. package/src/skills/poc-md-loader/vitest.poc.config.ts +13 -0
  495. package/src/skills/poc-md-loader/web-search/SKILL.md +42 -0
  496. package/src/skills/poc-md-loader/web-search/script.ts +109 -0
  497. package/src/skills/send-email.ts +15 -3
  498. package/src/testing/contracts/event-bus.contract.ts +16 -14
  499. package/src/testing/test-brain-port.ts +98 -24
  500. package/src/testing/test-event-bus.ts +104 -43
  501. package/src/trace/schema.ts +1 -1
  502. package/src/verify/formal/index.ts +154 -0
  503. package/src/verify/formal/policy.ts +253 -0
  504. package/src/verify/formal/result.ts +52 -0
  505. package/src/verify/formal/solver.ts +235 -0
  506. package/src/verify/formal/spec-language.ts +274 -0
@@ -0,0 +1,80 @@
1
+ /**
2
+ * src/verify/formal/spec-language.ts
3
+ *
4
+ * Sprint-587 — DSL for axiom specifications, compiled to SMT-LIB v2.
5
+ *
6
+ * Design philosophy (inspired by FormalJudge, arXiv:2602.11136) : agent-cycle
7
+ * properties are expressed as small, typed pre/post-condition tuples. Each
8
+ * condition is mapped to an SMT-LIB fragment by {@link compileToSmt}, which
9
+ * frames the property as a NEGATION of the post-conditions under the
10
+ * pre-conditions. This way, Z3 returning `sat` means a counterexample exists
11
+ * (= UNSAFE) and `unsat` means the post-conditions hold (= SAFE).
12
+ *
13
+ * Bound types : Reals for budgets and ratios, Bools for binary properties,
14
+ * Sets-as-symbols for scope subset checks.
15
+ *
16
+ * @module verify/formal/spec-language
17
+ */
18
+ /**
19
+ * One verifiable axiom-level property.
20
+ */
21
+ export interface AxiomSpec {
22
+ /** Human-readable axiom label (e.g. "Robuste", "Profitable"). */
23
+ axiom: string;
24
+ /** Conditions that must hold for the spec to be meaningful. */
25
+ preconditions: Condition[];
26
+ /** Conditions whose conjunction defines the post-state to verify. */
27
+ postconditions: Condition[];
28
+ /** Solver timeout in ms — see {@link DEFAULT_POLICIES}. */
29
+ timeout_ms?: number;
30
+ }
31
+ /**
32
+ * Tagged union of all supported condition kinds.
33
+ *
34
+ * `custom_smt` is the escape hatch : the consumer supplies a raw SMT-LIB
35
+ * fragment that will be inlined under an `(assert ...)`. Use sparingly —
36
+ * mistakes here are silent semantic bugs.
37
+ */
38
+ export type Condition = {
39
+ type: "budget_constraint";
40
+ child_max_fraction: number;
41
+ } | {
42
+ type: "scope_subset";
43
+ parent_scope: string[];
44
+ child_scope: string[];
45
+ } | {
46
+ type: "no_pii_in_output";
47
+ pii_count_var?: string;
48
+ } | {
49
+ type: "cost_positive_roi";
50
+ min_roi_ratio: number;
51
+ } | {
52
+ type: "response_time";
53
+ max_ms: number;
54
+ } | {
55
+ type: "custom_smt";
56
+ smt_fragment: string;
57
+ };
58
+ /**
59
+ * Compile an {@link AxiomSpec} into an SMT-LIB v2 program string.
60
+ *
61
+ * Pattern : preconditions are asserted as-is ; postconditions are joined by
62
+ * conjunction and asserted NEGATED. A counterexample (z3 returns `sat`)
63
+ * therefore means : "pre-conditions hold AND at least one post-condition
64
+ * fails" — i.e. an UNSAFE outcome.
65
+ *
66
+ * Includes `(check-sat)` and `(get-model)` as terminating commands.
67
+ */
68
+ export declare function compileToSmt(spec: AxiomSpec): string;
69
+ /**
70
+ * Default per-axiom AxiomSpec presets. Consumers can override the timeout
71
+ * or augment with additional conditions before passing to `formalVerify`.
72
+ *
73
+ * Robuste : 5s — engineering robustness, may need richer checks
74
+ * Institutionnel : 10s — strongest spec, PII + scope-subset + budget
75
+ * SOTA : 2s — lightweight (single ROI check on cost)
76
+ * AntiFragile : 1s — response-time bound only
77
+ * Profitable : 1s — cost-vs-value ROI check
78
+ */
79
+ export declare const AXIOM_SPECS: Record<string, AxiomSpec>;
80
+ //# sourceMappingURL=spec-language.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spec-language.d.ts","sourceRoot":"","sources":["../../../src/verify/formal/spec-language.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH;;GAEG;AACH,MAAM,WAAW,SAAS;IACxB,iEAAiE;IACjE,KAAK,EAAE,MAAM,CAAC;IACd,+DAA+D;IAC/D,aAAa,EAAE,SAAS,EAAE,CAAC;IAC3B,qEAAqE;IACrE,cAAc,EAAE,SAAS,EAAE,CAAC;IAC5B,2DAA2D;IAC3D,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;;;;;GAMG;AACH,MAAM,MAAM,SAAS,GACjB;IAAE,IAAI,EAAE,mBAAmB,CAAC;IAAC,kBAAkB,EAAE,MAAM,CAAA;CAAE,GACzD;IAAE,IAAI,EAAE,cAAc,CAAC;IAAC,YAAY,EAAE,MAAM,EAAE,CAAC;IAAC,WAAW,EAAE,MAAM,EAAE,CAAA;CAAE,GACvE;IAAE,IAAI,EAAE,kBAAkB,CAAC;IAAC,aAAa,CAAC,EAAE,MAAM,CAAA;CAAE,GACpD;IAAE,IAAI,EAAE,mBAAmB,CAAC;IAAC,aAAa,EAAE,MAAM,CAAA;CAAE,GACpD;IAAE,IAAI,EAAE,eAAe,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GACzC;IAAE,IAAI,EAAE,YAAY,CAAC;IAAC,YAAY,EAAE,MAAM,CAAA;CAAE,CAAC;AAiGjD;;;;;;;;;GASG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,SAAS,GAAG,MAAM,CAoEpD;AAMD;;;;;;;;;GASG;AACH,eAAO,MAAM,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAqCjD,CAAC"}
@@ -0,0 +1,219 @@
1
+ /**
2
+ * src/verify/formal/spec-language.ts
3
+ *
4
+ * Sprint-587 — DSL for axiom specifications, compiled to SMT-LIB v2.
5
+ *
6
+ * Design philosophy (inspired by FormalJudge, arXiv:2602.11136) : agent-cycle
7
+ * properties are expressed as small, typed pre/post-condition tuples. Each
8
+ * condition is mapped to an SMT-LIB fragment by {@link compileToSmt}, which
9
+ * frames the property as a NEGATION of the post-conditions under the
10
+ * pre-conditions. This way, Z3 returning `sat` means a counterexample exists
11
+ * (= UNSAFE) and `unsat` means the post-conditions hold (= SAFE).
12
+ *
13
+ * Bound types : Reals for budgets and ratios, Bools for binary properties,
14
+ * Sets-as-symbols for scope subset checks.
15
+ *
16
+ * @module verify/formal/spec-language
17
+ */
18
+ function ensureDecl(ctx, decl, name) {
19
+ if (ctx.declared.has(name))
20
+ return;
21
+ ctx.declared.add(name);
22
+ ctx.declarations.push(decl);
23
+ }
24
+ /**
25
+ * Lower a single Condition into SMT-LIB assertions appended to `ctx`.
26
+ * `negated` flag : when true, the condition is being added as a negated
27
+ * post-condition (i.e. we want to find a counterexample).
28
+ */
29
+ function lowerCondition(c, ctx, negated) {
30
+ switch (c.type) {
31
+ case "budget_constraint": {
32
+ // parent_budget >= 0, child_budget >= 0, child_budget <= parent_budget * fraction
33
+ ensureDecl(ctx, "(declare-const parent_budget Real)", "parent_budget");
34
+ ensureDecl(ctx, "(declare-const child_budget Real)", "child_budget");
35
+ // Positivity is part of the pre-state, always assert.
36
+ ctx.assertions.push("(assert (>= parent_budget 0))");
37
+ ctx.assertions.push("(assert (>= child_budget 0))");
38
+ const expr = `(<= child_budget (* parent_budget ${c.child_max_fraction}))`;
39
+ ctx.assertions.push(`(assert ${negated ? `(not ${expr})` : expr})`);
40
+ return;
41
+ }
42
+ case "scope_subset": {
43
+ // Encode each child element as a Bool : it must be present in parent.
44
+ // We do this by reducing to a boolean conjunction over the listed
45
+ // child elements. Mismatches surface as a counterexample.
46
+ const parentSet = new Set(c.parent_scope);
47
+ const childOk = c.child_scope.every((s) => parentSet.has(s));
48
+ // No declarations needed — fold the result statically into a bool.
49
+ const expr = childOk ? "true" : "false";
50
+ ctx.assertions.push(`(assert ${negated ? `(not ${expr})` : expr})`);
51
+ return;
52
+ }
53
+ case "no_pii_in_output": {
54
+ const name = c.pii_count_var ?? "pii_count";
55
+ ensureDecl(ctx, `(declare-const ${name} Int)`, name);
56
+ // pii_count >= 0 (always)
57
+ ctx.assertions.push(`(assert (>= ${name} 0))`);
58
+ const expr = `(= ${name} 0)`;
59
+ ctx.assertions.push(`(assert ${negated ? `(not ${expr})` : expr})`);
60
+ return;
61
+ }
62
+ case "cost_positive_roi": {
63
+ ensureDecl(ctx, "(declare-const cost Real)", "cost");
64
+ ensureDecl(ctx, "(declare-const value Real)", "value");
65
+ ctx.assertions.push("(assert (> cost 0))");
66
+ ctx.assertions.push("(assert (>= value 0))");
67
+ const expr = `(>= (/ value cost) ${c.min_roi_ratio})`;
68
+ ctx.assertions.push(`(assert ${negated ? `(not ${expr})` : expr})`);
69
+ return;
70
+ }
71
+ case "response_time": {
72
+ ensureDecl(ctx, "(declare-const response_ms Real)", "response_ms");
73
+ ctx.assertions.push("(assert (>= response_ms 0))");
74
+ const expr = `(<= response_ms ${c.max_ms})`;
75
+ ctx.assertions.push(`(assert ${negated ? `(not ${expr})` : expr})`);
76
+ return;
77
+ }
78
+ case "custom_smt": {
79
+ const frag = c.smt_fragment.trim();
80
+ // The custom fragment is expected to be a parenthesised assertion body.
81
+ if (negated) {
82
+ ctx.assertions.push(`(assert (not ${frag}))`);
83
+ }
84
+ else {
85
+ ctx.assertions.push(`(assert ${frag})`);
86
+ }
87
+ return;
88
+ }
89
+ }
90
+ }
91
+ /**
92
+ * Compile an {@link AxiomSpec} into an SMT-LIB v2 program string.
93
+ *
94
+ * Pattern : preconditions are asserted as-is ; postconditions are joined by
95
+ * conjunction and asserted NEGATED. A counterexample (z3 returns `sat`)
96
+ * therefore means : "pre-conditions hold AND at least one post-condition
97
+ * fails" — i.e. an UNSAFE outcome.
98
+ *
99
+ * Includes `(check-sat)` and `(get-model)` as terminating commands.
100
+ */
101
+ export function compileToSmt(spec) {
102
+ const ctx = {
103
+ declared: new Set(),
104
+ declarations: [],
105
+ assertions: [],
106
+ };
107
+ // Header — set logic to QF_LRA (quantifier-free linear real arithmetic
108
+ // plus integers) which covers all our supported condition kinds.
109
+ const header = ["(set-logic ALL)", `; AxiomSpec : ${spec.axiom}`];
110
+ // Preconditions : assert as-is (positive form).
111
+ for (const pre of spec.preconditions) {
112
+ lowerCondition(pre, ctx, false);
113
+ }
114
+ // Postconditions : conjoin and negate.
115
+ // Strategy : assert each one negated separately using De Morgan. We want
116
+ // NOT (post1 AND post2 AND …) ≡ (NOT post1) OR (NOT post2) OR …
117
+ // For check-sat-as-counterexample, we want the solver to find *any*
118
+ // violation, so we encode the disjunction with an auxiliary Bool flag
119
+ // per postcondition. Simpler equivalent : assert (or (not post1) (not post2) …).
120
+ if (spec.postconditions.length === 0) {
121
+ // Empty postcondition set : trivially SAFE (no obligation to verify).
122
+ ctx.assertions.push("(assert false)");
123
+ }
124
+ else if (spec.postconditions.length === 1) {
125
+ lowerCondition(spec.postconditions[0], ctx, true);
126
+ }
127
+ else {
128
+ // Build per-postcondition expression strings via a side-context, then
129
+ // emit a single `(assert (or ...))`.
130
+ const subCtx = {
131
+ declared: ctx.declared,
132
+ declarations: ctx.declarations,
133
+ assertions: [],
134
+ };
135
+ const negatedExprs = [];
136
+ for (const post of spec.postconditions) {
137
+ const before = subCtx.assertions.length;
138
+ lowerCondition(post, subCtx, true);
139
+ // The last appended assertion is "(assert <neg expr>)" or pre-assertions.
140
+ // To recover only the negated post-condition body, we accept that some
141
+ // conditions append additional non-negotiable preconditions (positivity).
142
+ // Those are valid in any case and stay in the main assertion list.
143
+ for (let i = before; i < subCtx.assertions.length; i++) {
144
+ const a = subCtx.assertions[i];
145
+ // Heuristic : split positivity asserts (>= x 0) and the negated body.
146
+ // The negated body always contains "(not ".
147
+ if (a.includes("(not ")) {
148
+ // Extract the inner expr "(not …)" inside the outer assert.
149
+ const inner = a.slice("(assert ".length, -1);
150
+ negatedExprs.push(inner);
151
+ }
152
+ }
153
+ // Drop the negated body assertions from subCtx so we only keep
154
+ // the positivity ones in the main assertion list.
155
+ subCtx.assertions = subCtx.assertions.filter((a) => !a.includes("(not "));
156
+ }
157
+ ctx.assertions = subCtx.assertions;
158
+ ctx.assertions.push(`(assert (or ${negatedExprs.join(" ")}))`);
159
+ }
160
+ return [
161
+ ...header,
162
+ ...ctx.declarations,
163
+ ...ctx.assertions,
164
+ "(check-sat)",
165
+ "(get-model)",
166
+ ].join("\n");
167
+ }
168
+ // ---------------------------------------------------------------------------
169
+ // Pre-built specs for the 5 Vauban axioms
170
+ // ---------------------------------------------------------------------------
171
+ /**
172
+ * Default per-axiom AxiomSpec presets. Consumers can override the timeout
173
+ * or augment with additional conditions before passing to `formalVerify`.
174
+ *
175
+ * Robuste : 5s — engineering robustness, may need richer checks
176
+ * Institutionnel : 10s — strongest spec, PII + scope-subset + budget
177
+ * SOTA : 2s — lightweight (single ROI check on cost)
178
+ * AntiFragile : 1s — response-time bound only
179
+ * Profitable : 1s — cost-vs-value ROI check
180
+ */
181
+ export const AXIOM_SPECS = {
182
+ Robuste: {
183
+ axiom: "Robuste",
184
+ preconditions: [],
185
+ postconditions: [
186
+ { type: "budget_constraint", child_max_fraction: 1.0 },
187
+ { type: "response_time", max_ms: 30_000 },
188
+ ],
189
+ timeout_ms: 5000,
190
+ },
191
+ Institutionnel: {
192
+ axiom: "Institutionnel",
193
+ preconditions: [],
194
+ postconditions: [
195
+ { type: "no_pii_in_output" },
196
+ { type: "budget_constraint", child_max_fraction: 1.0 },
197
+ ],
198
+ timeout_ms: 10_000,
199
+ },
200
+ SOTA: {
201
+ axiom: "SOTA",
202
+ preconditions: [],
203
+ postconditions: [{ type: "cost_positive_roi", min_roi_ratio: 1.0 }],
204
+ timeout_ms: 2000,
205
+ },
206
+ AntiFragile: {
207
+ axiom: "AntiFragile",
208
+ preconditions: [],
209
+ postconditions: [{ type: "response_time", max_ms: 60_000 }],
210
+ timeout_ms: 1000,
211
+ },
212
+ Profitable: {
213
+ axiom: "Profitable",
214
+ preconditions: [],
215
+ postconditions: [{ type: "cost_positive_roi", min_roi_ratio: 1.5 }],
216
+ timeout_ms: 1000,
217
+ },
218
+ };
219
+ //# sourceMappingURL=spec-language.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spec-language.js","sourceRoot":"","sources":["../../../src/verify/formal/spec-language.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,199 @@
1
+ # Run Certificate Verification (Standalone)
2
+
3
+ **Module:** `@vauban-org/agent-sdk/proof/cert-verify` · **Since:** CC v3.1 sprint-562 (Livrable D, 2026-05-14)
4
+
5
+ The standalone verifier in `src/proof/cert-verify.ts` verifies a `SignedRunProofCertificate` without any database or network dependency. It is the verification counterpart to the CC server's signing surface (`src/proof/ed25519-signer.ts`) and implements [draft-vauban-skill-attestation-00 §5](https://datatracker.ietf.org/doc/draft-vauban-skill-attestation/).
6
+
7
+ Suitable for: CI pipelines, third-party integrators, audits, and the `preste attest verify` CLI command.
8
+
9
+ ## Quick start
10
+
11
+ ```typescript
12
+ import { verifyRunCertificate } from "@vauban-org/agent-sdk/proof/cert-verify";
13
+ import { readFileSync } from "node:fs";
14
+
15
+ const cert = JSON.parse(readFileSync("cert.json", "utf-8"));
16
+
17
+ const result = verifyRunCertificate(cert);
18
+
19
+ if (!result.valid) {
20
+ console.error(`Verification failed: ${result.reason} — ${result.details}`);
21
+ process.exit(1);
22
+ }
23
+
24
+ console.log("Certificate valid. hash:", result.recomputed_cert_hash_felt252);
25
+ ```
26
+
27
+ ---
28
+
29
+ ## Imports
30
+
31
+ ```typescript
32
+ import {
33
+ verifyRunCertificate,
34
+ computeCertHashFelt252,
35
+ publicKeyFromSpkiB64,
36
+ CERT_MARKER_FELT,
37
+ } from "@vauban-org/agent-sdk/proof/cert-verify";
38
+
39
+ import type {
40
+ CertVerifyResult,
41
+ CertVerifyFailReason,
42
+ CertVerifyOptions,
43
+ SignedRunProofCertificateLike,
44
+ SignaturePayload,
45
+ } from "@vauban-org/agent-sdk/proof/cert-verify";
46
+ ```
47
+
48
+ ---
49
+
50
+ ## Types
51
+
52
+ ```typescript
53
+ interface CertVerifyResult {
54
+ valid: boolean;
55
+ reason?: CertVerifyFailReason; // only when valid === false
56
+ details?: string; // human-readable context
57
+ recomputed_cert_hash_felt252: string; // always present — useful for debug
58
+ }
59
+
60
+ type CertVerifyFailReason =
61
+ | "missing_signature" // cert.signature field absent
62
+ | "wrong_alg" // alg !== "Ed25519"
63
+ | "hash_mismatch" // embedded cert_hash_felt252 != recomputed
64
+ | "kid_mismatch" // expectedKid set and does not match
65
+ | "pubkey_unresolvable" // SPKI base64 malformed or not Ed25519
66
+ | "signature_invalid" // Ed25519 verify returns false
67
+ | "malformed_signature"; // signature.value is not valid base64 / wrong length
68
+
69
+ interface CertVerifyOptions {
70
+ expectedPublicKey?: KeyObject; // Node.js KeyObject (bypass embedded SPKI)
71
+ expectedKid?: string; // pin to a specific key ID
72
+ }
73
+ ```
74
+
75
+ ---
76
+
77
+ ## `verifyRunCertificate(cert, opts?)`
78
+
79
+ ```typescript
80
+ function verifyRunCertificate(
81
+ cert: SignedRunProofCertificateLike,
82
+ opts?: CertVerifyOptions
83
+ ): CertVerifyResult
84
+ ```
85
+
86
+ Returns synchronously — all crypto is Node.js built-in `node:crypto`. Never throws on verification failure; only throws when `cert` is not a plain object.
87
+
88
+ `recomputed_cert_hash_felt252` is always returned regardless of outcome — use it to debug `hash_mismatch` failures without a separate call.
89
+
90
+ ### Basic verification
91
+
92
+ ```typescript
93
+ const result = verifyRunCertificate(cert);
94
+ if (!result.valid) {
95
+ console.error(`Invalid: ${result.reason} — ${result.details}`);
96
+ }
97
+ ```
98
+
99
+ ### Pin to a known public key (recommended for production)
100
+
101
+ ```typescript
102
+ import { publicKeyFromSpkiB64, verifyRunCertificate } from "@vauban-org/agent-sdk/proof/cert-verify";
103
+
104
+ const pubkey = publicKeyFromSpkiB64(process.env["CC_ATTEST_PUBKEY_SPKI_B64"]!);
105
+
106
+ const result = verifyRunCertificate(cert, { expectedPublicKey: pubkey });
107
+ ```
108
+
109
+ `publicKeyFromSpkiB64` throws if the base64 is malformed or the key is not Ed25519. Call it once at startup and cache the `KeyObject`.
110
+
111
+ ### Pin to a key ID
112
+
113
+ ```typescript
114
+ const result = verifyRunCertificate(cert, {
115
+ expectedKid: "cc-attest-2026-05",
116
+ });
117
+ // → reason: "kid_mismatch" if cert was signed with a different key
118
+ ```
119
+
120
+ ### CI pipeline — exit code gate
121
+
122
+ ```typescript
123
+ import { verifyRunCertificate } from "@vauban-org/agent-sdk/proof/cert-verify";
124
+ import { readFileSync } from "node:fs";
125
+
126
+ const cert = JSON.parse(readFileSync("cert.json", "utf-8"));
127
+ const { valid, reason, recomputed_cert_hash_felt252 } = verifyRunCertificate(cert);
128
+
129
+ console.log(`hash: ${recomputed_cert_hash_felt252}`);
130
+ process.exit(valid ? 0 : 1);
131
+ ```
132
+
133
+ ---
134
+
135
+ ## Verification algorithm
136
+
137
+ Implements draft-vauban-skill-attestation-00 §5. Seven sequential checks — the first failure stops the chain:
138
+
139
+ | Step | Check | Failure reason |
140
+ |------|-------|----------------|
141
+ | 1 | `cert.signature` field is present | `missing_signature` |
142
+ | 2 | `signature.alg === "Ed25519"` | `wrong_alg` |
143
+ | 3 | Strip `signature`, JCS-canonicalize (RFC 8785 subset: sorted keys, `-0 → 0`), SHA-256 first 31 bytes → felt252, Poseidon(`[0x1, sha_felt, CERT_MARKER_FELT]`) — compare with `signature.cert_hash_felt252` | `hash_mismatch` |
144
+ | 4 | If `opts.expectedKid` set, compare with `signature.kid` | `kid_mismatch` |
145
+ | 5 | Resolve public key: `opts.expectedPublicKey` if provided, else `publicKeyFromSpkiB64(signature.pubkey_spki_b64)` | `pubkey_unresolvable` |
146
+ | 6 | Decode `signature.value` from base64, assert 64 bytes | `malformed_signature` |
147
+ | 7 | Ed25519 verify: `crypto.verify(null, felt252Bytes(recomputed), pubkey, sigBytes)` | `signature_invalid` |
148
+
149
+ **`CERT_MARKER_FELT`** is the domain separator — UTF-8 `"run_cert"` encoded as a felt252 (right-aligned, zero-padded). It prevents cross-context signature reuse: a signature over a different cert type cannot satisfy the Poseidon preimage.
150
+
151
+ ---
152
+
153
+ ## `computeCertHashFelt252(cert)`
154
+
155
+ Standalone hash computation — useful for debugging `hash_mismatch` failures.
156
+
157
+ ```typescript
158
+ import { computeCertHashFelt252 } from "@vauban-org/agent-sdk/proof/cert-verify";
159
+
160
+ const expected = cert.signature?.cert_hash_felt252;
161
+ const recomputed = computeCertHashFelt252(cert);
162
+
163
+ if (expected !== recomputed) {
164
+ console.error("Hash mismatch:");
165
+ console.error(" embedded :", expected);
166
+ console.error(" recomputed:", recomputed);
167
+ }
168
+ ```
169
+
170
+ `computeCertHashFelt252` strips the embedded `signature` field before hashing — calling it on a signed cert and on the pre-signature cert produces the same result.
171
+
172
+ ---
173
+
174
+ ## Security considerations
175
+
176
+ !!! warning "Treat embedded `pubkey_spki_b64` as a key-discovery hint, not a security guarantee"
177
+ The `pubkey_spki_b64` field in `signature` helps resolve the signing key for display and debugging, but an attacker can substitute it with their own public key and produce a valid self-consistent signature.
178
+
179
+ For production use, always pin to a known public key via `opts.expectedPublicKey` (loaded from a trusted source such as an environment variable, K8s secret, or a JWKS registry keyed on `signature.kid`). Never accept a certificate as authoritative based solely on its embedded public key.
180
+
181
+ ---
182
+
183
+ ## `preste attest verify` CLI
184
+
185
+ The standalone verifier is the engine behind the CLI command:
186
+
187
+ ```bash
188
+ preste attest verify cert.json
189
+ # Exit 0: certificate valid
190
+ # Exit 1: verification failed — reason printed to stderr
191
+
192
+ preste attest verify cert.json --kid cc-attest-2026-05
193
+ # Adds kid pinning
194
+
195
+ preste attest verify cert.json --pubkey "$CC_ATTEST_PUBKEY_SPKI_B64"
196
+ # Pins to an explicit SPKI base64 public key
197
+ ```
198
+
199
+ The CLI sets `process.exitCode` to `1` on failure so it composes naturally with `&&` in shell scripts and CI steps.