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,463 @@
1
+ #!/usr/bin/env python3
2
+ """Canonical, output-free benchmark suite for EU website localization."""
3
+
4
+ from __future__ import annotations
5
+
6
+ import hashlib
7
+ import importlib.util
8
+ import json
9
+ import sys
10
+ from dataclasses import asdict, dataclass
11
+ from pathlib import Path
12
+ from typing import Any
13
+
14
+
15
+ SCHEMA = "blun.website-localization-benchmark-suite.v4"
16
+ VERSION = "eu-web-content-lanes-2026-09-4"
17
+ LONG_FORM_MINIMUM_CHARACTERS = 400
18
+ COMMERCIAL_EVALUATION_SCHEMA = (
19
+ "translate-native.commercial-benchmark-scope.v1"
20
+ )
21
+
22
+
23
+ def _load_commercial_profile():
24
+ path = Path(__file__).with_name("commercial_localization_profile.py")
25
+ spec = importlib.util.spec_from_file_location(
26
+ "blun_website_benchmark_commercial_profile", path,
27
+ )
28
+ if spec is None or spec.loader is None:
29
+ raise RuntimeError("cannot load commercial benchmark profile")
30
+ module = importlib.util.module_from_spec(spec)
31
+ sys.modules[spec.name] = module
32
+ spec.loader.exec_module(module)
33
+ return module
34
+
35
+
36
+ _COMMERCIAL = _load_commercial_profile()
37
+
38
+
39
+ def _commercial_dimensions() -> tuple[str, ...]:
40
+ dimensions = tuple(_COMMERCIAL.DIMENSIONS)
41
+ if (
42
+ len(dimensions) != 10
43
+ or len(set(dimensions)) != len(dimensions)
44
+ or any(not isinstance(name, str) or not name for name in dimensions)
45
+ ):
46
+ raise RuntimeError("invalid commercial benchmark dimension registry")
47
+ return dimensions
48
+
49
+
50
+ @dataclass(frozen=True)
51
+ class SourceCase:
52
+ key: str
53
+ domain: str
54
+ content_type: str
55
+ source_text: str
56
+ adversarial_tags: tuple[str, ...]
57
+
58
+ def as_payload(self) -> dict[str, Any]:
59
+ payload = {
60
+ **asdict(self),
61
+ "source_id": f"benchmark.{self.key}",
62
+ "source_revision": VERSION,
63
+ "source_locale": "en-IE",
64
+ "source_sha256": hashlib.sha256(self.source_text.encode("utf-8")).hexdigest(),
65
+ "long_form": len(self.source_text) >= LONG_FORM_MINIMUM_CHARACTERS,
66
+ }
67
+ if self.content_type == "commercial":
68
+ payload["commercial_dimensions"] = list(_commercial_dimensions())
69
+ return payload
70
+
71
+
72
+ SOURCE_CASES: tuple[SourceCase, ...] = (
73
+ SourceCase(
74
+ "software-headline", "software", "headline",
75
+ "Move from idea to launch without losing the context that makes your work distinct.",
76
+ ("marketing_calque", "information_structure", "brand_voice"),
77
+ ),
78
+ SourceCase(
79
+ "commerce-cta", "commerce", "cta",
80
+ "Compare the options, check what is included, and choose the plan that fits your team.",
81
+ ("unnatural_cta", "politeness", "meaning_omission"),
82
+ ),
83
+ SourceCase(
84
+ "travel-marketing", "travel", "marketing",
85
+ '<section><h2>Take the slower road north</h2><p>Cook with local hosts, cross the lake by boat, and leave room for plans to change with the weather in {{season}}.</p><a href="https://example.test/routes">Explore the route</a></section>',
86
+ ("cultural_fit", "rhythm", "source_shaped_syntax", "html_integrity", "placeholder_integrity"),
87
+ ),
88
+ SourceCase(
89
+ "payments-ui", "financial_services", "ui",
90
+ '{"error":"Your payment was not processed.","retry":"Try again; you will not be charged twice."}',
91
+ ("negation", "modality", "false_friend", "concise_ui", "json_integrity"),
92
+ ),
93
+ SourceCase(
94
+ "api-documentation", "developer_tools", "documentation",
95
+ "Before rotating the API key, pause new deployments. Existing sessions remain valid until they expire, but they cannot be renewed with the old key.",
96
+ ("sequence", "negation", "modality", "terminology"),
97
+ ),
98
+ SourceCase(
99
+ "health-seo", "healthcare", "seo",
100
+ "Secure appointment booking for clinics that need clear reminders, accessible forms, and fewer missed visits.",
101
+ ("seo_naturalness", "register", "unsupported_claim"),
102
+ ),
103
+ SourceCase(
104
+ "subscription-legal-long", "subscription_services", "legal",
105
+ "This agreement starts when the account owner accepts the order. It continues for twelve months and renews for another twelve months unless either party gives written notice at least thirty days before the current term ends. Cancellation stops the next renewal; it does not shorten the current term or create a refund. We may suspend access only when payment is overdue by more than fourteen days and only after sending a reminder. Nothing in this section limits rights that cannot legally be waived.",
106
+ ("contract_term", "renewal", "cancellation", "negation", "modality", "long_context"),
107
+ ),
108
+ SourceCase(
109
+ "offer-commercial-long", "business_software", "commercial",
110
+ "The Standard option starts at EUR 29.90 per month when billed annually for a twelve-month contract. The displayed amount excludes VAT. New customers receive 20 percent off the first annual invoice, calculated from the undiscounted annual total; the discount does not apply to usage charges. The subscription renews for another year at the then-current standard price unless it is cancelled at least thirty days before renewal. The Professional option costs up to EUR 79.90 per month, including support but excluding VAT, and may be cancelled monthly after the initial three-month term. Additional conditions are shown before checkout.",
111
+ ("amount", "currency", "discount_basis", "tax", "billing_interval", "contract_term", "renewal", "cancellation", "long_context"),
112
+ ),
113
+ SourceCase(
114
+ "workspace-passes-commercial-long", "coworking", "commercial",
115
+ "Day passes start at EUR 18 excluding VAT and include access from 08:00 to 18:00. Evening access costs an additional EUR 6 per visit. Customers who prepay ten visits receive 15 percent off the day-pass total, but the discount does not apply to evening access or meeting rooms. Prepaid visits expire six months after purchase and are not renewed automatically. Unused visits are refundable only during the first fourteen days, provided that none has been redeemed. A separate monthly membership is available from EUR 149 and may be cancelled with thirty days’ notice.",
116
+ ("amount", "currency", "discount_basis", "qualifier", "tax", "billing_interval", "expiry", "cancellation", "offer_assignment", "long_context"),
117
+ ),
118
+ SourceCase(
119
+ "weekend-package-commercial-long", "travel", "commercial",
120
+ "The weekend package costs from EUR 349 per person for two nights when two adults share one room. Breakfast and the advertised boat transfer are included; the local visitor tax of EUR 3.50 per person per night is not. A 25 percent deposit is charged when the booking is confirmed, and the remaining balance is due fourteen days before arrival. Cancellations made at least thirty days before arrival receive a full refund of the deposit. Later cancellations receive no deposit refund, although one date change is permitted subject to availability and any price difference. The offer is available for stays completed by 31 March 2027.",
121
+ ("amount", "currency", "qualifier", "tax", "deposit", "payment_timing", "cancellation", "refund", "eligibility", "offer_assignment", "long_context"),
122
+ ),
123
+ SourceCase(
124
+ "course-instalments-commercial-long", "professional_education", "commercial",
125
+ "Complete course access costs EUR 240 including VAT and remains available for twelve months after enrolment. Customers may instead choose three monthly instalments of EUR 85, for a total of EUR 255; the instalment plan is a payment schedule, not a monthly subscription. A free seven-day preview includes the first module but does not extend the twelve-month access period. Access does not renew automatically. Withdrawal within fourteen days is refundable only if less than 20 percent of the course has been opened, and an administrative fee of EUR 15 is deducted from an approved refund.",
126
+ ("amount", "currency", "tax", "billing_interval", "commitment", "trial", "renewal", "cancellation", "refund", "percentage_words", "long_context"),
127
+ ),
128
+ SourceCase(
129
+ "media-trial-commercial", "digital_media", "commercial",
130
+ "The seven-day trial costs EUR 1. It becomes a monthly subscription at EUR 12.99 including VAT unless cancelled before the trial ends. The annual option costs EUR 119.90, is billed once at sign-up and renews yearly at the price shown before renewal. Cancelling stops the next charge but does not refund the current billing period.",
131
+ ("amount", "currency", "tax", "trial", "billing_interval", "renewal", "cancellation", "negation", "offer_assignment"),
132
+ ),
133
+ SourceCase(
134
+ "supporter-membership-commercial", "cultural_nonprofit", "commercial",
135
+ "Supporter membership is EUR 60 per calendar year and includes two guest tickets. People joining from 1 October pay EUR 30 for the remainder of that calendar year. Membership renews automatically on 1 January at the then-current annual fee unless notice is received by 1 December. An optional donation added at checkout is not part of the membership price and is not reduced by the late-year rate.",
136
+ ("amount", "currency", "proration", "commitment", "renewal", "cancellation", "conditions", "offer_assignment"),
137
+ ),
138
+ SourceCase(
139
+ "equipment-rental-commercial", "equipment_rental", "commercial",
140
+ "The compact unit is available from EUR 42 per day, excluding VAT, with a minimum rental of three days. The larger unit costs EUR 68 per day under the same minimum. A refundable EUR 250 deposit is charged separately for either unit. Rentals longer than fourteen consecutive days receive 10 percent off rental charges after day fourteen; delivery, collection and damage fees are excluded. Extensions depend on availability and use the daily rate in effect when the extension is confirmed. Cancellation is free until 48 hours before delivery, after which one daily charge is due.",
141
+ ("amount", "currency", "qualifier", "tax", "minimum", "deposit", "discount_basis", "extension", "cancellation", "offer_assignment", "long_context"),
142
+ ),
143
+ SourceCase(
144
+ "parcel-contract-commercial-long", "logistics", "commercial",
145
+ "The first one hundred domestic parcels each month cost EUR 0.45 each, and parcels 101 to 500 cost EUR 0.39 each. A minimum monthly charge of EUR 35 applies even when fewer parcels are sent. Prices exclude VAT and a fuel surcharge of up to 8 percent, calculated on transport charges only. Usage is invoiced in the following month, while the account fee is charged at the start of the current month. The agreement lasts twenty-four months and renews for twelve months unless cancelled at least ninety days before the term ends. Early termination requires payment of the remaining minimum monthly charges, except when the service-level guarantee has been missed for three consecutive months.",
146
+ ("amount", "currency", "tiered_price", "qualifier", "tax", "surcharge_basis", "billing_interval", "commitment", "renewal", "cancellation", "offer_assignment", "long_context"),
147
+ ),
148
+ SourceCase(
149
+ "clinic-continuity-headline", "healthcare", "headline",
150
+ "Care that follows the person, not the paperwork.",
151
+ ("brand_voice", "idiom", "information_structure", "unsupported_claim"),
152
+ ),
153
+ SourceCase(
154
+ "energy-control-headline", "climate_technology", "headline",
155
+ "Use less energy without putting comfort on pause.",
156
+ ("brand_voice", "negation", "rhythm", "marketing_calque"),
157
+ ),
158
+ SourceCase(
159
+ "learning-progress-headline", "professional_education", "headline",
160
+ "Turn practical experience into progress people can see.",
161
+ ("brand_voice", "idiom", "information_structure", "source_shaped_syntax"),
162
+ ),
163
+ SourceCase(
164
+ "delivery-confidence-headline", "logistics", "headline",
165
+ "Every handover clear. Every delivery accounted for.",
166
+ ("brand_voice", "rhythm", "ellipsis", "marketing_calque"),
167
+ ),
168
+ SourceCase(
169
+ "money-clarity-headline", "financial_services", "headline",
170
+ "See where your money is going before you decide where it should go next.",
171
+ ("brand_voice", "information_structure", "register", "unsupported_claim"),
172
+ ),
173
+ SourceCase(
174
+ "permit-guidance-headline", "public_services", "headline",
175
+ "A clearer route through permits, forms and deadlines.",
176
+ ("brand_voice", "register", "coordination", "false_friend"),
177
+ ),
178
+ SourceCase(
179
+ "museum-belonging-headline", "cultural_nonprofit", "headline",
180
+ "Come for the collection. Leave with a story of your own.",
181
+ ("brand_voice", "rhythm", "cultural_fit", "source_shaped_syntax"),
182
+ ),
183
+ SourceCase(
184
+ "route-planner-cta", "travel", "cta",
185
+ "Build your route, then save it for the days when plans change.",
186
+ ("unnatural_cta", "sequence", "register", "meaning_omission"),
187
+ ),
188
+ SourceCase(
189
+ "appointment-choice-cta", "healthcare", "cta",
190
+ "Choose a suitable appointment and tell us what support you need.",
191
+ ("unnatural_cta", "politeness", "register", "meaning_omission"),
192
+ ),
193
+ SourceCase(
194
+ "sandbox-start-cta", "developer_tools", "cta",
195
+ "Open the sandbox and test the workflow with sample data first.",
196
+ ("unnatural_cta", "sequence", "terminology", "modality"),
197
+ ),
198
+ SourceCase(
199
+ "benefit-check-cta", "public_services", "cta",
200
+ "Check what you may be entitled to before starting the application.",
201
+ ("unnatural_cta", "modality", "register", "sequence"),
202
+ ),
203
+ SourceCase(
204
+ "course-fit-cta", "professional_education", "cta",
205
+ "Explore the syllabus and decide whether the course fits your next step.",
206
+ ("unnatural_cta", "idiom", "register", "meaning_omission"),
207
+ ),
208
+ SourceCase(
209
+ "budget-review-cta", "financial_services", "cta",
210
+ "Review the forecast with your team before you publish it.",
211
+ ("unnatural_cta", "sequence", "terminology", "politeness"),
212
+ ),
213
+ SourceCase(
214
+ "volunteer-match-cta", "cultural_nonprofit", "cta",
215
+ "Find a role that suits your time, interests and access needs.",
216
+ ("unnatural_cta", "cultural_fit", "register", "coordination"),
217
+ ),
218
+ SourceCase(
219
+ "workflow-marketing-long", "business_software", "marketing",
220
+ "Work rarely arrives in the neat order shown on a project plan. A customer changes direction, a colleague spots a risk, and the decision that explains both is buried in yesterday’s messages. This workspace keeps the brief, discussion and next action together, so the team can adapt without rebuilding the story from memory. People still decide what matters and who may act; the service simply carries the relevant context forward. The result is calmer handovers, fewer repeated questions and work that remains recognisably yours from first draft to launch.",
221
+ ("brand_voice", "long_context", "information_structure", "marketing_calque", "unsupported_claim", "rhythm"),
222
+ ),
223
+ SourceCase(
224
+ "home-energy-marketing-long", "renewable_energy", "marketing",
225
+ "A comfortable home should not require constant attention to every radiator, window and tariff. The energy guide learns nothing by guesswork: it uses the readings and preferences the household chooses to share, explains why it recommends a change, and leaves the final decision with the resident. On bright afternoons it may suggest moving flexible tasks earlier; before a cold evening it can show which rooms are likely to need heat first. Clear comparisons make savings visible without turning daily life into a spreadsheet or promising results that the weather cannot guarantee.",
226
+ ("long_context", "unsupported_claim", "modality", "cultural_fit", "marketing_calque", "information_structure"),
227
+ ),
228
+ SourceCase(
229
+ "clinic-welcome-marketing", "healthcare", "marketing",
230
+ "Make each visit easier to prepare for with clear reminders, accessible forms and guidance that respects the patient’s choices.",
231
+ ("register", "unsupported_claim", "possessive", "cultural_fit"),
232
+ ),
233
+ SourceCase(
234
+ "guesthouse-marketing", "hospitality", "marketing",
235
+ "Settle in at your own pace, ask the hosts what is in season, and keep an evening free for whatever the village recommends.",
236
+ ("cultural_fit", "rhythm", "idiom", "marketing_calque"),
237
+ ),
238
+ SourceCase(
239
+ "mentor-programme-marketing", "professional_education", "marketing",
240
+ "Bring a real challenge, work through it with an experienced mentor, and leave with an approach your team can continue using.",
241
+ ("brand_voice", "register", "meaning_omission", "marketing_calque"),
242
+ ),
243
+ SourceCase(
244
+ "community-stage-marketing", "cultural_nonprofit", "marketing",
245
+ "The stage belongs to more than the people under the lights: join a season shaped with neighbours, volunteers and first-time performers.",
246
+ ("cultural_fit", "inclusive_language", "rhythm", "brand_voice"),
247
+ ),
248
+ SourceCase(
249
+ "freight-visibility-marketing", "logistics", "marketing",
250
+ "Give dispatchers, drivers and customers the same clear picture of what has moved, what is waiting and what needs attention.",
251
+ ("coordination", "information_structure", "terminology", "marketing_calque"),
252
+ ),
253
+ SourceCase(
254
+ "basket-update-ui", "commerce", "ui",
255
+ "Your basket changed while you were checking out. Review the updated items before paying.",
256
+ ("concise_ui", "sequence", "payment_timing", "meaning_omission"),
257
+ ),
258
+ SourceCase(
259
+ "identity-check-ui", "healthcare", "ui",
260
+ "We could not verify your details. Nothing was submitted; check them and try again.",
261
+ ("concise_ui", "negation", "register", "false_friend"),
262
+ ),
263
+ SourceCase(
264
+ "deployment-window-ui", "developer_tools", "ui",
265
+ "Deployment paused. Existing traffic is unaffected, and queued changes will resume when the window ends.",
266
+ ("concise_ui", "terminology", "negation", "sequence"),
267
+ ),
268
+ SourceCase(
269
+ "parcel-scan-ui", "logistics", "ui",
270
+ "Scan not recognised. Keep the parcel here and enter the tracking code manually.",
271
+ ("concise_ui", "negation", "imperative", "terminology"),
272
+ ),
273
+ SourceCase(
274
+ "assessment-submit-ui", "professional_education", "ui",
275
+ "Submit for review? You can still read your answers, but you cannot change them afterwards.",
276
+ ("concise_ui", "modality", "negation", "sequence"),
277
+ ),
278
+ SourceCase(
279
+ "booking-hold-ui", "travel", "ui",
280
+ "This room is being held for another guest. Choose a different room or check again shortly.",
281
+ ("concise_ui", "politeness", "temporary_state", "unnatural_cta"),
282
+ ),
283
+ SourceCase(
284
+ "application-draft-ui", "public_services", "ui",
285
+ "Draft saved. Your application has not been sent, and no deadline has been extended.",
286
+ ("concise_ui", "negation", "legal_effect", "false_friend"),
287
+ ),
288
+ SourceCase(
289
+ "reconciliation-documentation-long", "financial_services", "documentation",
290
+ "Run reconciliation only after the bank feed has finished importing. First compare the opening balance with the closing balance from the previous confirmed period. Then review unmatched entries and record why any deliberate difference remains. Do not create a balancing transaction merely to make the totals agree, because that hides the source of the discrepancy. If another person is still editing the period, wait until their changes are committed and refresh the ledger before continuing. Lock the period only when every exception has an owner and supporting evidence.",
291
+ ("long_context", "sequence", "negation", "terminology", "modality", "meaning_omission"),
292
+ ),
293
+ SourceCase(
294
+ "patient-import-documentation-long", "healthcare", "documentation",
295
+ "Before importing patient records, confirm that the export belongs to the intended organisation and that the permitted purpose covers every included field. Use the validation preview to map identifiers, dates and coded values without writing to the live record. Resolve duplicate people manually; a matching name alone is not sufficient evidence that two records describe the same person. When the preview is clean, schedule the import for a quiet period and keep the signed source manifest. If validation fails after writing begins, stop the batch, preserve the audit trail and follow the documented recovery procedure rather than starting a second import.",
296
+ ("long_context", "sequence", "negation", "privacy", "terminology", "safety"),
297
+ ),
298
+ SourceCase(
299
+ "handover-documentation", "logistics", "documentation",
300
+ "Record the seal number before handover, ask the receiving driver to confirm it, and retain both timestamps with the shipment record.",
301
+ ("sequence", "terminology", "completeness", "coordination"),
302
+ ),
303
+ SourceCase(
304
+ "case-note-documentation", "public_services", "documentation",
305
+ "Add a case note only for information relevant to the decision, identify its source, and correct an error without deleting the original entry.",
306
+ ("sequence", "register", "auditability", "negation"),
307
+ ),
308
+ SourceCase(
309
+ "catalogue-sync-documentation", "commerce", "documentation",
310
+ "Publish the catalogue after prices and availability finish syncing; retry failed images separately instead of restarting the product import.",
311
+ ("sequence", "terminology", "negation", "meaning_omission"),
312
+ ),
313
+ SourceCase(
314
+ "meter-reset-documentation", "renewable_energy", "documentation",
315
+ "Reset the comparison period without deleting meter history, then wait for the next complete reading before evaluating consumption.",
316
+ ("sequence", "negation", "terminology", "false_friend"),
317
+ ),
318
+ SourceCase(
319
+ "course-release-documentation", "professional_education", "documentation",
320
+ "Release a module to the next group only after captions, reading order and assessment feedback have passed accessibility review.",
321
+ ("sequence", "accessibility", "terminology", "modality"),
322
+ ),
323
+ SourceCase(
324
+ "island-routes-seo", "travel", "seo",
325
+ "Plan island walks, ferry connections and flexible overnight stops with practical local guidance for changing weather.",
326
+ ("seo_naturalness", "cultural_fit", "keyword_stuffing", "unsupported_claim"),
327
+ ),
328
+ SourceCase(
329
+ "team-context-seo", "business_software", "seo",
330
+ "A shared project workspace for decisions, handovers and approvals that keeps useful context close to the work.",
331
+ ("seo_naturalness", "marketing_calque", "keyword_stuffing", "register"),
332
+ ),
333
+ SourceCase(
334
+ "cashflow-planning-seo", "financial_services", "seo",
335
+ "Cash-flow planning for small organisations with clear scenarios, payment timing and collaborative review.",
336
+ ("seo_naturalness", "terminology", "unsupported_claim", "false_friend"),
337
+ ),
338
+ SourceCase(
339
+ "skills-course-seo", "professional_education", "seo",
340
+ "Practical online courses with mentor feedback, accessible materials and projects drawn from everyday work.",
341
+ ("seo_naturalness", "register", "keyword_stuffing", "unsupported_claim"),
342
+ ),
343
+ SourceCase(
344
+ "parcel-tracking-seo", "logistics", "seo",
345
+ "Parcel tracking that explains handovers, delays and next steps without hiding uncertainty from the customer.",
346
+ ("seo_naturalness", "negation", "register", "marketing_calque"),
347
+ ),
348
+ SourceCase(
349
+ "arts-volunteering-seo", "cultural_nonprofit", "seo",
350
+ "Flexible arts volunteering opportunities for people who want to support events, workshops and local collections.",
351
+ ("seo_naturalness", "inclusive_language", "cultural_fit", "keyword_stuffing"),
352
+ ),
353
+ SourceCase(
354
+ "permit-support-seo", "public_services", "seo",
355
+ "Plain-language permit guidance with document checklists, application stages and contact options for extra support.",
356
+ ("seo_naturalness", "register", "unsupported_claim", "meaning_omission"),
357
+ ),
358
+ SourceCase(
359
+ "privacy-choice-legal-long", "digital_services", "legal",
360
+ "We use the contact details supplied with an enquiry to answer it and to keep a record of the response. We do not add those details to marketing lists unless the person separately chooses to receive updates. That choice may be withdrawn at any time without affecting messages already sent or the lawful handling that took place beforehand. Access to enquiry records is limited to staff who need them for support, compliance or security. Retention periods depend on the nature of the enquiry and any legal duty to preserve it. Requests to access, correct or erase personal data are assessed under the rights and exceptions that apply in the relevant jurisdiction.",
361
+ ("privacy", "consent", "negation", "modality", "retention", "long_context"),
362
+ ),
363
+ SourceCase(
364
+ "consumer-return-legal-long", "commerce", "legal",
365
+ "Customers may notify us that they wish to withdraw from an eligible distance purchase during the statutory withdrawal period. The item must then be returned using the instructions provided, but opening packaging solely to inspect the item does not by itself remove the right to withdraw. A deduction may apply when handling goes beyond what is reasonably necessary to establish the item’s nature, characteristics and functioning. Refunds include the standard outbound delivery charge where required by law and are made using the original payment method unless another method is expressly agreed. Separate rules apply to customised goods, sealed hygiene products after unsealing and digital content supplied after valid prior consent.",
366
+ ("consumer_rights", "exception", "modality", "negation", "refund", "long_context"),
367
+ ),
368
+ SourceCase(
369
+ "telehealth-consent-legal-long", "healthcare", "legal",
370
+ "A remote consultation is offered only when the clinician considers that the format is appropriate for the patient’s needs and the patient agrees to use it. The patient may ask to stop the remote session or request an in-person option, although availability and clinical urgency may affect when that option can be provided. Remote care does not replace emergency services. If the connection fails and there is an immediate safety concern, the patient should use the emergency contact information already provided. Notes from the consultation form part of the clinical record and are handled under the same confidentiality, access and retention rules as notes from an in-person appointment.",
371
+ ("consent", "safety", "modality", "negation", "confidentiality", "long_context"),
372
+ ),
373
+ SourceCase(
374
+ "seller-responsibility-legal-long", "online_marketplace", "legal",
375
+ "Each seller is responsible for describing its offer accurately, identifying the trader where the law requires it and fulfilling accepted orders. The marketplace may remove an offer or restrict an account when there is a substantiated safety, fraud or legal concern, but it does not become the seller merely by providing the listing and payment tools. Buyers must receive the seller’s applicable terms before placing an order. A dispute process may help the parties exchange evidence and seek a resolution; it does not limit any mandatory right to contact a regulator, use an external dispute body or bring a legal claim. Repeated misuse of the dispute process may lead to proportionate restrictions after notice.",
376
+ ("marketplace_role", "modality", "negation", "consumer_rights", "long_context"),
377
+ ),
378
+ SourceCase(
379
+ "credit-information-legal-long", "financial_services", "legal",
380
+ "The affordability estimate is based on the information available when it is produced and is not an offer of credit or a guarantee that an application will be approved. A lender may carry out additional identity, income, expenditure and creditworthiness checks before making a decision. The applicant must provide complete and accurate information and should explain any material change before accepting an agreement. Declining an application does not necessarily mean that the information supplied was false. Where the law permits an automated assessment, the notice will explain the principal factors and any available route to request human review or challenge inaccurate data.",
381
+ ("financial_disclosure", "unsupported_claim", "modality", "negation", "automated_decision", "long_context"),
382
+ ),
383
+ SourceCase(
384
+ "event-cancellation-legal-long", "cultural_events", "legal",
385
+ "If an event is cancelled, the ticket holder may choose the refund or alternative offered in the cancellation notice, subject to any mandatory rights. A change of performer, running order or reasonable start time does not automatically amount to cancellation. When an event is postponed, the original ticket remains valid for the replacement date unless the notice states that a new ticket will be issued. Travel, accommodation and other indirect costs are not reimbursed by the organiser except where the law requires otherwise. Nothing in these terms excludes liability that cannot lawfully be excluded, and any stated claim period does not shorten a longer mandatory limitation period.",
386
+ ("cancellation", "refund", "exception", "negation", "modality", "long_context"),
387
+ ),
388
+ SourceCase(
389
+ "processor-instructions-legal-long", "cloud_services", "legal",
390
+ "The service provider processes customer personal data only on documented instructions, including instructions concerning transfers, unless applicable law requires different processing. If legally permitted, the provider will tell the customer about that requirement before acting. People authorised to handle the data are bound by confidentiality, and access is limited according to role. The provider will assist with security incidents, rights requests and compliance information to the extent described in the agreement. At the end of the service, customer personal data is returned or deleted as instructed, except for copies that must be retained by law. Sub-processors remain subject to equivalent data-protection obligations and the agreed notification procedure.",
391
+ ("data_processing", "confidentiality", "modality", "exception", "retention", "long_context"),
392
+ ),
393
+ )
394
+
395
+
396
+ def _canonical_json(value: Any) -> bytes:
397
+ return json.dumps(
398
+ value, ensure_ascii=False, allow_nan=False,
399
+ sort_keys=True, separators=(",", ":"),
400
+ ).encode("utf-8")
401
+
402
+
403
+ def manifest() -> dict[str, Any]:
404
+ cases = [case.as_payload() for case in SOURCE_CASES]
405
+ commercial_cases = [
406
+ case for case in cases if case["content_type"] == "commercial"
407
+ ]
408
+ dimensions = list(_commercial_dimensions())
409
+ if (
410
+ len(commercial_cases) != 8
411
+ or any(case.get("commercial_dimensions") != dimensions for case in commercial_cases)
412
+ or any(
413
+ "commercial_dimensions" in case
414
+ for case in cases if case["content_type"] != "commercial"
415
+ )
416
+ ):
417
+ raise RuntimeError("invalid commercial benchmark coverage")
418
+ body = {
419
+ "schema": SCHEMA,
420
+ "version": VERSION,
421
+ "long_form_minimum_characters": LONG_FORM_MINIMUM_CHARACTERS,
422
+ "commercial_evaluation": {
423
+ "schema": COMMERCIAL_EVALUATION_SCHEMA,
424
+ "review_summary_schema": _COMMERCIAL.REVIEW_SUMMARY_SCHEMA,
425
+ "source_blind_native_exposure": "none",
426
+ "source_fidelity_scope": "all-dimensions-every-commercial-case",
427
+ "dimensions": dimensions,
428
+ "case_keys": [case["key"] for case in commercial_cases],
429
+ "cases_per_dimension": len(commercial_cases),
430
+ },
431
+ "cases": cases,
432
+ }
433
+ body["sha256"] = hashlib.sha256(_canonical_json(body)).hexdigest()
434
+ return json.loads(_canonical_json(body))
435
+
436
+
437
+ _BY_BINDING = {
438
+ (
439
+ case.as_payload()["source_id"],
440
+ case.as_payload()["source_revision"],
441
+ case.as_payload()["source_sha256"],
442
+ case.content_type,
443
+ ): case.as_payload()
444
+ for case in SOURCE_CASES
445
+ }
446
+ if len(_BY_BINDING) != len(SOURCE_CASES):
447
+ raise RuntimeError("duplicate website-localization benchmark case")
448
+
449
+
450
+ def case_for_job(job: Any) -> dict[str, Any]:
451
+ try:
452
+ binding = (
453
+ job["source"]["id"], job["source"]["revision"],
454
+ job["source"]["sha256"], job["content_type"],
455
+ )
456
+ case = _BY_BINDING[binding]
457
+ if job["source"]["locale"] != case["source_locale"]:
458
+ raise KeyError
459
+ if job["source"]["text"] != case["source_text"]:
460
+ raise KeyError
461
+ except (KeyError, TypeError):
462
+ raise ValueError("job is not an exact canonical benchmark case") from None
463
+ return json.loads(_canonical_json(case))