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":"obligations.js","sourceRoot":"","sources":["../../src/metacognition/obligations.ts"],"names":[],"mappings":"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","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,83 @@
1
+ /**
2
+ * Observation validity and state packing (Jev audit algorithm A2, finding F10).
3
+ *
4
+ * F10: the value the existing code calls `freshness` is really a change
5
+ * indicator. Those are different facts — a screen observed one millisecond ago
6
+ * that has not changed scores zero on one and one on the other — so this module
7
+ * reports them separately and never derives one from the other.
8
+ *
9
+ * For anything risky the decay score is not the gate at all. An explicit
10
+ * maximum observation age and equality of the document and action generations
11
+ * decide validity; the decay value is a continuous signal for ranking, not a
12
+ * learned safety probability.
13
+ *
14
+ * "Check then click" is not a database transaction: the page keeps running.
15
+ * Re-checking the target narrows the race window, and the postcondition is what
16
+ * actually establishes the result.
17
+ */
18
+ /** f = exp(−Δt/τ). A ranking signal, not a probability of safety. */
19
+ export declare function timeDecayFreshness(elapsedMs: number, decayConstantMs: number): number;
20
+ /** n = 1[h(x_t) ≠ h(x_{t−1})]. Orthogonal to age. */
21
+ export declare function changeIndicator(previousStateHash: string | undefined, currentStateHash: string | undefined): 0 | 1;
22
+ export interface ObservationValidityInput {
23
+ readonly observedAtMs: number;
24
+ readonly dispatchAtMs: number;
25
+ readonly decayConstantMs: number;
26
+ /** Hard bound for this risk tier; outranks any decay score. */
27
+ readonly maxObservationAgeMs: number;
28
+ /** Navigation, frame swap, tab swap, permission-session change. */
29
+ readonly observedDocumentGeneration: number;
30
+ readonly currentDocumentGeneration: number;
31
+ /** Chosen element's attachment, role, name, arguments, enabled state. */
32
+ readonly observedActionGeneration: number;
33
+ readonly currentActionGeneration: number;
34
+ readonly previousStateHash?: string;
35
+ readonly currentStateHash?: string;
36
+ }
37
+ export type ObservationValidityVerdict = {
38
+ readonly valid: true;
39
+ readonly freshness: number;
40
+ readonly changed: 0 | 1;
41
+ readonly ageMs: number;
42
+ } | {
43
+ readonly valid: false;
44
+ readonly reason: "document-generation-changed" | "action-generation-changed" | "max-age-exceeded";
45
+ };
46
+ /**
47
+ * Decide whether an observation may still back a dispatch.
48
+ *
49
+ * Generation mismatches are reported before age: if the page navigated, saying
50
+ * "observation too old" sends the operator to tune a timeout instead of looking
51
+ * at the navigation that actually invalidated the target.
52
+ */
53
+ export declare function evaluateObservationValidity(input: ObservationValidityInput): ObservationValidityVerdict;
54
+ export interface StateItem {
55
+ readonly id: string;
56
+ readonly tokenCost: number;
57
+ readonly utility: number;
58
+ readonly required: boolean;
59
+ }
60
+ export type StatePackingResult = {
61
+ readonly status: "packed";
62
+ readonly selected: readonly string[];
63
+ readonly tokensUsed: number;
64
+ readonly utility: number;
65
+ } | {
66
+ readonly status: "incomplete-state";
67
+ readonly missingRequired: readonly string[];
68
+ readonly requiredTokens: number;
69
+ readonly budget: number;
70
+ };
71
+ /**
72
+ * Pack observation state under a token budget.
73
+ *
74
+ * Required evidence is pinned first. When it alone exceeds the budget the
75
+ * result is `incomplete-state`, never a quietly truncated view: the caller has
76
+ * to narrow the observation rather than act on a state that lost its evidence.
77
+ *
78
+ * Optional items are then taken by utility density. That is the fixed-rule
79
+ * starting point the design asks for, not an optimal knapsack solution, and it
80
+ * is not claimed to be one.
81
+ */
82
+ export declare function packState(items: readonly StateItem[], budget: number): StatePackingResult;
83
+ //# sourceMappingURL=observation-validity.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"observation-validity.d.ts","sourceRoot":"","sources":["../../src/metacognition/observation-validity.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAIH,yEAAqE;AACrE,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,GAAG,MAAM,CAUrF;AAED,yDAAqD;AACrD,wBAAgB,eAAe,CAAC,iBAAiB,EAAE,MAAM,GAAG,SAAS,EAAE,gBAAgB,EAAE,MAAM,GAAG,SAAS,GAAG,CAAC,GAAG,CAAC,CAGlH;AAED,MAAM,WAAW,wBAAwB;IACxC,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,+DAA+D;IAC/D,QAAQ,CAAC,mBAAmB,EAAE,MAAM,CAAC;IACrC,mEAAmE;IACnE,QAAQ,CAAC,0BAA0B,EAAE,MAAM,CAAC;IAC5C,QAAQ,CAAC,yBAAyB,EAAE,MAAM,CAAC;IAC3C,yEAAyE;IACzE,QAAQ,CAAC,wBAAwB,EAAE,MAAM,CAAC;IAC1C,QAAQ,CAAC,uBAAuB,EAAE,MAAM,CAAC;IACzC,QAAQ,CAAC,iBAAiB,CAAC,EAAE,MAAM,CAAC;IACpC,QAAQ,CAAC,gBAAgB,CAAC,EAAE,MAAM,CAAC;CACnC;AAED,MAAM,MAAM,0BAA0B,GACnC;IAAE,QAAQ,CAAC,KAAK,EAAE,IAAI,CAAC;IAAC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,CAAC,GAAG,CAAC,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GACrG;IACA,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,6BAA6B,GAAG,2BAA2B,GAAG,kBAAkB,CAAC;CACjG,CAAC;AAEL;;;;;;GAMG;AACH,wBAAgB,2BAA2B,CAAC,KAAK,EAAE,wBAAwB,GAAG,0BAA0B,CAyBvG;AAED,MAAM,WAAW,SAAS;IACzB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;CAC3B;AAED,MAAM,MAAM,kBAAkB,GAC3B;IACA,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC;IAC1B,QAAQ,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAC;IACrC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CACxB,GACD;IACA,QAAQ,CAAC,MAAM,EAAE,kBAAkB,CAAC;IACpC,QAAQ,CAAC,eAAe,EAAE,SAAS,MAAM,EAAE,CAAC;IAC5C,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACvB,CAAC;AAEL;;;;;;;;;;GAUG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,SAAS,SAAS,EAAE,EAAE,MAAM,EAAE,MAAM,GAAG,kBAAkB,CA4CzF","sourcesContent":["/**\n * Observation validity and state packing (Jev audit algorithm A2, finding F10).\n *\n * F10: the value the existing code calls `freshness` is really a change\n * indicator. Those are different facts — a screen observed one millisecond ago\n * that has not changed scores zero on one and one on the other — so this module\n * reports them separately and never derives one from the other.\n *\n * For anything risky the decay score is not the gate at all. An explicit\n * maximum observation age and equality of the document and action generations\n * decide validity; the decay value is a continuous signal for ranking, not a\n * learned safety probability.\n *\n * \"Check then click\" is not a database transaction: the page keeps running.\n * Re-checking the target narrows the race window, and the postcondition is what\n * actually establishes the result.\n */\n\nimport { ensure } from \"./validation.ts\";\n\n/** f = exp(−Δt/τ). A ranking signal, not a probability of safety. */\nexport function timeDecayFreshness(elapsedMs: number, decayConstantMs: number): number {\n\tensure(\n\t\ttypeof elapsedMs === \"number\" && Number.isFinite(elapsedMs) && elapsedMs >= 0,\n\t\t\"elapsedMs must be a nonnegative finite number\",\n\t);\n\tensure(\n\t\ttypeof decayConstantMs === \"number\" && Number.isFinite(decayConstantMs) && decayConstantMs > 0,\n\t\t\"decayConstantMs must be positive\",\n\t);\n\treturn Math.exp(-elapsedMs / decayConstantMs);\n}\n\n/** n = 1[h(x_t) ≠ h(x_{t−1})]. Orthogonal to age. */\nexport function changeIndicator(previousStateHash: string | undefined, currentStateHash: string | undefined): 0 | 1 {\n\tif (previousStateHash === undefined || currentStateHash === undefined) return 0;\n\treturn previousStateHash === currentStateHash ? 0 : 1;\n}\n\nexport interface ObservationValidityInput {\n\treadonly observedAtMs: number;\n\treadonly dispatchAtMs: number;\n\treadonly decayConstantMs: number;\n\t/** Hard bound for this risk tier; outranks any decay score. */\n\treadonly maxObservationAgeMs: number;\n\t/** Navigation, frame swap, tab swap, permission-session change. */\n\treadonly observedDocumentGeneration: number;\n\treadonly currentDocumentGeneration: number;\n\t/** Chosen element's attachment, role, name, arguments, enabled state. */\n\treadonly observedActionGeneration: number;\n\treadonly currentActionGeneration: number;\n\treadonly previousStateHash?: string;\n\treadonly currentStateHash?: string;\n}\n\nexport type ObservationValidityVerdict =\n\t| { readonly valid: true; readonly freshness: number; readonly changed: 0 | 1; readonly ageMs: number }\n\t| {\n\t\t\treadonly valid: false;\n\t\t\treadonly reason: \"document-generation-changed\" | \"action-generation-changed\" | \"max-age-exceeded\";\n\t };\n\n/**\n * Decide whether an observation may still back a dispatch.\n *\n * Generation mismatches are reported before age: if the page navigated, saying\n * \"observation too old\" sends the operator to tune a timeout instead of looking\n * at the navigation that actually invalidated the target.\n */\nexport function evaluateObservationValidity(input: ObservationValidityInput): ObservationValidityVerdict {\n\tfor (const [label, value] of [\n\t\t[\"observedAtMs\", input.observedAtMs],\n\t\t[\"dispatchAtMs\", input.dispatchAtMs],\n\t\t[\"maxObservationAgeMs\", input.maxObservationAgeMs],\n\t] as const) {\n\t\tensure(typeof value === \"number\" && Number.isFinite(value) && value >= 0, `${label} must be nonnegative`);\n\t}\n\tconst ageMs = input.dispatchAtMs - input.observedAtMs;\n\tensure(ageMs >= 0, \"dispatchAtMs must not precede observedAtMs on a monotonic clock\");\n\n\tif (input.observedDocumentGeneration !== input.currentDocumentGeneration) {\n\t\treturn { valid: false, reason: \"document-generation-changed\" };\n\t}\n\tif (input.observedActionGeneration !== input.currentActionGeneration) {\n\t\treturn { valid: false, reason: \"action-generation-changed\" };\n\t}\n\tif (ageMs > input.maxObservationAgeMs) return { valid: false, reason: \"max-age-exceeded\" };\n\n\treturn {\n\t\tvalid: true,\n\t\tfreshness: timeDecayFreshness(ageMs, input.decayConstantMs),\n\t\tchanged: changeIndicator(input.previousStateHash, input.currentStateHash),\n\t\tageMs,\n\t};\n}\n\nexport interface StateItem {\n\treadonly id: string;\n\treadonly tokenCost: number;\n\treadonly utility: number;\n\treadonly required: boolean;\n}\n\nexport type StatePackingResult =\n\t| {\n\t\t\treadonly status: \"packed\";\n\t\t\treadonly selected: readonly string[];\n\t\t\treadonly tokensUsed: number;\n\t\t\treadonly utility: number;\n\t }\n\t| {\n\t\t\treadonly status: \"incomplete-state\";\n\t\t\treadonly missingRequired: readonly string[];\n\t\t\treadonly requiredTokens: number;\n\t\t\treadonly budget: number;\n\t };\n\n/**\n * Pack observation state under a token budget.\n *\n * Required evidence is pinned first. When it alone exceeds the budget the\n * result is `incomplete-state`, never a quietly truncated view: the caller has\n * to narrow the observation rather than act on a state that lost its evidence.\n *\n * Optional items are then taken by utility density. That is the fixed-rule\n * starting point the design asks for, not an optimal knapsack solution, and it\n * is not claimed to be one.\n */\nexport function packState(items: readonly StateItem[], budget: number): StatePackingResult {\n\tensure(Array.isArray(items), \"items must be an array\");\n\tensure(Number.isFinite(budget) && budget >= 0, \"budget must be nonnegative\");\n\tfor (const item of items) {\n\t\tensure(typeof item.id === \"string\" && item.id.length > 0, \"each item needs a non-empty id\");\n\t\tensure(Number.isFinite(item.tokenCost) && item.tokenCost >= 0, \"tokenCost must be nonnegative\");\n\t\tensure(Number.isFinite(item.utility) && item.utility >= 0, \"utility must be nonnegative\");\n\t}\n\n\tconst required: StateItem[] = [];\n\tconst optional: Array<{ item: StateItem; density: number }> = [];\n\tfor (const item of items) {\n\t\tif (item.required) required.push(item);\n\t\telse optional.push({ item, density: item.tokenCost === 0 ? Infinity : item.utility / item.tokenCost });\n\t}\n\tconst requiredTokens = required.reduce((sum, item) => sum + item.tokenCost, 0);\n\tif (requiredTokens > budget) {\n\t\treturn {\n\t\t\tstatus: \"incomplete-state\",\n\t\t\tmissingRequired: required.map((item) => item.id),\n\t\t\trequiredTokens,\n\t\t\tbudget,\n\t\t};\n\t}\n\n\tconst selected = required.map((item) => item.id);\n\tlet tokensUsed = requiredTokens;\n\tlet utility = required.reduce((sum, item) => sum + item.utility, 0);\n\n\t// Density order, with id as a tiebreak so equal densities pack deterministically.\n\tconst byId = (a: StateItem, b: StateItem): number => {\n\t\tif (a.id < b.id) return -1;\n\t\treturn a.id > b.id ? 1 : 0;\n\t};\n\toptional.sort((a, b) => b.density - a.density || byId(a.item, b.item));\n\n\tfor (const { item } of optional) {\n\t\tif (tokensUsed + item.tokenCost > budget) continue;\n\t\tselected.push(item.id);\n\t\ttokensUsed += item.tokenCost;\n\t\tutility += item.utility;\n\t}\n\n\treturn { status: \"packed\", selected, tokensUsed, utility };\n}\n"]}
@@ -0,0 +1,118 @@
1
+ /**
2
+ * Observation validity and state packing (Jev audit algorithm A2, finding F10).
3
+ *
4
+ * F10: the value the existing code calls `freshness` is really a change
5
+ * indicator. Those are different facts — a screen observed one millisecond ago
6
+ * that has not changed scores zero on one and one on the other — so this module
7
+ * reports them separately and never derives one from the other.
8
+ *
9
+ * For anything risky the decay score is not the gate at all. An explicit
10
+ * maximum observation age and equality of the document and action generations
11
+ * decide validity; the decay value is a continuous signal for ranking, not a
12
+ * learned safety probability.
13
+ *
14
+ * "Check then click" is not a database transaction: the page keeps running.
15
+ * Re-checking the target narrows the race window, and the postcondition is what
16
+ * actually establishes the result.
17
+ */
18
+ import { ensure } from "./validation.js";
19
+ /** f = exp(−Δt/τ). A ranking signal, not a probability of safety. */
20
+ export function timeDecayFreshness(elapsedMs, decayConstantMs) {
21
+ ensure(typeof elapsedMs === "number" && Number.isFinite(elapsedMs) && elapsedMs >= 0, "elapsedMs must be a nonnegative finite number");
22
+ ensure(typeof decayConstantMs === "number" && Number.isFinite(decayConstantMs) && decayConstantMs > 0, "decayConstantMs must be positive");
23
+ return Math.exp(-elapsedMs / decayConstantMs);
24
+ }
25
+ /** n = 1[h(x_t) ≠ h(x_{t−1})]. Orthogonal to age. */
26
+ export function changeIndicator(previousStateHash, currentStateHash) {
27
+ if (previousStateHash === undefined || currentStateHash === undefined)
28
+ return 0;
29
+ return previousStateHash === currentStateHash ? 0 : 1;
30
+ }
31
+ /**
32
+ * Decide whether an observation may still back a dispatch.
33
+ *
34
+ * Generation mismatches are reported before age: if the page navigated, saying
35
+ * "observation too old" sends the operator to tune a timeout instead of looking
36
+ * at the navigation that actually invalidated the target.
37
+ */
38
+ export function evaluateObservationValidity(input) {
39
+ for (const [label, value] of [
40
+ ["observedAtMs", input.observedAtMs],
41
+ ["dispatchAtMs", input.dispatchAtMs],
42
+ ["maxObservationAgeMs", input.maxObservationAgeMs],
43
+ ]) {
44
+ ensure(typeof value === "number" && Number.isFinite(value) && value >= 0, `${label} must be nonnegative`);
45
+ }
46
+ const ageMs = input.dispatchAtMs - input.observedAtMs;
47
+ ensure(ageMs >= 0, "dispatchAtMs must not precede observedAtMs on a monotonic clock");
48
+ if (input.observedDocumentGeneration !== input.currentDocumentGeneration) {
49
+ return { valid: false, reason: "document-generation-changed" };
50
+ }
51
+ if (input.observedActionGeneration !== input.currentActionGeneration) {
52
+ return { valid: false, reason: "action-generation-changed" };
53
+ }
54
+ if (ageMs > input.maxObservationAgeMs)
55
+ return { valid: false, reason: "max-age-exceeded" };
56
+ return {
57
+ valid: true,
58
+ freshness: timeDecayFreshness(ageMs, input.decayConstantMs),
59
+ changed: changeIndicator(input.previousStateHash, input.currentStateHash),
60
+ ageMs,
61
+ };
62
+ }
63
+ /**
64
+ * Pack observation state under a token budget.
65
+ *
66
+ * Required evidence is pinned first. When it alone exceeds the budget the
67
+ * result is `incomplete-state`, never a quietly truncated view: the caller has
68
+ * to narrow the observation rather than act on a state that lost its evidence.
69
+ *
70
+ * Optional items are then taken by utility density. That is the fixed-rule
71
+ * starting point the design asks for, not an optimal knapsack solution, and it
72
+ * is not claimed to be one.
73
+ */
74
+ export function packState(items, budget) {
75
+ ensure(Array.isArray(items), "items must be an array");
76
+ ensure(Number.isFinite(budget) && budget >= 0, "budget must be nonnegative");
77
+ for (const item of items) {
78
+ ensure(typeof item.id === "string" && item.id.length > 0, "each item needs a non-empty id");
79
+ ensure(Number.isFinite(item.tokenCost) && item.tokenCost >= 0, "tokenCost must be nonnegative");
80
+ ensure(Number.isFinite(item.utility) && item.utility >= 0, "utility must be nonnegative");
81
+ }
82
+ const required = [];
83
+ const optional = [];
84
+ for (const item of items) {
85
+ if (item.required)
86
+ required.push(item);
87
+ else
88
+ optional.push({ item, density: item.tokenCost === 0 ? Infinity : item.utility / item.tokenCost });
89
+ }
90
+ const requiredTokens = required.reduce((sum, item) => sum + item.tokenCost, 0);
91
+ if (requiredTokens > budget) {
92
+ return {
93
+ status: "incomplete-state",
94
+ missingRequired: required.map((item) => item.id),
95
+ requiredTokens,
96
+ budget,
97
+ };
98
+ }
99
+ const selected = required.map((item) => item.id);
100
+ let tokensUsed = requiredTokens;
101
+ let utility = required.reduce((sum, item) => sum + item.utility, 0);
102
+ // Density order, with id as a tiebreak so equal densities pack deterministically.
103
+ const byId = (a, b) => {
104
+ if (a.id < b.id)
105
+ return -1;
106
+ return a.id > b.id ? 1 : 0;
107
+ };
108
+ optional.sort((a, b) => b.density - a.density || byId(a.item, b.item));
109
+ for (const { item } of optional) {
110
+ if (tokensUsed + item.tokenCost > budget)
111
+ continue;
112
+ selected.push(item.id);
113
+ tokensUsed += item.tokenCost;
114
+ utility += item.utility;
115
+ }
116
+ return { status: "packed", selected, tokensUsed, utility };
117
+ }
118
+ //# sourceMappingURL=observation-validity.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"observation-validity.js","sourceRoot":"","sources":["../../src/metacognition/observation-validity.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Observation validity and state packing (Jev audit algorithm A2, finding F10).\n *\n * F10: the value the existing code calls `freshness` is really a change\n * indicator. Those are different facts — a screen observed one millisecond ago\n * that has not changed scores zero on one and one on the other — so this module\n * reports them separately and never derives one from the other.\n *\n * For anything risky the decay score is not the gate at all. An explicit\n * maximum observation age and equality of the document and action generations\n * decide validity; the decay value is a continuous signal for ranking, not a\n * learned safety probability.\n *\n * \"Check then click\" is not a database transaction: the page keeps running.\n * Re-checking the target narrows the race window, and the postcondition is what\n * actually establishes the result.\n */\n\nimport { ensure } from \"./validation.ts\";\n\n/** f = exp(−Δt/τ). A ranking signal, not a probability of safety. */\nexport function timeDecayFreshness(elapsedMs: number, decayConstantMs: number): number {\n\tensure(\n\t\ttypeof elapsedMs === \"number\" && Number.isFinite(elapsedMs) && elapsedMs >= 0,\n\t\t\"elapsedMs must be a nonnegative finite number\",\n\t);\n\tensure(\n\t\ttypeof decayConstantMs === \"number\" && Number.isFinite(decayConstantMs) && decayConstantMs > 0,\n\t\t\"decayConstantMs must be positive\",\n\t);\n\treturn Math.exp(-elapsedMs / decayConstantMs);\n}\n\n/** n = 1[h(x_t) ≠ h(x_{t−1})]. Orthogonal to age. */\nexport function changeIndicator(previousStateHash: string | undefined, currentStateHash: string | undefined): 0 | 1 {\n\tif (previousStateHash === undefined || currentStateHash === undefined) return 0;\n\treturn previousStateHash === currentStateHash ? 0 : 1;\n}\n\nexport interface ObservationValidityInput {\n\treadonly observedAtMs: number;\n\treadonly dispatchAtMs: number;\n\treadonly decayConstantMs: number;\n\t/** Hard bound for this risk tier; outranks any decay score. */\n\treadonly maxObservationAgeMs: number;\n\t/** Navigation, frame swap, tab swap, permission-session change. */\n\treadonly observedDocumentGeneration: number;\n\treadonly currentDocumentGeneration: number;\n\t/** Chosen element's attachment, role, name, arguments, enabled state. */\n\treadonly observedActionGeneration: number;\n\treadonly currentActionGeneration: number;\n\treadonly previousStateHash?: string;\n\treadonly currentStateHash?: string;\n}\n\nexport type ObservationValidityVerdict =\n\t| { readonly valid: true; readonly freshness: number; readonly changed: 0 | 1; readonly ageMs: number }\n\t| {\n\t\t\treadonly valid: false;\n\t\t\treadonly reason: \"document-generation-changed\" | \"action-generation-changed\" | \"max-age-exceeded\";\n\t };\n\n/**\n * Decide whether an observation may still back a dispatch.\n *\n * Generation mismatches are reported before age: if the page navigated, saying\n * \"observation too old\" sends the operator to tune a timeout instead of looking\n * at the navigation that actually invalidated the target.\n */\nexport function evaluateObservationValidity(input: ObservationValidityInput): ObservationValidityVerdict {\n\tfor (const [label, value] of [\n\t\t[\"observedAtMs\", input.observedAtMs],\n\t\t[\"dispatchAtMs\", input.dispatchAtMs],\n\t\t[\"maxObservationAgeMs\", input.maxObservationAgeMs],\n\t] as const) {\n\t\tensure(typeof value === \"number\" && Number.isFinite(value) && value >= 0, `${label} must be nonnegative`);\n\t}\n\tconst ageMs = input.dispatchAtMs - input.observedAtMs;\n\tensure(ageMs >= 0, \"dispatchAtMs must not precede observedAtMs on a monotonic clock\");\n\n\tif (input.observedDocumentGeneration !== input.currentDocumentGeneration) {\n\t\treturn { valid: false, reason: \"document-generation-changed\" };\n\t}\n\tif (input.observedActionGeneration !== input.currentActionGeneration) {\n\t\treturn { valid: false, reason: \"action-generation-changed\" };\n\t}\n\tif (ageMs > input.maxObservationAgeMs) return { valid: false, reason: \"max-age-exceeded\" };\n\n\treturn {\n\t\tvalid: true,\n\t\tfreshness: timeDecayFreshness(ageMs, input.decayConstantMs),\n\t\tchanged: changeIndicator(input.previousStateHash, input.currentStateHash),\n\t\tageMs,\n\t};\n}\n\nexport interface StateItem {\n\treadonly id: string;\n\treadonly tokenCost: number;\n\treadonly utility: number;\n\treadonly required: boolean;\n}\n\nexport type StatePackingResult =\n\t| {\n\t\t\treadonly status: \"packed\";\n\t\t\treadonly selected: readonly string[];\n\t\t\treadonly tokensUsed: number;\n\t\t\treadonly utility: number;\n\t }\n\t| {\n\t\t\treadonly status: \"incomplete-state\";\n\t\t\treadonly missingRequired: readonly string[];\n\t\t\treadonly requiredTokens: number;\n\t\t\treadonly budget: number;\n\t };\n\n/**\n * Pack observation state under a token budget.\n *\n * Required evidence is pinned first. When it alone exceeds the budget the\n * result is `incomplete-state`, never a quietly truncated view: the caller has\n * to narrow the observation rather than act on a state that lost its evidence.\n *\n * Optional items are then taken by utility density. That is the fixed-rule\n * starting point the design asks for, not an optimal knapsack solution, and it\n * is not claimed to be one.\n */\nexport function packState(items: readonly StateItem[], budget: number): StatePackingResult {\n\tensure(Array.isArray(items), \"items must be an array\");\n\tensure(Number.isFinite(budget) && budget >= 0, \"budget must be nonnegative\");\n\tfor (const item of items) {\n\t\tensure(typeof item.id === \"string\" && item.id.length > 0, \"each item needs a non-empty id\");\n\t\tensure(Number.isFinite(item.tokenCost) && item.tokenCost >= 0, \"tokenCost must be nonnegative\");\n\t\tensure(Number.isFinite(item.utility) && item.utility >= 0, \"utility must be nonnegative\");\n\t}\n\n\tconst required: StateItem[] = [];\n\tconst optional: Array<{ item: StateItem; density: number }> = [];\n\tfor (const item of items) {\n\t\tif (item.required) required.push(item);\n\t\telse optional.push({ item, density: item.tokenCost === 0 ? Infinity : item.utility / item.tokenCost });\n\t}\n\tconst requiredTokens = required.reduce((sum, item) => sum + item.tokenCost, 0);\n\tif (requiredTokens > budget) {\n\t\treturn {\n\t\t\tstatus: \"incomplete-state\",\n\t\t\tmissingRequired: required.map((item) => item.id),\n\t\t\trequiredTokens,\n\t\t\tbudget,\n\t\t};\n\t}\n\n\tconst selected = required.map((item) => item.id);\n\tlet tokensUsed = requiredTokens;\n\tlet utility = required.reduce((sum, item) => sum + item.utility, 0);\n\n\t// Density order, with id as a tiebreak so equal densities pack deterministically.\n\tconst byId = (a: StateItem, b: StateItem): number => {\n\t\tif (a.id < b.id) return -1;\n\t\treturn a.id > b.id ? 1 : 0;\n\t};\n\toptional.sort((a, b) => b.density - a.density || byId(a.item, b.item));\n\n\tfor (const { item } of optional) {\n\t\tif (tokensUsed + item.tokenCost > budget) continue;\n\t\tselected.push(item.id);\n\t\ttokensUsed += item.tokenCost;\n\t\tutility += item.utility;\n\t}\n\n\treturn { status: \"packed\", selected, tokensUsed, utility };\n}\n"]}
@@ -0,0 +1,45 @@
1
+ /**
2
+ * Observation mode — §13 "기존 완료 판정 호출부: 메타상태를 진단으로 첨부,
3
+ * 최종 승인·검증 영수증은 기존 권위에 둠."
4
+ *
5
+ * Produces a serializable diagnostic snapshot for the host to attach at a
6
+ * completion/verification boundary. It never mutates the run, never issues a
7
+ * receipt, and never changes `verified` — it only reports what the
8
+ * metacognition state saw at that checkpoint.
9
+ */
10
+ import { type CheckpointResult } from "./checkpoint.ts";
11
+ import type { ActionConstraints, MetaAction } from "./policy.ts";
12
+ import type { MetaState } from "./state.ts";
13
+ export interface MetaDiagnostic {
14
+ readonly schema: "omk.metacognition.diagnostic.v1";
15
+ readonly taskId: string;
16
+ readonly stageId: string;
17
+ readonly stateFingerprint: string;
18
+ readonly finishKind: "continue" | "verified-completion" | "inconclusive";
19
+ readonly finishReason?: string;
20
+ readonly proposedAction: MetaActionKindLabel;
21
+ readonly openRequiredObligations: number;
22
+ readonly violatedObligations: number;
23
+ readonly blockedHighRiskCandidates: number;
24
+ readonly unresolvedMismatches: number;
25
+ readonly verifierBlindSpots: number;
26
+ readonly runnerHealth: MetaState["verifier"]["runnerHealth"];
27
+ readonly calibrationDemoted: number;
28
+ readonly checkpointCount: number;
29
+ }
30
+ type MetaActionKindLabel = MetaAction["kind"];
31
+ /** Observation-mode diagnostic. Read-only over MetaState — no side effects. */
32
+ export declare function attachMetaDiagnostics(state: MetaState, constraints: ActionConstraints, nowMs: number): MetaDiagnostic;
33
+ /** Project a checkpoint result into the diagnostic record. */
34
+ export declare function toDiagnostic(state: MetaState, result: CheckpointResult): MetaDiagnostic;
35
+ /**
36
+ * Run one observation-mode checkpoint through the bridge: returns the kernel
37
+ * report plus the diagnostic to attach. The host keeps its own completion
38
+ * verdict; this only advises.
39
+ */
40
+ export declare function observeCheckpoint(state: MetaState, constraints: ActionConstraints, nowMs: number): {
41
+ readonly result: CheckpointResult;
42
+ readonly diagnostic: MetaDiagnostic;
43
+ };
44
+ export {};
45
+ //# sourceMappingURL=observe.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"observe.d.ts","sourceRoot":"","sources":["../../src/metacognition/observe.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,EAAE,KAAK,gBAAgB,EAAc,MAAM,iBAAiB,CAAC;AACpE,OAAO,KAAK,EAAE,iBAAiB,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEjE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAI5C,MAAM,WAAW,cAAc;IAC9B,QAAQ,CAAC,MAAM,EAAE,iCAAiC,CAAC;IACnD,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,UAAU,EAAE,UAAU,GAAG,qBAAqB,GAAG,cAAc,CAAC;IACzE,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,cAAc,EAAE,mBAAmB,CAAC;IAC7C,QAAQ,CAAC,uBAAuB,EAAE,MAAM,CAAC;IACzC,QAAQ,CAAC,mBAAmB,EAAE,MAAM,CAAC;IACrC,QAAQ,CAAC,yBAAyB,EAAE,MAAM,CAAC;IAC3C,QAAQ,CAAC,oBAAoB,EAAE,MAAM,CAAC;IACtC,QAAQ,CAAC,kBAAkB,EAAE,MAAM,CAAC;IACpC,QAAQ,CAAC,YAAY,EAAE,SAAS,CAAC,UAAU,CAAC,CAAC,cAAc,CAAC,CAAC;IAC7D,QAAQ,CAAC,kBAAkB,EAAE,MAAM,CAAC;IACpC,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;CACjC;AACD,KAAK,mBAAmB,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC;AAE9C,iFAA+E;AAC/E,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,iBAAiB,EAAE,KAAK,EAAE,MAAM,GAAG,cAAc,CAIrH;AAED,8DAA8D;AAC9D,wBAAgB,YAAY,CAAC,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,gBAAgB,GAAG,cAAc,CAiCvF;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAChC,KAAK,EAAE,SAAS,EAChB,WAAW,EAAE,iBAAiB,EAC9B,KAAK,EAAE,MAAM,GACX;IAAE,QAAQ,CAAC,MAAM,EAAE,gBAAgB,CAAC;IAAC,QAAQ,CAAC,UAAU,EAAE,cAAc,CAAA;CAAE,CAG5E","sourcesContent":["/**\n * Observation mode — §13 \"기존 완료 판정 호출부: 메타상태를 진단으로 첨부,\n * 최종 승인·검증 영수증은 기존 권위에 둠.\"\n *\n * Produces a serializable diagnostic snapshot for the host to attach at a\n * completion/verification boundary. It never mutates the run, never issues a\n * receipt, and never changes `verified` — it only reports what the\n * metacognition state saw at that checkpoint.\n */\nimport { type CheckpointResult, checkpoint } from \"./checkpoint.ts\";\nimport type { ActionConstraints, MetaAction } from \"./policy.ts\";\nimport { mismatchSummary } from \"./predictions.ts\";\nimport type { MetaState } from \"./state.ts\";\nimport { stateFingerprint } from \"./state.ts\";\nimport { integer } from \"./validation.ts\";\n\nexport interface MetaDiagnostic {\n\treadonly schema: \"omk.metacognition.diagnostic.v1\";\n\treadonly taskId: string;\n\treadonly stageId: string;\n\treadonly stateFingerprint: string;\n\treadonly finishKind: \"continue\" | \"verified-completion\" | \"inconclusive\";\n\treadonly finishReason?: string;\n\treadonly proposedAction: MetaActionKindLabel;\n\treadonly openRequiredObligations: number;\n\treadonly violatedObligations: number;\n\treadonly blockedHighRiskCandidates: number;\n\treadonly unresolvedMismatches: number;\n\treadonly verifierBlindSpots: number;\n\treadonly runnerHealth: MetaState[\"verifier\"][\"runnerHealth\"];\n\treadonly calibrationDemoted: number;\n\treadonly checkpointCount: number;\n}\ntype MetaActionKindLabel = MetaAction[\"kind\"];\n\n/** Observation-mode diagnostic. Read-only over MetaState — no side effects. */\nexport function attachMetaDiagnostics(state: MetaState, constraints: ActionConstraints, nowMs: number): MetaDiagnostic {\n\tinteger(nowMs, \"nowMs\");\n\tconst result = checkpoint({ state, nowMs, constraints });\n\treturn toDiagnostic(state, result);\n}\n\n/** Project a checkpoint result into the diagnostic record. */\nexport function toDiagnostic(state: MetaState, result: CheckpointResult): MetaDiagnostic {\n\tconst mismatches = mismatchSummary(state.predictions);\n\tconst blindSpots = state.verifier.evaluations.reduce(\n\t\t(n, e) => n + e.blindSpots.length + (e.detectionRate === \"unknown\" ? 1 : 0),\n\t\t0,\n\t);\n\tconst demoted = Object.values(state.calibration.buckets).filter((b) => b.state === \"demoted\").length;\n\treturn {\n\t\tschema: \"omk.metacognition.diagnostic.v1\",\n\t\ttaskId: state.goal.taskId,\n\t\tstageId: state.goal.stageId,\n\t\tstateFingerprint: stateFingerprint(state),\n\t\tfinishKind: result.finish.kind,\n\t\tfinishReason:\n\t\t\tresult.finish.kind === \"inconclusive\"\n\t\t\t\t? result.finish.reason\n\t\t\t\t: result.finish.kind === \"verified-completion\"\n\t\t\t\t\t? result.finish.receiptId\n\t\t\t\t\t: undefined,\n\t\tproposedAction: result.action.kind,\n\t\topenRequiredObligations: state.obligations.filter((o) => o.status === \"required\").length,\n\t\tviolatedObligations: state.obligations.filter((o) => o.status === \"violated\").length,\n\t\tblockedHighRiskCandidates: state.obligations.filter((o) => o.status === \"blocked-high-risk\").length,\n\t\tunresolvedMismatches:\n\t\t\tmismatches.byKind[\"unexpected-fail\"] +\n\t\t\tmismatches.byKind[\"unexpected-side-effect\"] +\n\t\t\tmismatches.byKind[\"scope-mismatch\"] +\n\t\t\tmismatches.byKind[\"missing-observation\"],\n\t\tverifierBlindSpots: blindSpots,\n\t\trunnerHealth: state.verifier.runnerHealth,\n\t\tcalibrationDemoted: demoted,\n\t\tcheckpointCount: result.state.checkpointCount,\n\t};\n}\n\n/**\n * Run one observation-mode checkpoint through the bridge: returns the kernel\n * report plus the diagnostic to attach. The host keeps its own completion\n * verdict; this only advises.\n */\nexport function observeCheckpoint(\n\tstate: MetaState,\n\tconstraints: ActionConstraints,\n\tnowMs: number,\n): { readonly result: CheckpointResult; readonly diagnostic: MetaDiagnostic } {\n\tconst result = checkpoint({ state, nowMs, constraints });\n\treturn { result, diagnostic: toDiagnostic(state, result) };\n}\n"]}
@@ -0,0 +1,59 @@
1
+ /**
2
+ * Observation mode — §13 "기존 완료 판정 호출부: 메타상태를 진단으로 첨부,
3
+ * 최종 승인·검증 영수증은 기존 권위에 둠."
4
+ *
5
+ * Produces a serializable diagnostic snapshot for the host to attach at a
6
+ * completion/verification boundary. It never mutates the run, never issues a
7
+ * receipt, and never changes `verified` — it only reports what the
8
+ * metacognition state saw at that checkpoint.
9
+ */
10
+ import { checkpoint } from "./checkpoint.js";
11
+ import { mismatchSummary } from "./predictions.js";
12
+ import { stateFingerprint } from "./state.js";
13
+ import { integer } from "./validation.js";
14
+ /** Observation-mode diagnostic. Read-only over MetaState — no side effects. */
15
+ export function attachMetaDiagnostics(state, constraints, nowMs) {
16
+ integer(nowMs, "nowMs");
17
+ const result = checkpoint({ state, nowMs, constraints });
18
+ return toDiagnostic(state, result);
19
+ }
20
+ /** Project a checkpoint result into the diagnostic record. */
21
+ export function toDiagnostic(state, result) {
22
+ const mismatches = mismatchSummary(state.predictions);
23
+ const blindSpots = state.verifier.evaluations.reduce((n, e) => n + e.blindSpots.length + (e.detectionRate === "unknown" ? 1 : 0), 0);
24
+ const demoted = Object.values(state.calibration.buckets).filter((b) => b.state === "demoted").length;
25
+ return {
26
+ schema: "omk.metacognition.diagnostic.v1",
27
+ taskId: state.goal.taskId,
28
+ stageId: state.goal.stageId,
29
+ stateFingerprint: stateFingerprint(state),
30
+ finishKind: result.finish.kind,
31
+ finishReason: result.finish.kind === "inconclusive"
32
+ ? result.finish.reason
33
+ : result.finish.kind === "verified-completion"
34
+ ? result.finish.receiptId
35
+ : undefined,
36
+ proposedAction: result.action.kind,
37
+ openRequiredObligations: state.obligations.filter((o) => o.status === "required").length,
38
+ violatedObligations: state.obligations.filter((o) => o.status === "violated").length,
39
+ blockedHighRiskCandidates: state.obligations.filter((o) => o.status === "blocked-high-risk").length,
40
+ unresolvedMismatches: mismatches.byKind["unexpected-fail"] +
41
+ mismatches.byKind["unexpected-side-effect"] +
42
+ mismatches.byKind["scope-mismatch"] +
43
+ mismatches.byKind["missing-observation"],
44
+ verifierBlindSpots: blindSpots,
45
+ runnerHealth: state.verifier.runnerHealth,
46
+ calibrationDemoted: demoted,
47
+ checkpointCount: result.state.checkpointCount,
48
+ };
49
+ }
50
+ /**
51
+ * Run one observation-mode checkpoint through the bridge: returns the kernel
52
+ * report plus the diagnostic to attach. The host keeps its own completion
53
+ * verdict; this only advises.
54
+ */
55
+ export function observeCheckpoint(state, constraints, nowMs) {
56
+ const result = checkpoint({ state, nowMs, constraints });
57
+ return { result, diagnostic: toDiagnostic(state, result) };
58
+ }
59
+ //# sourceMappingURL=observe.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"observe.js","sourceRoot":"","sources":["../../src/metacognition/observe.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Observation mode — §13 \"기존 완료 판정 호출부: 메타상태를 진단으로 첨부,\n * 최종 승인·검증 영수증은 기존 권위에 둠.\"\n *\n * Produces a serializable diagnostic snapshot for the host to attach at a\n * completion/verification boundary. It never mutates the run, never issues a\n * receipt, and never changes `verified` — it only reports what the\n * metacognition state saw at that checkpoint.\n */\nimport { type CheckpointResult, checkpoint } from \"./checkpoint.ts\";\nimport type { ActionConstraints, MetaAction } from \"./policy.ts\";\nimport { mismatchSummary } from \"./predictions.ts\";\nimport type { MetaState } from \"./state.ts\";\nimport { stateFingerprint } from \"./state.ts\";\nimport { integer } from \"./validation.ts\";\n\nexport interface MetaDiagnostic {\n\treadonly schema: \"omk.metacognition.diagnostic.v1\";\n\treadonly taskId: string;\n\treadonly stageId: string;\n\treadonly stateFingerprint: string;\n\treadonly finishKind: \"continue\" | \"verified-completion\" | \"inconclusive\";\n\treadonly finishReason?: string;\n\treadonly proposedAction: MetaActionKindLabel;\n\treadonly openRequiredObligations: number;\n\treadonly violatedObligations: number;\n\treadonly blockedHighRiskCandidates: number;\n\treadonly unresolvedMismatches: number;\n\treadonly verifierBlindSpots: number;\n\treadonly runnerHealth: MetaState[\"verifier\"][\"runnerHealth\"];\n\treadonly calibrationDemoted: number;\n\treadonly checkpointCount: number;\n}\ntype MetaActionKindLabel = MetaAction[\"kind\"];\n\n/** Observation-mode diagnostic. Read-only over MetaState — no side effects. */\nexport function attachMetaDiagnostics(state: MetaState, constraints: ActionConstraints, nowMs: number): MetaDiagnostic {\n\tinteger(nowMs, \"nowMs\");\n\tconst result = checkpoint({ state, nowMs, constraints });\n\treturn toDiagnostic(state, result);\n}\n\n/** Project a checkpoint result into the diagnostic record. */\nexport function toDiagnostic(state: MetaState, result: CheckpointResult): MetaDiagnostic {\n\tconst mismatches = mismatchSummary(state.predictions);\n\tconst blindSpots = state.verifier.evaluations.reduce(\n\t\t(n, e) => n + e.blindSpots.length + (e.detectionRate === \"unknown\" ? 1 : 0),\n\t\t0,\n\t);\n\tconst demoted = Object.values(state.calibration.buckets).filter((b) => b.state === \"demoted\").length;\n\treturn {\n\t\tschema: \"omk.metacognition.diagnostic.v1\",\n\t\ttaskId: state.goal.taskId,\n\t\tstageId: state.goal.stageId,\n\t\tstateFingerprint: stateFingerprint(state),\n\t\tfinishKind: result.finish.kind,\n\t\tfinishReason:\n\t\t\tresult.finish.kind === \"inconclusive\"\n\t\t\t\t? result.finish.reason\n\t\t\t\t: result.finish.kind === \"verified-completion\"\n\t\t\t\t\t? result.finish.receiptId\n\t\t\t\t\t: undefined,\n\t\tproposedAction: result.action.kind,\n\t\topenRequiredObligations: state.obligations.filter((o) => o.status === \"required\").length,\n\t\tviolatedObligations: state.obligations.filter((o) => o.status === \"violated\").length,\n\t\tblockedHighRiskCandidates: state.obligations.filter((o) => o.status === \"blocked-high-risk\").length,\n\t\tunresolvedMismatches:\n\t\t\tmismatches.byKind[\"unexpected-fail\"] +\n\t\t\tmismatches.byKind[\"unexpected-side-effect\"] +\n\t\t\tmismatches.byKind[\"scope-mismatch\"] +\n\t\t\tmismatches.byKind[\"missing-observation\"],\n\t\tverifierBlindSpots: blindSpots,\n\t\trunnerHealth: state.verifier.runnerHealth,\n\t\tcalibrationDemoted: demoted,\n\t\tcheckpointCount: result.state.checkpointCount,\n\t};\n}\n\n/**\n * Run one observation-mode checkpoint through the bridge: returns the kernel\n * report plus the diagnostic to attach. The host keeps its own completion\n * verdict; this only advises.\n */\nexport function observeCheckpoint(\n\tstate: MetaState,\n\tconstraints: ActionConstraints,\n\tnowMs: number,\n): { readonly result: CheckpointResult; readonly diagnostic: MetaDiagnostic } {\n\tconst result = checkpoint({ state, nowMs, constraints });\n\treturn { result, diagnostic: toDiagnostic(state, result) };\n}\n"]}
@@ -0,0 +1,53 @@
1
+ import type { MetaState } from "./state.ts";
2
+ export type MetaActionKind = "inspect_local" | "retrieve_reference" | "run_discriminating_probe" | "strengthen_verifier" | "reselect_skills" | "revise_implementation" | "switch_strategy" | "request_required_decision" | "continue_object_work" | "finish_with_bound_receipt" | "stop_inconclusive" | "settle_safety" | "form_obligations";
3
+ export interface MetaAction {
4
+ readonly kind: MetaActionKind;
5
+ readonly obligationId?: string;
6
+ readonly hypothesisId?: string;
7
+ readonly reason: string;
8
+ readonly priority: number;
9
+ }
10
+ export interface ActionConstraints {
11
+ readonly authorizedActions: readonly MetaActionKind[];
12
+ readonly prerequisites: Partial<Readonly<Record<MetaActionKind, readonly string[]>>>;
13
+ readonly actionCostsMs: Partial<Readonly<Record<MetaActionKind, number>>>;
14
+ readonly actionCostsRequests: Partial<Readonly<Record<MetaActionKind, number>>>;
15
+ readonly inScopeKinds: readonly MetaActionKind[];
16
+ }
17
+ /** §9.2: Authorized ∧ Prerequisites ∧ BudgetFits ∧ ScopeBound. */
18
+ export declare function feasibleActions(state: MetaState, constraints: ActionConstraints): MetaActionKind[];
19
+ /**
20
+ * §14 priority table — the baseline deterministic policy. Safety first, then
21
+ * required decisions, host-observed obligations, verifier health, prediction
22
+ * mismatches, verifier blind spots, stagnation, optional positive-VOI work,
23
+ * object work, then finish.
24
+ */
25
+ export declare function selectAction(state: MetaState, constraints: ActionConstraints, options?: {
26
+ readonly receipt?: {
27
+ receiptId: string;
28
+ candidateHash: string;
29
+ scope: string;
30
+ } | null;
31
+ readonly maxRepetitions?: number;
32
+ readonly switchCost?: number;
33
+ readonly estimatedSwitchGain?: number;
34
+ readonly voiCandidates?: readonly {
35
+ kind: MetaActionKind;
36
+ voi: number;
37
+ }[];
38
+ readonly progress?: {
39
+ goalScope: string;
40
+ candidateFamily: string;
41
+ errorClass: string;
42
+ approach: string;
43
+ checkMethod: string;
44
+ sourceFamily: string;
45
+ };
46
+ }): MetaAction;
47
+ /**
48
+ * §6.2/§6.5 VOI evaluation for one observation action. Returns the finite
49
+ * computation result; the caller supplies real priors and likelihoods and may
50
+ * include approved 2-step bundles whose joint value is computed the same way.
51
+ */
52
+ export declare function valueOfObservation(prior: readonly number[], losses: readonly (readonly number[])[], likelihoodByHypothesis: readonly (readonly number[])[], cost: number): number;
53
+ //# sourceMappingURL=policy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"policy.d.ts","sourceRoot":"","sources":["../../src/metacognition/policy.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAG5C,MAAM,MAAM,cAAc,GACvB,eAAe,GACf,oBAAoB,GACpB,0BAA0B,GAC1B,qBAAqB,GACrB,iBAAiB,GACjB,uBAAuB,GACvB,iBAAiB,GACjB,2BAA2B,GAC3B,sBAAsB,GACtB,2BAA2B,GAC3B,mBAAmB,GACnB,eAAe,GACf,kBAAkB,CAAC;AAEtB,MAAM,WAAW,UAAU;IAC1B,QAAQ,CAAC,IAAI,EAAE,cAAc,CAAC;IAC9B,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,iBAAiB;IACjC,QAAQ,CAAC,iBAAiB,EAAE,SAAS,cAAc,EAAE,CAAC;IACtD,QAAQ,CAAC,aAAa,EAAE,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,cAAc,EAAE,SAAS,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC;IACrF,QAAQ,CAAC,aAAa,EAAE,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,cAAc,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC;IAC1E,QAAQ,CAAC,mBAAmB,EAAE,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,cAAc,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC;IAChF,QAAQ,CAAC,YAAY,EAAE,SAAS,cAAc,EAAE,CAAC;CACjD;AAkBD,yEAAkE;AAClE,wBAAgB,eAAe,CAAC,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,iBAAiB,GAAG,cAAc,EAAE,CAclG;AAED;;;;;GAKG;AACH,wBAAgB,YAAY,CAC3B,KAAK,EAAE,SAAS,EAChB,WAAW,EAAE,iBAAiB,EAC9B,OAAO,CAAC,EAAE;IACT,QAAQ,CAAC,OAAO,CAAC,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,aAAa,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;IACtF,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,mBAAmB,CAAC,EAAE,MAAM,CAAC;IACtC,QAAQ,CAAC,aAAa,CAAC,EAAE,SAAS;QAAE,IAAI,EAAE,cAAc,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IAC1E,QAAQ,CAAC,QAAQ,CAAC,EAAE;QACnB,SAAS,EAAE,MAAM,CAAC;QAClB,eAAe,EAAE,MAAM,CAAC;QACxB,UAAU,EAAE,MAAM,CAAC;QACnB,QAAQ,EAAE,MAAM,CAAC;QACjB,WAAW,EAAE,MAAM,CAAC;QACpB,YAAY,EAAE,MAAM,CAAC;KACrB,CAAC;CACF,GACC,UAAU,CAsGZ;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CACjC,KAAK,EAAE,SAAS,MAAM,EAAE,EACxB,MAAM,EAAE,SAAS,CAAC,SAAS,MAAM,EAAE,CAAC,EAAE,EACtC,sBAAsB,EAAE,SAAS,CAAC,SAAS,MAAM,EAAE,CAAC,EAAE,EACtD,IAAI,EAAE,MAAM,GACV,MAAM,CAER","sourcesContent":["/**\n * Algorithm F — bounded metacontrol policy. Spec §9, §14.\n *\n * Feasibility precedes optimization: an action that is unauthorized, missing\n * prerequisites, over budget, or out of scope is absent from the feasible set\n * no matter how much information it promises. The baseline policy is the\n * explicit priority table of §14, not a score-sum that folds safety\n * constraints into a utility number.\n */\nimport { experimentValue } from \"./decision.ts\";\nimport type { MetaState } from \"./state.ts\";\nimport { isStagnant, netSwitchValue, progressKey } from \"./verifier.ts\";\n\nexport type MetaActionKind =\n\t| \"inspect_local\"\n\t| \"retrieve_reference\"\n\t| \"run_discriminating_probe\"\n\t| \"strengthen_verifier\"\n\t| \"reselect_skills\"\n\t| \"revise_implementation\"\n\t| \"switch_strategy\"\n\t| \"request_required_decision\"\n\t| \"continue_object_work\"\n\t| \"finish_with_bound_receipt\"\n\t| \"stop_inconclusive\"\n\t| \"settle_safety\"\n\t| \"form_obligations\";\n\nexport interface MetaAction {\n\treadonly kind: MetaActionKind;\n\treadonly obligationId?: string;\n\treadonly hypothesisId?: string;\n\treadonly reason: string;\n\treadonly priority: number;\n}\n\nexport interface ActionConstraints {\n\treadonly authorizedActions: readonly MetaActionKind[];\n\treadonly prerequisites: Partial<Readonly<Record<MetaActionKind, readonly string[]>>>;\n\treadonly actionCostsMs: Partial<Readonly<Record<MetaActionKind, number>>>;\n\treadonly actionCostsRequests: Partial<Readonly<Record<MetaActionKind, number>>>;\n\treadonly inScopeKinds: readonly MetaActionKind[];\n}\n\nconst ALL_KINDS: readonly MetaActionKind[] = [\n\t\"inspect_local\",\n\t\"retrieve_reference\",\n\t\"run_discriminating_probe\",\n\t\"strengthen_verifier\",\n\t\"reselect_skills\",\n\t\"revise_implementation\",\n\t\"switch_strategy\",\n\t\"request_required_decision\",\n\t\"continue_object_work\",\n\t\"finish_with_bound_receipt\",\n\t\"stop_inconclusive\",\n\t\"settle_safety\",\n\t\"form_obligations\",\n];\n\n/** §9.2: Authorized ∧ Prerequisites ∧ BudgetFits ∧ ScopeBound. */\nexport function feasibleActions(state: MetaState, constraints: ActionConstraints): MetaActionKind[] {\n\treturn ALL_KINDS.filter((kind) => {\n\t\tif (!constraints.authorizedActions.includes(kind)) return false;\n\t\tif (!constraints.inScopeKinds.includes(kind)) return false;\n\t\tfor (const prereq of constraints.prerequisites[kind] ?? []) {\n\t\t\tconst met =\n\t\t\t\tstate.obligations.some((o) => o.id === prereq && o.status === \"satisfied\") ||\n\t\t\t\tstate.predictions.some((p) => p.predictionId === prereq && p.status === \"resolved\");\n\t\t\tif (!met) return false;\n\t\t}\n\t\tconst ms = constraints.actionCostsMs[kind] ?? 0;\n\t\tconst req = constraints.actionCostsRequests[kind] ?? 0;\n\t\treturn ms <= state.budget.remainingMs && req <= state.budget.remainingRequests;\n\t});\n}\n\n/**\n * §14 priority table — the baseline deterministic policy. Safety first, then\n * required decisions, host-observed obligations, verifier health, prediction\n * mismatches, verifier blind spots, stagnation, optional positive-VOI work,\n * object work, then finish.\n */\nexport function selectAction(\n\tstate: MetaState,\n\tconstraints: ActionConstraints,\n\toptions?: {\n\t\treadonly receipt?: { receiptId: string; candidateHash: string; scope: string } | null;\n\t\treadonly maxRepetitions?: number;\n\t\treadonly switchCost?: number;\n\t\treadonly estimatedSwitchGain?: number;\n\t\treadonly voiCandidates?: readonly { kind: MetaActionKind; voi: number }[];\n\t\treadonly progress?: {\n\t\t\tgoalScope: string;\n\t\t\tcandidateFamily: string;\n\t\t\terrorClass: string;\n\t\t\tapproach: string;\n\t\t\tcheckMethod: string;\n\t\t\tsourceFamily: string;\n\t\t};\n\t},\n): MetaAction {\n\tconst feasible = new Set(feasibleActions(state, constraints));\n\tconst pick = (\n\t\tkind: MetaActionKind,\n\t\treason: string,\n\t\tpriority: number,\n\t\textra?: Partial<MetaAction>,\n\t): MetaAction | null => (feasible.has(kind) ? { kind, reason, priority, ...extra } : null);\n\n\t// 0: cancellation, authorization violation, safety constraint, binding mismatch.\n\tif (\n\t\tstate.policy.interruptionReason !== null ||\n\t\tstate.facts.candidateHash === \"\" ||\n\t\t!constraints.authorizedActions.every((a) => state.policy.authorizedActions.includes(a))\n\t) {\n\t\treturn (\n\t\t\tpick(\"settle_safety\", \"safety-or-binding\", 0) ?? {\n\t\t\t\tkind: \"stop_inconclusive\",\n\t\t\t\treason: \"unsafe-feasible-set\",\n\t\t\t\tpriority: 0,\n\t\t\t}\n\t\t);\n\t}\n\t// 1: required user decision or unknown prerequisite.\n\tconst needsDecision = state.obligations.find(\n\t\t(o) => o.status === \"blocked-high-risk\" || (o.status === \"required\" && o.checkMethodId === null && o.required),\n\t);\n\tif (needsDecision) {\n\t\tconst action = pick(\"request_required_decision\", `required-decision:${needsDecision.id}`, 1, {\n\t\t\tobligationId: needsDecision.id,\n\t\t});\n\t\tif (action) return action;\n\t}\n\t// 2: host-observed new required obligation → refresh obligations, gate the step.\n\tconst newRequired = state.obligations.find((o) => o.status === \"required\" && o.coverageFraction === 0);\n\tif (newRequired) {\n\t\tconst action = pick(\"form_obligations\", `new-required:${newRequired.id}`, 2, { obligationId: newRequired.id });\n\t\tif (action) return action;\n\t}\n\t// 3: check execution itself invalid → diagnose environment, not code.\n\tif (state.verifier.runnerHealth !== \"healthy\") {\n\t\tconst action = pick(\"inspect_local\", \"verifier-health-unverified\", 3);\n\t\tif (action) return action;\n\t}\n\t// 4: prediction mismatch or adoptable evidence conflict → discriminate causes.\n\tconst mismatch = state.predictions.find(\n\t\t(p) => p.status === \"resolved\" && p.mismatch !== undefined && p.mismatch !== \"none\",\n\t);\n\tif (mismatch && state.hypotheses.open.length > 1) {\n\t\tconst action = pick(\"run_discriminating_probe\", `mismatch:${mismatch.predictionId}`, 4, {\n\t\t\thypothesisId: state.hypotheses.open[0],\n\t\t});\n\t\tif (action) return action;\n\t}\n\t// 5: verifier blind spot on an important obligation → negative control / new check.\n\tconst blind = state.verifier.evaluations.find((e) => e.detectionRate === \"unknown\" || e.blindSpots.length > 0);\n\tif (blind) {\n\t\tconst action = pick(\"strengthen_verifier\", `blind-spot:${blind.obligationId}`, 5, {\n\t\t\tobligationId: blind.obligationId,\n\t\t});\n\t\tif (action) return action;\n\t}\n\t// 6: same strategy, no valid progress → switch with hysteresis, or stop.\n\tconst maxRep = options?.maxRepetitions ?? 3;\n\tif (options?.progress && isStagnant(options.progress, state.progressHistory, maxRep)) {\n\t\tconst switchGain = netSwitchValue(options.estimatedSwitchGain ?? 0, 0, options.switchCost ?? 0);\n\t\tif (switchGain > 0) {\n\t\t\tconst action = pick(\"switch_strategy\", `stagnant:${progressKey(options.progress)}`, 6);\n\t\t\tif (action) return action;\n\t\t}\n\t\tconst stop = pick(\"stop_inconclusive\", \"stagnant-no-progress\", 6);\n\t\tif (stop) return stop;\n\t}\n\t// 7: optional information acquisition with positive VOI.\n\tconst voi = (options?.voiCandidates ?? [])\n\t\t.filter((c) => c.voi > 0 && feasible.has(c.kind))\n\t\t.sort((a, b) => b.voi - a.voi);\n\tif (voi.length > 0) {\n\t\treturn (\n\t\t\tpick(voi[0]!.kind, `positive-voi:${voi[0]!.voi}`, 7) ?? {\n\t\t\t\tkind: \"stop_inconclusive\",\n\t\t\t\treason: \"no-feasible-voi-action\",\n\t\t\t\tpriority: 7,\n\t\t\t}\n\t\t);\n\t}\n\t// 8: premises sufficient, object work remains.\n\tconst openRequired = state.obligations.filter((o) => o.status === \"required\" || o.status === \"violated\");\n\tif (openRequired.length === 0) {\n\t\tconst action = pick(\"continue_object_work\", \"premises-satisfied\", 8);\n\t\tif (action) return action;\n\t}\n\t// 9: object work done → verified bounded completion or inconclusive stop.\n\tif (options?.receipt && openRequired.length === 0) {\n\t\tconst action = pick(\"finish_with_bound_receipt\", `receipt:${options.receipt.receiptId}`, 9);\n\t\tif (action) return action;\n\t}\n\tconst blocked =\n\t\tpick(\"revise_implementation\", `open-obligations:${openRequired.length}`, 8) ??\n\t\tpick(\"inspect_local\", \"open-obligations-inspect\", 8);\n\tif (blocked) return blocked;\n\treturn { kind: \"stop_inconclusive\", reason: \"no-feasible-action\", priority: 9 };\n}\n\n/**\n * §6.2/§6.5 VOI evaluation for one observation action. Returns the finite\n * computation result; the caller supplies real priors and likelihoods and may\n * include approved 2-step bundles whose joint value is computed the same way.\n */\nexport function valueOfObservation(\n\tprior: readonly number[],\n\tlosses: readonly (readonly number[])[],\n\tlikelihoodByHypothesis: readonly (readonly number[])[],\n\tcost: number,\n): number {\n\treturn experimentValue(prior, losses, likelihoodByHypothesis, cost).netValue;\n}\n"]}