open-multi-agent-kit 0.99.0 → 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 (464) hide show
  1. package/CHANGELOG.md +30 -1
  2. package/README.md +3 -3
  3. package/dist/bun/cli.d.ts.map +1 -1
  4. package/dist/bun/cli.js +1 -0
  5. package/dist/bun/cli.js.map +1 -1
  6. package/dist/bun/register-bundled-coding-agent.d.ts +10 -0
  7. package/dist/bun/register-bundled-coding-agent.d.ts.map +1 -0
  8. package/dist/bun/register-bundled-coding-agent.js +12 -0
  9. package/dist/bun/register-bundled-coding-agent.js.map +1 -0
  10. package/dist/cli/args.d.ts +1 -1
  11. package/dist/cli/args.d.ts.map +1 -1
  12. package/dist/cli/args.js +1 -1
  13. package/dist/cli/args.js.map +1 -1
  14. package/dist/cli/help.d.ts.map +1 -1
  15. package/dist/cli/help.js +2 -1
  16. package/dist/cli/help.js.map +1 -1
  17. package/dist/cli.d.ts.map +1 -1
  18. package/dist/cli.js +14 -2
  19. package/dist/cli.js.map +1 -1
  20. package/dist/commands/neo-cli.d.ts +9 -0
  21. package/dist/commands/neo-cli.d.ts.map +1 -0
  22. package/dist/commands/neo-cli.js +61 -0
  23. package/dist/commands/neo-cli.js.map +1 -0
  24. package/dist/coordination/awareness.d.ts +32 -0
  25. package/dist/coordination/awareness.d.ts.map +1 -0
  26. package/dist/coordination/awareness.js +55 -0
  27. package/dist/coordination/awareness.js.map +1 -0
  28. package/dist/coordination/broker.d.ts +79 -0
  29. package/dist/coordination/broker.d.ts.map +1 -0
  30. package/dist/coordination/broker.js +195 -0
  31. package/dist/coordination/broker.js.map +1 -0
  32. package/dist/coordination/index.d.ts +16 -0
  33. package/dist/coordination/index.d.ts.map +1 -0
  34. package/dist/coordination/index.js +16 -0
  35. package/dist/coordination/index.js.map +1 -0
  36. package/dist/coordination/integration.d.ts +59 -0
  37. package/dist/coordination/integration.d.ts.map +1 -0
  38. package/dist/coordination/integration.js +126 -0
  39. package/dist/coordination/integration.js.map +1 -0
  40. package/dist/coordination/operation.d.ts +106 -0
  41. package/dist/coordination/operation.d.ts.map +1 -0
  42. package/dist/coordination/operation.js +179 -0
  43. package/dist/coordination/operation.js.map +1 -0
  44. package/dist/coordination/resource.d.ts +33 -0
  45. package/dist/coordination/resource.d.ts.map +1 -0
  46. package/dist/coordination/resource.js +89 -0
  47. package/dist/coordination/resource.js.map +1 -0
  48. package/dist/coordination/session.d.ts +74 -0
  49. package/dist/coordination/session.d.ts.map +1 -0
  50. package/dist/coordination/session.js +143 -0
  51. package/dist/coordination/session.js.map +1 -0
  52. package/dist/coordination/types.d.ts +68 -0
  53. package/dist/coordination/types.d.ts.map +1 -0
  54. package/dist/coordination/types.js +26 -0
  55. package/dist/coordination/types.js.map +1 -0
  56. package/dist/core/agent-session.d.ts +29 -2
  57. package/dist/core/agent-session.d.ts.map +1 -1
  58. package/dist/core/agent-session.js +135 -37
  59. package/dist/core/agent-session.js.map +1 -1
  60. package/dist/core/bundled-skills.d.ts +4 -0
  61. package/dist/core/bundled-skills.d.ts.map +1 -0
  62. package/dist/core/bundled-skills.js +32 -0
  63. package/dist/core/bundled-skills.js.map +1 -0
  64. package/dist/core/cli-diagnostics.d.ts +6 -0
  65. package/dist/core/cli-diagnostics.d.ts.map +1 -0
  66. package/dist/core/cli-diagnostics.js +20 -0
  67. package/dist/core/cli-diagnostics.js.map +1 -0
  68. package/dist/core/compaction/control-state.d.ts +41 -0
  69. package/dist/core/compaction/control-state.d.ts.map +1 -0
  70. package/dist/core/compaction/control-state.js +85 -0
  71. package/dist/core/compaction/control-state.js.map +1 -0
  72. package/dist/core/compaction/fallback.d.ts +60 -0
  73. package/dist/core/compaction/fallback.d.ts.map +1 -0
  74. package/dist/core/compaction/fallback.js +117 -0
  75. package/dist/core/compaction/fallback.js.map +1 -0
  76. package/dist/core/compaction/index.d.ts +2 -0
  77. package/dist/core/compaction/index.d.ts.map +1 -1
  78. package/dist/core/compaction/index.js +2 -0
  79. package/dist/core/compaction/index.js.map +1 -1
  80. package/dist/core/context-budget-headroom-candidates.d.ts +16 -1
  81. package/dist/core/context-budget-headroom-candidates.d.ts.map +1 -1
  82. package/dist/core/context-budget-headroom-candidates.js +31 -13
  83. package/dist/core/context-budget-headroom-candidates.js.map +1 -1
  84. package/dist/core/context-budget-headroom-types.d.ts +7 -1
  85. package/dist/core/context-budget-headroom-types.d.ts.map +1 -1
  86. package/dist/core/context-budget-headroom-types.js +0 -1
  87. package/dist/core/context-budget-headroom-types.js.map +1 -1
  88. package/dist/core/context-budget-headroom.d.ts +22 -0
  89. package/dist/core/context-budget-headroom.d.ts.map +1 -1
  90. package/dist/core/context-budget-headroom.js +46 -2
  91. package/dist/core/context-budget-headroom.js.map +1 -1
  92. package/dist/core/context-budget-v2-global-pass.d.ts +21 -0
  93. package/dist/core/context-budget-v2-global-pass.d.ts.map +1 -0
  94. package/dist/core/context-budget-v2-global-pass.js +203 -0
  95. package/dist/core/context-budget-v2-global-pass.js.map +1 -0
  96. package/dist/core/context-budget-v2-input-validation.d.ts +4 -0
  97. package/dist/core/context-budget-v2-input-validation.d.ts.map +1 -0
  98. package/dist/core/context-budget-v2-input-validation.js +79 -0
  99. package/dist/core/context-budget-v2-input-validation.js.map +1 -0
  100. package/dist/core/context-budget-v2-observability.d.ts +15 -0
  101. package/dist/core/context-budget-v2-observability.d.ts.map +1 -0
  102. package/dist/core/context-budget-v2-observability.js +35 -0
  103. package/dist/core/context-budget-v2-observability.js.map +1 -0
  104. package/dist/core/context-budget-v2-planned-items.d.ts +17 -0
  105. package/dist/core/context-budget-v2-planned-items.d.ts.map +1 -0
  106. package/dist/core/context-budget-v2-planned-items.js +59 -0
  107. package/dist/core/context-budget-v2-planned-items.js.map +1 -0
  108. package/dist/core/context-budget-v2-planner.d.ts.map +1 -1
  109. package/dist/core/context-budget-v2-planner.js +69 -51
  110. package/dist/core/context-budget-v2-planner.js.map +1 -1
  111. package/dist/core/context-budget-v2-scoring.d.ts +7 -1
  112. package/dist/core/context-budget-v2-scoring.d.ts.map +1 -1
  113. package/dist/core/context-budget-v2-scoring.js.map +1 -1
  114. package/dist/core/context-budget-v2-selection.d.ts +22 -3
  115. package/dist/core/context-budget-v2-selection.d.ts.map +1 -1
  116. package/dist/core/context-budget-v2-selection.js +41 -59
  117. package/dist/core/context-budget-v2-selection.js.map +1 -1
  118. package/dist/core/context-budget-v2-tiers.d.ts.map +1 -1
  119. package/dist/core/context-budget-v2-tiers.js +9 -42
  120. package/dist/core/context-budget-v2-tiers.js.map +1 -1
  121. package/dist/core/context-budget-v2-types.d.ts +14 -2
  122. package/dist/core/context-budget-v2-types.d.ts.map +1 -1
  123. package/dist/core/context-budget-v2-types.js +6 -1
  124. package/dist/core/context-budget-v2-types.js.map +1 -1
  125. package/dist/core/extensions/bundled-virtual-modules.d.ts +15 -0
  126. package/dist/core/extensions/bundled-virtual-modules.d.ts.map +1 -0
  127. package/dist/core/extensions/bundled-virtual-modules.js +63 -0
  128. package/dist/core/extensions/bundled-virtual-modules.js.map +1 -0
  129. package/dist/core/extensions/loader.d.ts.map +1 -1
  130. package/dist/core/extensions/loader.js +2 -42
  131. package/dist/core/extensions/loader.js.map +1 -1
  132. package/dist/core/extensions/runner.d.ts +1 -0
  133. package/dist/core/extensions/runner.d.ts.map +1 -1
  134. package/dist/core/extensions/runner.js +6 -0
  135. package/dist/core/extensions/runner.js.map +1 -1
  136. package/dist/core/extensions/types.d.ts +10 -0
  137. package/dist/core/extensions/types.d.ts.map +1 -1
  138. package/dist/core/extensions/types.js.map +1 -1
  139. package/dist/core/index.d.ts +2 -1
  140. package/dist/core/index.d.ts.map +1 -1
  141. package/dist/core/index.js +2 -1
  142. package/dist/core/index.js.map +1 -1
  143. package/dist/core/loadout-runtime.d.ts +2 -8
  144. package/dist/core/loadout-runtime.d.ts.map +1 -1
  145. package/dist/core/loadout-runtime.js.map +1 -1
  146. package/dist/core/mcp/client.d.ts +27 -6
  147. package/dist/core/mcp/client.d.ts.map +1 -1
  148. package/dist/core/mcp/client.js +80 -20
  149. package/dist/core/mcp/client.js.map +1 -1
  150. package/dist/core/mcp/manager.d.ts +10 -1
  151. package/dist/core/mcp/manager.d.ts.map +1 -1
  152. package/dist/core/mcp/manager.js +68 -9
  153. package/dist/core/mcp/manager.js.map +1 -1
  154. package/dist/core/mcp/protocol.d.ts +9 -3
  155. package/dist/core/mcp/protocol.d.ts.map +1 -1
  156. package/dist/core/mcp/protocol.js +61 -15
  157. package/dist/core/mcp/protocol.js.map +1 -1
  158. package/dist/core/mcp/stdio-transport.d.ts +12 -1
  159. package/dist/core/mcp/stdio-transport.d.ts.map +1 -1
  160. package/dist/core/mcp/stdio-transport.js +30 -2
  161. package/dist/core/mcp/stdio-transport.js.map +1 -1
  162. package/dist/core/mcp-descriptor-injection.d.ts +26 -0
  163. package/dist/core/mcp-descriptor-injection.d.ts.map +1 -0
  164. package/dist/core/mcp-descriptor-injection.js +25 -0
  165. package/dist/core/mcp-descriptor-injection.js.map +1 -0
  166. package/dist/core/mcp-public-presets.d.ts +1 -3
  167. package/dist/core/mcp-public-presets.d.ts.map +1 -1
  168. package/dist/core/mcp-public-presets.js +3 -15
  169. package/dist/core/mcp-public-presets.js.map +1 -1
  170. package/dist/core/model-registry.d.ts.map +1 -1
  171. package/dist/core/model-registry.js +24 -3
  172. package/dist/core/model-registry.js.map +1 -1
  173. package/dist/core/neo/catalog.d.ts +20 -0
  174. package/dist/core/neo/catalog.d.ts.map +1 -0
  175. package/dist/core/neo/catalog.js +50 -0
  176. package/dist/core/neo/catalog.js.map +1 -0
  177. package/dist/core/neo/setup.d.ts +3 -0
  178. package/dist/core/neo/setup.d.ts.map +1 -0
  179. package/dist/core/neo/setup.js +47 -0
  180. package/dist/core/neo/setup.js.map +1 -0
  181. package/dist/core/provider-default-models.d.ts +2 -0
  182. package/dist/core/provider-default-models.d.ts.map +1 -1
  183. package/dist/core/provider-default-models.js +2 -0
  184. package/dist/core/provider-default-models.js.map +1 -1
  185. package/dist/core/provider-display-names.d.ts.map +1 -1
  186. package/dist/core/provider-display-names.js +2 -0
  187. package/dist/core/provider-display-names.js.map +1 -1
  188. package/dist/core/provider-error-classification.d.ts +57 -0
  189. package/dist/core/provider-error-classification.d.ts.map +1 -0
  190. package/dist/core/provider-error-classification.js +103 -0
  191. package/dist/core/provider-error-classification.js.map +1 -0
  192. package/dist/core/provider-resilience.d.ts +10 -0
  193. package/dist/core/provider-resilience.d.ts.map +1 -1
  194. package/dist/core/provider-resilience.js +36 -3
  195. package/dist/core/provider-resilience.js.map +1 -1
  196. package/dist/core/provider-usage-commandcode.d.ts +9 -0
  197. package/dist/core/provider-usage-commandcode.d.ts.map +1 -0
  198. package/dist/core/provider-usage-commandcode.js +198 -0
  199. package/dist/core/provider-usage-commandcode.js.map +1 -0
  200. package/dist/core/provider-usage-devin.d.ts +5 -3
  201. package/dist/core/provider-usage-devin.d.ts.map +1 -1
  202. package/dist/core/provider-usage-devin.js +15 -5
  203. package/dist/core/provider-usage-devin.js.map +1 -1
  204. package/dist/core/provider-usage-types.d.ts +1 -1
  205. package/dist/core/provider-usage-types.d.ts.map +1 -1
  206. package/dist/core/provider-usage-types.js.map +1 -1
  207. package/dist/core/provider-usage.d.ts.map +1 -1
  208. package/dist/core/provider-usage.js +6 -0
  209. package/dist/core/provider-usage.js.map +1 -1
  210. package/dist/core/reasoning-router-resolver.d.ts +7 -0
  211. package/dist/core/reasoning-router-resolver.d.ts.map +1 -1
  212. package/dist/core/reasoning-router-resolver.js +21 -3
  213. package/dist/core/reasoning-router-resolver.js.map +1 -1
  214. package/dist/core/reasoning-router-v4.d.ts +8 -5
  215. package/dist/core/reasoning-router-v4.d.ts.map +1 -1
  216. package/dist/core/reasoning-router-v4.js +8 -5
  217. package/dist/core/reasoning-router-v4.js.map +1 -1
  218. package/dist/core/resource-admission.d.ts +36 -0
  219. package/dist/core/resource-admission.d.ts.map +1 -1
  220. package/dist/core/resource-admission.js +59 -0
  221. package/dist/core/resource-admission.js.map +1 -1
  222. package/dist/core/resource-loader.d.ts.map +1 -1
  223. package/dist/core/resource-loader.js +2 -2
  224. package/dist/core/resource-loader.js.map +1 -1
  225. package/dist/core/run-usage-ledger.d.ts +47 -0
  226. package/dist/core/run-usage-ledger.d.ts.map +1 -0
  227. package/dist/core/run-usage-ledger.js +162 -0
  228. package/dist/core/run-usage-ledger.js.map +1 -0
  229. package/dist/core/run-usage-operation.d.ts +8 -0
  230. package/dist/core/run-usage-operation.d.ts.map +1 -0
  231. package/dist/core/run-usage-operation.js +12 -0
  232. package/dist/core/run-usage-operation.js.map +1 -0
  233. package/dist/core/sdk.d.ts.map +1 -1
  234. package/dist/core/sdk.js +5 -6
  235. package/dist/core/sdk.js.map +1 -1
  236. package/dist/core/session-compaction-service.d.ts +15 -0
  237. package/dist/core/session-compaction-service.d.ts.map +1 -1
  238. package/dist/core/session-compaction-service.js +17 -4
  239. package/dist/core/session-compaction-service.js.map +1 -1
  240. package/dist/core/session-failure-cause.d.ts.map +1 -1
  241. package/dist/core/session-failure-cause.js +14 -5
  242. package/dist/core/session-failure-cause.js.map +1 -1
  243. package/dist/core/session-prompt-lifecycle.d.ts +6 -0
  244. package/dist/core/session-prompt-lifecycle.d.ts.map +1 -1
  245. package/dist/core/session-prompt-lifecycle.js +47 -2
  246. package/dist/core/session-prompt-lifecycle.js.map +1 -1
  247. package/dist/core/session-termination.d.ts.map +1 -1
  248. package/dist/core/session-termination.js +4 -2
  249. package/dist/core/session-termination.js.map +1 -1
  250. package/dist/core/subagent-lane-authority.d.ts +28 -0
  251. package/dist/core/subagent-lane-authority.d.ts.map +1 -0
  252. package/dist/core/subagent-lane-authority.js +119 -0
  253. package/dist/core/subagent-lane-authority.js.map +1 -0
  254. package/dist/core/subagent-lane-contract.d.ts +114 -0
  255. package/dist/core/subagent-lane-contract.d.ts.map +1 -0
  256. package/dist/core/subagent-lane-contract.js +18 -0
  257. package/dist/core/subagent-lane-contract.js.map +1 -0
  258. package/dist/core/subagent-lane-launcher.d.ts +3 -6
  259. package/dist/core/subagent-lane-launcher.d.ts.map +1 -1
  260. package/dist/core/subagent-lane-launcher.js +53 -12
  261. package/dist/core/subagent-lane-launcher.js.map +1 -1
  262. package/dist/core/subagent-orchestration.d.ts +4 -17
  263. package/dist/core/subagent-orchestration.d.ts.map +1 -1
  264. package/dist/core/subagent-orchestration.js.map +1 -1
  265. package/dist/core/todo-runtime-state.d.ts +12 -0
  266. package/dist/core/todo-runtime-state.d.ts.map +1 -1
  267. package/dist/core/todo-runtime-state.js +23 -0
  268. package/dist/core/todo-runtime-state.js.map +1 -1
  269. package/dist/core/verified-run/broker.d.ts.map +1 -1
  270. package/dist/core/verified-run/broker.js +4 -1
  271. package/dist/core/verified-run/broker.js.map +1 -1
  272. package/dist/core/workload-permit-pool.d.ts +1 -1
  273. package/dist/core/workload-permit-pool.d.ts.map +1 -1
  274. package/dist/core/workload-permit-pool.js +3 -0
  275. package/dist/core/workload-permit-pool.js.map +1 -1
  276. package/dist/guardrails/strict-evidence-approval-adapter.d.ts +34 -0
  277. package/dist/guardrails/strict-evidence-approval-adapter.d.ts.map +1 -0
  278. package/dist/guardrails/strict-evidence-approval-adapter.js +70 -0
  279. package/dist/guardrails/strict-evidence-approval-adapter.js.map +1 -0
  280. package/dist/index.d.ts +5 -0
  281. package/dist/index.d.ts.map +1 -1
  282. package/dist/index.js +3 -0
  283. package/dist/index.js.map +1 -1
  284. package/dist/main.d.ts.map +1 -1
  285. package/dist/main.js +11 -18
  286. package/dist/main.js.map +1 -1
  287. package/dist/metacognition/calibration-selective.d.ts +78 -0
  288. package/dist/metacognition/calibration-selective.d.ts.map +1 -0
  289. package/dist/metacognition/calibration-selective.js +161 -0
  290. package/dist/metacognition/calibration-selective.js.map +1 -0
  291. package/dist/metacognition/calibration.d.ts +62 -0
  292. package/dist/metacognition/calibration.d.ts.map +1 -0
  293. package/dist/metacognition/calibration.js +122 -0
  294. package/dist/metacognition/calibration.js.map +1 -0
  295. package/dist/metacognition/checkpoint.d.ts +60 -0
  296. package/dist/metacognition/checkpoint.d.ts.map +1 -0
  297. package/dist/metacognition/checkpoint.js +57 -0
  298. package/dist/metacognition/checkpoint.js.map +1 -0
  299. package/dist/metacognition/context7.d.ts +48 -0
  300. package/dist/metacognition/context7.d.ts.map +1 -0
  301. package/dist/metacognition/context7.js +154 -0
  302. package/dist/metacognition/context7.js.map +1 -0
  303. package/dist/metacognition/decision.d.ts +44 -0
  304. package/dist/metacognition/decision.d.ts.map +1 -0
  305. package/dist/metacognition/decision.js +111 -0
  306. package/dist/metacognition/decision.js.map +1 -0
  307. package/dist/metacognition/evaluation.d.ts +73 -0
  308. package/dist/metacognition/evaluation.d.ts.map +1 -0
  309. package/dist/metacognition/evaluation.js +97 -0
  310. package/dist/metacognition/evaluation.js.map +1 -0
  311. package/dist/metacognition/index.d.ts +31 -0
  312. package/dist/metacognition/index.d.ts.map +1 -0
  313. package/dist/metacognition/index.js +31 -0
  314. package/dist/metacognition/index.js.map +1 -0
  315. package/dist/metacognition/knowledge-action.d.ts +43 -0
  316. package/dist/metacognition/knowledge-action.d.ts.map +1 -0
  317. package/dist/metacognition/knowledge-action.js +60 -0
  318. package/dist/metacognition/knowledge-action.js.map +1 -0
  319. package/dist/metacognition/knowledge.d.ts +84 -0
  320. package/dist/metacognition/knowledge.d.ts.map +1 -0
  321. package/dist/metacognition/knowledge.js +165 -0
  322. package/dist/metacognition/knowledge.js.map +1 -0
  323. package/dist/metacognition/obligations.d.ts +82 -0
  324. package/dist/metacognition/obligations.d.ts.map +1 -0
  325. package/dist/metacognition/obligations.js +139 -0
  326. package/dist/metacognition/obligations.js.map +1 -0
  327. package/dist/metacognition/observation-validity.d.ts +83 -0
  328. package/dist/metacognition/observation-validity.d.ts.map +1 -0
  329. package/dist/metacognition/observation-validity.js +118 -0
  330. package/dist/metacognition/observation-validity.js.map +1 -0
  331. package/dist/metacognition/observe.d.ts +45 -0
  332. package/dist/metacognition/observe.d.ts.map +1 -0
  333. package/dist/metacognition/observe.js +59 -0
  334. package/dist/metacognition/observe.js.map +1 -0
  335. package/dist/metacognition/policy.d.ts +53 -0
  336. package/dist/metacognition/policy.d.ts.map +1 -0
  337. package/dist/metacognition/policy.js +155 -0
  338. package/dist/metacognition/policy.js.map +1 -0
  339. package/dist/metacognition/predictions.d.ts +78 -0
  340. package/dist/metacognition/predictions.d.ts.map +1 -0
  341. package/dist/metacognition/predictions.js +181 -0
  342. package/dist/metacognition/predictions.js.map +1 -0
  343. package/dist/metacognition/retrieval.d.ts +53 -0
  344. package/dist/metacognition/retrieval.d.ts.map +1 -0
  345. package/dist/metacognition/retrieval.js +170 -0
  346. package/dist/metacognition/retrieval.js.map +1 -0
  347. package/dist/metacognition/risk.d.ts +48 -0
  348. package/dist/metacognition/risk.d.ts.map +1 -0
  349. package/dist/metacognition/risk.js +165 -0
  350. package/dist/metacognition/risk.js.map +1 -0
  351. package/dist/metacognition/route-economics.d.ts +95 -0
  352. package/dist/metacognition/route-economics.d.ts.map +1 -0
  353. package/dist/metacognition/route-economics.js +110 -0
  354. package/dist/metacognition/route-economics.js.map +1 -0
  355. package/dist/metacognition/runtime-bridge.d.ts +54 -0
  356. package/dist/metacognition/runtime-bridge.d.ts.map +1 -0
  357. package/dist/metacognition/runtime-bridge.js +140 -0
  358. package/dist/metacognition/runtime-bridge.js.map +1 -0
  359. package/dist/metacognition/skills.d.ts +42 -0
  360. package/dist/metacognition/skills.d.ts.map +1 -0
  361. package/dist/metacognition/skills.js +220 -0
  362. package/dist/metacognition/skills.js.map +1 -0
  363. package/dist/metacognition/state.d.ts +110 -0
  364. package/dist/metacognition/state.d.ts.map +1 -0
  365. package/dist/metacognition/state.js +52 -0
  366. package/dist/metacognition/state.js.map +1 -0
  367. package/dist/metacognition/validation.d.ts +19 -0
  368. package/dist/metacognition/validation.d.ts.map +1 -0
  369. package/dist/metacognition/validation.js +58 -0
  370. package/dist/metacognition/validation.js.map +1 -0
  371. package/dist/metacognition/verification.d.ts +93 -0
  372. package/dist/metacognition/verification.d.ts.map +1 -0
  373. package/dist/metacognition/verification.js +132 -0
  374. package/dist/metacognition/verification.js.map +1 -0
  375. package/dist/metacognition/verifier.d.ts +49 -0
  376. package/dist/metacognition/verifier.d.ts.map +1 -0
  377. package/dist/metacognition/verifier.js +88 -0
  378. package/dist/metacognition/verifier.js.map +1 -0
  379. package/dist/modes/acp/acp-agent.d.ts +24 -0
  380. package/dist/modes/acp/acp-agent.d.ts.map +1 -0
  381. package/dist/modes/acp/acp-agent.js +133 -0
  382. package/dist/modes/acp/acp-agent.js.map +1 -0
  383. package/dist/modes/acp/acp-mode.d.ts +4 -0
  384. package/dist/modes/acp/acp-mode.d.ts.map +1 -0
  385. package/dist/modes/acp/acp-mode.js +34 -0
  386. package/dist/modes/acp/acp-mode.js.map +1 -0
  387. package/dist/modes/acp/acp-session.d.ts +4 -0
  388. package/dist/modes/acp/acp-session.d.ts.map +1 -0
  389. package/dist/modes/acp/acp-session.js +76 -0
  390. package/dist/modes/acp/acp-session.js.map +1 -0
  391. package/dist/modes/acp/acp-transport.d.ts +5 -0
  392. package/dist/modes/acp/acp-transport.d.ts.map +1 -0
  393. package/dist/modes/acp/acp-transport.js +90 -0
  394. package/dist/modes/acp/acp-transport.js.map +1 -0
  395. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  396. package/dist/modes/interactive/interactive-mode.js +1 -0
  397. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  398. package/dist/observation/identity.d.ts +14 -0
  399. package/dist/observation/identity.d.ts.map +1 -0
  400. package/dist/observation/identity.js +29 -0
  401. package/dist/observation/identity.js.map +1 -0
  402. package/dist/observation/index.d.ts +13 -0
  403. package/dist/observation/index.d.ts.map +1 -0
  404. package/dist/observation/index.js +13 -0
  405. package/dist/observation/index.js.map +1 -0
  406. package/dist/observation/observe-mode.d.ts +46 -0
  407. package/dist/observation/observe-mode.d.ts.map +1 -0
  408. package/dist/observation/observe-mode.js +83 -0
  409. package/dist/observation/observe-mode.js.map +1 -0
  410. package/dist/observation/store.d.ts +53 -0
  411. package/dist/observation/store.d.ts.map +1 -0
  412. package/dist/observation/store.js +126 -0
  413. package/dist/observation/store.js.map +1 -0
  414. package/dist/observation/types.d.ts +72 -0
  415. package/dist/observation/types.d.ts.map +1 -0
  416. package/dist/observation/types.js +9 -0
  417. package/dist/observation/types.js.map +1 -0
  418. package/dist/observation/view.d.ts +39 -0
  419. package/dist/observation/view.d.ts.map +1 -0
  420. package/dist/observation/view.js +173 -0
  421. package/dist/observation/view.js.map +1 -0
  422. package/docs/audit-revalidation-2026-09-17.md +77 -0
  423. package/docs/devin-harness.md +33 -4
  424. package/docs/ecraf-normalization.md +83 -0
  425. package/docs/metacognition.md +51 -0
  426. package/docs/model-catalog-refresh.md +110 -1
  427. package/docs/models.md +1 -1
  428. package/docs/neo.md +134 -0
  429. package/docs/providers.md +125 -6
  430. package/docs/run-usage-ledger.md +56 -0
  431. package/docs/runtime-algorithms.md +151 -3
  432. package/docs/skills.md +1 -1
  433. package/docs/usage.md +2 -1
  434. package/examples/extensions/custom-provider-anthropic/package-lock.json +2 -2
  435. package/examples/extensions/custom-provider-anthropic/package.json +1 -1
  436. package/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
  437. package/examples/extensions/gondolin/package-lock.json +2 -2
  438. package/examples/extensions/gondolin/package.json +1 -1
  439. package/examples/extensions/sandbox/package-lock.json +2 -2
  440. package/examples/extensions/sandbox/package.json +1 -1
  441. package/examples/extensions/subagent/adaptive-agent-runtime.ts +14 -1
  442. package/examples/extensions/subagent/graph-result.ts +48 -0
  443. package/examples/extensions/subagent/index.ts +246 -111
  444. package/examples/extensions/subagent/managed-process-tree.ts +42 -0
  445. package/examples/extensions/subagent/managed-process.test.ts +24 -0
  446. package/examples/extensions/subagent/managed-process.ts +93 -112
  447. package/examples/extensions/subagent/subagent-runtime-types.ts +17 -1
  448. package/examples/extensions/subagent/subagent-stream.ts +161 -0
  449. package/examples/extensions/terminal-browser/README.md +54 -0
  450. package/examples/extensions/terminal-browser/bridge-protocol.ts +29 -0
  451. package/examples/extensions/terminal-browser/bridge.ts +219 -0
  452. package/examples/extensions/terminal-browser/browser-surface.ts +288 -0
  453. package/examples/extensions/terminal-browser/index.ts +215 -0
  454. package/examples/extensions/terminal-browser/placeholders.ts +49 -0
  455. package/examples/extensions/with-deps/package-lock.json +2 -2
  456. package/examples/extensions/with-deps/package.json +1 -1
  457. package/npm-shrinkwrap.json +18 -18
  458. package/package.json +8 -7
  459. package/resources/neo/skills/omk-browser/SKILL.md +32 -0
  460. package/resources/neo/skills/omk-code-review/SKILL.md +24 -0
  461. package/resources/neo/skills/omk-computeruse/SKILL.md +34 -0
  462. package/resources/neo/skills/omk-mcp-setup/SKILL.md +48 -0
  463. package/resources/neo/skills/omk-research/SKILL.md +24 -0
  464. package/resources/neo/skills/omk-site/SKILL.md +28 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"knowledge-action.js","sourceRoot":"","sources":["../../src/metacognition/knowledge-action.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Bounded next-action selector for knowledge gaps.\n *\n * Split from knowledge.ts to keep each module under the repository's\n * 250-line module-size ratchet. Same behavior as the reference port.\n */\n\nimport type { Claim, KnowledgeReport } from \"./knowledge.ts\";\nimport { ensure, integer, member, text, unique } from \"./validation.ts\";\n\nexport type SearchChannel = \"local\" | \"official\" | \"web\";\nexport interface SearchAttempt {\n\treadonly claimId: string;\n\treadonly binding: string;\n\treadonly channel: SearchChannel;\n\treadonly result: \"empty\" | \"failed\" | \"candidates\" | \"in-flight\";\n}\nexport interface ActionPolicy {\n\treadonly availableChannels: readonly SearchChannel[];\n\treadonly remoteQueryApprovedClaimIds: readonly string[];\n\treadonly remainingRequests: number;\n\treadonly remainingMs: number;\n}\nexport type KnowledgeAction =\n\t| { readonly kind: \"proceed\"; readonly meaning: \"evidence-predicates-satisfied-not-general-correctness\" }\n\t| { readonly kind: \"search\"; readonly claimId: string; readonly channel: SearchChannel; readonly query: string }\n\t| { readonly kind: \"run-check\"; readonly claimId: string; readonly checkId: string }\n\t| {\n\t\t\treadonly kind:\n\t\t\t\t| \"inspect-local\"\n\t\t\t\t| \"repair\"\n\t\t\t\t| \"review-candidates\"\n\t\t\t\t| \"await-owned-work\"\n\t\t\t\t| \"ask-user\"\n\t\t\t\t| \"form-obligations\";\n\t\t\treadonly claimId: string;\n\t }\n\t| { readonly kind: \"blocked\"; readonly claimId: string; readonly reason: string };\n\n/** One bounded next action, not an autonomous recursion that can spend unbounded API calls. */\nexport function nextKnowledgeAction(\n\treport: KnowledgeReport,\n\tclaims: readonly Claim[],\n\tattempts: readonly SearchAttempt[],\n\tpolicy: ActionPolicy,\n): KnowledgeAction {\n\tinteger(policy.remainingRequests, \"remainingRequests\");\n\tinteger(policy.remainingMs, \"remainingMs\");\n\tunique(policy.availableChannels, \"availableChannels\", 3);\n\tfor (const channel of policy.availableChannels) member(channel, [\"local\", \"official\", \"web\"], \"search channel\");\n\tunique(policy.remoteQueryApprovedClaimIds, \"remote approvals\", 128);\n\tensure(attempts.length <= 4096, \"too many search attempts\");\n\tfor (const attempt of attempts) {\n\t\ttext(attempt.claimId, \"attempt claim\");\n\t\ttext(attempt.binding, \"attempt binding\");\n\t\tmember(attempt.channel, [\"local\", \"official\", \"web\"], \"attempt channel\");\n\t\tmember(attempt.result, [\"empty\", \"failed\", \"candidates\", \"in-flight\"], \"attempt result\");\n\t}\n\tconst gap = report.gaps.find((g) => g.required);\n\tif (!gap) return { kind: \"proceed\", meaning: \"evidence-predicates-satisfied-not-general-correctness\" };\n\tconst claimId = gap.claimId;\n\tif (gap.reason === \"unassessed-step\") return { kind: \"form-obligations\", claimId };\n\tif (gap.reason === \"missing-user-decision\") return { kind: \"ask-user\", claimId };\n\tif (gap.reason === \"unknown-version\") return { kind: \"inspect-local\", claimId };\n\tif (gap.reason === \"failed-check\") return { kind: \"repair\", claimId };\n\tif (gap.reason === \"pending-check\") return { kind: \"await-owned-work\", claimId };\n\tif (gap.reason === \"missing-check\") {\n\t\tensure(gap.checkId !== null, \"missing checkId\");\n\t\treturn { kind: \"run-check\", claimId, checkId: gap.checkId };\n\t}\n\tconst claim = claims.find((c) => c.id === claimId && c.binding === gap.binding);\n\tensure(claim !== undefined, \"report has stale or unknown claim\");\n\tconst history = attempts.filter((a) => a.claimId === claimId && a.binding === gap.binding);\n\tif (history.some((a) => a.result === \"in-flight\")) return { kind: \"await-owned-work\", claimId };\n\tif (history.some((a) => a.result === \"candidates\")) return { kind: \"review-candidates\", claimId };\n\tif (policy.remainingRequests === 0 || policy.remainingMs === 0) {\n\t\treturn { kind: \"blocked\", claimId, reason: \"acquisition-budget-exhausted\" };\n\t}\n\tfor (const channel of [\"local\", \"official\", \"web\"] as const) {\n\t\tif (!policy.availableChannels.includes(channel) || history.some((a) => a.channel === channel)) continue;\n\t\tif (channel !== \"local\" && (!policy.remoteQueryApprovedClaimIds.includes(claimId) || claim.publicQuery === null))\n\t\t\tcontinue;\n\t\treturn { kind: \"search\", claimId, channel, query: channel === \"local\" ? claim.statement : claim.publicQuery! };\n\t}\n\treturn { kind: \"blocked\", claimId, reason: \"no-approved-untried-source\" };\n}\n"]}
@@ -0,0 +1,84 @@
1
+ export type Stage = "before-change" | "after-change";
2
+ export interface Claim {
3
+ readonly id: string;
4
+ /** Hash/fingerprint computed by the host over the relevant subject and environment. */
5
+ readonly binding: string;
6
+ readonly phase: "precondition" | "postcondition";
7
+ readonly statement: string;
8
+ readonly required: boolean;
9
+ readonly impact: number;
10
+ readonly needsReference: boolean;
11
+ readonly requiresVersion: boolean;
12
+ readonly version: string | null;
13
+ readonly minSourceFamilies: number;
14
+ readonly requiredCheckIds: readonly string[];
15
+ readonly needsUserDecision: boolean;
16
+ /** Only explicit, host-approved public text can leave the repository. */
17
+ readonly publicQuery: string | null;
18
+ }
19
+ export interface SourceIdentity {
20
+ readonly id: string;
21
+ readonly family: string;
22
+ readonly kind: "repository" | "official" | "community" | "model";
23
+ }
24
+ interface ObservationBase {
25
+ readonly id: string;
26
+ readonly claimId: string;
27
+ readonly binding: string;
28
+ readonly observedAtMs: number;
29
+ readonly expiresAtMs: number;
30
+ }
31
+ export interface ReferenceObservation extends ObservationBase {
32
+ readonly kind: "reference";
33
+ readonly sourceId: string;
34
+ readonly version: string | null;
35
+ readonly stance: "support" | "refute";
36
+ readonly documentDigest: string;
37
+ readonly locator: string;
38
+ }
39
+ export interface CheckObservation extends ObservationBase {
40
+ readonly kind: "check";
41
+ readonly runnerId: string;
42
+ readonly checkId: string;
43
+ /** Host-ordered snapshot. In OMK, project the existing strict evidence ledger here. */
44
+ readonly sequence: number;
45
+ readonly verdict: "pass" | "fail" | "pending";
46
+ }
47
+ export interface DecisionObservation extends ObservationBase {
48
+ readonly kind: "decision";
49
+ readonly actorId: string;
50
+ readonly accepted: boolean;
51
+ }
52
+ export type Observation = ReferenceObservation | CheckObservation | DecisionObservation;
53
+ export type GapReason = "unassessed-step" | "unknown-version" | "unsupported-reference" | "contradictory-reference" | "missing-check" | "failed-check" | "pending-check" | "missing-user-decision";
54
+ export interface KnowledgeGap {
55
+ readonly claimId: string;
56
+ readonly binding: string;
57
+ readonly reason: GapReason;
58
+ readonly required: boolean;
59
+ readonly impact: number;
60
+ readonly checkId: string | null;
61
+ }
62
+ export interface KnowledgeReport {
63
+ readonly state: "supported" | "gaps";
64
+ readonly gaps: readonly KnowledgeGap[];
65
+ readonly supportedClaimIds: readonly string[];
66
+ readonly rejectedObservations: readonly {
67
+ id: string;
68
+ reason: string;
69
+ }[];
70
+ }
71
+ export interface KnowledgeInput {
72
+ readonly stage: Stage;
73
+ readonly requiresAssessment: boolean;
74
+ readonly nowMs: number;
75
+ readonly claims: readonly Claim[];
76
+ /** Admitted host observations only. Never pass a model's JSON here as runner truth. */
77
+ readonly observations: readonly Observation[];
78
+ readonly sources: readonly SourceIdentity[];
79
+ readonly trustedRunnerIds: readonly string[];
80
+ readonly decisionActorIds: readonly string[];
81
+ }
82
+ export declare function inspectKnowledge(input: KnowledgeInput): KnowledgeReport;
83
+ export {};
84
+ //# sourceMappingURL=knowledge.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"knowledge.d.ts","sourceRoot":"","sources":["../../src/metacognition/knowledge.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Claim/evidence gap inspection and the bounded next-action selector.\n *\n * Ported from docs/OMK_skill_knowledge_control_2026-09-19.zip\n * (src/knowledge.ts). Host-owned observations only; a model's JSON is never\n * runner truth. See OMK_metacognitive_control_algorithms_2026-09-19.md §13.\n */\nimport { canonical, ensure, integer, lexical, member, text, unique } from \"./validation.ts\";\n\nexport type Stage = \"before-change\" | \"after-change\";\nexport interface Claim {\n\treadonly id: string;\n\t/** Hash/fingerprint computed by the host over the relevant subject and environment. */\n\treadonly binding: string;\n\treadonly phase: \"precondition\" | \"postcondition\";\n\treadonly statement: string;\n\treadonly required: boolean;\n\treadonly impact: number;\n\treadonly needsReference: boolean;\n\treadonly requiresVersion: boolean;\n\treadonly version: string | null;\n\treadonly minSourceFamilies: number;\n\treadonly requiredCheckIds: readonly string[];\n\treadonly needsUserDecision: boolean;\n\t/** Only explicit, host-approved public text can leave the repository. */\n\treadonly publicQuery: string | null;\n}\nexport interface SourceIdentity {\n\treadonly id: string;\n\treadonly family: string;\n\treadonly kind: \"repository\" | \"official\" | \"community\" | \"model\";\n}\ninterface ObservationBase {\n\treadonly id: string;\n\treadonly claimId: string;\n\treadonly binding: string;\n\treadonly observedAtMs: number;\n\treadonly expiresAtMs: number;\n}\nexport interface ReferenceObservation extends ObservationBase {\n\treadonly kind: \"reference\";\n\treadonly sourceId: string;\n\treadonly version: string | null;\n\treadonly stance: \"support\" | \"refute\";\n\treadonly documentDigest: string;\n\treadonly locator: string;\n}\nexport interface CheckObservation extends ObservationBase {\n\treadonly kind: \"check\";\n\treadonly runnerId: string;\n\treadonly checkId: string;\n\t/** Host-ordered snapshot. In OMK, project the existing strict evidence ledger here. */\n\treadonly sequence: number;\n\treadonly verdict: \"pass\" | \"fail\" | \"pending\";\n}\nexport interface DecisionObservation extends ObservationBase {\n\treadonly kind: \"decision\";\n\treadonly actorId: string;\n\treadonly accepted: boolean;\n}\nexport type Observation = ReferenceObservation | CheckObservation | DecisionObservation;\nexport type GapReason =\n\t| \"unassessed-step\"\n\t| \"unknown-version\"\n\t| \"unsupported-reference\"\n\t| \"contradictory-reference\"\n\t| \"missing-check\"\n\t| \"failed-check\"\n\t| \"pending-check\"\n\t| \"missing-user-decision\";\nexport interface KnowledgeGap {\n\treadonly claimId: string;\n\treadonly binding: string;\n\treadonly reason: GapReason;\n\treadonly required: boolean;\n\treadonly impact: number;\n\treadonly checkId: string | null;\n}\nexport interface KnowledgeReport {\n\treadonly state: \"supported\" | \"gaps\";\n\treadonly gaps: readonly KnowledgeGap[];\n\treadonly supportedClaimIds: readonly string[];\n\treadonly rejectedObservations: readonly { id: string; reason: string }[];\n}\nexport interface KnowledgeInput {\n\treadonly stage: Stage;\n\treadonly requiresAssessment: boolean;\n\treadonly nowMs: number;\n\treadonly claims: readonly Claim[];\n\t/** Admitted host observations only. Never pass a model's JSON here as runner truth. */\n\treadonly observations: readonly Observation[];\n\treadonly sources: readonly SourceIdentity[];\n\treadonly trustedRunnerIds: readonly string[];\n\treadonly decisionActorIds: readonly string[];\n}\n\nexport function inspectKnowledge(input: KnowledgeInput): KnowledgeReport {\n\tmember(input.stage, [\"before-change\", \"after-change\"], \"stage\");\n\tinteger(input.nowMs, \"nowMs\");\n\tensure(typeof input.requiresAssessment === \"boolean\", \"requiresAssessment must be boolean\");\n\tensure(input.claims.length <= 128 && input.observations.length <= 4096, \"knowledge input too large\");\n\tunique(\n\t\tinput.claims.map((c) => c.id),\n\t\t\"claim ids\",\n\t\t128,\n\t);\n\tunique(\n\t\tinput.sources.map((s) => s.id),\n\t\t\"source ids\",\n\t\t512,\n\t);\n\tunique(input.trustedRunnerIds, \"runner ids\");\n\tunique(input.decisionActorIds, \"decision actor ids\");\n\tfor (const c of input.claims) {\n\t\ttext(c.binding, \"binding\");\n\t\ttext(c.statement, \"statement\");\n\t\tmember(c.phase, [\"precondition\", \"postcondition\"], \"claim phase\");\n\t\tfor (const v of [c.required, c.needsReference, c.requiresVersion, c.needsUserDecision]) {\n\t\t\tensure(typeof v === \"boolean\", \"invalid claim flag\");\n\t\t}\n\t\tensure(Number.isFinite(c.impact) && c.impact >= 0 && c.impact <= 1_000_000, \"invalid impact\");\n\t\tinteger(c.minSourceFamilies, \"minSourceFamilies\", 16);\n\t\tensure(!c.needsReference || c.minSourceFamilies > 0, \"reference needs at least one source family\");\n\t\tif (c.version !== null) text(c.version, \"version\", 128);\n\t\tif (c.publicQuery !== null) text(c.publicQuery, \"publicQuery\", 500);\n\t\tunique(c.requiredCheckIds, \"check ids\", 128);\n\t\tensure(\n\t\t\tc.needsReference || c.requiredCheckIds.length > 0 || c.needsUserDecision,\n\t\t\t\"claim has no evidence predicate\",\n\t\t);\n\t}\n\tconst sources = new Map(\n\t\tinput.sources.map((s) => {\n\t\t\ttext(s.family, \"source family\");\n\t\t\tmember(s.kind, [\"repository\", \"official\", \"community\", \"model\"], \"source kind\");\n\t\t\treturn [s.id, s] as const;\n\t\t}),\n\t);\n\tconst observations = new Map<string, Observation>();\n\tconst sequences = new Map<string, string>();\n\tfor (const obs of input.observations) {\n\t\ttext(obs.id, \"observation id\");\n\t\ttext(obs.claimId, \"observation claim\");\n\t\ttext(obs.binding, \"observation binding\");\n\t\tinteger(obs.observedAtMs, \"observedAtMs\");\n\t\tinteger(obs.expiresAtMs, \"expiresAtMs\");\n\t\tensure(obs.expiresAtMs >= obs.observedAtMs, \"invalid observation validity interval\");\n\t\tmember(obs.kind, [\"reference\", \"check\", \"decision\"], \"observation kind\");\n\t\tif (obs.kind === \"reference\") {\n\t\t\ttext(obs.sourceId, \"sourceId\");\n\t\t\ttext(obs.documentDigest, \"documentDigest\");\n\t\t\ttext(obs.locator, \"locator\");\n\t\t\tif (obs.version !== null) text(obs.version, \"observation version\", 128);\n\t\t\tmember(obs.stance, [\"support\", \"refute\"], \"stance\");\n\t\t} else if (obs.kind === \"check\") {\n\t\t\ttext(obs.runnerId, \"runnerId\");\n\t\t\ttext(obs.checkId, \"checkId\");\n\t\t\tinteger(obs.sequence, \"sequence\");\n\t\t\tmember(obs.verdict, [\"pass\", \"fail\", \"pending\"], \"check verdict\");\n\t\t\tconst key = canonical([obs.claimId, obs.binding, obs.checkId, obs.sequence]);\n\t\t\tconst previous = sequences.get(key);\n\t\t\tensure(previous === undefined || previous === canonical(obs), \"conflicting check sequence\");\n\t\t\tsequences.set(key, canonical(obs));\n\t\t} else {\n\t\t\ttext(obs.actorId, \"actorId\");\n\t\t\tensure(typeof obs.accepted === \"boolean\", \"invalid decision\");\n\t\t}\n\t\tconst previous = observations.get(obs.id);\n\t\tensure(previous === undefined || canonical(previous) === canonical(obs), \"conflicting observation id\");\n\t\tobservations.set(obs.id, obs);\n\t}\n\tconst relevantClaims = input.claims.filter((c) => input.stage === \"after-change\" || c.phase === \"precondition\");\n\tconst rejectedObservations: { id: string; reason: string }[] = [];\n\tconst admissible = new Map<string, Observation[]>();\n\tconst claimMap = new Map(relevantClaims.map((c) => [c.id, c]));\n\tfor (const obs of observations.values()) {\n\t\tconst c = claimMap.get(obs.claimId);\n\t\tlet reason: string | undefined;\n\t\tif (!c) reason = \"irrelevant-claim-or-stage\";\n\t\telse if (obs.binding !== c.binding) reason = \"stale-binding\";\n\t\telse if (obs.observedAtMs > input.nowMs || obs.expiresAtMs <= input.nowMs) reason = \"expired-or-future\";\n\t\telse if (obs.kind === \"reference\") {\n\t\t\tconst source = sources.get(obs.sourceId);\n\t\t\tif (!source || (source.kind !== \"repository\" && source.kind !== \"official\")) reason = \"inadmissible-source\";\n\t\t\telse if (c.requiresVersion && (c.version === null || obs.version !== c.version)) reason = \"version-mismatch\";\n\t\t} else if (obs.kind === \"check\" && !input.trustedRunnerIds.includes(obs.runnerId)) reason = \"untrusted-runner\";\n\t\telse if (obs.kind === \"decision\" && !input.decisionActorIds.includes(obs.actorId)) {\n\t\t\treason = \"untrusted-decision-actor\";\n\t\t}\n\t\tif (reason) rejectedObservations.push({ id: obs.id, reason });\n\t\telse admissible.set(obs.claimId, [...(admissible.get(obs.claimId) ?? []), obs]);\n\t}\n\tconst gaps: KnowledgeGap[] = [];\n\tconst supportedClaimIds: string[] = [];\n\tif (input.requiresAssessment && relevantClaims.filter((c) => c.required).length === 0) {\n\t\tgaps.push({\n\t\t\tclaimId: \"$step\",\n\t\t\tbinding: \"unassessed\",\n\t\t\treason: \"unassessed-step\",\n\t\t\trequired: true,\n\t\t\timpact: 1_000_000,\n\t\t\tcheckId: null,\n\t\t});\n\t}\n\tfor (const c of relevantClaims) {\n\t\tconst before = gaps.length;\n\t\tconst evidence = admissible.get(c.id) ?? [];\n\t\tconst add = (reason: GapReason, checkId: string | null = null): void => {\n\t\t\tgaps.push({ claimId: c.id, binding: c.binding, reason, required: c.required, impact: c.impact, checkId });\n\t\t};\n\t\tif (c.requiresVersion && c.version === null) add(\"unknown-version\");\n\t\tif (c.needsReference) {\n\t\t\tconst refs = evidence.filter((obs): obs is ReferenceObservation => obs.kind === \"reference\");\n\t\t\tconst support = new Set(\n\t\t\t\trefs.filter((r) => r.stance === \"support\").map((r) => sources.get(r.sourceId)!.family),\n\t\t\t);\n\t\t\tif (refs.some((r) => r.stance === \"refute\")) add(\"contradictory-reference\");\n\t\t\telse if (support.size < c.minSourceFamilies) add(\"unsupported-reference\");\n\t\t}\n\t\tfor (const checkId of c.requiredCheckIds) {\n\t\t\tconst records = evidence\n\t\t\t\t.filter((obs): obs is CheckObservation => obs.kind === \"check\" && obs.checkId === checkId)\n\t\t\t\t.sort((a, b) => a.sequence - b.sequence);\n\t\t\tconst latest = records.at(-1);\n\t\t\tif (!latest) add(\"missing-check\", checkId);\n\t\t\telse if (latest.verdict === \"fail\") add(\"failed-check\", checkId);\n\t\t\telse if (latest.verdict === \"pending\") add(\"pending-check\", checkId);\n\t\t}\n\t\tif (c.needsUserDecision) {\n\t\t\tconst decisions = evidence.filter((obs): obs is DecisionObservation => obs.kind === \"decision\");\n\t\t\tif (!decisions.some((d) => d.accepted) || decisions.some((d) => !d.accepted)) add(\"missing-user-decision\");\n\t\t}\n\t\tif (before === gaps.length) supportedClaimIds.push(c.id);\n\t}\n\tgaps.sort(\n\t\t(a, b) =>\n\t\t\tNumber(b.required) - Number(a.required) ||\n\t\t\tb.impact - a.impact ||\n\t\t\tlexical(a.claimId, b.claimId) ||\n\t\t\tlexical(a.reason, b.reason),\n\t);\n\treturn {\n\t\tstate: gaps.some((g) => g.required) ? \"gaps\" : \"supported\",\n\t\tgaps,\n\t\tsupportedClaimIds: supportedClaimIds.sort(lexical),\n\t\trejectedObservations,\n\t};\n}\n"]}
@@ -0,0 +1,165 @@
1
+ /**
2
+ * Claim/evidence gap inspection and the bounded next-action selector.
3
+ *
4
+ * Ported from docs/OMK_skill_knowledge_control_2026-09-19.zip
5
+ * (src/knowledge.ts). Host-owned observations only; a model's JSON is never
6
+ * runner truth. See OMK_metacognitive_control_algorithms_2026-09-19.md §13.
7
+ */
8
+ import { canonical, ensure, integer, lexical, member, text, unique } from "./validation.js";
9
+ export function inspectKnowledge(input) {
10
+ member(input.stage, ["before-change", "after-change"], "stage");
11
+ integer(input.nowMs, "nowMs");
12
+ ensure(typeof input.requiresAssessment === "boolean", "requiresAssessment must be boolean");
13
+ ensure(input.claims.length <= 128 && input.observations.length <= 4096, "knowledge input too large");
14
+ unique(input.claims.map((c) => c.id), "claim ids", 128);
15
+ unique(input.sources.map((s) => s.id), "source ids", 512);
16
+ unique(input.trustedRunnerIds, "runner ids");
17
+ unique(input.decisionActorIds, "decision actor ids");
18
+ for (const c of input.claims) {
19
+ text(c.binding, "binding");
20
+ text(c.statement, "statement");
21
+ member(c.phase, ["precondition", "postcondition"], "claim phase");
22
+ for (const v of [c.required, c.needsReference, c.requiresVersion, c.needsUserDecision]) {
23
+ ensure(typeof v === "boolean", "invalid claim flag");
24
+ }
25
+ ensure(Number.isFinite(c.impact) && c.impact >= 0 && c.impact <= 1_000_000, "invalid impact");
26
+ integer(c.minSourceFamilies, "minSourceFamilies", 16);
27
+ ensure(!c.needsReference || c.minSourceFamilies > 0, "reference needs at least one source family");
28
+ if (c.version !== null)
29
+ text(c.version, "version", 128);
30
+ if (c.publicQuery !== null)
31
+ text(c.publicQuery, "publicQuery", 500);
32
+ unique(c.requiredCheckIds, "check ids", 128);
33
+ ensure(c.needsReference || c.requiredCheckIds.length > 0 || c.needsUserDecision, "claim has no evidence predicate");
34
+ }
35
+ const sources = new Map(input.sources.map((s) => {
36
+ text(s.family, "source family");
37
+ member(s.kind, ["repository", "official", "community", "model"], "source kind");
38
+ return [s.id, s];
39
+ }));
40
+ const observations = new Map();
41
+ const sequences = new Map();
42
+ for (const obs of input.observations) {
43
+ text(obs.id, "observation id");
44
+ text(obs.claimId, "observation claim");
45
+ text(obs.binding, "observation binding");
46
+ integer(obs.observedAtMs, "observedAtMs");
47
+ integer(obs.expiresAtMs, "expiresAtMs");
48
+ ensure(obs.expiresAtMs >= obs.observedAtMs, "invalid observation validity interval");
49
+ member(obs.kind, ["reference", "check", "decision"], "observation kind");
50
+ if (obs.kind === "reference") {
51
+ text(obs.sourceId, "sourceId");
52
+ text(obs.documentDigest, "documentDigest");
53
+ text(obs.locator, "locator");
54
+ if (obs.version !== null)
55
+ text(obs.version, "observation version", 128);
56
+ member(obs.stance, ["support", "refute"], "stance");
57
+ }
58
+ else if (obs.kind === "check") {
59
+ text(obs.runnerId, "runnerId");
60
+ text(obs.checkId, "checkId");
61
+ integer(obs.sequence, "sequence");
62
+ member(obs.verdict, ["pass", "fail", "pending"], "check verdict");
63
+ const key = canonical([obs.claimId, obs.binding, obs.checkId, obs.sequence]);
64
+ const previous = sequences.get(key);
65
+ ensure(previous === undefined || previous === canonical(obs), "conflicting check sequence");
66
+ sequences.set(key, canonical(obs));
67
+ }
68
+ else {
69
+ text(obs.actorId, "actorId");
70
+ ensure(typeof obs.accepted === "boolean", "invalid decision");
71
+ }
72
+ const previous = observations.get(obs.id);
73
+ ensure(previous === undefined || canonical(previous) === canonical(obs), "conflicting observation id");
74
+ observations.set(obs.id, obs);
75
+ }
76
+ const relevantClaims = input.claims.filter((c) => input.stage === "after-change" || c.phase === "precondition");
77
+ const rejectedObservations = [];
78
+ const admissible = new Map();
79
+ const claimMap = new Map(relevantClaims.map((c) => [c.id, c]));
80
+ for (const obs of observations.values()) {
81
+ const c = claimMap.get(obs.claimId);
82
+ let reason;
83
+ if (!c)
84
+ reason = "irrelevant-claim-or-stage";
85
+ else if (obs.binding !== c.binding)
86
+ reason = "stale-binding";
87
+ else if (obs.observedAtMs > input.nowMs || obs.expiresAtMs <= input.nowMs)
88
+ reason = "expired-or-future";
89
+ else if (obs.kind === "reference") {
90
+ const source = sources.get(obs.sourceId);
91
+ if (!source || (source.kind !== "repository" && source.kind !== "official"))
92
+ reason = "inadmissible-source";
93
+ else if (c.requiresVersion && (c.version === null || obs.version !== c.version))
94
+ reason = "version-mismatch";
95
+ }
96
+ else if (obs.kind === "check" && !input.trustedRunnerIds.includes(obs.runnerId))
97
+ reason = "untrusted-runner";
98
+ else if (obs.kind === "decision" && !input.decisionActorIds.includes(obs.actorId)) {
99
+ reason = "untrusted-decision-actor";
100
+ }
101
+ if (reason)
102
+ rejectedObservations.push({ id: obs.id, reason });
103
+ else
104
+ admissible.set(obs.claimId, [...(admissible.get(obs.claimId) ?? []), obs]);
105
+ }
106
+ const gaps = [];
107
+ const supportedClaimIds = [];
108
+ if (input.requiresAssessment && relevantClaims.filter((c) => c.required).length === 0) {
109
+ gaps.push({
110
+ claimId: "$step",
111
+ binding: "unassessed",
112
+ reason: "unassessed-step",
113
+ required: true,
114
+ impact: 1_000_000,
115
+ checkId: null,
116
+ });
117
+ }
118
+ for (const c of relevantClaims) {
119
+ const before = gaps.length;
120
+ const evidence = admissible.get(c.id) ?? [];
121
+ const add = (reason, checkId = null) => {
122
+ gaps.push({ claimId: c.id, binding: c.binding, reason, required: c.required, impact: c.impact, checkId });
123
+ };
124
+ if (c.requiresVersion && c.version === null)
125
+ add("unknown-version");
126
+ if (c.needsReference) {
127
+ const refs = evidence.filter((obs) => obs.kind === "reference");
128
+ const support = new Set(refs.filter((r) => r.stance === "support").map((r) => sources.get(r.sourceId).family));
129
+ if (refs.some((r) => r.stance === "refute"))
130
+ add("contradictory-reference");
131
+ else if (support.size < c.minSourceFamilies)
132
+ add("unsupported-reference");
133
+ }
134
+ for (const checkId of c.requiredCheckIds) {
135
+ const records = evidence
136
+ .filter((obs) => obs.kind === "check" && obs.checkId === checkId)
137
+ .sort((a, b) => a.sequence - b.sequence);
138
+ const latest = records.at(-1);
139
+ if (!latest)
140
+ add("missing-check", checkId);
141
+ else if (latest.verdict === "fail")
142
+ add("failed-check", checkId);
143
+ else if (latest.verdict === "pending")
144
+ add("pending-check", checkId);
145
+ }
146
+ if (c.needsUserDecision) {
147
+ const decisions = evidence.filter((obs) => obs.kind === "decision");
148
+ if (!decisions.some((d) => d.accepted) || decisions.some((d) => !d.accepted))
149
+ add("missing-user-decision");
150
+ }
151
+ if (before === gaps.length)
152
+ supportedClaimIds.push(c.id);
153
+ }
154
+ gaps.sort((a, b) => Number(b.required) - Number(a.required) ||
155
+ b.impact - a.impact ||
156
+ lexical(a.claimId, b.claimId) ||
157
+ lexical(a.reason, b.reason));
158
+ return {
159
+ state: gaps.some((g) => g.required) ? "gaps" : "supported",
160
+ gaps,
161
+ supportedClaimIds: supportedClaimIds.sort(lexical),
162
+ rejectedObservations,
163
+ };
164
+ }
165
+ //# sourceMappingURL=knowledge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"knowledge.js","sourceRoot":"","sources":["../../src/metacognition/knowledge.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Claim/evidence gap inspection and the bounded next-action selector.\n *\n * Ported from docs/OMK_skill_knowledge_control_2026-09-19.zip\n * (src/knowledge.ts). Host-owned observations only; a model's JSON is never\n * runner truth. See OMK_metacognitive_control_algorithms_2026-09-19.md §13.\n */\nimport { canonical, ensure, integer, lexical, member, text, unique } from \"./validation.ts\";\n\nexport type Stage = \"before-change\" | \"after-change\";\nexport interface Claim {\n\treadonly id: string;\n\t/** Hash/fingerprint computed by the host over the relevant subject and environment. */\n\treadonly binding: string;\n\treadonly phase: \"precondition\" | \"postcondition\";\n\treadonly statement: string;\n\treadonly required: boolean;\n\treadonly impact: number;\n\treadonly needsReference: boolean;\n\treadonly requiresVersion: boolean;\n\treadonly version: string | null;\n\treadonly minSourceFamilies: number;\n\treadonly requiredCheckIds: readonly string[];\n\treadonly needsUserDecision: boolean;\n\t/** Only explicit, host-approved public text can leave the repository. */\n\treadonly publicQuery: string | null;\n}\nexport interface SourceIdentity {\n\treadonly id: string;\n\treadonly family: string;\n\treadonly kind: \"repository\" | \"official\" | \"community\" | \"model\";\n}\ninterface ObservationBase {\n\treadonly id: string;\n\treadonly claimId: string;\n\treadonly binding: string;\n\treadonly observedAtMs: number;\n\treadonly expiresAtMs: number;\n}\nexport interface ReferenceObservation extends ObservationBase {\n\treadonly kind: \"reference\";\n\treadonly sourceId: string;\n\treadonly version: string | null;\n\treadonly stance: \"support\" | \"refute\";\n\treadonly documentDigest: string;\n\treadonly locator: string;\n}\nexport interface CheckObservation extends ObservationBase {\n\treadonly kind: \"check\";\n\treadonly runnerId: string;\n\treadonly checkId: string;\n\t/** Host-ordered snapshot. In OMK, project the existing strict evidence ledger here. */\n\treadonly sequence: number;\n\treadonly verdict: \"pass\" | \"fail\" | \"pending\";\n}\nexport interface DecisionObservation extends ObservationBase {\n\treadonly kind: \"decision\";\n\treadonly actorId: string;\n\treadonly accepted: boolean;\n}\nexport type Observation = ReferenceObservation | CheckObservation | DecisionObservation;\nexport type GapReason =\n\t| \"unassessed-step\"\n\t| \"unknown-version\"\n\t| \"unsupported-reference\"\n\t| \"contradictory-reference\"\n\t| \"missing-check\"\n\t| \"failed-check\"\n\t| \"pending-check\"\n\t| \"missing-user-decision\";\nexport interface KnowledgeGap {\n\treadonly claimId: string;\n\treadonly binding: string;\n\treadonly reason: GapReason;\n\treadonly required: boolean;\n\treadonly impact: number;\n\treadonly checkId: string | null;\n}\nexport interface KnowledgeReport {\n\treadonly state: \"supported\" | \"gaps\";\n\treadonly gaps: readonly KnowledgeGap[];\n\treadonly supportedClaimIds: readonly string[];\n\treadonly rejectedObservations: readonly { id: string; reason: string }[];\n}\nexport interface KnowledgeInput {\n\treadonly stage: Stage;\n\treadonly requiresAssessment: boolean;\n\treadonly nowMs: number;\n\treadonly claims: readonly Claim[];\n\t/** Admitted host observations only. Never pass a model's JSON here as runner truth. */\n\treadonly observations: readonly Observation[];\n\treadonly sources: readonly SourceIdentity[];\n\treadonly trustedRunnerIds: readonly string[];\n\treadonly decisionActorIds: readonly string[];\n}\n\nexport function inspectKnowledge(input: KnowledgeInput): KnowledgeReport {\n\tmember(input.stage, [\"before-change\", \"after-change\"], \"stage\");\n\tinteger(input.nowMs, \"nowMs\");\n\tensure(typeof input.requiresAssessment === \"boolean\", \"requiresAssessment must be boolean\");\n\tensure(input.claims.length <= 128 && input.observations.length <= 4096, \"knowledge input too large\");\n\tunique(\n\t\tinput.claims.map((c) => c.id),\n\t\t\"claim ids\",\n\t\t128,\n\t);\n\tunique(\n\t\tinput.sources.map((s) => s.id),\n\t\t\"source ids\",\n\t\t512,\n\t);\n\tunique(input.trustedRunnerIds, \"runner ids\");\n\tunique(input.decisionActorIds, \"decision actor ids\");\n\tfor (const c of input.claims) {\n\t\ttext(c.binding, \"binding\");\n\t\ttext(c.statement, \"statement\");\n\t\tmember(c.phase, [\"precondition\", \"postcondition\"], \"claim phase\");\n\t\tfor (const v of [c.required, c.needsReference, c.requiresVersion, c.needsUserDecision]) {\n\t\t\tensure(typeof v === \"boolean\", \"invalid claim flag\");\n\t\t}\n\t\tensure(Number.isFinite(c.impact) && c.impact >= 0 && c.impact <= 1_000_000, \"invalid impact\");\n\t\tinteger(c.minSourceFamilies, \"minSourceFamilies\", 16);\n\t\tensure(!c.needsReference || c.minSourceFamilies > 0, \"reference needs at least one source family\");\n\t\tif (c.version !== null) text(c.version, \"version\", 128);\n\t\tif (c.publicQuery !== null) text(c.publicQuery, \"publicQuery\", 500);\n\t\tunique(c.requiredCheckIds, \"check ids\", 128);\n\t\tensure(\n\t\t\tc.needsReference || c.requiredCheckIds.length > 0 || c.needsUserDecision,\n\t\t\t\"claim has no evidence predicate\",\n\t\t);\n\t}\n\tconst sources = new Map(\n\t\tinput.sources.map((s) => {\n\t\t\ttext(s.family, \"source family\");\n\t\t\tmember(s.kind, [\"repository\", \"official\", \"community\", \"model\"], \"source kind\");\n\t\t\treturn [s.id, s] as const;\n\t\t}),\n\t);\n\tconst observations = new Map<string, Observation>();\n\tconst sequences = new Map<string, string>();\n\tfor (const obs of input.observations) {\n\t\ttext(obs.id, \"observation id\");\n\t\ttext(obs.claimId, \"observation claim\");\n\t\ttext(obs.binding, \"observation binding\");\n\t\tinteger(obs.observedAtMs, \"observedAtMs\");\n\t\tinteger(obs.expiresAtMs, \"expiresAtMs\");\n\t\tensure(obs.expiresAtMs >= obs.observedAtMs, \"invalid observation validity interval\");\n\t\tmember(obs.kind, [\"reference\", \"check\", \"decision\"], \"observation kind\");\n\t\tif (obs.kind === \"reference\") {\n\t\t\ttext(obs.sourceId, \"sourceId\");\n\t\t\ttext(obs.documentDigest, \"documentDigest\");\n\t\t\ttext(obs.locator, \"locator\");\n\t\t\tif (obs.version !== null) text(obs.version, \"observation version\", 128);\n\t\t\tmember(obs.stance, [\"support\", \"refute\"], \"stance\");\n\t\t} else if (obs.kind === \"check\") {\n\t\t\ttext(obs.runnerId, \"runnerId\");\n\t\t\ttext(obs.checkId, \"checkId\");\n\t\t\tinteger(obs.sequence, \"sequence\");\n\t\t\tmember(obs.verdict, [\"pass\", \"fail\", \"pending\"], \"check verdict\");\n\t\t\tconst key = canonical([obs.claimId, obs.binding, obs.checkId, obs.sequence]);\n\t\t\tconst previous = sequences.get(key);\n\t\t\tensure(previous === undefined || previous === canonical(obs), \"conflicting check sequence\");\n\t\t\tsequences.set(key, canonical(obs));\n\t\t} else {\n\t\t\ttext(obs.actorId, \"actorId\");\n\t\t\tensure(typeof obs.accepted === \"boolean\", \"invalid decision\");\n\t\t}\n\t\tconst previous = observations.get(obs.id);\n\t\tensure(previous === undefined || canonical(previous) === canonical(obs), \"conflicting observation id\");\n\t\tobservations.set(obs.id, obs);\n\t}\n\tconst relevantClaims = input.claims.filter((c) => input.stage === \"after-change\" || c.phase === \"precondition\");\n\tconst rejectedObservations: { id: string; reason: string }[] = [];\n\tconst admissible = new Map<string, Observation[]>();\n\tconst claimMap = new Map(relevantClaims.map((c) => [c.id, c]));\n\tfor (const obs of observations.values()) {\n\t\tconst c = claimMap.get(obs.claimId);\n\t\tlet reason: string | undefined;\n\t\tif (!c) reason = \"irrelevant-claim-or-stage\";\n\t\telse if (obs.binding !== c.binding) reason = \"stale-binding\";\n\t\telse if (obs.observedAtMs > input.nowMs || obs.expiresAtMs <= input.nowMs) reason = \"expired-or-future\";\n\t\telse if (obs.kind === \"reference\") {\n\t\t\tconst source = sources.get(obs.sourceId);\n\t\t\tif (!source || (source.kind !== \"repository\" && source.kind !== \"official\")) reason = \"inadmissible-source\";\n\t\t\telse if (c.requiresVersion && (c.version === null || obs.version !== c.version)) reason = \"version-mismatch\";\n\t\t} else if (obs.kind === \"check\" && !input.trustedRunnerIds.includes(obs.runnerId)) reason = \"untrusted-runner\";\n\t\telse if (obs.kind === \"decision\" && !input.decisionActorIds.includes(obs.actorId)) {\n\t\t\treason = \"untrusted-decision-actor\";\n\t\t}\n\t\tif (reason) rejectedObservations.push({ id: obs.id, reason });\n\t\telse admissible.set(obs.claimId, [...(admissible.get(obs.claimId) ?? []), obs]);\n\t}\n\tconst gaps: KnowledgeGap[] = [];\n\tconst supportedClaimIds: string[] = [];\n\tif (input.requiresAssessment && relevantClaims.filter((c) => c.required).length === 0) {\n\t\tgaps.push({\n\t\t\tclaimId: \"$step\",\n\t\t\tbinding: \"unassessed\",\n\t\t\treason: \"unassessed-step\",\n\t\t\trequired: true,\n\t\t\timpact: 1_000_000,\n\t\t\tcheckId: null,\n\t\t});\n\t}\n\tfor (const c of relevantClaims) {\n\t\tconst before = gaps.length;\n\t\tconst evidence = admissible.get(c.id) ?? [];\n\t\tconst add = (reason: GapReason, checkId: string | null = null): void => {\n\t\t\tgaps.push({ claimId: c.id, binding: c.binding, reason, required: c.required, impact: c.impact, checkId });\n\t\t};\n\t\tif (c.requiresVersion && c.version === null) add(\"unknown-version\");\n\t\tif (c.needsReference) {\n\t\t\tconst refs = evidence.filter((obs): obs is ReferenceObservation => obs.kind === \"reference\");\n\t\t\tconst support = new Set(\n\t\t\t\trefs.filter((r) => r.stance === \"support\").map((r) => sources.get(r.sourceId)!.family),\n\t\t\t);\n\t\t\tif (refs.some((r) => r.stance === \"refute\")) add(\"contradictory-reference\");\n\t\t\telse if (support.size < c.minSourceFamilies) add(\"unsupported-reference\");\n\t\t}\n\t\tfor (const checkId of c.requiredCheckIds) {\n\t\t\tconst records = evidence\n\t\t\t\t.filter((obs): obs is CheckObservation => obs.kind === \"check\" && obs.checkId === checkId)\n\t\t\t\t.sort((a, b) => a.sequence - b.sequence);\n\t\t\tconst latest = records.at(-1);\n\t\t\tif (!latest) add(\"missing-check\", checkId);\n\t\t\telse if (latest.verdict === \"fail\") add(\"failed-check\", checkId);\n\t\t\telse if (latest.verdict === \"pending\") add(\"pending-check\", checkId);\n\t\t}\n\t\tif (c.needsUserDecision) {\n\t\t\tconst decisions = evidence.filter((obs): obs is DecisionObservation => obs.kind === \"decision\");\n\t\t\tif (!decisions.some((d) => d.accepted) || decisions.some((d) => !d.accepted)) add(\"missing-user-decision\");\n\t\t}\n\t\tif (before === gaps.length) supportedClaimIds.push(c.id);\n\t}\n\tgaps.sort(\n\t\t(a, b) =>\n\t\t\tNumber(b.required) - Number(a.required) ||\n\t\t\tb.impact - a.impact ||\n\t\t\tlexical(a.claimId, b.claimId) ||\n\t\t\tlexical(a.reason, b.reason),\n\t);\n\treturn {\n\t\tstate: gaps.some((g) => g.required) ? \"gaps\" : \"supported\",\n\t\tgaps,\n\t\tsupportedClaimIds: supportedClaimIds.sort(lexical),\n\t\trejectedObservations,\n\t};\n}\n"]}
@@ -0,0 +1,82 @@
1
+ export type ObservationSource = "host-observed" | "analyzer-inferred" | "model-hypothesized";
2
+ export type Coverage = "covered" | "partial" | "unsupported" | "unknown";
3
+ /** §4.2: one observable change atom, not a filename or keyword. */
4
+ export interface ChangeAtom {
5
+ readonly id: string;
6
+ readonly targetId: string;
7
+ readonly operation: string;
8
+ readonly trustBoundary: string;
9
+ readonly temporal: "synchronous" | "async" | "concurrent" | "retried" | "none";
10
+ readonly externalEffect: "none" | "read" | "write" | "network" | "payment" | "delete";
11
+ readonly source: ObservationSource;
12
+ readonly analyzerCoverage: Coverage;
13
+ }
14
+ /** A versioned host rule: when its predicates hold, instantiate obligations. */
15
+ export interface ObligationRule {
16
+ readonly ruleId: string;
17
+ readonly ruleVersion: string;
18
+ readonly description: string;
19
+ readonly match: {
20
+ readonly temporal?: readonly ChangeAtom["temporal"][];
21
+ readonly externalEffect?: readonly ChangeAtom["externalEffect"][];
22
+ readonly trustBoundary?: readonly string[];
23
+ readonly operation?: readonly string[];
24
+ };
25
+ /** Obligations instantiated when this rule fires. */
26
+ readonly produce: readonly {
27
+ readonly obligationId: string;
28
+ readonly statement: string;
29
+ readonly kind: "precondition" | "postcondition";
30
+ readonly checkMethodId: string | null;
31
+ readonly required: boolean;
32
+ readonly impact: number;
33
+ readonly minSourceFamilies?: number;
34
+ readonly requiresVersion?: boolean;
35
+ }[];
36
+ }
37
+ export type ObligationStatus = "candidate" | "required" | "satisfied" | "violated" | "blocked-high-risk";
38
+ export interface Obligation {
39
+ readonly id: string;
40
+ readonly atomId: string;
41
+ readonly ruleId: string;
42
+ readonly ruleVersion: string;
43
+ readonly statement: string;
44
+ readonly kind: "precondition" | "postcondition";
45
+ readonly checkMethodId: string | null;
46
+ readonly scope: string;
47
+ readonly triggerObservationIds: readonly string[];
48
+ readonly required: boolean;
49
+ readonly impact: number;
50
+ readonly novelty: number;
51
+ readonly normalizedCost: number;
52
+ readonly coverageFraction: number;
53
+ status: ObligationStatus;
54
+ }
55
+ export interface ObligationReport {
56
+ readonly required: readonly Obligation[];
57
+ readonly candidates: readonly Obligation[];
58
+ /** Effects/rules we could not map — never claim completeness. */
59
+ readonly unmappedEffects: readonly string[];
60
+ readonly unsupportedSyntax: readonly string[];
61
+ readonly unobservedConsumers: readonly string[];
62
+ readonly coverage: "complete" | "partial" | "unknown";
63
+ }
64
+ export declare function validateAtom(atom: ChangeAtom): void;
65
+ /**
66
+ * Instantiate host rules over observed atoms. Rules fire only on atoms whose
67
+ * predicates are satisfied; `model-hypothesized` atoms produce candidates,
68
+ * never required obligations. High-risk effects on unverified hypotheses are
69
+ * surfaced as `blocked-high-risk` candidates so the host can gate the effect.
70
+ */
71
+ export declare function instantiateObligations(atoms: readonly ChangeAtom[], rules: readonly ObligationRule[], nowMs: number): ObligationReport;
72
+ /**
73
+ * §4.4 ranking score. NOT a failure probability — an explainable ordering key:
74
+ * J(o) = impact·(1-coverage)·(1+novelty) / (ε + normalizedCost).
75
+ * Priority classes are applied by the caller before this score is consulted.
76
+ */
77
+ export declare function obligationPriority(o: Obligation, epsilon?: number): number;
78
+ /** Close an obligation when its bound check passes; open violations when it fails. */
79
+ export declare function settleObligation(obligations: readonly Obligation[], obligationId: string, checkOutcome: "pass" | "fail" | "unverifiable"): readonly Obligation[];
80
+ /** Structural fingerprint for de-duplication across checkpoints. */
81
+ export declare function obligationFingerprint(o: Obligation): string;
82
+ //# sourceMappingURL=obligations.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"obligations.d.ts","sourceRoot":"","sources":["../../src/metacognition/obligations.ts"],"names":[],"mappings":"AAYA,MAAM,MAAM,iBAAiB,GAAG,eAAe,GAAG,mBAAmB,GAAG,oBAAoB,CAAC;AAC7F,MAAM,MAAM,QAAQ,GAAG,SAAS,GAAG,SAAS,GAAG,aAAa,GAAG,SAAS,CAAC;AAEzE,oEAAmE;AACnE,MAAM,WAAW,UAAU;IAC1B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,QAAQ,EAAE,aAAa,GAAG,OAAO,GAAG,YAAY,GAAG,SAAS,GAAG,MAAM,CAAC;IAC/E,QAAQ,CAAC,cAAc,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,SAAS,GAAG,SAAS,GAAG,QAAQ,CAAC;IACtF,QAAQ,CAAC,MAAM,EAAE,iBAAiB,CAAC;IACnC,QAAQ,CAAC,gBAAgB,EAAE,QAAQ,CAAC;CACpC;AACD,gFAAgF;AAChF,MAAM,WAAW,cAAc;IAC9B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,KAAK,EAAE;QACf,QAAQ,CAAC,QAAQ,CAAC,EAAE,SAAS,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QACtD,QAAQ,CAAC,cAAc,CAAC,EAAE,SAAS,UAAU,CAAC,gBAAgB,CAAC,EAAE,CAAC;QAClE,QAAQ,CAAC,aAAa,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;QAC3C,QAAQ,CAAC,SAAS,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;KACvC,CAAC;IACF,qDAAqD;IACrD,QAAQ,CAAC,OAAO,EAAE,SAAS;QAC1B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;QAC9B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;QAC3B,QAAQ,CAAC,IAAI,EAAE,cAAc,GAAG,eAAe,CAAC;QAChD,QAAQ,CAAC,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;QACtC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;QAC3B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;QACxB,QAAQ,CAAC,iBAAiB,CAAC,EAAE,MAAM,CAAC;QACpC,QAAQ,CAAC,eAAe,CAAC,EAAE,OAAO,CAAC;KACnC,EAAE,CAAC;CACJ;AACD,MAAM,MAAM,gBAAgB,GAAG,WAAW,GAAG,UAAU,GAAG,WAAW,GAAG,UAAU,GAAG,mBAAmB,CAAC;AACzG,MAAM,WAAW,UAAU;IAC1B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,IAAI,EAAE,cAAc,GAAG,eAAe,CAAC;IAChD,QAAQ,CAAC,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IACtC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,qBAAqB,EAAE,SAAS,MAAM,EAAE,CAAC;IAClD,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;IAClC,MAAM,EAAE,gBAAgB,CAAC;CACzB;AACD,MAAM,WAAW,gBAAgB;IAChC,QAAQ,CAAC,QAAQ,EAAE,SAAS,UAAU,EAAE,CAAC;IACzC,QAAQ,CAAC,UAAU,EAAE,SAAS,UAAU,EAAE,CAAC;IAC3C,mEAAiE;IACjE,QAAQ,CAAC,eAAe,EAAE,SAAS,MAAM,EAAE,CAAC;IAC5C,QAAQ,CAAC,iBAAiB,EAAE,SAAS,MAAM,EAAE,CAAC;IAC9C,QAAQ,CAAC,mBAAmB,EAAE,SAAS,MAAM,EAAE,CAAC;IAChD,QAAQ,CAAC,QAAQ,EAAE,UAAU,GAAG,SAAS,GAAG,SAAS,CAAC;CACtD;AAKD,wBAAgB,YAAY,CAAC,IAAI,EAAE,UAAU,GAAG,IAAI,CASnD;AAED;;;;;GAKG;AACH,wBAAgB,sBAAsB,CACrC,KAAK,EAAE,SAAS,UAAU,EAAE,EAC5B,KAAK,EAAE,SAAS,cAAc,EAAE,EAChC,KAAK,EAAE,MAAM,GACX,gBAAgB,CAiFlB;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,CAAC,EAAE,UAAU,EAAE,OAAO,SAAO,GAAG,MAAM,CAOxE;AAED,sFAAsF;AACtF,wBAAgB,gBAAgB,CAC/B,WAAW,EAAE,SAAS,UAAU,EAAE,EAClC,YAAY,EAAE,MAAM,EACpB,YAAY,EAAE,MAAM,GAAG,MAAM,GAAG,cAAc,GAC5C,SAAS,UAAU,EAAE,CAQvB;AAED,oEAAoE;AACpE,wBAAgB,qBAAqB,CAAC,CAAC,EAAE,UAAU,GAAG,MAAM,CAE3D","sourcesContent":["/**\n * Algorithm A — missing-condition discovery and obligation generation.\n * Spec: OMK_metacognitive_control_algorithms_2026-09-19.md §4.\n *\n * Change atoms (target + operation + trust boundary + temporal property +\n * external effect + observation source + analyzer coverage) are matched\n * against a versioned host rule set. Host facts promote candidates to\n * required obligations; model hypotheses stay candidates. Model proposals\n * can never remove user or policy obligations.\n */\nimport { canonical, ensure, finite, integer, lexical, member, text, unique } from \"./validation.ts\";\n\nexport type ObservationSource = \"host-observed\" | \"analyzer-inferred\" | \"model-hypothesized\";\nexport type Coverage = \"covered\" | \"partial\" | \"unsupported\" | \"unknown\";\n\n/** §4.2: one observable change atom, not a filename or keyword. */\nexport interface ChangeAtom {\n\treadonly id: string;\n\treadonly targetId: string;\n\treadonly operation: string;\n\treadonly trustBoundary: string;\n\treadonly temporal: \"synchronous\" | \"async\" | \"concurrent\" | \"retried\" | \"none\";\n\treadonly externalEffect: \"none\" | \"read\" | \"write\" | \"network\" | \"payment\" | \"delete\";\n\treadonly source: ObservationSource;\n\treadonly analyzerCoverage: Coverage;\n}\n/** A versioned host rule: when its predicates hold, instantiate obligations. */\nexport interface ObligationRule {\n\treadonly ruleId: string;\n\treadonly ruleVersion: string;\n\treadonly description: string;\n\treadonly match: {\n\t\treadonly temporal?: readonly ChangeAtom[\"temporal\"][];\n\t\treadonly externalEffect?: readonly ChangeAtom[\"externalEffect\"][];\n\t\treadonly trustBoundary?: readonly string[];\n\t\treadonly operation?: readonly string[];\n\t};\n\t/** Obligations instantiated when this rule fires. */\n\treadonly produce: readonly {\n\t\treadonly obligationId: string;\n\t\treadonly statement: string;\n\t\treadonly kind: \"precondition\" | \"postcondition\";\n\t\treadonly checkMethodId: string | null;\n\t\treadonly required: boolean;\n\t\treadonly impact: number;\n\t\treadonly minSourceFamilies?: number;\n\t\treadonly requiresVersion?: boolean;\n\t}[];\n}\nexport type ObligationStatus = \"candidate\" | \"required\" | \"satisfied\" | \"violated\" | \"blocked-high-risk\";\nexport interface Obligation {\n\treadonly id: string;\n\treadonly atomId: string;\n\treadonly ruleId: string;\n\treadonly ruleVersion: string;\n\treadonly statement: string;\n\treadonly kind: \"precondition\" | \"postcondition\";\n\treadonly checkMethodId: string | null;\n\treadonly scope: string;\n\treadonly triggerObservationIds: readonly string[];\n\treadonly required: boolean;\n\treadonly impact: number;\n\treadonly novelty: number;\n\treadonly normalizedCost: number;\n\treadonly coverageFraction: number;\n\tstatus: ObligationStatus;\n}\nexport interface ObligationReport {\n\treadonly required: readonly Obligation[];\n\treadonly candidates: readonly Obligation[];\n\t/** Effects/rules we could not map — never claim completeness. */\n\treadonly unmappedEffects: readonly string[];\n\treadonly unsupportedSyntax: readonly string[];\n\treadonly unobservedConsumers: readonly string[];\n\treadonly coverage: \"complete\" | \"partial\" | \"unknown\";\n}\n\nconst ATOM_BOUND = 512;\nconst RULE_BOUND = 256;\n\nexport function validateAtom(atom: ChangeAtom): void {\n\ttext(atom.id, \"atom id\", 128);\n\ttext(atom.targetId, \"targetId\", 512);\n\ttext(atom.operation, \"operation\", 128);\n\ttext(atom.trustBoundary, \"trustBoundary\", 256);\n\tmember(atom.temporal, [\"synchronous\", \"async\", \"concurrent\", \"retried\", \"none\"], \"temporal\");\n\tmember(atom.externalEffect, [\"none\", \"read\", \"write\", \"network\", \"payment\", \"delete\"], \"externalEffect\");\n\tmember(atom.source, [\"host-observed\", \"analyzer-inferred\", \"model-hypothesized\"], \"atom source\");\n\tmember(atom.analyzerCoverage, [\"covered\", \"partial\", \"unsupported\", \"unknown\"], \"analyzerCoverage\");\n}\n\n/**\n * Instantiate host rules over observed atoms. Rules fire only on atoms whose\n * predicates are satisfied; `model-hypothesized` atoms produce candidates,\n * never required obligations. High-risk effects on unverified hypotheses are\n * surfaced as `blocked-high-risk` candidates so the host can gate the effect.\n */\nexport function instantiateObligations(\n\tatoms: readonly ChangeAtom[],\n\trules: readonly ObligationRule[],\n\tnowMs: number,\n): ObligationReport {\n\tinteger(nowMs, \"nowMs\");\n\tensure(atoms.length <= ATOM_BOUND, \"too many atoms\");\n\tensure(rules.length <= RULE_BOUND, \"too many rules\");\n\tunique(\n\t\tatoms.map((a) => a.id),\n\t\t\"atom ids\",\n\t);\n\tunique(\n\t\trules.map((r) => r.ruleId),\n\t\t\"rule ids\",\n\t);\n\tfor (const atom of atoms) validateAtom(atom);\n\tfor (const rule of rules) {\n\t\ttext(rule.ruleVersion, \"ruleVersion\", 64);\n\t\ttext(rule.description, \"rule description\", 512);\n\t\tensure(rule.produce.length > 0 && rule.produce.length <= 32, \"rule produce bounds\");\n\t}\n\tconst required: Obligation[] = [];\n\tconst candidates: Obligation[] = [];\n\tconst unmappedEffects: string[] = [];\n\tconst unsupportedSyntax: string[] = [];\n\tconst _unobservedConsumers: string[] = [];\n\tlet sawUnknownCoverage = false;\n\tfor (const atom of atoms) {\n\t\tif (atom.analyzerCoverage === \"unknown\") sawUnknownCoverage = true;\n\t\tif (atom.analyzerCoverage === \"unsupported\") unsupportedSyntax.push(atom.id);\n\t\tlet matched = false;\n\t\tfor (const rule of rules) {\n\t\t\tconst m = rule.match;\n\t\t\tif (m.temporal && !m.temporal.includes(atom.temporal)) continue;\n\t\t\tif (m.externalEffect && !m.externalEffect.includes(atom.externalEffect)) continue;\n\t\t\tif (m.trustBoundary && !m.trustBoundary.includes(atom.trustBoundary)) continue;\n\t\t\tif (m.operation && !m.operation.includes(atom.operation)) continue;\n\t\t\tmatched = true;\n\t\t\tfor (const prod of rule.produce) {\n\t\t\t\tfinite(prod.impact, \"obligation impact\", 1_000_000);\n\t\t\t\tconst novelty = atom.source === \"model-hypothesized\" ? 1 : 0.5;\n\t\t\t\tconst obligation: Obligation = {\n\t\t\t\t\tid: `${rule.ruleId}:${atom.id}:${prod.obligationId}`,\n\t\t\t\t\tatomId: atom.id,\n\t\t\t\t\truleId: rule.ruleId,\n\t\t\t\t\truleVersion: rule.ruleVersion,\n\t\t\t\t\tstatement: prod.statement,\n\t\t\t\t\tkind: prod.kind,\n\t\t\t\t\tcheckMethodId: prod.checkMethodId,\n\t\t\t\t\tscope: atom.targetId,\n\t\t\t\t\ttriggerObservationIds: [atom.id],\n\t\t\t\t\trequired: prod.required,\n\t\t\t\t\timpact: prod.impact,\n\t\t\t\t\tnovelty,\n\t\t\t\t\tnormalizedCost: 1,\n\t\t\t\t\tcoverageFraction: 0,\n\t\t\t\t\tstatus:\n\t\t\t\t\t\tatom.source === \"model-hypothesized\"\n\t\t\t\t\t\t\t? atom.externalEffect === \"write\" ||\n\t\t\t\t\t\t\t\tatom.externalEffect === \"payment\" ||\n\t\t\t\t\t\t\t\tatom.externalEffect === \"delete\"\n\t\t\t\t\t\t\t\t? \"blocked-high-risk\"\n\t\t\t\t\t\t\t\t: \"candidate\"\n\t\t\t\t\t\t\t: prod.required\n\t\t\t\t\t\t\t\t? \"required\"\n\t\t\t\t\t\t\t\t: \"candidate\",\n\t\t\t\t};\n\t\t\t\t(atom.source === \"model-hypothesized\" ? candidates : required).push(obligation);\n\t\t\t}\n\t\t}\n\t\tif (!matched && atom.externalEffect !== \"none\") unmappedEffects.push(atom.id);\n\t}\n\tconst sortObligations = (a: Obligation, b: Obligation): number => b.impact - a.impact || lexical(a.id, b.id);\n\trequired.sort(sortObligations);\n\tcandidates.sort(sortObligations);\n\treturn {\n\t\trequired: required.filter((o) => o.status === \"required\"),\n\t\tcandidates,\n\t\tunmappedEffects: unmappedEffects.sort(lexical),\n\t\tunsupportedSyntax: unsupportedSyntax.sort(lexical),\n\t\tunobservedConsumers: [],\n\t\tcoverage:\n\t\t\tsawUnknownCoverage || unmappedEffects.length > 0 || unsupportedSyntax.length > 0 ? \"unknown\" : \"partial\",\n\t};\n}\n\n/**\n * §4.4 ranking score. NOT a failure probability — an explainable ordering key:\n * J(o) = impact·(1-coverage)·(1+novelty) / (ε + normalizedCost).\n * Priority classes are applied by the caller before this score is consulted.\n */\nexport function obligationPriority(o: Obligation, epsilon = 0.01): number {\n\tfinite(o.impact, \"impact\", 1_000_000);\n\tfinite(o.coverageFraction, \"coverage\", 1);\n\tfinite(o.novelty, \"novelty\", 1);\n\tfinite(o.normalizedCost, \"cost\", 1_000_000);\n\tfinite(epsilon, \"epsilon\", 1);\n\treturn (o.impact * (1 - o.coverageFraction) * (1 + o.novelty)) / (epsilon + o.normalizedCost);\n}\n\n/** Close an obligation when its bound check passes; open violations when it fails. */\nexport function settleObligation(\n\tobligations: readonly Obligation[],\n\tobligationId: string,\n\tcheckOutcome: \"pass\" | \"fail\" | \"unverifiable\",\n): readonly Obligation[] {\n\ttext(obligationId, \"obligationId\", 512);\n\treturn obligations.map((o) => {\n\t\tif (o.id !== obligationId) return o;\n\t\tconst status: ObligationStatus =\n\t\t\tcheckOutcome === \"pass\" ? \"satisfied\" : checkOutcome === \"fail\" ? \"violated\" : o.status;\n\t\treturn { ...o, status };\n\t});\n}\n\n/** Structural fingerprint for de-duplication across checkpoints. */\nexport function obligationFingerprint(o: Obligation): string {\n\treturn canonical([o.ruleId, o.ruleVersion, o.atomId, o.statement, o.scope]);\n}\n"]}
@@ -0,0 +1,139 @@
1
+ /**
2
+ * Algorithm A — missing-condition discovery and obligation generation.
3
+ * Spec: OMK_metacognitive_control_algorithms_2026-09-19.md §4.
4
+ *
5
+ * Change atoms (target + operation + trust boundary + temporal property +
6
+ * external effect + observation source + analyzer coverage) are matched
7
+ * against a versioned host rule set. Host facts promote candidates to
8
+ * required obligations; model hypotheses stay candidates. Model proposals
9
+ * can never remove user or policy obligations.
10
+ */
11
+ import { canonical, ensure, finite, integer, lexical, member, text, unique } from "./validation.js";
12
+ const ATOM_BOUND = 512;
13
+ const RULE_BOUND = 256;
14
+ export function validateAtom(atom) {
15
+ text(atom.id, "atom id", 128);
16
+ text(atom.targetId, "targetId", 512);
17
+ text(atom.operation, "operation", 128);
18
+ text(atom.trustBoundary, "trustBoundary", 256);
19
+ member(atom.temporal, ["synchronous", "async", "concurrent", "retried", "none"], "temporal");
20
+ member(atom.externalEffect, ["none", "read", "write", "network", "payment", "delete"], "externalEffect");
21
+ member(atom.source, ["host-observed", "analyzer-inferred", "model-hypothesized"], "atom source");
22
+ member(atom.analyzerCoverage, ["covered", "partial", "unsupported", "unknown"], "analyzerCoverage");
23
+ }
24
+ /**
25
+ * Instantiate host rules over observed atoms. Rules fire only on atoms whose
26
+ * predicates are satisfied; `model-hypothesized` atoms produce candidates,
27
+ * never required obligations. High-risk effects on unverified hypotheses are
28
+ * surfaced as `blocked-high-risk` candidates so the host can gate the effect.
29
+ */
30
+ export function instantiateObligations(atoms, rules, nowMs) {
31
+ integer(nowMs, "nowMs");
32
+ ensure(atoms.length <= ATOM_BOUND, "too many atoms");
33
+ ensure(rules.length <= RULE_BOUND, "too many rules");
34
+ unique(atoms.map((a) => a.id), "atom ids");
35
+ unique(rules.map((r) => r.ruleId), "rule ids");
36
+ for (const atom of atoms)
37
+ validateAtom(atom);
38
+ for (const rule of rules) {
39
+ text(rule.ruleVersion, "ruleVersion", 64);
40
+ text(rule.description, "rule description", 512);
41
+ ensure(rule.produce.length > 0 && rule.produce.length <= 32, "rule produce bounds");
42
+ }
43
+ const required = [];
44
+ const candidates = [];
45
+ const unmappedEffects = [];
46
+ const unsupportedSyntax = [];
47
+ const _unobservedConsumers = [];
48
+ let sawUnknownCoverage = false;
49
+ for (const atom of atoms) {
50
+ if (atom.analyzerCoverage === "unknown")
51
+ sawUnknownCoverage = true;
52
+ if (atom.analyzerCoverage === "unsupported")
53
+ unsupportedSyntax.push(atom.id);
54
+ let matched = false;
55
+ for (const rule of rules) {
56
+ const m = rule.match;
57
+ if (m.temporal && !m.temporal.includes(atom.temporal))
58
+ continue;
59
+ if (m.externalEffect && !m.externalEffect.includes(atom.externalEffect))
60
+ continue;
61
+ if (m.trustBoundary && !m.trustBoundary.includes(atom.trustBoundary))
62
+ continue;
63
+ if (m.operation && !m.operation.includes(atom.operation))
64
+ continue;
65
+ matched = true;
66
+ for (const prod of rule.produce) {
67
+ finite(prod.impact, "obligation impact", 1_000_000);
68
+ const novelty = atom.source === "model-hypothesized" ? 1 : 0.5;
69
+ const obligation = {
70
+ id: `${rule.ruleId}:${atom.id}:${prod.obligationId}`,
71
+ atomId: atom.id,
72
+ ruleId: rule.ruleId,
73
+ ruleVersion: rule.ruleVersion,
74
+ statement: prod.statement,
75
+ kind: prod.kind,
76
+ checkMethodId: prod.checkMethodId,
77
+ scope: atom.targetId,
78
+ triggerObservationIds: [atom.id],
79
+ required: prod.required,
80
+ impact: prod.impact,
81
+ novelty,
82
+ normalizedCost: 1,
83
+ coverageFraction: 0,
84
+ status: atom.source === "model-hypothesized"
85
+ ? atom.externalEffect === "write" ||
86
+ atom.externalEffect === "payment" ||
87
+ atom.externalEffect === "delete"
88
+ ? "blocked-high-risk"
89
+ : "candidate"
90
+ : prod.required
91
+ ? "required"
92
+ : "candidate",
93
+ };
94
+ (atom.source === "model-hypothesized" ? candidates : required).push(obligation);
95
+ }
96
+ }
97
+ if (!matched && atom.externalEffect !== "none")
98
+ unmappedEffects.push(atom.id);
99
+ }
100
+ const sortObligations = (a, b) => b.impact - a.impact || lexical(a.id, b.id);
101
+ required.sort(sortObligations);
102
+ candidates.sort(sortObligations);
103
+ return {
104
+ required: required.filter((o) => o.status === "required"),
105
+ candidates,
106
+ unmappedEffects: unmappedEffects.sort(lexical),
107
+ unsupportedSyntax: unsupportedSyntax.sort(lexical),
108
+ unobservedConsumers: [],
109
+ coverage: sawUnknownCoverage || unmappedEffects.length > 0 || unsupportedSyntax.length > 0 ? "unknown" : "partial",
110
+ };
111
+ }
112
+ /**
113
+ * §4.4 ranking score. NOT a failure probability — an explainable ordering key:
114
+ * J(o) = impact·(1-coverage)·(1+novelty) / (ε + normalizedCost).
115
+ * Priority classes are applied by the caller before this score is consulted.
116
+ */
117
+ export function obligationPriority(o, epsilon = 0.01) {
118
+ finite(o.impact, "impact", 1_000_000);
119
+ finite(o.coverageFraction, "coverage", 1);
120
+ finite(o.novelty, "novelty", 1);
121
+ finite(o.normalizedCost, "cost", 1_000_000);
122
+ finite(epsilon, "epsilon", 1);
123
+ return (o.impact * (1 - o.coverageFraction) * (1 + o.novelty)) / (epsilon + o.normalizedCost);
124
+ }
125
+ /** Close an obligation when its bound check passes; open violations when it fails. */
126
+ export function settleObligation(obligations, obligationId, checkOutcome) {
127
+ text(obligationId, "obligationId", 512);
128
+ return obligations.map((o) => {
129
+ if (o.id !== obligationId)
130
+ return o;
131
+ const status = checkOutcome === "pass" ? "satisfied" : checkOutcome === "fail" ? "violated" : o.status;
132
+ return { ...o, status };
133
+ });
134
+ }
135
+ /** Structural fingerprint for de-duplication across checkpoints. */
136
+ export function obligationFingerprint(o) {
137
+ return canonical([o.ruleId, o.ruleVersion, o.atomId, o.statement, o.scope]);
138
+ }
139
+ //# sourceMappingURL=obligations.js.map