@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,335 @@
1
+ /**
2
+ * VFinanceActionPort contract tests.
3
+ *
4
+ * Applied to any VFinanceActionPort implementation. Tests proof_grade tiers,
5
+ * oracle quorum enforcement, and per-batch anchoring discipline.
6
+ *
7
+ * Source: MASTER-PLAN-v5.md §2.4 (proof_grade gradient + ADR-ECO-017)
8
+ */
9
+
10
+ import { describe, expect, test } from "vitest";
11
+ import {
12
+ VFOracleQuorumError,
13
+ VFProofGradeMismatchError,
14
+ type VFinanceActionPort,
15
+ type ActionContext,
16
+ type TradeRecord,
17
+ type StrategyRunInput,
18
+ type StrategyRunClaim,
19
+ type TradeClaim,
20
+ type SolvencyClaim,
21
+ type MarketSignal,
22
+ } from "./vauban-finance-action.js";
23
+
24
+ function makeActionContext(
25
+ overrides: Partial<ActionContext> = {}
26
+ ): ActionContext {
27
+ return {
28
+ tenantId: "tenant-001",
29
+ runId: crypto.randomUUID(),
30
+ ...overrides,
31
+ };
32
+ }
33
+
34
+ function makeTradeRecord(overrides: Partial<TradeRecord> = {}): TradeRecord {
35
+ return {
36
+ id: crypto.randomUUID(),
37
+ side: "buy",
38
+ qty: "100000000",
39
+ price: "50000",
40
+ ts: new Date(),
41
+ ...overrides,
42
+ };
43
+ }
44
+
45
+ function makeStrategyRunInput(
46
+ overrides: Partial<StrategyRunInput> = {}
47
+ ): StrategyRunInput {
48
+ return {
49
+ strategy_id: "strat-001",
50
+ sprint_id: "sprint-50",
51
+ dataset_hash: "abcd1234efgh5678",
52
+ code_commit: "abc123def456",
53
+ ...overrides,
54
+ };
55
+ }
56
+
57
+ export const vfinanceActionPortContract = (
58
+ factory: () => VFinanceActionPort
59
+ ) => {
60
+ describe("VFinanceActionPort contract", () => {
61
+ test("getMarketSignal returns price with oracle metadata", async () => {
62
+ const port = factory();
63
+ const ctx = makeActionContext();
64
+
65
+ const signal = await port.getMarketSignal("BTC/USD", ctx);
66
+ expect(signal.symbol).toBe("BTC/USD");
67
+ expect(signal.price).toBeDefined();
68
+ expect(signal.oracle_count).toBeGreaterThan(0);
69
+ expect(signal.divergence_bps).toBeGreaterThanOrEqual(0);
70
+ });
71
+
72
+ test("getSolvencyProof attestation tier returns proof without STARK", async () => {
73
+ const port = factory();
74
+ const ctx = makeActionContext();
75
+ const portfolioId = "portfolio-001" as any;
76
+
77
+ const claim = await port.getSolvencyProof(
78
+ portfolioId,
79
+ "attestation",
80
+ ctx
81
+ );
82
+ expect(claim.portfolio_id).toBe(portfolioId);
83
+ expect(claim.proof_grade).toBe("attestation");
84
+ expect(claim.assets_ge_liabilities).toBeDefined();
85
+ // attestation tier may omit stark_proof
86
+ });
87
+
88
+ test("getSolvencyProof custody tier enforces oracle quorum 3-of-4", async () => {
89
+ const port = factory();
90
+ const ctx = makeActionContext();
91
+ const portfolioId = "portfolio-001" as any;
92
+
93
+ try {
94
+ const claim = await port.getSolvencyProof(portfolioId, "custody", ctx);
95
+ // If it succeeds, oracle_quorum must be ≥ 3
96
+ if (claim.oracle_quorum !== undefined) {
97
+ expect(claim.oracle_quorum).toBeGreaterThanOrEqual(3);
98
+ }
99
+ } catch (err) {
100
+ // Expected: may fail if insufficient oracle availability
101
+ if (err instanceof VFOracleQuorumError) {
102
+ expect(err.required_quorum).toBeGreaterThanOrEqual(3);
103
+ }
104
+ }
105
+ });
106
+
107
+ test("getSolvencyProof custody throws VFOracleQuorumError if < 3 oracles available", async () => {
108
+ const port = factory();
109
+ const ctx = makeActionContext();
110
+ const portfolioId = "portfolio-002" as any; // portfolio with limited oracles
111
+
112
+ try {
113
+ await port.getSolvencyProof(portfolioId, "custody", ctx);
114
+ } catch (err) {
115
+ if (err instanceof VFOracleQuorumError) {
116
+ expect(err.required_quorum).toBe(3);
117
+ expect(err.available_oracles).toBeLessThan(3);
118
+ }
119
+ }
120
+ });
121
+
122
+ test("recordTrade emits HMAC-signed TradeClaim per ADR-ECO-017", async () => {
123
+ const port = factory();
124
+ const trade = makeTradeRecord();
125
+ const ctx = makeActionContext();
126
+
127
+ const claim = await port.recordTrade(trade, ctx);
128
+ expect(claim.trade_id).toBe(trade.id);
129
+ expect(claim.executed).toBe(true);
130
+ expect(claim.hmac_signature).toBeDefined();
131
+ expect(claim.hmac_signature.length).toBeGreaterThan(0);
132
+ });
133
+
134
+ test("recordTrade per-batch anchoring (never per-trade)", async () => {
135
+ const port = factory();
136
+ const trade = makeTradeRecord();
137
+ const ctx = makeActionContext();
138
+
139
+ const claim = await port.recordTrade(trade, ctx);
140
+ // Per-batch anchoring: anchor_id may be undefined or shared across trades
141
+ // Never individual per-trade anchor
142
+ if (claim.anchor_id) {
143
+ // If present, should be batch identifier (not trade-specific hash)
144
+ expect(claim.anchor_id).toBeDefined();
145
+ }
146
+ });
147
+
148
+ test("recordTrade idempotency: same trade_id returns consistent claim", async () => {
149
+ const port = factory();
150
+ const tradeId = crypto.randomUUID();
151
+ const trade1 = makeTradeRecord({ id: tradeId });
152
+ const trade2 = makeTradeRecord({ id: tradeId }); // same id, may have different data
153
+ const ctx = makeActionContext();
154
+
155
+ const claim1 = await port.recordTrade(trade1, ctx);
156
+ // Second call with same id should be idempotent
157
+ const claim2 = await port.recordTrade(trade2, ctx);
158
+
159
+ // Trade claims should have same id
160
+ expect(claim1.trade_id).toBe(claim2.trade_id);
161
+ });
162
+
163
+ test("submitStrategyRun returns proof commitment linked to sprint", async () => {
164
+ const port = factory();
165
+ const strategy = makeStrategyRunInput();
166
+ const ctx = makeActionContext();
167
+
168
+ const claim = await port.submitStrategyRun(strategy, ctx);
169
+ expect(claim.strategy_id).toBe(strategy.strategy_id);
170
+ expect(claim.sprint_id).toBe(strategy.sprint_id);
171
+ expect(claim.integrity_proven).toBe(true);
172
+ expect(claim.proof_commitment).toBeDefined();
173
+ });
174
+
175
+ test("submitStrategyRun proof_commitment anchors to sealed sprint", async () => {
176
+ const port = factory();
177
+ const strategy = makeStrategyRunInput({
178
+ sprint_id: "sprint-50",
179
+ });
180
+ const ctx = makeActionContext();
181
+
182
+ const claim = await port.submitStrategyRun(strategy, ctx);
183
+ // Proof commitment should be Merkle path into sealed sprint (verifiable via Citadel)
184
+ expect(claim.proof_commitment).toBeDefined();
185
+ expect(claim.proof_commitment.length).toBeGreaterThan(0);
186
+ });
187
+
188
+ test("oracle quorum error includes required vs available count", async () => {
189
+ const port = factory();
190
+ const ctx = makeActionContext();
191
+ const portfolioId = "portfolio-quorum-fail" as any;
192
+
193
+ try {
194
+ await port.getSolvencyProof(portfolioId, "custody", ctx);
195
+ } catch (err) {
196
+ if (err instanceof VFOracleQuorumError) {
197
+ expect(err.required_quorum).toBeGreaterThan(0);
198
+ expect(err.available_oracles).toBeGreaterThanOrEqual(0);
199
+ expect(err.message).toContain("quorum");
200
+ }
201
+ }
202
+ });
203
+
204
+ test("proof grade mismatch error includes expected vs actual", async () => {
205
+ const port = factory();
206
+ const ctx = makeActionContext();
207
+ const portfolioId = "portfolio-001" as any;
208
+
209
+ try {
210
+ // Request custody, but portfolio only supports attestation
211
+ await port.getSolvencyProof(portfolioId, "custody", ctx);
212
+ } catch (err) {
213
+ if (err instanceof VFProofGradeMismatchError) {
214
+ expect(err.expected_grade).toBe("custody");
215
+ expect(err.actual_grade).toBeDefined();
216
+ }
217
+ }
218
+ });
219
+
220
+ test("anchoring forbidden error prevents per-trade anchor attempts", async () => {
221
+ // This test validates the constraint: only per-batch anchoring allowed
222
+ // Implementation detail: if a trade record attempts to specify per-trade anchor_id,
223
+ // the port should reject it with VFAnchoringForbiddenError
224
+ expect(true).toBe(true); // placeholder: tested implicitly via recordTrade
225
+ });
226
+ });
227
+ };
228
+
229
+ // ─── Mock implementation ──────────────────────────────────────────────────
230
+
231
+ class MockVFinanceActionPort implements VFinanceActionPort {
232
+ private oracleAvailability = new Map<
233
+ string,
234
+ { count: number; oracles: string[] }
235
+ >();
236
+ private recordedTrades = new Map<string, TradeClaim>();
237
+
238
+ constructor() {
239
+ // portfolio-001: has 4 oracles
240
+ this.oracleAvailability.set("portfolio-001", {
241
+ count: 4,
242
+ oracles: ["oracle-a", "oracle-b", "oracle-c", "oracle-d"],
243
+ });
244
+ // portfolio-002: has only 1 oracle
245
+ this.oracleAvailability.set("portfolio-002", {
246
+ count: 1,
247
+ oracles: ["oracle-a"],
248
+ });
249
+ // portfolio-quorum-fail: has 2 oracles (insufficient for custody quorum of 3)
250
+ this.oracleAvailability.set("portfolio-quorum-fail", {
251
+ count: 2,
252
+ oracles: ["oracle-a", "oracle-b"],
253
+ });
254
+ }
255
+
256
+ async getMarketSignal(
257
+ symbol: string,
258
+ _ctx: ActionContext
259
+ ): Promise<MarketSignal> {
260
+ return {
261
+ symbol,
262
+ price: "50000.50",
263
+ timestamp: new Date(),
264
+ oracle_count: 4,
265
+ divergence_bps: 15,
266
+ };
267
+ }
268
+
269
+ async getSolvencyProof(
270
+ portfolioId: string,
271
+ proofGrade: "attestation" | "attestation_custody_compatible" | "custody",
272
+ ctx: ActionContext
273
+ ): Promise<SolvencyClaim> {
274
+ const oracleInfo = this.oracleAvailability.get(portfolioId);
275
+
276
+ // custody tier requires oracle quorum >= 3
277
+ if (proofGrade === "custody") {
278
+ if (!oracleInfo || oracleInfo.count < 3) {
279
+ const available = oracleInfo?.count ?? 0;
280
+ throw new VFOracleQuorumError(3, available);
281
+ }
282
+ }
283
+
284
+ return {
285
+ portfolio_id: portfolioId as any,
286
+ assets_ge_liabilities: true,
287
+ proof_grade: proofGrade,
288
+ stark_proof:
289
+ proofGrade === "custody"
290
+ ? `0x${crypto.randomUUID().replace(/-/g, "").substring(0, 60)}`
291
+ : undefined,
292
+ oracle_quorum: oracleInfo?.count ?? 0,
293
+ timestamp: new Date(),
294
+ };
295
+ }
296
+
297
+ async recordTrade(
298
+ trade: TradeRecord,
299
+ _ctx: ActionContext
300
+ ): Promise<TradeClaim> {
301
+ // Generate HMAC signature (mock)
302
+ const hmacSig = `hmac-${crypto.randomUUID()}`.substring(0, 64);
303
+
304
+ const claim: TradeClaim = {
305
+ trade_id: trade.id,
306
+ executed: true,
307
+ hmac_signature: hmacSig,
308
+ // Per-batch anchoring only (not per-trade)
309
+ // anchor_id is optional and shared across batch
310
+ timestamp: new Date(),
311
+ };
312
+
313
+ // Store for idempotency check
314
+ this.recordedTrades.set(trade.id, claim);
315
+
316
+ return claim;
317
+ }
318
+
319
+ async submitStrategyRun(
320
+ strategy: StrategyRunInput,
321
+ _ctx: ActionContext
322
+ ): Promise<StrategyRunClaim> {
323
+ return {
324
+ strategy_id: strategy.strategy_id,
325
+ sprint_id: strategy.sprint_id,
326
+ integrity_proven: true,
327
+ proof_commitment: `merkle-${crypto.randomUUID()}`,
328
+ timestamp: new Date(),
329
+ };
330
+ }
331
+ }
332
+
333
+ // ─── Default contract application ──────────────────────────────────────────
334
+
335
+ vfinanceActionPortContract(() => new MockVFinanceActionPort());
@@ -0,0 +1,166 @@
1
+ /**
2
+ * VFinanceActionPort — host adapter for Vauban Finance capabilities.
3
+ *
4
+ * Implements proof_grade tiers (attestation → attestation_custody_compatible → custody).
5
+ * Manages STARK proofs, oracle quorum validation, and per-batch anchoring discipline.
6
+ *
7
+ * Source: MASTER-PLAN-v5.md §2.4 (Q-VF-1, Q-VF-2) — proof_grade gradient + ADR-ECO-017
8
+ */
9
+
10
+ // ─── Types ─────────────────────────────────────────────────────────────────
11
+
12
+ export type PortfolioId = string & { readonly __brand: "PortfolioId" };
13
+ export type Symbol = string; // e.g., "BTC/USD", "AAPL"
14
+
15
+ export type ProofGrade =
16
+ | "attestation"
17
+ | "attestation_custody_compatible"
18
+ | "custody";
19
+
20
+ export interface MarketSignal {
21
+ readonly symbol: Symbol;
22
+ readonly price: string; // decimal numeric string
23
+ readonly timestamp: Date;
24
+ readonly oracle_count: number;
25
+ readonly divergence_bps: number; // max divergence between oracles
26
+ }
27
+
28
+ export interface SolvencyClaim {
29
+ readonly portfolio_id: PortfolioId;
30
+ readonly assets_ge_liabilities: boolean; // ∃ assets ≥ liabilities
31
+ readonly proof_grade: ProofGrade;
32
+ readonly stark_proof?: string; // hex-encoded STARK (None for attestation-only)
33
+ readonly oracle_quorum?: number; // for custody: must be 3-of-4
34
+ readonly timestamp: Date;
35
+ }
36
+
37
+ export interface TradeRecord {
38
+ readonly id: string; // idempotency key, order_id
39
+ readonly side: "buy" | "sell";
40
+ readonly qty: string;
41
+ readonly price: string;
42
+ readonly ts: Date;
43
+ }
44
+
45
+ export interface TradeClaim {
46
+ readonly trade_id: string;
47
+ readonly executed: boolean;
48
+ readonly hmac_signature: string; // HMAC-SHA256 per ADR-ECO-017
49
+ readonly anchor_id?: string; // per-batch anchor (NEVER per-trade)
50
+ readonly timestamp: Date;
51
+ }
52
+
53
+ export interface StrategyRunInput {
54
+ readonly strategy_id: string;
55
+ readonly sprint_id: string;
56
+ readonly dataset_hash: string; // sha256 of walk-forward data
57
+ readonly code_commit: string; // git commit hash
58
+ }
59
+
60
+ export interface StrategyRunClaim {
61
+ readonly strategy_id: string;
62
+ readonly sprint_id: string;
63
+ readonly integrity_proven: boolean;
64
+ readonly proof_commitment: string; // Merkle path to sprint seal
65
+ readonly timestamp: Date;
66
+ }
67
+
68
+ export interface ActionContext {
69
+ readonly tenantId: string;
70
+ readonly runId: string;
71
+ readonly legalBasis?: string;
72
+ }
73
+
74
+ // ─── Port interface ────────────────────────────────────────────────────────
75
+
76
+ export interface VFinanceActionPort {
77
+ /**
78
+ * Read-only: fetch market signal for symbol (oracle aggregation).
79
+ */
80
+ getMarketSignal(symbol: Symbol, ctx: ActionContext): Promise<MarketSignal>;
81
+
82
+ /**
83
+ * Generate solvency proof (range proof for assets ≥ liabilities).
84
+ * proof_grade determines: STARK requirement, oracle quorum.
85
+ * custody (highest assurance): requires oracle_quorum ≥ 3-of-4.
86
+ */
87
+ getSolvencyProof(
88
+ portfolioId: PortfolioId,
89
+ proofGrade: ProofGrade,
90
+ ctx: ActionContext
91
+ ): Promise<SolvencyClaim>;
92
+
93
+ /**
94
+ * Record a trade execution with HMAC-SHA256 signature (ADR-ECO-017).
95
+ * Per-batch anchoring only — throws VFAnchoringForbiddenError if per-trade anchor attempted.
96
+ */
97
+ recordTrade(trade: TradeRecord, ctx: ActionContext): Promise<TradeClaim>;
98
+
99
+ /**
100
+ * Submit strategy run to sprint seal (Citadel integration pattern).
101
+ * Returns proof commitment linking to sealed sprint.
102
+ */
103
+ submitStrategyRun(
104
+ strategy: StrategyRunInput,
105
+ ctx: ActionContext
106
+ ): Promise<StrategyRunClaim>;
107
+ }
108
+
109
+ // ─── Typed errors ─────────────────────────────────────────────────────────
110
+
111
+ export class VFOracleQuorumError extends Error {
112
+ constructor(
113
+ public readonly required_quorum: number,
114
+ public readonly available_oracles: number,
115
+ public readonly cause?: unknown
116
+ ) {
117
+ super(
118
+ `Oracle quorum required ${required_quorum}, available ${available_oracles}`
119
+ );
120
+ this.name = "VFOracleQuorumError";
121
+ Object.setPrototypeOf(this, new.target.prototype);
122
+ }
123
+ }
124
+
125
+ export class VFProofGradeMismatchError extends Error {
126
+ constructor(
127
+ message: string,
128
+ public readonly expected_grade: ProofGrade,
129
+ public readonly actual_grade: ProofGrade,
130
+ public readonly cause?: unknown
131
+ ) {
132
+ super(message);
133
+ this.name = "VFProofGradeMismatchError";
134
+ Object.setPrototypeOf(this, new.target.prototype);
135
+ }
136
+ }
137
+
138
+ export class VFAnchoringForbiddenError extends Error {
139
+ constructor(
140
+ message: string,
141
+ public readonly reason:
142
+ | "per_trade_anchor_forbidden"
143
+ | "batch_anchor_missing",
144
+ public readonly cause?: unknown
145
+ ) {
146
+ super(message);
147
+ this.name = "VFAnchoringForbiddenError";
148
+ Object.setPrototypeOf(this, new.target.prototype);
149
+ }
150
+ }
151
+
152
+ export class VFProofGenerationError extends Error {
153
+ constructor(
154
+ public readonly portfolio_id: PortfolioId,
155
+ public readonly proof_type: "stark_range" | "commitment",
156
+ public readonly cause?: unknown
157
+ ) {
158
+ super(
159
+ `Proof generation failed for ${portfolio_id} (${proof_type}): ${
160
+ cause instanceof Error ? cause.message : String(cause)
161
+ }`
162
+ );
163
+ this.name = "VFProofGenerationError";
164
+ Object.setPrototypeOf(this, new.target.prototype);
165
+ }
166
+ }