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,177 @@
1
+ # Commercial localization — profile v2
2
+
3
+ Use for pricing pages, offer cards, checkout copy, subscription CTAs, discounts,
4
+ trials and associated conditions in **any language or script**. The skill is
5
+ language-neutral; the website planner currently supplies 24 EU locale profiles.
6
+ Technical coverage does not establish native fluency in those languages.
7
+
8
+ ## Keep the offer intact
9
+
10
+ Before drafting, map each proposition to its product/tier and source segment.
11
+ Include headings, neighboring cards, footnotes and linked condition labels.
12
+ Preserve:
13
+
14
+ - amount, currency identity, unit and the product receiving that price;
15
+ - discount/saving, comparison basis, eligibility and reference period;
16
+ - qualifiers such as “from”, “up to”, “only” and minimum quantities;
17
+ - stated tax inclusion/exclusion and scope, without inferring local tax rules;
18
+ - billing frequency and amount charged, distinct from an equivalent monthly
19
+ display price or minimum contract term;
20
+ - trial cost/duration, introductory period, renewal terms and subsequent price;
21
+ - cancellation deadline, notice, fees, refunds and exceptions;
22
+ - remaining limits, tier counts, dates, eligibility and attached conditions.
23
+
24
+ “Four tiers” counts pricing levels, not payment installments. “Save up to” does
25
+ not promise every customer that saving. A yearly contract billed monthly is not
26
+ a monthly cancellable subscription. Do not add missing terms to improve copy.
27
+
28
+ ## Preserve meaning, allow native presentation
29
+
30
+ Allow locale-appropriate separators, spacing, currency position, native digits,
31
+ number words, written percentages and inflected unit expressions. These must
32
+ express the same value and commercial relationship. Do not perform currency
33
+ conversion, round prices, or change tax treatment. An explicit request to keep
34
+ an exact number/symbol spelling overrides formatting adaptation.
35
+
36
+ Never interpret `1,234` without reliable locale and source context. “12 months”
37
+ and “one year” can be equivalent, but calendar dates, commitment, charging and
38
+ renewal conditions must still agree. A digit-count or number-multiset regex is
39
+ neither proof of fidelity nor grounds to reject an otherwise equivalent form.
40
+
41
+ Read protected names and slogans from the project brief/glossary. Protect an
42
+ acrostic tagline verbatim when requested; do not translate its initials away.
43
+ There is no public default list of brands, tier names, amounts or currencies.
44
+
45
+ ## Review and uncertainty
46
+
47
+ First hide the source and judge idiomatic commercial language, CTA effect,
48
+ register, rhythm, typography and comprehensibility as original native copy.
49
+ Then compare the full source and target proposition by proposition. Check both
50
+ omissions and added promises. Match each price and condition to its own offer;
51
+ equal totals across two cards do not excuse swapped prices.
52
+
53
+ Record a known mismatch as blocking. If a value, condition, coverage or native
54
+ usage remains unresolved, request an independent model adapter or qualified
55
+ native/domain reviewer. Do not mark uncertainty as a successful check or invent
56
+ a translation to fill a gap. A grammatical target and model confidence alone
57
+ are not publication evidence. Neither average scores nor unrelated successful
58
+ checks override a blocking or major defect.
59
+
60
+ ## Skill-only evidence check
61
+
62
+ The executable checker and its shared validator ship in this skill's `scripts/`
63
+ directory. No `integrations/` directory, server, model credentials or network is
64
+ needed for this local check. Run from the skill directory:
65
+
66
+ ```bash
67
+ python3 scripts/check_commercial_review.py --contract
68
+ python3 scripts/check_commercial_review.py --source source.txt --target target.txt --review review.json
69
+ ```
70
+
71
+ The contract is a description, not a completed review. First perform the
72
+ source-blind native review, then have the source-aware reviewer produce the
73
+ `commercial_review` object; save that object alone as `review.json`. Do not
74
+ manufacture positive evidence to satisfy the checker. Supply the full unchanged
75
+ source and target, not extracted price fragments. Inputs must be UTF-8 without
76
+ BOM, at most 2,000,000 bytes each. Character spans count Unicode code points, not
77
+ UTF-8 bytes or JavaScript UTF-16 units. Line endings are preserved; do not
78
+ normalize or edit the files after producing the evidence offsets.
79
+
80
+ Exit 1 and `BLOCK` mean malformed, changed or unresolved evidence. Missing
81
+ arguments exit 2. Exit 0 and `EVIDENCE_VALID` mean only that the evidence meets
82
+ the structural contract, **not that prices are correct or the text is ready**.
83
+ All machine results say `release_allowed: false`; no token is issued. Successful
84
+ checks include hashes of the exact inputs for traceability, not an authenticated
85
+ receipt. The independent quality assessment, structural/orthography guards and
86
+ host-verified signed release remain necessary. Unknown language/domain facts
87
+ must still go to an independent adapter or qualified reviewer.
88
+
89
+ This helper neither starts nor locates a deployed checking service. The website
90
+ worker uses this same validator through a compatibility module in `integrations/`.
91
+ The ordinary MCP/response guard is not automatically wired to commercial review
92
+ by copying the skill; the trusted host must use the commercial worker path and
93
+ enforce its quality and publication gates. Do not claim coverage for a live
94
+ BLUN agent without testing that actual path. When updating an installation with
95
+ local guard patches, preserve and reconcile those patches; this helper does not
96
+ require replacing `scripts/blun_language_guard.py`.
97
+
98
+ ## Website worker contract
99
+
100
+ The trusted CMS/backend selects `content_type: "commercial"` for complete offer
101
+ copy, including its CTA and conditions. Do not let a generating agent downgrade
102
+ it to `marketing` or `ui` to avoid review. Keep genuinely legal terms on the
103
+ existing `legal` path with required human review; this profile is not a legal
104
+ approval. For mixed pages, supply complete contextual commercial units rather
105
+ than isolated price fragments.
106
+
107
+ The planner binds `translate-native.commercial.v2` into the job and plan IDs.
108
+ The authenticated capabilities response publishes the same profile as a
109
+ separately hashed, brand-neutral machine-readable contract. It lists all ten
110
+ semantic dimensions, exact preservation rules, permitted locale-aware
111
+ rendering, the evidence method and the fail-closed route for ambiguity. CMS
112
+ integrations can therefore preflight the implemented offer contract without
113
+ receiving project prices, product lists, protected terms or deployment secrets.
114
+ Its separately hashed `review_summary_contract` also declares the exact five
115
+ summary fields, both valid statuses, the only permitted ordered dimension
116
+ names, the evidence-hash canonicalization and the explicit exclusion of source
117
+ text, target text, spans, reviewer prose, project prices and project brands.
118
+ Adapters therefore do not need to infer the targeted-review envelope from a
119
+ schema name or prose. A changed, missing, reordered or unknown dimension makes
120
+ the complete capability response unavailable.
121
+ The worker uses the existing three ordered passes; the source-fidelity response
122
+ additionally requires `commercial_review`. It contains all ten named dimensions,
123
+ coverage and per-offer evidence. Each item declares `matched`, `source_only`, or
124
+ `target_only` and supplies exact source/target character spans; the absent side
125
+ of a one-sided item is `null`. Equivalent evidence must be matched. A specific
126
+ changed or uncertain verdict needs a concrete item, while globally uncertain
127
+ coverage may remain span-free rather than fabricate a location.
128
+ Missing/malformed checks, impossible relation/span combinations and changed
129
+ terms produce no result or approval. Uncertainty or an all-absent report preserves the candidate only as a
130
+ low-confidence fidelity result. It remains unpublishable until the host verifies
131
+ exactly one qualified native/domain review or an independent second-provider
132
+ model receipt bound to the commercial profile and policy. The worker does not
133
+ secretly call an alternative provider.
134
+
135
+ The worker retains a content-free `commercial_review` summary in result schema
136
+ v5. It contains only the profile, verdict, ordered unresolved dimension names
137
+ and a hash of the complete commercial evidence. Prices, text spans,
138
+ interpretations and reviewer prose do not survive in the summary. The same
139
+ summary is bound into quality-evidence request schema v5 and receipt-binding
140
+ schema v2, so an independent adapter receives the exact targeted scope and
141
+ cannot replace it with a generic approval. Tampered, unknown, reordered or
142
+ contradictory dimensions block before network access or signing.
143
+
144
+ The validator checks evidence shape and offsets, **not semantic truth**. A model
145
+ can misinterpret text or omit a fact while claiming completeness. The host's
146
+ independent quality-receipt verifier must inspect the complete request/response
147
+ and adequacy of evidence before signing; existing signature/readiness gates
148
+ remain mandatory. No live provider or native-editor quality is established by
149
+ scripted adapter tests. Profile changes require a new profile version, and
150
+ project condition/glossary/prompt changes require new bound policy versions.
151
+
152
+ The website benchmark suite v4 treats commercial localization as one of eight
153
+ separately gated content-type lanes. Each locale needs all eight brand-neutral
154
+ commercial cases and must pass the predeclared joint, target-native, and
155
+ source-fidelity statistics inside that lane. Wins on headlines, UI, or other
156
+ content cannot compensate for a weak pricing lane, just as commercial wins
157
+ cannot hide another weak content type. These gates prove only the integrity of
158
+ recorded blind evidence; they do not manufacture native review or establish
159
+ superiority without real qualified reviewers and a lawful baseline.
160
+
161
+ Its hashed manifest binds the same ten ordered dimensions as this profile to
162
+ every commercial case. This includes dimensions absent from the source, because
163
+ the target must also be checked for invented prices, discounts, terms, or
164
+ conditions. The runner validates the exact list before either external pass and
165
+ provides it only to source-fidelity review. Source-blind native review receives
166
+ neither the source nor this semantic scope. Missing, additional, or reordered
167
+ dimensions fail closed before a reviewer is called.
168
+
169
+ The fidelity reviewer must return
170
+ `translate-native.commercial-benchmark-review.v1`: one ordered item for every
171
+ dimension and a decision for each anonymous variant. `equivalent` and
172
+ `not_present` carry no defect reference. `major` and `blocking` point to the
173
+ matching variant's zero-based defect entry, so a generic preference cannot hide
174
+ which commercial check failed. `uncertain`, incomplete, reordered, additional,
175
+ or contradictory acknowledgements fail closed. Only canonical response hashes,
176
+ defect counts, and finding hashes survive in case evidence; reviewer prose does
177
+ not.
@@ -196,7 +196,13 @@ def validate_text(
196
196
  base_language = language.casefold().replace("_", "-").split("-", 1)[0]
197
197
  profile = LANGUAGE_CHARACTER_PROFILES.get(base_language)
198
198
  profile_prose = DIACRITICS.mask_technical_text(text)
199
- if profile and len(profile_prose) >= 200 and not any(character in profile for character in profile_prose):
199
+ # Masked URLs and code retain their length as spaces, so the threshold must
200
+ # count real prose characters. Native characters anywhere in the complete
201
+ # text also disprove the specific hypothesis of wholesale ASCII folding.
202
+ profile_prose_solid = sum(1 for character in profile_prose if not character.isspace())
203
+ if (profile and profile_prose_solid >= 200
204
+ and not any(character in profile for character in profile_prose)
205
+ and not any(character in profile for character in text)):
200
206
  findings.append(Finding(
201
207
  "missing-language-character-profile",
202
208
  f"Long {base_language} text contains none of the language's characteristic native characters; possible wholesale ASCII folding.",
@@ -0,0 +1,80 @@
1
+ #!/usr/bin/env python3
2
+ """Offline evidence-shape check, never a semantic approval or release token."""
3
+
4
+ from __future__ import annotations
5
+
6
+ import argparse
7
+ import hashlib
8
+ import json
9
+ from pathlib import Path
10
+
11
+ from commercial_localization_profile import CommercialReviewBlocked, review_contract, validate_review
12
+
13
+
14
+ PROFILE = "translate-native.commercial.v2"
15
+ MAX_INPUT_BYTES = 2_000_000
16
+
17
+
18
+ def _read(path: str) -> str:
19
+ # Bound each read; decode bytes directly to preserve CRLF and exact spans.
20
+ with Path(path).open("rb") as stream:
21
+ raw = stream.read(MAX_INPUT_BYTES + 1)
22
+ if len(raw) > MAX_INPUT_BYTES:
23
+ raise ValueError("input limit")
24
+ text = raw.decode("utf-8")
25
+ if not text.strip() or text.startswith("\ufeff"):
26
+ raise ValueError("empty input or BOM")
27
+ return text
28
+
29
+
30
+ def _object(pairs):
31
+ result = {}
32
+ for key, value in pairs:
33
+ if key in result:
34
+ raise ValueError("duplicate JSON key")
35
+ result[key] = value
36
+ return result
37
+
38
+
39
+ def _constant(value):
40
+ raise ValueError("nonfinite JSON number")
41
+
42
+
43
+ def main(argv=None) -> int:
44
+ parser = argparse.ArgumentParser(description=__doc__)
45
+ parser.add_argument("--contract", action="store_true", help="print the review contract; not completed evidence")
46
+ parser.add_argument("--source", help="complete source text, UTF-8 without BOM")
47
+ parser.add_argument("--target", help="complete target text, UTF-8 without BOM")
48
+ parser.add_argument("--review", help="source-aware review JSON, UTF-8 without BOM")
49
+ args = parser.parse_args(argv)
50
+ if args.contract:
51
+ if any((args.source, args.target, args.review)):
52
+ parser.error("--contract cannot be combined with input files")
53
+ print(json.dumps({"status": "CONTRACT", "release_allowed": False,
54
+ "commercial_review": review_contract(PROFILE)}, ensure_ascii=False))
55
+ return 0
56
+ if not all((args.source, args.target, args.review)):
57
+ parser.error("--source, --target and --review are required")
58
+ result = {"schema": "translate-native.commercial-evidence-check.v1",
59
+ "profile": PROFILE, "release_allowed": False}
60
+ try:
61
+ source, target, raw_review = (_read(path) for path in (args.source, args.target, args.review))
62
+ review = json.loads(raw_review, object_pairs_hook=_object, parse_constant=_constant)
63
+ validate_review(review, source, target, PROFILE)
64
+ except CommercialReviewBlocked as error:
65
+ result.update(status="BLOCK", reason=error.code)
66
+ except (OSError, ValueError, RecursionError):
67
+ result.update(status="BLOCK", reason="review.commercial.input_invalid")
68
+ else:
69
+ result.update(
70
+ status="EVIDENCE_VALID", reason="independent_quality_and_signed_release_required",
71
+ source_sha256=hashlib.sha256(source.encode("utf-8")).hexdigest(),
72
+ target_sha256=hashlib.sha256(target.encode("utf-8")).hexdigest(),
73
+ review_sha256=hashlib.sha256(raw_review.encode("utf-8")).hexdigest(),
74
+ )
75
+ print(json.dumps(result, ensure_ascii=False, sort_keys=True))
76
+ return 0 if result["status"] == "EVIDENCE_VALID" else 1
77
+
78
+
79
+ if __name__ == "__main__":
80
+ raise SystemExit(main())
@@ -0,0 +1,333 @@
1
+ """Language-neutral commercial review contract; not a semantic language detector.
2
+
3
+ Models provide semantic evidence. This module validates coverage, exact evidence
4
+ locations and verdict consistency, not the truth of a model's interpretation.
5
+ Only a host-verified quality receipt can authorize subsequent publication.
6
+ """
7
+
8
+ from __future__ import annotations
9
+
10
+ import hashlib
11
+ import json
12
+ from typing import Any
13
+
14
+
15
+ PUBLIC_PROFILE_SCHEMA = "translate-native.commercial-capabilities.v2"
16
+ REVIEW_SUMMARY_CAPABILITIES_SCHEMA = (
17
+ "translate-native.commercial-review-summary-capabilities.v1"
18
+ )
19
+ REVIEW_SUMMARY_SCHEMA = "translate-native.commercial-review-summary.v1"
20
+
21
+ DIMENSIONS = {
22
+ "amount_currency": "Amounts, currency identity, units and price-to-product association; no conversion or rounding.",
23
+ "discount_basis": "Discount or saving amount/rate, comparison price, eligibility and reference period.",
24
+ "qualifiers": "From, up to, only, minimum, maximum, approximate and other limits on every claim.",
25
+ "tax_status": "Tax included/excluded, stated rates and scope; do not infer local tax treatment.",
26
+ "billing_interval": "Charge frequency and amount due now, separate from the advertised equivalent monthly price.",
27
+ "commitment": "Contract duration, minimum commitment, trial duration and whether a trial is paid or free.",
28
+ "renewal": "Automatic/manual renewal, renewal price, interval and conditions after introductory offers.",
29
+ "cancellation": "Cancellation deadline, notice period, fees, refund conditions and exceptions.",
30
+ "conditions": "Every remaining eligibility rule, quantity, tier count, limit, deadline and linked footnote.",
31
+ "offer_assignment": "Which offer, tier or product each claim belongs to; never accept swapped prices or conditions.",
32
+ }
33
+
34
+
35
+ def _canonical_json(value: Any) -> bytes:
36
+ return json.dumps(
37
+ value, ensure_ascii=False, sort_keys=True, separators=(",", ":"),
38
+ ).encode("utf-8")
39
+
40
+
41
+ def public_review_summary_contract(profile: str) -> dict[str, Any]:
42
+ """Return the exact content-free summary contract external adapters consume."""
43
+ body = {
44
+ "schema": REVIEW_SUMMARY_CAPABILITIES_SCHEMA,
45
+ "result_schema": REVIEW_SUMMARY_SCHEMA,
46
+ "profile": profile,
47
+ "required_fields": [
48
+ "schema", "profile", "status", "review_required_dimensions",
49
+ "evidence_sha256",
50
+ ],
51
+ "statuses": {
52
+ "verified": {"review_required_dimensions": "empty"},
53
+ "review_required": {
54
+ "review_required_dimensions": "one-or-more",
55
+ "requires_independent_review": True,
56
+ },
57
+ },
58
+ "review_required_dimensions": {
59
+ "allowed": list(DIMENSIONS),
60
+ "order": list(DIMENSIONS),
61
+ "unique": True,
62
+ },
63
+ "evidence_sha256": {
64
+ "algorithm": "sha-256",
65
+ "canonicalization": "utf-8-json-sort-keys-no-insignificant-whitespace",
66
+ "covers": "complete-commercial-review-evidence",
67
+ },
68
+ "content_policy": {
69
+ "source_text": False,
70
+ "target_text": False,
71
+ "source_spans": False,
72
+ "target_spans": False,
73
+ "reviewer_prose": False,
74
+ "project_prices": False,
75
+ "project_brands": False,
76
+ },
77
+ }
78
+ return {
79
+ **body,
80
+ "sha256": hashlib.sha256(_canonical_json(body)).hexdigest(),
81
+ }
82
+
83
+
84
+ def public_profile(profile: str) -> dict[str, Any]:
85
+ """Return the public, brand-neutral contract implemented by this module."""
86
+ body = {
87
+ "schema": PUBLIC_PROFILE_SCHEMA,
88
+ "profile": profile,
89
+ "review_summary_schema": REVIEW_SUMMARY_SCHEMA,
90
+ "review_summary_contract": public_review_summary_contract(profile),
91
+ "applies_to": {
92
+ "content_type": "commercial",
93
+ "locales": "all-supported-target-locales",
94
+ },
95
+ "dimensions": [
96
+ {"name": name, "requirement": requirement}
97
+ for name, requirement in DIMENSIONS.items()
98
+ ],
99
+ "preservation": {
100
+ "amounts": "exact-value",
101
+ "currencies": "same-identity-no-conversion",
102
+ "discounts": "rate-amount-reference-basis-period-and-eligibility",
103
+ "qualifiers": "scope-and-limit-per-claim",
104
+ "taxes": "status-rate-and-scope-without-inference",
105
+ "billing": "charge-amount-and-frequency",
106
+ "commitment": "separate-duration-and-minimum-term",
107
+ "renewal": "mode-price-interval-and-conditions",
108
+ "cancellation": "deadline-notice-fees-refunds-and-exceptions",
109
+ "conditions": "eligibility-limits-deadlines-footnotes-and-links",
110
+ "offer_assignment": "every-claim-bound-to-its-own-offer",
111
+ },
112
+ "rendering": {
113
+ "locale_appropriate": True,
114
+ "natural_wording": True,
115
+ "native_digits_allowed": True,
116
+ "number_words_allowed": True,
117
+ "written_percentages_allowed": True,
118
+ "locale_separators_allowed": True,
119
+ "rounding_allowed": False,
120
+ "currency_conversion_allowed": False,
121
+ "exact_characters_only_when_project_configured": True,
122
+ },
123
+ "verification": {
124
+ "method": "semantic-provider-evidence",
125
+ "deterministic_numeric_regex_is_sufficient": False,
126
+ "evidence_granularity": "every-proposition-per-offer",
127
+ "directions": ["matched", "source_only", "target_only"],
128
+ "ambiguous_values": "unresolved",
129
+ "unresolved_route": "independent-model-or-qualified-native-domain-review",
130
+ "automatic_publication_when_unresolved": False,
131
+ },
132
+ "protected_terms": "project-configuration-only",
133
+ }
134
+ return {
135
+ **body,
136
+ "sha256": hashlib.sha256(_canonical_json(body)).hexdigest(),
137
+ }
138
+
139
+ CREATION_GUIDANCE = """Localize prices, offers and subscriptions as natural native commercial copy.
140
+ Preserve every commercial proposition and its association with the correct offer, not merely a bag of numbers.
141
+ Keep brands, product names and protected slogans exactly as configured for this project; invent no universal list.
142
+ Locale formatting, native digits, number words and written percentages are allowed when semantically equivalent.
143
+ Do not convert currency, change a tax claim, round a price, strengthen a saving or conceal a condition.
144
+ Keep billing frequency distinct from contract length. Preserve footnote and link associations.
145
+ An explicit instruction to preserve exact characters (for example a currency symbol) overrides format adaptation."""
146
+
147
+ NATIVE_GUIDANCE = """Judge commercial copy as native writing: idiomatic pricing labels, CTAs, natural number,
148
+ currency and interval expressions, unambiguous offer layout and readable conditions. Do not require digits instead
149
+ of number words, ASCII instead of native digits, or source-locale punctuation. Do not infer missing commercial facts."""
150
+
151
+ FIDELITY_GUIDANCE = """For each commercial dimension inspect the COMPLETE source and candidate, including
152
+ all offers, headings, footnotes, links and conditions. Record every applicable proposition as an item with a stable
153
+ offer label, semantic explanation and relation: 'matched', 'source_only' for an omission, or 'target_only' for an
154
+ addition. Give exact zero-based Python Unicode code-point spans with an exclusive end; the absent side of a one-sided
155
+ item MUST be null. Repeated amounts must stay attached to their own offer; number multisets do not prove fidelity.
156
+ 'not_present' is valid only if a dimension is absent from BOTH texts. 'equivalent' requires nonempty matched items
157
+ covering every applicable proposition. A dimension-level 'changed' or 'uncertain' verdict requires at least one
158
+ specific item; use coverage='uncertain' for unresolved overall completeness without inventing a span.
159
+ Use 'changed' for a known defect and 'uncertain' for unresolved interpretation, coverage or insufficient language/domain
160
+ evidence. Use coverage='uncertain' unless every proposition and offer association was checked. Never resolve numeric
161
+ ambiguity by guessing. Number words, written percentages, native digits and locale separators may be equivalent;
162
+ 12 months and one year may be equivalent only when the actual commercial terms agree. State the interpretation in
163
+ the explanation. No average score can override a defect. Return commercial_review in addition to the normal review."""
164
+
165
+
166
+ class CommercialReviewBlocked(ValueError):
167
+ def __init__(self, code: str):
168
+ super().__init__(code)
169
+ self.code = code
170
+
171
+
172
+ def review_contract(schema: str) -> dict[str, Any]:
173
+ return {
174
+ "schema": schema,
175
+ "coverage": "complete or uncertain",
176
+ "checks": {
177
+ name: {
178
+ "status": "equivalent, not_present, changed or uncertain",
179
+ "items": [{
180
+ "offer": "stable offer label",
181
+ "relation": "matched, source_only, or target_only",
182
+ "source_span": [0, 1],
183
+ "target_span": [0, 1],
184
+ "explanation": description,
185
+ }],
186
+ }
187
+ for name, description in DIMENSIONS.items()
188
+ },
189
+ }
190
+
191
+
192
+ def validate_review(
193
+ value: Any,
194
+ source: str,
195
+ target: str,
196
+ schema: str,
197
+ *,
198
+ allow_uncertain: bool = False,
199
+ ) -> dict[str, Any]:
200
+ """Validate evidence and return a content-free, hash-bound routing summary."""
201
+ def invalid() -> None:
202
+ raise CommercialReviewBlocked("review.commercial.invalid")
203
+
204
+ def span(value: Any, text: str) -> None:
205
+ if (
206
+ not isinstance(value, list) or len(value) != 2
207
+ or any(type(offset) is not int for offset in value)
208
+ or not 0 <= value[0] < value[1] <= len(text)
209
+ or not text[value[0]:value[1]].strip()
210
+ ):
211
+ invalid()
212
+
213
+ if not isinstance(value, dict) or set(value) != {"schema", "coverage", "checks"}:
214
+ invalid()
215
+ if value["schema"] != schema or value["coverage"] not in ("complete", "uncertain"):
216
+ invalid()
217
+ checks = value["checks"]
218
+ if not isinstance(checks, dict) or set(checks) != set(DIMENSIONS):
219
+ invalid()
220
+ uncertain_dimensions: set[str] = set()
221
+ coverage_uncertain = value["coverage"] == "uncertain"
222
+ changed = False
223
+ evidenced = False
224
+ for name, check in checks.items():
225
+ if not isinstance(check, dict) or set(check) != {"status", "items"}:
226
+ invalid()
227
+ status, items = check["status"], check["items"]
228
+ if status not in ("equivalent", "not_present", "changed", "uncertain"):
229
+ invalid()
230
+ if not isinstance(items, list) or len(items) > 1000:
231
+ invalid()
232
+ if (
233
+ (status == "not_present" and items)
234
+ or (status in ("equivalent", "changed", "uncertain") and not items)
235
+ ):
236
+ invalid()
237
+ seen = set()
238
+ for item in items:
239
+ if not isinstance(item, dict) or set(item) != {
240
+ "offer", "relation", "source_span", "target_span", "explanation",
241
+ }:
242
+ invalid()
243
+ for field in ("offer", "explanation"):
244
+ if not isinstance(item[field], str) or not item[field].strip() or len(item[field]) > 2000:
245
+ invalid()
246
+ relation = item["relation"]
247
+ if relation == "matched":
248
+ span(item["source_span"], source)
249
+ span(item["target_span"], target)
250
+ elif relation == "source_only":
251
+ span(item["source_span"], source)
252
+ if item["target_span"] is not None:
253
+ invalid()
254
+ elif relation == "target_only":
255
+ if item["source_span"] is not None:
256
+ invalid()
257
+ span(item["target_span"], target)
258
+ else:
259
+ invalid()
260
+ if status == "equivalent" and relation != "matched":
261
+ invalid()
262
+ identity = (
263
+ item["offer"], relation,
264
+ tuple(item["source_span"]) if item["source_span"] is not None else None,
265
+ tuple(item["target_span"]) if item["target_span"] is not None else None,
266
+ )
267
+ if identity in seen:
268
+ invalid()
269
+ seen.add(identity)
270
+ if status == "uncertain":
271
+ uncertain_dimensions.add(name)
272
+ changed |= status == "changed"
273
+ evidenced |= status == "equivalent"
274
+ if changed:
275
+ raise CommercialReviewBlocked("review.commercial.changed")
276
+ # Every evidenced condition must resolve to an explicitly reviewed offer.
277
+ assignment = checks["offer_assignment"]
278
+ if assignment["status"] != "equivalent" or not any(
279
+ check["status"] == "equivalent" for name, check in checks.items() if name != "offer_assignment"
280
+ ):
281
+ uncertain_dimensions.add("offer_assignment")
282
+ else:
283
+ offers = {item["offer"] for item in assignment["items"]}
284
+ if any(item["offer"] not in offers for check in checks.values() for item in check["items"]):
285
+ invalid()
286
+ if coverage_uncertain or not evidenced:
287
+ uncertain_dimensions.update(DIMENSIONS)
288
+ summary = {
289
+ "schema": REVIEW_SUMMARY_SCHEMA,
290
+ "profile": schema,
291
+ "status": "review_required" if uncertain_dimensions else "verified",
292
+ "review_required_dimensions": [
293
+ name for name in DIMENSIONS if name in uncertain_dimensions
294
+ ],
295
+ "evidence_sha256": hashlib.sha256(_canonical_json(value)).hexdigest(),
296
+ }
297
+ if uncertain_dimensions and not allow_uncertain:
298
+ raise CommercialReviewBlocked("review.commercial.independent_review_required")
299
+ return summary
300
+
301
+
302
+ def validate_summary(
303
+ value: Any,
304
+ profile: str,
305
+ *,
306
+ review_required: bool,
307
+ ) -> dict[str, Any]:
308
+ """Validate a persisted summary without retaining customer or reviewer text."""
309
+ if (
310
+ not isinstance(value, dict)
311
+ or set(value) != {
312
+ "schema", "profile", "status", "review_required_dimensions",
313
+ "evidence_sha256",
314
+ }
315
+ or value["schema"] != REVIEW_SUMMARY_SCHEMA
316
+ or value["profile"] != profile
317
+ or value["status"] not in {"verified", "review_required"}
318
+ or not isinstance(value["evidence_sha256"], str)
319
+ or len(value["evidence_sha256"]) != 64
320
+ or any(character not in "0123456789abcdef" for character in value["evidence_sha256"])
321
+ or not isinstance(value["review_required_dimensions"], list)
322
+ ):
323
+ raise CommercialReviewBlocked("review.commercial.summary_invalid")
324
+ dimensions = value["review_required_dimensions"]
325
+ if (
326
+ len(dimensions) != len(set(dimensions))
327
+ or any(name not in DIMENSIONS for name in dimensions)
328
+ or dimensions != [name for name in DIMENSIONS if name in dimensions]
329
+ or (value["status"] == "verified") != (not dimensions)
330
+ or (value["status"] == "review_required" and not review_required)
331
+ ):
332
+ raise CommercialReviewBlocked("review.commercial.summary_invalid")
333
+ return json.loads(_canonical_json(value))
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Maykbiletti
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1 @@
1
+ 6.64.0
@@ -196,7 +196,13 @@ def validate_text(
196
196
  base_language = language.casefold().replace("_", "-").split("-", 1)[0]
197
197
  profile = LANGUAGE_CHARACTER_PROFILES.get(base_language)
198
198
  profile_prose = DIACRITICS.mask_technical_text(text)
199
- if profile and len(profile_prose) >= 200 and not any(character in profile for character in profile_prose):
199
+ # Masked URLs and code retain their length as spaces, so the threshold must
200
+ # count real prose characters. Native characters anywhere in the complete
201
+ # text also disprove the specific hypothesis of wholesale ASCII folding.
202
+ profile_prose_solid = sum(1 for character in profile_prose if not character.isspace())
203
+ if (profile and profile_prose_solid >= 200
204
+ and not any(character in profile for character in profile_prose)
205
+ and not any(character in profile for character in text)):
200
206
  findings.append(Finding(
201
207
  "missing-language-character-profile",
202
208
  f"Long {base_language} text contains none of the language's characteristic native characters; possible wholesale ASCII folding.",