blun-king-cli 9.1.587 → 9.1.588

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 (436) hide show
  1. package/CHANGELOG.md +11 -185
  2. package/LIESMICH.txt +51 -13
  3. package/README.md +44 -47
  4. package/agent-spine-plugin/.codex-plugin/plugin.json +16 -4
  5. package/agent-spine-plugin/CHANGELOG.md +37 -5
  6. package/agent-spine-plugin/README.md +3 -3
  7. package/agent-spine-plugin/blun.plugin.json +45 -10
  8. package/agent-spine-plugin/docs/artifact-evaluation.md +93 -0
  9. package/agent-spine-plugin/docs/host-integration.md +42 -27
  10. package/agent-spine-plugin/docs/preflight-recall.md +4 -2
  11. package/agent-spine-plugin/docs/session-timeline.md +97 -236
  12. package/agent-spine-plugin/docs/world-model.md +25 -0
  13. package/agent-spine-plugin/hooks/codex.json +1 -1
  14. package/agent-spine-plugin/hooks/hooks.json +1 -1
  15. package/agent-spine-plugin/package.json +1 -3
  16. package/agent-spine-plugin/scripts/check-hosts.js +3 -3
  17. package/agent-spine-plugin/scripts/release-check.js +10 -5
  18. package/agent-spine-plugin/scripts/run-checks.js +4 -1
  19. package/agent-spine-plugin/scripts/run-tests-hermetic.js +32 -6
  20. package/agent-spine-plugin/src/cli-learning.js +15 -0
  21. package/agent-spine-plugin/src/cli.js +2 -0
  22. package/agent-spine-plugin/src/hook.js +32 -32
  23. package/agent-spine-plugin/src/lib/action-lesson-recall.js +73 -8
  24. package/agent-spine-plugin/src/lib/briefing.js +146 -36
  25. package/agent-spine-plugin/src/lib/channel-continuity.js +19 -0
  26. package/agent-spine-plugin/src/lib/delivery-agent-usage.js +14 -7
  27. package/agent-spine-plugin/src/lib/gateway-group-response.js +128 -0
  28. package/agent-spine-plugin/src/lib/gateway-runs.js +24 -15
  29. package/agent-spine-plugin/src/lib/hook-briefing-use.js +13 -3
  30. package/agent-spine-plugin/src/lib/hook-context.js +16 -3
  31. package/agent-spine-plugin/src/lib/hook-output.js +129 -5
  32. package/agent-spine-plugin/src/lib/hook-timeline.js +5 -3
  33. package/agent-spine-plugin/src/lib/indexed-memory.js +2 -2
  34. package/agent-spine-plugin/src/lib/learning-artifact-evaluator.js +114 -0
  35. package/agent-spine-plugin/src/lib/learning-context.js +11 -4
  36. package/agent-spine-plugin/src/lib/learning-measurements.js +2 -2
  37. package/agent-spine-plugin/src/lib/mcp-runtime.js +89 -3
  38. package/agent-spine-plugin/src/lib/mcp-source-context.js +12 -2
  39. package/agent-spine-plugin/src/lib/mcp-timeline-tools.js +91 -8
  40. package/agent-spine-plugin/src/lib/mcp-world-tools.js +2 -2
  41. package/agent-spine-plugin/src/lib/owned-file-lock.js +20 -1
  42. package/agent-spine-plugin/src/lib/persona-runtime.js +2 -2
  43. package/agent-spine-plugin/src/lib/preflight-delivery-id.js +27 -0
  44. package/agent-spine-plugin/src/lib/preflight.js +4 -4
  45. package/agent-spine-plugin/src/lib/session-timeline-codex.js +15 -0
  46. package/agent-spine-plugin/src/lib/session-timeline-contract.js +12 -4
  47. package/agent-spine-plugin/src/lib/session-timeline-event-extract.js +36 -7
  48. package/agent-spine-plugin/src/lib/session-timeline-host-origin.js +13 -10
  49. package/agent-spine-plugin/src/lib/session-timeline-invocation.js +1 -1
  50. package/agent-spine-plugin/src/lib/session-timeline-king.js +14 -0
  51. package/agent-spine-plugin/src/lib/session-timeline-prior.js +18 -12
  52. package/agent-spine-plugin/src/lib/session-timeline-provider.js +5 -0
  53. package/agent-spine-plugin/src/lib/session-timeline-query.js +2 -0
  54. package/agent-spine-plugin/src/lib/session-timeline-results.js +35 -10
  55. package/agent-spine-plugin/src/lib/session-timeline-source-open.js +30 -0
  56. package/agent-spine-plugin/src/lib/session-timeline.js +122 -75
  57. package/agent-spine-plugin/src/lib/source-roots.js +3 -2
  58. package/agent-spine-plugin/src/lib/task-knowledge-context.js +22 -1
  59. package/agent-spine-plugin/src/lib/timeline-continuation-update.js +100 -0
  60. package/agent-spine-plugin/src/lib/timeline-tool-guard.js +30 -7
  61. package/agent-spine-plugin/src/lib/timeline-user-feedback.js +217 -0
  62. package/agent-spine-plugin/src/lib/timeline-world-capture.js +233 -0
  63. package/agent-spine-plugin/src/lib/world-knowledge.js +59 -2
  64. package/agent-spine-plugin/src/lib/world-model.js +64 -9
  65. package/agent-spine-plugin/src/worker.js +13 -1
  66. package/bin/blun.js +43 -28
  67. package/bin/core-bootstrap.js +5 -4
  68. package/bin/king.js +43 -28
  69. package/bin/launcher-mode.js +1 -10
  70. package/bin/launcher-runtime.js +128 -295
  71. package/bin/managed-node.js +0 -0
  72. package/bin/managed-plugin-selection.cjs +0 -1
  73. package/bin/native-module-repair.js +0 -0
  74. package/bin/node-runtime.js +0 -0
  75. package/bin/node-version.js +0 -0
  76. package/bin/plugin-bootstrap.js +56 -120
  77. package/bin/private-paths.js +11 -34
  78. package/bin/standard-tools-bootstrap.js +34 -114
  79. package/bin/turn-thinking-policy.cjs +3 -11
  80. package/bin/update-copy.js +200 -0
  81. package/bin/update-lease.js +0 -0
  82. package/bin/update-notice.js +136 -289
  83. package/bin/verify-agent-behavior.cjs +122 -0
  84. package/bin/verify-agent-components.cjs +104 -0
  85. package/bin/verify-bundled-agent-sources.cjs +57 -0
  86. package/blun.mjs +143076 -135288
  87. package/bundled-agent-sources.json +701 -0
  88. package/package.json +12 -15
  89. package/standard-skills/translate-native/README.md +1293 -0
  90. package/standard-skills/translate-native/SKILL.md +172 -22
  91. package/standard-skills/translate-native/VERSION +1 -1
  92. package/standard-skills/translate-native/agents/openai.yaml +18 -0
  93. package/standard-skills/translate-native/assets/icon.svg +8 -0
  94. package/standard-skills/translate-native/docs/BLUN_CODE_INTEGRATION.md +76 -0
  95. package/standard-skills/translate-native/docs/PREMORTEM.md +489 -0
  96. package/standard-skills/translate-native/docs/WEBSITE_LOCALIZATION.md +2035 -0
  97. package/standard-skills/translate-native/docs/WEBSITE_LOCALIZATION_API.md +1302 -0
  98. package/standard-skills/translate-native/docs/WEBSITE_LOCALIZATION_EVIDENCE_HTTP.md +136 -0
  99. package/standard-skills/translate-native/docs/WEBSITE_LOCALIZATION_HEALTH_HTTP.md +130 -0
  100. package/standard-skills/translate-native/docs/WEBSITE_LOCALIZATION_HTTP_PROVIDER.md +175 -0
  101. package/standard-skills/translate-native/docs/WEBSITE_LOCALIZATION_RECEIPT_VERIFIER_HTTP.md +86 -0
  102. package/standard-skills/translate-native/integrations/AGENT_RULES.md +32 -0
  103. package/standard-skills/translate-native/integrations/adapters/blun-code-language-guard.js +514 -0
  104. package/standard-skills/translate-native/integrations/adapters/node-language-guard.js +230 -0
  105. package/standard-skills/translate-native/integrations/audit_log.py +327 -0
  106. package/standard-skills/translate-native/integrations/claude_language_hook.js +1536 -0
  107. package/standard-skills/translate-native/integrations/commercial_localization_profile.py +42 -0
  108. package/standard-skills/translate-native/integrations/delivery-policy.example.json +28 -0
  109. package/standard-skills/translate-native/integrations/enforced_delivery.py +543 -0
  110. package/standard-skills/translate-native/integrations/guard_service.py +435 -0
  111. package/standard-skills/translate-native/integrations/language_gateway.py +67 -0
  112. package/standard-skills/translate-native/integrations/mcp_auth_headers.py +198 -0
  113. package/standard-skills/translate-native/integrations/mcp_http_gateway.py +429 -0
  114. package/standard-skills/translate-native/integrations/non_language_html_entities.js +1485 -0
  115. package/standard-skills/translate-native/integrations/pre_output_guard.py +65 -0
  116. package/standard-skills/translate-native/integrations/task_router.py +101 -0
  117. package/standard-skills/translate-native/integrations/website_localization.py +401 -0
  118. package/standard-skills/translate-native/integrations/website_localization_api.py +581 -0
  119. package/standard-skills/translate-native/integrations/website_localization_benchmark.py +1885 -0
  120. package/standard-skills/translate-native/integrations/website_localization_benchmark_campaign.py +1772 -0
  121. package/standard-skills/translate-native/integrations/website_localization_benchmark_candidate.py +506 -0
  122. package/standard-skills/translate-native/integrations/website_localization_benchmark_http.py +400 -0
  123. package/standard-skills/translate-native/integrations/website_localization_benchmark_review_store.py +781 -0
  124. package/standard-skills/translate-native/integrations/website_localization_benchmark_reviewer_http.py +500 -0
  125. package/standard-skills/translate-native/integrations/website_localization_benchmark_runtime.py +1107 -0
  126. package/standard-skills/translate-native/integrations/website_localization_benchmark_suite.py +463 -0
  127. package/standard-skills/translate-native/integrations/website_localization_cms.py +2835 -0
  128. package/standard-skills/translate-native/integrations/website_localization_cms_client.py +875 -0
  129. package/standard-skills/translate-native/integrations/website_localization_cms_dispatch.py +805 -0
  130. package/standard-skills/translate-native/integrations/website_localization_cms_http.py +588 -0
  131. package/standard-skills/translate-native/integrations/website_localization_cms_lifecycle_monitor.py +991 -0
  132. package/standard-skills/translate-native/integrations/website_localization_cms_receiver.py +1441 -0
  133. package/standard-skills/translate-native/integrations/website_localization_cms_receiver_runtime.py +414 -0
  134. package/standard-skills/translate-native/integrations/website_localization_cms_receiver_store.py +1073 -0
  135. package/standard-skills/translate-native/integrations/website_localization_cms_removal_dispatch.py +865 -0
  136. package/standard-skills/translate-native/integrations/website_localization_cms_source_client.py +583 -0
  137. package/standard-skills/translate-native/integrations/website_localization_cms_source_delivery.py +964 -0
  138. package/standard-skills/translate-native/integrations/website_localization_cms_source_delivery_runtime.py +665 -0
  139. package/standard-skills/translate-native/integrations/website_localization_cms_source_http.py +1153 -0
  140. package/standard-skills/translate-native/integrations/website_localization_cms_source_runtime.py +675 -0
  141. package/standard-skills/translate-native/integrations/website_localization_cms_source_service.py +1125 -0
  142. package/standard-skills/translate-native/integrations/website_localization_cms_terminal_notification.py +674 -0
  143. package/standard-skills/translate-native/integrations/website_localization_cms_terminal_notification_http.py +444 -0
  144. package/standard-skills/translate-native/integrations/website_localization_cms_terminal_notification_receiver.py +1469 -0
  145. package/standard-skills/translate-native/integrations/website_localization_cms_terminal_notification_receiver_runtime.py +1142 -0
  146. package/standard-skills/translate-native/integrations/website_localization_cms_terminal_processing_monitor.py +634 -0
  147. package/standard-skills/translate-native/integrations/website_localization_cms_terminal_receiver_client.py +804 -0
  148. package/standard-skills/translate-native/integrations/website_localization_deepl_baseline.py +922 -0
  149. package/standard-skills/translate-native/integrations/website_localization_evidence_http.py +482 -0
  150. package/standard-skills/translate-native/integrations/website_localization_health.py +1541 -0
  151. package/standard-skills/translate-native/integrations/website_localization_health_http.py +372 -0
  152. package/standard-skills/translate-native/integrations/website_localization_http_provider.py +297 -0
  153. package/standard-skills/translate-native/integrations/website_localization_native_reference_http.py +479 -0
  154. package/standard-skills/translate-native/integrations/website_localization_native_reference_intake.py +363 -0
  155. package/standard-skills/translate-native/integrations/website_localization_native_reference_queue.py +1449 -0
  156. package/standard-skills/translate-native/integrations/website_localization_native_reference_store.py +420 -0
  157. package/standard-skills/translate-native/integrations/website_localization_quality_profiles.py +235 -0
  158. package/standard-skills/translate-native/integrations/website_localization_queue.py +671 -0
  159. package/standard-skills/translate-native/integrations/website_localization_receipt_verifier_http.py +516 -0
  160. package/standard-skills/translate-native/integrations/website_localization_release.py +928 -0
  161. package/standard-skills/translate-native/integrations/website_localization_release_coordinator.py +1008 -0
  162. package/standard-skills/translate-native/integrations/website_localization_runner.py +276 -0
  163. package/standard-skills/translate-native/integrations/website_localization_runtime.py +862 -0
  164. package/standard-skills/translate-native/integrations/website_localization_service.py +350 -0
  165. package/standard-skills/translate-native/integrations/website_localization_supervisor.py +511 -0
  166. package/standard-skills/translate-native/integrations/website_localization_worker.py +663 -0
  167. package/standard-skills/translate-native/provenance.json +3 -4
  168. package/standard-skills/translate-native/references/commercial-localization.md +177 -0
  169. package/standard-skills/translate-native/scripts/blun_language_guard.py +7 -1
  170. package/standard-skills/translate-native/scripts/check_commercial_review.py +80 -0
  171. package/standard-skills/translate-native/scripts/commercial_localization_profile.py +333 -0
  172. package/standard-tools/language-guard/LICENSE +21 -0
  173. package/standard-tools/language-guard/VERSION +1 -0
  174. package/standard-tools/language-guard/blun_language_guard.py +7 -1
  175. package/standard-tools/language-guard/check_commercial_review.py +80 -0
  176. package/standard-tools/language-guard/commercial_localization_profile.py +333 -0
  177. package/standard-tools/language-guard/language_gateway.py +62 -0
  178. package/standard-tools/language-guard/pre_output_guard.py +64 -0
  179. package/standard-tools/language-guard/provenance.json +4 -11
  180. package/standard-tools/manifest.json +34 -11
  181. package/telegram-plugin/commands/access.md +2 -10
  182. package/telegram-plugin/dist/bridge.mjs +64041 -687
  183. package/telegram-plugin/dist/mcp-server.mjs +72810 -9027
  184. package/telegram-plugin/dist/noise.mjs +28 -63511
  185. package/agent-spine-plugin/CONTRIBUTING.md +0 -52
  186. package/agent-spine-plugin/SECURITY.md +0 -47
  187. package/agent-spine-plugin/docs/assignment-continuation.md +0 -48
  188. package/agent-spine-plugin/docs/releasing.md +0 -85
  189. package/agent-spine-plugin/docs/structured-completion.md +0 -67
  190. package/bin/abort-listener-policy.cjs +0 -43
  191. package/bin/active-steer-priority-policy.cjs +0 -24
  192. package/bin/agent-api-http-adapter.mjs +0 -446
  193. package/bin/agent-api-private-http-server.mjs +0 -288
  194. package/bin/agent-api-runtime.mjs +0 -252
  195. package/bin/agent-api-service-environment.mjs +0 -236
  196. package/bin/agent-api-service-host.mjs +0 -209
  197. package/bin/agent-api-service-process.mjs +0 -171
  198. package/bin/agent-api-session-registry.mjs +0 -428
  199. package/bin/agent-api-tool-broker.cjs +0 -248
  200. package/bin/agent-api-turn-controller.mjs +0 -461
  201. package/bin/agent-api-usage-journal.cjs +0 -259
  202. package/bin/agent-resume-snapshot.cjs +0 -241
  203. package/bin/agentspine-king-goal-inbox.mjs +0 -111
  204. package/bin/agentspine-king-goal-intake.mjs +0 -106
  205. package/bin/approval-rejection-stop.cjs +0 -15
  206. package/bin/assistant-message-offload-policy.cjs +0 -284
  207. package/bin/baseline-skill-performance-policy.cjs +0 -39
  208. package/bin/bash-search-scope-policy.cjs +0 -49
  209. package/bin/codebase-search-runtime.cjs +0 -23
  210. package/bin/cognitive-action-checkpoint.cjs +0 -1104
  211. package/bin/cognitive-attention-delivery.cjs +0 -76
  212. package/bin/cognitive-attention-policy.cjs +0 -143
  213. package/bin/cognitive-attention-runtime.cjs +0 -91
  214. package/bin/cognitive-context-projection.cjs +0 -73
  215. package/bin/cognitive-cross-portal-acceptance.cjs +0 -443
  216. package/bin/cognitive-effective-view.cjs +0 -77
  217. package/bin/cognitive-focus-projection.cjs +0 -206
  218. package/bin/cognitive-focus-scope.cjs +0 -37
  219. package/bin/cognitive-goal-autostart-policy.cjs +0 -72
  220. package/bin/cognitive-goal-time-trigger-controller.cjs +0 -146
  221. package/bin/cognitive-memory-adapter.cjs +0 -282
  222. package/bin/cognitive-memory-command.cjs +0 -293
  223. package/bin/cognitive-memory-provider.cjs +0 -92
  224. package/bin/cognitive-salience-policy.cjs +0 -159
  225. package/bin/cognitive-state-store.cjs +0 -508
  226. package/bin/cognitive-turn-lifecycle.cjs +0 -624
  227. package/bin/cognitive-work-focus.cjs +0 -180
  228. package/bin/compaction-history-archive.cjs +0 -166
  229. package/bin/compaction-history-startup.cjs +0 -50
  230. package/bin/compaction-model-policy.cjs +0 -31
  231. package/bin/compaction-stage-policy.cjs +0 -21
  232. package/bin/compaction-transaction-policy.cjs +0 -122
  233. package/bin/config-write-dedup-policy.cjs +0 -27
  234. package/bin/context-budget-ledger.cjs +0 -31
  235. package/bin/context-doctor-policy.cjs +0 -70
  236. package/bin/context-insight-policy.cjs +0 -36
  237. package/bin/context-performance-policy.cjs +0 -19
  238. package/bin/context-pressure-policy.cjs +0 -20
  239. package/bin/cron-run-output.cjs +0 -45
  240. package/bin/cron-run-store.cjs +0 -145
  241. package/bin/curiosity-scout-policy.cjs +0 -49
  242. package/bin/default-model-output-budget-policy.cjs +0 -28
  243. package/bin/durable-task-resume-policy.cjs +0 -130
  244. package/bin/durable-task-resume-runtime.cjs +0 -117
  245. package/bin/durable-task-resume-store.cjs +0 -88
  246. package/bin/editable-tool-approval-policy.cjs +0 -540
  247. package/bin/editable-tool-approval-runtime.cjs +0 -99
  248. package/bin/effective-system-prompt-cache-policy.cjs +0 -33
  249. package/bin/error-memory-performance-policy.cjs +0 -113
  250. package/bin/file-observation-policy.cjs +0 -133
  251. package/bin/foreground-output-capture-policy.cjs +0 -41
  252. package/bin/generated-source-health.cjs +0 -142
  253. package/bin/glob-pattern-policy.cjs +0 -13
  254. package/bin/goal-completion-evidence-policy.cjs +0 -120
  255. package/bin/grep-output-limit-policy.cjs +0 -39
  256. package/bin/historical-media-projection-policy.cjs +0 -48
  257. package/bin/history-offload-pressure-policy.cjs +0 -33
  258. package/bin/html-to-research-markdown.cjs +0 -147
  259. package/bin/identity-context-policy.cjs +0 -764
  260. package/bin/identity-journal-policy.cjs +0 -107
  261. package/bin/input-draft-persistence.cjs +0 -77
  262. package/bin/king-tui-function-contract.json +0 -33
  263. package/bin/launcher-restart-policy.cjs +0 -150
  264. package/bin/live-response-repetition-guard.cjs +0 -196
  265. package/bin/llm-config-log-dedup-policy.cjs +0 -76
  266. package/bin/loop-event-record-policy.cjs +0 -174
  267. package/bin/managed-context-startup-policy.cjs +0 -27
  268. package/bin/media-activity-layout-policy.cjs +0 -34
  269. package/bin/media-auto-retrieval-policy.cjs +0 -90
  270. package/bin/media-result-policy.cjs +0 -59
  271. package/bin/micro-compaction-policy.cjs +0 -145
  272. package/bin/mistake-relevance-policy.cjs +0 -319
  273. package/bin/model-retry-progress-policy.cjs +0 -46
  274. package/bin/native-large-file-io.cjs +0 -42
  275. package/bin/native-runtime-cache.cjs +0 -76
  276. package/bin/natural-presence-policy.cjs +0 -28
  277. package/bin/noninteractive-shell-env-policy.cjs +0 -19
  278. package/bin/observer-hooks.cjs +0 -14
  279. package/bin/outbound-claim-provenance.cjs +0 -150
  280. package/bin/oversized-context-offload-policy.cjs +0 -86
  281. package/bin/pending-media-policy.cjs +0 -182
  282. package/bin/pending-token-estimate-policy.cjs +0 -41
  283. package/bin/personal-memory-consent-policy.cjs +0 -72
  284. package/bin/personal-memory-performance-policy.cjs +0 -12
  285. package/bin/personality-choice-policy.cjs +0 -101
  286. package/bin/personality-memory-adapter.cjs +0 -379
  287. package/bin/personality-mode.cjs +0 -46
  288. package/bin/personality-setup-policy.cjs +0 -197
  289. package/bin/proactive-compaction-policy.cjs +0 -25
  290. package/bin/profile-identity-resolution.cjs +0 -136
  291. package/bin/profile-runtime.cjs +0 -318
  292. package/bin/profile-tool-exclusion-policy.cjs +0 -37
  293. package/bin/programmatic-context-isolation.cjs +0 -25
  294. package/bin/programmatic-tool-runtime.mjs +0 -627
  295. package/bin/provider-idle-timeout-policy.cjs +0 -14
  296. package/bin/provider-model-refresh-deadline.cjs +0 -53
  297. package/bin/provider-model-refresh-policy.cjs +0 -107
  298. package/bin/rate-limit-recovery-policy.cjs +0 -47
  299. package/bin/read-batch-policy.cjs +0 -32
  300. package/bin/read-continuation-policy.cjs +0 -59
  301. package/bin/recurring-cron-history-policy.cjs +0 -124
  302. package/bin/relationship-continuity-policy.cjs +0 -143
  303. package/bin/relationship-curiosity-policy.cjs +0 -107
  304. package/bin/relationship-learning-policy.cjs +0 -168
  305. package/bin/release-artifact-freeze-policy.cjs +0 -30
  306. package/bin/reload-plugin-bootstrap.cjs +0 -18
  307. package/bin/reload-queue-policy.cjs +0 -38
  308. package/bin/repeated-assistant-response-policy.cjs +0 -232
  309. package/bin/repeated-injection-projection.cjs +0 -107
  310. package/bin/repeated-user-message-projection.cjs +0 -8
  311. package/bin/research-page-result.cjs +0 -74
  312. package/bin/retry-checkpoint-policy.cjs +0 -13
  313. package/bin/runtime-exit-ledger.cjs +0 -144
  314. package/bin/scoped-cron-run-policy.cjs +0 -358
  315. package/bin/session-checkpoint-policy.cjs +0 -25
  316. package/bin/session-compaction-policy.cjs +0 -84
  317. package/bin/session-replay-policy.cjs +0 -20
  318. package/bin/session-replay-window-policy.cjs +0 -40
  319. package/bin/session-resume-checkpoint.cjs +0 -254
  320. package/bin/session-scrollback-archive.cjs +0 -229
  321. package/bin/skill-activation-performance-policy.cjs +0 -69
  322. package/bin/skill-listing-performance-policy.cjs +0 -92
  323. package/bin/soul-organization-policy.cjs +0 -78
  324. package/bin/soul-preservation-policy.cjs +0 -20
  325. package/bin/startup-preferences.cjs +0 -131
  326. package/bin/streaming-flush-performance-policy.cjs +0 -28
  327. package/bin/structured-agent-swarm-output.cjs +0 -325
  328. package/bin/structured-subagent-output.cjs +0 -252
  329. package/bin/subagent-context-fork-policy.cjs +0 -155
  330. package/bin/subagent-max-tokens-handoff-policy.cjs +0 -69
  331. package/bin/subagent-parent-responsiveness.cjs +0 -19
  332. package/bin/subagent-skill-policy.cjs +0 -206
  333. package/bin/subagent-timeout-policy.cjs +0 -182
  334. package/bin/subagent-tool-policy.cjs +0 -60
  335. package/bin/subagent-usage-rollup-policy.cjs +0 -29
  336. package/bin/system-prompt-context-policy.cjs +0 -124
  337. package/bin/system-prompt-token-cache-policy.cjs +0 -60
  338. package/bin/telegram-addressed-focus.cjs +0 -55
  339. package/bin/telegram-addressed-priority.cjs +0 -12
  340. package/bin/telegram-approval-relay.cjs +0 -290
  341. package/bin/telegram-bot-priority.cjs +0 -17
  342. package/bin/telegram-console-status-policy.cjs +0 -174
  343. package/bin/telegram-context-projection-policy.cjs +0 -141
  344. package/bin/telegram-delivery-lifecycle.cjs +0 -125
  345. package/bin/telegram-direct-focus-policy.cjs +0 -273
  346. package/bin/telegram-mcp-compatibility.cjs +0 -49
  347. package/bin/telegram-media-delivery-policy.cjs +0 -42
  348. package/bin/telegram-private-conversation-policy.cjs +0 -185
  349. package/bin/telegram-queue-handoff-policy.cjs +0 -73
  350. package/bin/telegram-remote-status-policy.cjs +0 -120
  351. package/bin/telegram-session-queue-runtime.mjs +0 -306
  352. package/bin/telegram-text-chunk-policy.cjs +0 -63
  353. package/bin/telegram-truncated-reply-policy.cjs +0 -37
  354. package/bin/telegram-urgent-policy.cjs +0 -45
  355. package/bin/telemetry-spool-policy.cjs +0 -57
  356. package/bin/thinking-activity-status-policy.cjs +0 -132
  357. package/bin/thinking-only-guard.cjs +0 -80
  358. package/bin/todo-list-turn-policy.cjs +0 -131
  359. package/bin/tool-call-loop-policy.cjs +0 -51
  360. package/bin/tool-file-persistence.cjs +0 -141
  361. package/bin/tool-result-offload-policy.cjs +0 -359
  362. package/bin/tool-result-offload-telemetry.cjs +0 -12
  363. package/bin/tool-schema-token-cache-policy.cjs +0 -41
  364. package/bin/tool-stream-preview-policy.cjs +0 -9
  365. package/bin/tui-functional-contract.cjs +0 -55
  366. package/bin/turn-tool-performance-policy.cjs +0 -486
  367. package/bin/usage-cache-efficiency-policy.cjs +0 -26
  368. package/bin/user-home-path-policy.cjs +0 -13
  369. package/bin/user-message-offload-policy.cjs +0 -103
  370. package/bin/user-prompt-hook-origin-policy.cjs +0 -34
  371. package/bin/user-tool-record-policy.cjs +0 -7
  372. package/bin/validated-learning-insight-policy.cjs +0 -58
  373. package/bin/validated-learning-outcome-trace.cjs +0 -107
  374. package/bin/validated-learning-performance-policy.cjs +0 -53
  375. package/bin/validated-learning-signal.cjs +0 -463
  376. package/bin/windows-bash-dialect-policy.cjs +0 -25
  377. package/bin/windows-node-crash-dump.cjs +0 -110
  378. package/bin/write-continuation-policy.cjs +0 -69
  379. package/codebase-index/README.md +0 -82
  380. package/codebase-index/codebase_index.py +0 -470
  381. package/standard-skills/agent-browser/SKILL.md +0 -19
  382. package/standard-skills/agent-browser/references/runtime.md +0 -8
  383. package/standard-skills/blun-session-inspector/SKILL.md +0 -41
  384. package/standard-skills/blun-session-inspector/scripts/inspect-session.cjs +0 -437
  385. package/standard-skills/design-taste-frontend/SKILL.md +0 -1206
  386. package/standard-skills/full-output-enforcement/SKILL.md +0 -49
  387. package/standard-skills/high-end-visual-design/SKILL.md +0 -98
  388. package/standard-skills/image-to-code/SKILL.md +0 -1228
  389. package/standard-skills/industrial-brutalist-ui/SKILL.md +0 -92
  390. package/standard-skills/minimalist-ui/SKILL.md +0 -85
  391. package/standard-skills/motion-design-taste/SKILL.md +0 -74
  392. package/standard-skills/playwright-testing/SKILL.md +0 -19
  393. package/standard-skills/playwright-testing/references/runtime.md +0 -7
  394. package/standard-skills/premortem/SKILL.md +0 -148
  395. package/standard-skills/redesign-existing-projects/SKILL.md +0 -178
  396. package/standard-skills/research-evidence/SKILL.md +0 -39
  397. package/standard-skills/research-evidence/references/evidence-format.md +0 -104
  398. package/standard-skills/research-evidence/scripts/evidence-collection.cjs +0 -260
  399. package/standard-skills/research-evidence/scripts/score-report.cjs +0 -130
  400. package/standard-skills/screenshot-lesen/SKILL.md +0 -52
  401. package/standard-skills/stitch-design-taste/DESIGN.md +0 -121
  402. package/standard-skills/stitch-design-taste/SKILL.md +0 -184
  403. package/standard-skills/telegram-channel/SKILL.md +0 -18
  404. package/standard-skills/telegram-channel/references/runtime.md +0 -7
  405. package/standard-skills/venture-flywheel/SKILL.md +0 -32
  406. package/standard-skills/venture-flywheel/identity/project-identity.cjs +0 -146
  407. package/standard-skills/venture-flywheel/policy/capability-engine.cjs +0 -114
  408. package/standard-skills/venture-flywheel/policy/repository-trust.cjs +0 -229
  409. package/standard-skills/venture-flywheel/references/BEISPIELE-phase0.md +0 -146
  410. package/standard-skills/venture-flywheel/references/CAPABILITY-MAP.md +0 -34
  411. package/standard-skills/venture-flywheel/references/SPEC-phase0-identity-trust.md +0 -77
  412. package/standard-skills/venture-flywheel/references/SPEC-phase0-state-events.md +0 -93
  413. package/standard-skills/venture-flywheel/schemas/capability-decision.schema.json +0 -13
  414. package/standard-skills/venture-flywheel/schemas/execution-event.schema.json +0 -44
  415. package/standard-skills/venture-flywheel/schemas/project-identity.schema.json +0 -32
  416. package/standard-skills/venture-flywheel/schemas/repository-trust.schema.json +0 -57
  417. package/standard-skills/venture-flywheel/schemas/run-transition.schema.json +0 -59
  418. package/standard-skills/venture-flywheel/state/execution-event.cjs +0 -191
  419. package/standard-skills/venture-flywheel/state/task-state-machine.cjs +0 -190
  420. package/standard-skills/web-lesen/SKILL.md +0 -73
  421. package/standard-skills/web-lesen/scripts/crawl_public.py +0 -379
  422. package/standard-skills/windows-mcp/SKILL.md +0 -19
  423. package/standard-skills/windows-mcp/references/runtime.md +0 -9
  424. package/telegram-plugin/DELIVERY.md +0 -36
  425. package/telegram-plugin/bin/telegram-approval-relay.cjs +0 -290
  426. package/telegram-plugin/bin/telegram-console-status-policy.cjs +0 -175
  427. package/telegram-plugin/bin/telegram-delivery-lifecycle.cjs +0 -125
  428. package/telegram-plugin/bin/telegram-direct-reply-policy.cjs +0 -48
  429. package/telegram-plugin/bin/telegram-launcher-status-queue.cjs +0 -122
  430. package/telegram-plugin/bin/telegram-private-conversation-policy.cjs +0 -186
  431. package/telegram-plugin/bin/telegram-remote-status-policy.cjs +0 -121
  432. package/telegram-plugin/bin/telegram-reply-parts.cjs +0 -149
  433. package/telegram-plugin/bin/telegram-text-chunk-policy.cjs +0 -63
  434. package/telegram-plugin/bin/telegram-typing-keepalive.cjs +0 -89
  435. package/telegram-plugin/compat/mcp-server-fa511cd1.mjs +0 -73825
  436. /package/{bin → scripts}/fix-node-pty-perms.js +0 -0
@@ -0,0 +1,506 @@
1
+ #!/usr/bin/env python3
2
+ """Durable, attested acquisition of one benchmark candidate result.
3
+
4
+ The trusted host owns the SQLite connection, model adapter, evidence authority,
5
+ and operation guard. The first valid worker result is bound to one non-secret
6
+ route, benchmark policy, and canonical suite job. Every read reverifies the
7
+ stored digest, complete worker-result binding, and host attestation.
8
+ """
9
+
10
+ from __future__ import annotations
11
+
12
+ import hashlib
13
+ import importlib.util
14
+ import json
15
+ import math
16
+ import re
17
+ import sqlite3
18
+ import sys
19
+ import time
20
+ from contextlib import contextmanager
21
+ from dataclasses import asdict
22
+ from pathlib import Path
23
+ from typing import Any, Callable, Iterator
24
+
25
+
26
+ STORE_SCHEMA = "blun.website-localization-benchmark-candidate-store.v1"
27
+ ARTIFACT_SCHEMA = "blun.website-localization-benchmark-candidate.v1"
28
+ MAX_ARTIFACT_BYTES = 4 * 1024 * 1024
29
+ ERROR_CODE = re.compile(r"^[a-z][a-z0-9_.-]{0,127}$")
30
+ STORE_COLUMNS = (
31
+ "acquisition_id", "route_id", "policy_sha256", "job_sha256",
32
+ "artifact_json", "artifact_sha256", "created_at",
33
+ )
34
+
35
+
36
+ def _load_module(name: str, path: Path):
37
+ spec = importlib.util.spec_from_file_location(name, path)
38
+ if spec is None or spec.loader is None:
39
+ raise RuntimeError(f"cannot load candidate dependency: {path.name}")
40
+ module = importlib.util.module_from_spec(spec)
41
+ sys.modules[spec.name] = module
42
+ spec.loader.exec_module(module)
43
+ return module
44
+
45
+
46
+ _ROOT = Path(__file__).resolve().parents[1]
47
+ _BENCHMARK = _load_module(
48
+ "blun_website_localization_candidate_benchmark",
49
+ _ROOT / "integrations" / "website_localization_benchmark.py",
50
+ )
51
+ _WORKER = _BENCHMARK._WORKER
52
+ _SUITE = _BENCHMARK._SUITE
53
+
54
+
55
+ class CandidateAcquisitionFailed(RuntimeError):
56
+ """Content-free candidate failure understood by campaign orchestration."""
57
+
58
+ benchmark_campaign_dependency_failure = True
59
+
60
+ def __init__(self, code: str, *, retryable: bool):
61
+ if not isinstance(code, str) or ERROR_CODE.fullmatch(code) is None:
62
+ raise ValueError("candidate error code is invalid")
63
+ if not isinstance(retryable, bool):
64
+ raise ValueError("candidate retryability must be boolean")
65
+ super().__init__(code)
66
+ self.code = code
67
+ self.retryable = retryable
68
+
69
+
70
+ def _pairs(items):
71
+ result = {}
72
+ for key, value in items:
73
+ if key in result:
74
+ raise ValueError("duplicate JSON key")
75
+ result[key] = value
76
+ return result
77
+
78
+
79
+ def _constant(value):
80
+ raise ValueError("non-finite JSON number")
81
+
82
+
83
+ def _json_bytes(value: Any, code: str) -> bytes:
84
+ try:
85
+ encoded = json.dumps(
86
+ value,
87
+ ensure_ascii=False,
88
+ allow_nan=False,
89
+ sort_keys=True,
90
+ separators=(",", ":"),
91
+ ).encode("utf-8")
92
+ except (TypeError, ValueError, UnicodeEncodeError, RecursionError):
93
+ raise CandidateAcquisitionFailed(code, retryable=False) from None
94
+ if not encoded or len(encoded) > MAX_ARTIFACT_BYTES:
95
+ raise CandidateAcquisitionFailed(code, retryable=False)
96
+ return encoded
97
+
98
+
99
+ def _parse_json(value: Any) -> Any:
100
+ if not isinstance(value, str) or not value:
101
+ raise CandidateAcquisitionFailed(
102
+ "candidate.store.state_invalid", retryable=False,
103
+ )
104
+ try:
105
+ encoded = value.encode("utf-8")
106
+ if len(encoded) > MAX_ARTIFACT_BYTES:
107
+ raise ValueError("stored JSON is too large")
108
+ return json.loads(
109
+ value, object_pairs_hook=_pairs, parse_constant=_constant,
110
+ )
111
+ except (UnicodeEncodeError, ValueError, RecursionError):
112
+ raise CandidateAcquisitionFailed(
113
+ "candidate.store.state_invalid", retryable=False,
114
+ ) from None
115
+
116
+
117
+ def _hash_bytes(value: bytes) -> str:
118
+ return hashlib.sha256(value).hexdigest()
119
+
120
+
121
+ def _hash_text(value: str) -> str:
122
+ return _hash_bytes(value.encode("utf-8"))
123
+
124
+
125
+ def _timestamp(value: Any = None) -> float:
126
+ value = time.time() if value is None else value
127
+ if (
128
+ isinstance(value, bool)
129
+ or not isinstance(value, (int, float))
130
+ or not math.isfinite(float(value))
131
+ or float(value) < 0
132
+ ):
133
+ raise CandidateAcquisitionFailed(
134
+ "candidate.store.time_invalid", retryable=False,
135
+ )
136
+ return float(value)
137
+
138
+
139
+ def _identifier(value: Any, code: str) -> str:
140
+ if not isinstance(value, str) or _BENCHMARK.IDENTIFIER.fullmatch(value) is None:
141
+ raise CandidateAcquisitionFailed(code, retryable=False)
142
+ return value
143
+
144
+
145
+ def _binding(
146
+ job_payload: Any,
147
+ policy: Any,
148
+ route_id: Any,
149
+ ) -> tuple[tuple[str, str, str, str], dict[str, Any], Any]:
150
+ route = _identifier(route_id, "candidate.store.route_invalid")
151
+ try:
152
+ validated_policy = _BENCHMARK._validate_policy(policy)
153
+ job = _WORKER._validated_job(job_payload)
154
+ _BENCHMARK._validate_candidate_job_binding(job, validated_policy)
155
+ if job["target"]["locale"] not in validated_policy.required_locales:
156
+ raise ValueError("locale is not required")
157
+ _SUITE.case_for_job(job)
158
+ except Exception:
159
+ raise CandidateAcquisitionFailed(
160
+ "candidate.store.binding_invalid", retryable=False,
161
+ ) from None
162
+ policy_sha256 = _hash_bytes(_json_bytes(
163
+ asdict(validated_policy), "candidate.store.binding_invalid",
164
+ ))
165
+ job_sha256 = _hash_bytes(_json_bytes(
166
+ job, "candidate.store.binding_invalid",
167
+ ))
168
+ acquisition_id = "benchmark-candidate:" + _hash_bytes(_json_bytes(
169
+ {
170
+ "schema": STORE_SCHEMA,
171
+ "route_id": route,
172
+ "policy_sha256": policy_sha256,
173
+ "job_sha256": job_sha256,
174
+ },
175
+ "candidate.store.binding_invalid",
176
+ ))
177
+ return (
178
+ (acquisition_id, route, policy_sha256, job_sha256),
179
+ job,
180
+ validated_policy,
181
+ )
182
+
183
+
184
+ def _worker_result(
185
+ result: Any,
186
+ job: dict[str, Any],
187
+ ) -> dict[str, Any]:
188
+ try:
189
+ return _BENCHMARK._validate_worker_result(job, result)
190
+ except Exception:
191
+ raise CandidateAcquisitionFailed(
192
+ "candidate.store.result_invalid", retryable=False,
193
+ ) from None
194
+
195
+
196
+ def _validate_artifact(
197
+ artifact: Any,
198
+ identity: tuple[str, str, str, str],
199
+ job: dict[str, Any],
200
+ policy: Any,
201
+ evidence_authority: Any,
202
+ ) -> dict[str, Any]:
203
+ if not isinstance(artifact, dict) or set(artifact) != {
204
+ "schema", "acquisition_id", "route_id", "policy_sha256",
205
+ "job_sha256", "candidate_result", "attestation",
206
+ }:
207
+ raise CandidateAcquisitionFailed(
208
+ "candidate.store.artifact_invalid", retryable=False,
209
+ )
210
+ unsigned = {key: value for key, value in artifact.items() if key != "attestation"}
211
+ if (
212
+ unsigned["schema"] != ARTIFACT_SCHEMA
213
+ or tuple(unsigned[name] for name in STORE_COLUMNS[:4]) != identity
214
+ ):
215
+ raise CandidateAcquisitionFailed(
216
+ "candidate.store.artifact_invalid", retryable=False,
217
+ )
218
+ unsigned["candidate_result"] = _worker_result(
219
+ unsigned["candidate_result"], job,
220
+ )
221
+ try:
222
+ _BENCHMARK._verify_attestation(
223
+ unsigned, artifact["attestation"], policy, evidence_authority,
224
+ )
225
+ except _BENCHMARK.BenchmarkBlocked as error:
226
+ retryable = error.code == "benchmark.attestation.verify_failed"
227
+ code = (
228
+ "candidate.store.attestation_unavailable"
229
+ if retryable else "candidate.store.artifact_invalid"
230
+ )
231
+ raise CandidateAcquisitionFailed(code, retryable=retryable) from None
232
+ except Exception:
233
+ raise CandidateAcquisitionFailed(
234
+ "candidate.store.artifact_invalid", retryable=False,
235
+ ) from None
236
+ verified = dict(unsigned)
237
+ verified["attestation"] = artifact["attestation"]
238
+ return json.loads(_json_bytes(
239
+ verified, "candidate.store.artifact_invalid",
240
+ ).decode("utf-8"))
241
+
242
+
243
+ def _create_artifact(
244
+ identity: tuple[str, str, str, str],
245
+ result: Any,
246
+ job: dict[str, Any],
247
+ policy: Any,
248
+ evidence_authority: Any,
249
+ ) -> dict[str, Any]:
250
+ unsigned = {
251
+ "schema": ARTIFACT_SCHEMA,
252
+ "acquisition_id": identity[0],
253
+ "route_id": identity[1],
254
+ "policy_sha256": identity[2],
255
+ "job_sha256": identity[3],
256
+ "candidate_result": _worker_result(result, job),
257
+ }
258
+ try:
259
+ artifact = _BENCHMARK._attest(unsigned, policy, evidence_authority)
260
+ except _BENCHMARK.BenchmarkBlocked as error:
261
+ retryable = error.code in {
262
+ "benchmark.attestation.sign_failed",
263
+ "benchmark.attestation.verify_failed",
264
+ }
265
+ code = (
266
+ "candidate.store.attestation_unavailable"
267
+ if retryable else "candidate.store.artifact_invalid"
268
+ )
269
+ raise CandidateAcquisitionFailed(code, retryable=retryable) from None
270
+ return _validate_artifact(
271
+ artifact, identity, job, policy, evidence_authority,
272
+ )
273
+
274
+
275
+ @contextmanager
276
+ def _transaction(connection: sqlite3.Connection) -> Iterator[None]:
277
+ if connection.in_transaction:
278
+ raise CandidateAcquisitionFailed(
279
+ "candidate.store.external_transaction", retryable=False,
280
+ )
281
+ try:
282
+ connection.execute("BEGIN IMMEDIATE")
283
+ yield
284
+ except Exception:
285
+ connection.rollback()
286
+ raise
287
+ else:
288
+ connection.commit()
289
+
290
+
291
+ class CandidateAcquisitionStore:
292
+ """Persist the first exact host-attested candidate for one bound route."""
293
+
294
+ def __init__(self, connection: sqlite3.Connection):
295
+ if not isinstance(connection, sqlite3.Connection):
296
+ raise CandidateAcquisitionFailed(
297
+ "candidate.store.connection_invalid", retryable=False,
298
+ )
299
+ self.connection = connection
300
+ self.connection.row_factory = sqlite3.Row
301
+ self.connection.execute("PRAGMA busy_timeout = 5000")
302
+ with _transaction(self.connection):
303
+ self.connection.execute("""
304
+ CREATE TABLE IF NOT EXISTS benchmark_candidate_acquisitions (
305
+ acquisition_id TEXT PRIMARY KEY,
306
+ route_id TEXT NOT NULL,
307
+ policy_sha256 TEXT NOT NULL,
308
+ job_sha256 TEXT NOT NULL,
309
+ artifact_json TEXT NOT NULL,
310
+ artifact_sha256 TEXT NOT NULL,
311
+ created_at REAL NOT NULL,
312
+ UNIQUE(route_id, policy_sha256, job_sha256)
313
+ )
314
+ """)
315
+ columns = tuple(
316
+ row[1] for row in self.connection.execute(
317
+ "PRAGMA table_info(benchmark_candidate_acquisitions)"
318
+ ).fetchall()
319
+ )
320
+ if columns != STORE_COLUMNS:
321
+ raise CandidateAcquisitionFailed(
322
+ "candidate.store.schema_unsupported", retryable=False,
323
+ )
324
+
325
+ @staticmethod
326
+ def identity(
327
+ job_payload: Any, policy: Any, route_id: Any,
328
+ ) -> tuple[str, str, str, str]:
329
+ return _binding(job_payload, policy, route_id)[0]
330
+
331
+ def load(
332
+ self,
333
+ job_payload: Any,
334
+ policy: Any,
335
+ route_id: Any,
336
+ *,
337
+ evidence_authority: Any,
338
+ ) -> dict[str, Any] | None:
339
+ identity, job, validated_policy = _binding(job_payload, policy, route_id)
340
+ row = self.connection.execute("""
341
+ SELECT * FROM benchmark_candidate_acquisitions
342
+ WHERE acquisition_id = ?
343
+ """, (identity[0],)).fetchone()
344
+ if row is None:
345
+ return None
346
+ if (
347
+ tuple(row.keys()) != STORE_COLUMNS
348
+ or tuple(row[name] for name in STORE_COLUMNS[:4]) != identity
349
+ or isinstance(row["created_at"], bool)
350
+ or not isinstance(row["created_at"], (int, float))
351
+ or not math.isfinite(float(row["created_at"]))
352
+ or float(row["created_at"]) < 0
353
+ or not isinstance(row["artifact_json"], str)
354
+ or row["artifact_sha256"] != _hash_text(row["artifact_json"])
355
+ ):
356
+ raise CandidateAcquisitionFailed(
357
+ "candidate.store.state_invalid", retryable=False,
358
+ )
359
+ artifact = _parse_json(row["artifact_json"])
360
+ verified = _validate_artifact(
361
+ artifact, identity, job, validated_policy, evidence_authority,
362
+ )
363
+ return verified["candidate_result"]
364
+
365
+ def save(
366
+ self,
367
+ job_payload: Any,
368
+ policy: Any,
369
+ route_id: Any,
370
+ result: Any,
371
+ *,
372
+ evidence_authority: Any,
373
+ now: Any = None,
374
+ ) -> dict[str, Any]:
375
+ identity, job, validated_policy = _binding(job_payload, policy, route_id)
376
+ artifact = _create_artifact(
377
+ identity, result, job, validated_policy, evidence_authority,
378
+ )
379
+ artifact_json = _json_bytes(
380
+ artifact, "candidate.store.artifact_invalid",
381
+ ).decode("utf-8")
382
+ values = identity + (
383
+ artifact_json,
384
+ _hash_text(artifact_json),
385
+ _timestamp(now),
386
+ )
387
+ with _transaction(self.connection):
388
+ self.connection.execute("""
389
+ INSERT OR IGNORE INTO benchmark_candidate_acquisitions
390
+ VALUES (?, ?, ?, ?, ?, ?, ?)
391
+ """, values)
392
+ stored = self.load(
393
+ job_payload,
394
+ policy,
395
+ route_id,
396
+ evidence_authority=evidence_authority,
397
+ )
398
+ if stored != artifact["candidate_result"]:
399
+ raise CandidateAcquisitionFailed(
400
+ "candidate.store.conflict", retryable=False,
401
+ )
402
+ return stored
403
+
404
+
405
+ class _GuardedAuthority:
406
+ def __init__(self, authority: Any, guard: Callable[[], None]):
407
+ self.authority = authority
408
+ self.guard = guard
409
+
410
+ def sign(self, payload: bytes):
411
+ self.guard()
412
+ return self.authority.sign(payload)
413
+
414
+ def verify(self, payload: bytes, signature: Any):
415
+ self.guard()
416
+ return self.authority.verify(payload, signature)
417
+
418
+
419
+ class _GuardedProvider:
420
+ def __init__(self, provider: Any, guard: Callable[[], None]):
421
+ self.provider = provider
422
+ self.guard = guard
423
+
424
+ def invoke(self, request: Any):
425
+ try:
426
+ self.guard()
427
+ except CandidateAcquisitionFailed as error:
428
+ raise _WORKER.ProviderCallFailed(
429
+ error.code, retryable=error.retryable,
430
+ ) from None
431
+ return self.provider.invoke(request)
432
+
433
+
434
+ def resolve_candidate_acquisition(
435
+ store: CandidateAcquisitionStore,
436
+ job_payload: Any,
437
+ policy: Any,
438
+ route_id: Any,
439
+ assets: Any,
440
+ provider: Any,
441
+ *,
442
+ evidence_authority: Any,
443
+ operation_guard: Callable[[], Any] | None = None,
444
+ now: Any = None,
445
+ ) -> dict[str, Any]:
446
+ """Reuse an attested candidate or run and persist exactly one worker output."""
447
+ if any(not callable(getattr(store, name, None)) for name in ("load", "save")):
448
+ raise TypeError("store must provide load and save")
449
+ if operation_guard is not None and not callable(operation_guard):
450
+ raise TypeError("operation_guard must be callable")
451
+ if any(
452
+ not callable(getattr(evidence_authority, name, None))
453
+ for name in ("sign", "verify")
454
+ ):
455
+ raise CandidateAcquisitionFailed(
456
+ "candidate.authority.invalid", retryable=False,
457
+ )
458
+
459
+ def guard() -> None:
460
+ if operation_guard is None:
461
+ return
462
+ try:
463
+ operation_guard()
464
+ except CandidateAcquisitionFailed:
465
+ raise
466
+ except Exception:
467
+ raise CandidateAcquisitionFailed(
468
+ "candidate.operation_guard_failed", retryable=True,
469
+ ) from None
470
+
471
+ guarded_authority = _GuardedAuthority(evidence_authority, guard)
472
+ cached = store.load(
473
+ job_payload,
474
+ policy,
475
+ route_id,
476
+ evidence_authority=guarded_authority,
477
+ )
478
+ if cached is not None:
479
+ return cached
480
+ if not callable(getattr(provider, "invoke", None)):
481
+ raise CandidateAcquisitionFailed(
482
+ "candidate.provider.invalid", retryable=False,
483
+ )
484
+ try:
485
+ result = _WORKER.run_localization_job(
486
+ job_payload, assets, _GuardedProvider(provider, guard),
487
+ )
488
+ except _WORKER.LocalizationWorkerBlocked as error:
489
+ code = "candidate.worker." + error.code
490
+ if len(code) > 128:
491
+ code = "candidate.worker.failed"
492
+ raise CandidateAcquisitionFailed(
493
+ code, retryable=error.retryable,
494
+ ) from None
495
+ except Exception:
496
+ raise CandidateAcquisitionFailed(
497
+ "candidate.worker.unexpected", retryable=True,
498
+ ) from None
499
+ return store.save(
500
+ job_payload,
501
+ policy,
502
+ route_id,
503
+ result,
504
+ evidence_authority=guarded_authority,
505
+ now=now,
506
+ )