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.
- package/CHANGELOG.md +11 -185
- package/LIESMICH.txt +51 -13
- package/README.md +44 -47
- package/agent-spine-plugin/.codex-plugin/plugin.json +16 -4
- package/agent-spine-plugin/CHANGELOG.md +37 -5
- package/agent-spine-plugin/README.md +3 -3
- package/agent-spine-plugin/blun.plugin.json +45 -10
- package/agent-spine-plugin/docs/artifact-evaluation.md +93 -0
- package/agent-spine-plugin/docs/host-integration.md +42 -27
- package/agent-spine-plugin/docs/preflight-recall.md +4 -2
- package/agent-spine-plugin/docs/session-timeline.md +97 -236
- package/agent-spine-plugin/docs/world-model.md +25 -0
- package/agent-spine-plugin/hooks/codex.json +1 -1
- package/agent-spine-plugin/hooks/hooks.json +1 -1
- package/agent-spine-plugin/package.json +1 -3
- package/agent-spine-plugin/scripts/check-hosts.js +3 -3
- package/agent-spine-plugin/scripts/release-check.js +10 -5
- package/agent-spine-plugin/scripts/run-checks.js +4 -1
- package/agent-spine-plugin/scripts/run-tests-hermetic.js +32 -6
- package/agent-spine-plugin/src/cli-learning.js +15 -0
- package/agent-spine-plugin/src/cli.js +2 -0
- package/agent-spine-plugin/src/hook.js +32 -32
- package/agent-spine-plugin/src/lib/action-lesson-recall.js +73 -8
- package/agent-spine-plugin/src/lib/briefing.js +146 -36
- package/agent-spine-plugin/src/lib/channel-continuity.js +19 -0
- package/agent-spine-plugin/src/lib/delivery-agent-usage.js +14 -7
- package/agent-spine-plugin/src/lib/gateway-group-response.js +128 -0
- package/agent-spine-plugin/src/lib/gateway-runs.js +24 -15
- package/agent-spine-plugin/src/lib/hook-briefing-use.js +13 -3
- package/agent-spine-plugin/src/lib/hook-context.js +16 -3
- package/agent-spine-plugin/src/lib/hook-output.js +129 -5
- package/agent-spine-plugin/src/lib/hook-timeline.js +5 -3
- package/agent-spine-plugin/src/lib/indexed-memory.js +2 -2
- package/agent-spine-plugin/src/lib/learning-artifact-evaluator.js +114 -0
- package/agent-spine-plugin/src/lib/learning-context.js +11 -4
- package/agent-spine-plugin/src/lib/learning-measurements.js +2 -2
- package/agent-spine-plugin/src/lib/mcp-runtime.js +89 -3
- package/agent-spine-plugin/src/lib/mcp-source-context.js +12 -2
- package/agent-spine-plugin/src/lib/mcp-timeline-tools.js +91 -8
- package/agent-spine-plugin/src/lib/mcp-world-tools.js +2 -2
- package/agent-spine-plugin/src/lib/owned-file-lock.js +20 -1
- package/agent-spine-plugin/src/lib/persona-runtime.js +2 -2
- package/agent-spine-plugin/src/lib/preflight-delivery-id.js +27 -0
- package/agent-spine-plugin/src/lib/preflight.js +4 -4
- package/agent-spine-plugin/src/lib/session-timeline-codex.js +15 -0
- package/agent-spine-plugin/src/lib/session-timeline-contract.js +12 -4
- package/agent-spine-plugin/src/lib/session-timeline-event-extract.js +36 -7
- package/agent-spine-plugin/src/lib/session-timeline-host-origin.js +13 -10
- package/agent-spine-plugin/src/lib/session-timeline-invocation.js +1 -1
- package/agent-spine-plugin/src/lib/session-timeline-king.js +14 -0
- package/agent-spine-plugin/src/lib/session-timeline-prior.js +18 -12
- package/agent-spine-plugin/src/lib/session-timeline-provider.js +5 -0
- package/agent-spine-plugin/src/lib/session-timeline-query.js +2 -0
- package/agent-spine-plugin/src/lib/session-timeline-results.js +35 -10
- package/agent-spine-plugin/src/lib/session-timeline-source-open.js +30 -0
- package/agent-spine-plugin/src/lib/session-timeline.js +122 -75
- package/agent-spine-plugin/src/lib/source-roots.js +3 -2
- package/agent-spine-plugin/src/lib/task-knowledge-context.js +22 -1
- package/agent-spine-plugin/src/lib/timeline-continuation-update.js +100 -0
- package/agent-spine-plugin/src/lib/timeline-tool-guard.js +30 -7
- package/agent-spine-plugin/src/lib/timeline-user-feedback.js +217 -0
- package/agent-spine-plugin/src/lib/timeline-world-capture.js +233 -0
- package/agent-spine-plugin/src/lib/world-knowledge.js +59 -2
- package/agent-spine-plugin/src/lib/world-model.js +64 -9
- package/agent-spine-plugin/src/worker.js +13 -1
- package/bin/blun.js +43 -28
- package/bin/core-bootstrap.js +5 -4
- package/bin/king.js +43 -28
- package/bin/launcher-mode.js +1 -10
- package/bin/launcher-runtime.js +128 -295
- package/bin/managed-node.js +0 -0
- package/bin/managed-plugin-selection.cjs +0 -1
- package/bin/native-module-repair.js +0 -0
- package/bin/node-runtime.js +0 -0
- package/bin/node-version.js +0 -0
- package/bin/plugin-bootstrap.js +56 -120
- package/bin/private-paths.js +11 -34
- package/bin/standard-tools-bootstrap.js +34 -114
- package/bin/turn-thinking-policy.cjs +3 -11
- package/bin/update-copy.js +200 -0
- package/bin/update-lease.js +0 -0
- package/bin/update-notice.js +136 -289
- package/bin/verify-agent-behavior.cjs +122 -0
- package/bin/verify-agent-components.cjs +104 -0
- package/bin/verify-bundled-agent-sources.cjs +57 -0
- package/blun.mjs +143076 -135288
- package/bundled-agent-sources.json +701 -0
- package/package.json +12 -15
- package/standard-skills/translate-native/README.md +1293 -0
- package/standard-skills/translate-native/SKILL.md +172 -22
- package/standard-skills/translate-native/VERSION +1 -1
- package/standard-skills/translate-native/agents/openai.yaml +18 -0
- package/standard-skills/translate-native/assets/icon.svg +8 -0
- package/standard-skills/translate-native/docs/BLUN_CODE_INTEGRATION.md +76 -0
- package/standard-skills/translate-native/docs/PREMORTEM.md +489 -0
- package/standard-skills/translate-native/docs/WEBSITE_LOCALIZATION.md +2035 -0
- package/standard-skills/translate-native/docs/WEBSITE_LOCALIZATION_API.md +1302 -0
- package/standard-skills/translate-native/docs/WEBSITE_LOCALIZATION_EVIDENCE_HTTP.md +136 -0
- package/standard-skills/translate-native/docs/WEBSITE_LOCALIZATION_HEALTH_HTTP.md +130 -0
- package/standard-skills/translate-native/docs/WEBSITE_LOCALIZATION_HTTP_PROVIDER.md +175 -0
- package/standard-skills/translate-native/docs/WEBSITE_LOCALIZATION_RECEIPT_VERIFIER_HTTP.md +86 -0
- package/standard-skills/translate-native/integrations/AGENT_RULES.md +32 -0
- package/standard-skills/translate-native/integrations/adapters/blun-code-language-guard.js +514 -0
- package/standard-skills/translate-native/integrations/adapters/node-language-guard.js +230 -0
- package/standard-skills/translate-native/integrations/audit_log.py +327 -0
- package/standard-skills/translate-native/integrations/claude_language_hook.js +1536 -0
- package/standard-skills/translate-native/integrations/commercial_localization_profile.py +42 -0
- package/standard-skills/translate-native/integrations/delivery-policy.example.json +28 -0
- package/standard-skills/translate-native/integrations/enforced_delivery.py +543 -0
- package/standard-skills/translate-native/integrations/guard_service.py +435 -0
- package/standard-skills/translate-native/integrations/language_gateway.py +67 -0
- package/standard-skills/translate-native/integrations/mcp_auth_headers.py +198 -0
- package/standard-skills/translate-native/integrations/mcp_http_gateway.py +429 -0
- package/standard-skills/translate-native/integrations/non_language_html_entities.js +1485 -0
- package/standard-skills/translate-native/integrations/pre_output_guard.py +65 -0
- package/standard-skills/translate-native/integrations/task_router.py +101 -0
- package/standard-skills/translate-native/integrations/website_localization.py +401 -0
- package/standard-skills/translate-native/integrations/website_localization_api.py +581 -0
- package/standard-skills/translate-native/integrations/website_localization_benchmark.py +1885 -0
- package/standard-skills/translate-native/integrations/website_localization_benchmark_campaign.py +1772 -0
- package/standard-skills/translate-native/integrations/website_localization_benchmark_candidate.py +506 -0
- package/standard-skills/translate-native/integrations/website_localization_benchmark_http.py +400 -0
- package/standard-skills/translate-native/integrations/website_localization_benchmark_review_store.py +781 -0
- package/standard-skills/translate-native/integrations/website_localization_benchmark_reviewer_http.py +500 -0
- package/standard-skills/translate-native/integrations/website_localization_benchmark_runtime.py +1107 -0
- package/standard-skills/translate-native/integrations/website_localization_benchmark_suite.py +463 -0
- package/standard-skills/translate-native/integrations/website_localization_cms.py +2835 -0
- package/standard-skills/translate-native/integrations/website_localization_cms_client.py +875 -0
- package/standard-skills/translate-native/integrations/website_localization_cms_dispatch.py +805 -0
- package/standard-skills/translate-native/integrations/website_localization_cms_http.py +588 -0
- package/standard-skills/translate-native/integrations/website_localization_cms_lifecycle_monitor.py +991 -0
- package/standard-skills/translate-native/integrations/website_localization_cms_receiver.py +1441 -0
- package/standard-skills/translate-native/integrations/website_localization_cms_receiver_runtime.py +414 -0
- package/standard-skills/translate-native/integrations/website_localization_cms_receiver_store.py +1073 -0
- package/standard-skills/translate-native/integrations/website_localization_cms_removal_dispatch.py +865 -0
- package/standard-skills/translate-native/integrations/website_localization_cms_source_client.py +583 -0
- package/standard-skills/translate-native/integrations/website_localization_cms_source_delivery.py +964 -0
- package/standard-skills/translate-native/integrations/website_localization_cms_source_delivery_runtime.py +665 -0
- package/standard-skills/translate-native/integrations/website_localization_cms_source_http.py +1153 -0
- package/standard-skills/translate-native/integrations/website_localization_cms_source_runtime.py +675 -0
- package/standard-skills/translate-native/integrations/website_localization_cms_source_service.py +1125 -0
- package/standard-skills/translate-native/integrations/website_localization_cms_terminal_notification.py +674 -0
- package/standard-skills/translate-native/integrations/website_localization_cms_terminal_notification_http.py +444 -0
- package/standard-skills/translate-native/integrations/website_localization_cms_terminal_notification_receiver.py +1469 -0
- package/standard-skills/translate-native/integrations/website_localization_cms_terminal_notification_receiver_runtime.py +1142 -0
- package/standard-skills/translate-native/integrations/website_localization_cms_terminal_processing_monitor.py +634 -0
- package/standard-skills/translate-native/integrations/website_localization_cms_terminal_receiver_client.py +804 -0
- package/standard-skills/translate-native/integrations/website_localization_deepl_baseline.py +922 -0
- package/standard-skills/translate-native/integrations/website_localization_evidence_http.py +482 -0
- package/standard-skills/translate-native/integrations/website_localization_health.py +1541 -0
- package/standard-skills/translate-native/integrations/website_localization_health_http.py +372 -0
- package/standard-skills/translate-native/integrations/website_localization_http_provider.py +297 -0
- package/standard-skills/translate-native/integrations/website_localization_native_reference_http.py +479 -0
- package/standard-skills/translate-native/integrations/website_localization_native_reference_intake.py +363 -0
- package/standard-skills/translate-native/integrations/website_localization_native_reference_queue.py +1449 -0
- package/standard-skills/translate-native/integrations/website_localization_native_reference_store.py +420 -0
- package/standard-skills/translate-native/integrations/website_localization_quality_profiles.py +235 -0
- package/standard-skills/translate-native/integrations/website_localization_queue.py +671 -0
- package/standard-skills/translate-native/integrations/website_localization_receipt_verifier_http.py +516 -0
- package/standard-skills/translate-native/integrations/website_localization_release.py +928 -0
- package/standard-skills/translate-native/integrations/website_localization_release_coordinator.py +1008 -0
- package/standard-skills/translate-native/integrations/website_localization_runner.py +276 -0
- package/standard-skills/translate-native/integrations/website_localization_runtime.py +862 -0
- package/standard-skills/translate-native/integrations/website_localization_service.py +350 -0
- package/standard-skills/translate-native/integrations/website_localization_supervisor.py +511 -0
- package/standard-skills/translate-native/integrations/website_localization_worker.py +663 -0
- package/standard-skills/translate-native/provenance.json +3 -4
- package/standard-skills/translate-native/references/commercial-localization.md +177 -0
- package/standard-skills/translate-native/scripts/blun_language_guard.py +7 -1
- package/standard-skills/translate-native/scripts/check_commercial_review.py +80 -0
- package/standard-skills/translate-native/scripts/commercial_localization_profile.py +333 -0
- package/standard-tools/language-guard/LICENSE +21 -0
- package/standard-tools/language-guard/VERSION +1 -0
- package/standard-tools/language-guard/blun_language_guard.py +7 -1
- package/standard-tools/language-guard/check_commercial_review.py +80 -0
- package/standard-tools/language-guard/commercial_localization_profile.py +333 -0
- package/standard-tools/language-guard/language_gateway.py +62 -0
- package/standard-tools/language-guard/pre_output_guard.py +64 -0
- package/standard-tools/language-guard/provenance.json +4 -11
- package/standard-tools/manifest.json +34 -11
- package/telegram-plugin/commands/access.md +2 -10
- package/telegram-plugin/dist/bridge.mjs +64041 -687
- package/telegram-plugin/dist/mcp-server.mjs +72810 -9027
- package/telegram-plugin/dist/noise.mjs +28 -63511
- package/agent-spine-plugin/CONTRIBUTING.md +0 -52
- package/agent-spine-plugin/SECURITY.md +0 -47
- package/agent-spine-plugin/docs/assignment-continuation.md +0 -48
- package/agent-spine-plugin/docs/releasing.md +0 -85
- package/agent-spine-plugin/docs/structured-completion.md +0 -67
- package/bin/abort-listener-policy.cjs +0 -43
- package/bin/active-steer-priority-policy.cjs +0 -24
- package/bin/agent-api-http-adapter.mjs +0 -446
- package/bin/agent-api-private-http-server.mjs +0 -288
- package/bin/agent-api-runtime.mjs +0 -252
- package/bin/agent-api-service-environment.mjs +0 -236
- package/bin/agent-api-service-host.mjs +0 -209
- package/bin/agent-api-service-process.mjs +0 -171
- package/bin/agent-api-session-registry.mjs +0 -428
- package/bin/agent-api-tool-broker.cjs +0 -248
- package/bin/agent-api-turn-controller.mjs +0 -461
- package/bin/agent-api-usage-journal.cjs +0 -259
- package/bin/agent-resume-snapshot.cjs +0 -241
- package/bin/agentspine-king-goal-inbox.mjs +0 -111
- package/bin/agentspine-king-goal-intake.mjs +0 -106
- package/bin/approval-rejection-stop.cjs +0 -15
- package/bin/assistant-message-offload-policy.cjs +0 -284
- package/bin/baseline-skill-performance-policy.cjs +0 -39
- package/bin/bash-search-scope-policy.cjs +0 -49
- package/bin/codebase-search-runtime.cjs +0 -23
- package/bin/cognitive-action-checkpoint.cjs +0 -1104
- package/bin/cognitive-attention-delivery.cjs +0 -76
- package/bin/cognitive-attention-policy.cjs +0 -143
- package/bin/cognitive-attention-runtime.cjs +0 -91
- package/bin/cognitive-context-projection.cjs +0 -73
- package/bin/cognitive-cross-portal-acceptance.cjs +0 -443
- package/bin/cognitive-effective-view.cjs +0 -77
- package/bin/cognitive-focus-projection.cjs +0 -206
- package/bin/cognitive-focus-scope.cjs +0 -37
- package/bin/cognitive-goal-autostart-policy.cjs +0 -72
- package/bin/cognitive-goal-time-trigger-controller.cjs +0 -146
- package/bin/cognitive-memory-adapter.cjs +0 -282
- package/bin/cognitive-memory-command.cjs +0 -293
- package/bin/cognitive-memory-provider.cjs +0 -92
- package/bin/cognitive-salience-policy.cjs +0 -159
- package/bin/cognitive-state-store.cjs +0 -508
- package/bin/cognitive-turn-lifecycle.cjs +0 -624
- package/bin/cognitive-work-focus.cjs +0 -180
- package/bin/compaction-history-archive.cjs +0 -166
- package/bin/compaction-history-startup.cjs +0 -50
- package/bin/compaction-model-policy.cjs +0 -31
- package/bin/compaction-stage-policy.cjs +0 -21
- package/bin/compaction-transaction-policy.cjs +0 -122
- package/bin/config-write-dedup-policy.cjs +0 -27
- package/bin/context-budget-ledger.cjs +0 -31
- package/bin/context-doctor-policy.cjs +0 -70
- package/bin/context-insight-policy.cjs +0 -36
- package/bin/context-performance-policy.cjs +0 -19
- package/bin/context-pressure-policy.cjs +0 -20
- package/bin/cron-run-output.cjs +0 -45
- package/bin/cron-run-store.cjs +0 -145
- package/bin/curiosity-scout-policy.cjs +0 -49
- package/bin/default-model-output-budget-policy.cjs +0 -28
- package/bin/durable-task-resume-policy.cjs +0 -130
- package/bin/durable-task-resume-runtime.cjs +0 -117
- package/bin/durable-task-resume-store.cjs +0 -88
- package/bin/editable-tool-approval-policy.cjs +0 -540
- package/bin/editable-tool-approval-runtime.cjs +0 -99
- package/bin/effective-system-prompt-cache-policy.cjs +0 -33
- package/bin/error-memory-performance-policy.cjs +0 -113
- package/bin/file-observation-policy.cjs +0 -133
- package/bin/foreground-output-capture-policy.cjs +0 -41
- package/bin/generated-source-health.cjs +0 -142
- package/bin/glob-pattern-policy.cjs +0 -13
- package/bin/goal-completion-evidence-policy.cjs +0 -120
- package/bin/grep-output-limit-policy.cjs +0 -39
- package/bin/historical-media-projection-policy.cjs +0 -48
- package/bin/history-offload-pressure-policy.cjs +0 -33
- package/bin/html-to-research-markdown.cjs +0 -147
- package/bin/identity-context-policy.cjs +0 -764
- package/bin/identity-journal-policy.cjs +0 -107
- package/bin/input-draft-persistence.cjs +0 -77
- package/bin/king-tui-function-contract.json +0 -33
- package/bin/launcher-restart-policy.cjs +0 -150
- package/bin/live-response-repetition-guard.cjs +0 -196
- package/bin/llm-config-log-dedup-policy.cjs +0 -76
- package/bin/loop-event-record-policy.cjs +0 -174
- package/bin/managed-context-startup-policy.cjs +0 -27
- package/bin/media-activity-layout-policy.cjs +0 -34
- package/bin/media-auto-retrieval-policy.cjs +0 -90
- package/bin/media-result-policy.cjs +0 -59
- package/bin/micro-compaction-policy.cjs +0 -145
- package/bin/mistake-relevance-policy.cjs +0 -319
- package/bin/model-retry-progress-policy.cjs +0 -46
- package/bin/native-large-file-io.cjs +0 -42
- package/bin/native-runtime-cache.cjs +0 -76
- package/bin/natural-presence-policy.cjs +0 -28
- package/bin/noninteractive-shell-env-policy.cjs +0 -19
- package/bin/observer-hooks.cjs +0 -14
- package/bin/outbound-claim-provenance.cjs +0 -150
- package/bin/oversized-context-offload-policy.cjs +0 -86
- package/bin/pending-media-policy.cjs +0 -182
- package/bin/pending-token-estimate-policy.cjs +0 -41
- package/bin/personal-memory-consent-policy.cjs +0 -72
- package/bin/personal-memory-performance-policy.cjs +0 -12
- package/bin/personality-choice-policy.cjs +0 -101
- package/bin/personality-memory-adapter.cjs +0 -379
- package/bin/personality-mode.cjs +0 -46
- package/bin/personality-setup-policy.cjs +0 -197
- package/bin/proactive-compaction-policy.cjs +0 -25
- package/bin/profile-identity-resolution.cjs +0 -136
- package/bin/profile-runtime.cjs +0 -318
- package/bin/profile-tool-exclusion-policy.cjs +0 -37
- package/bin/programmatic-context-isolation.cjs +0 -25
- package/bin/programmatic-tool-runtime.mjs +0 -627
- package/bin/provider-idle-timeout-policy.cjs +0 -14
- package/bin/provider-model-refresh-deadline.cjs +0 -53
- package/bin/provider-model-refresh-policy.cjs +0 -107
- package/bin/rate-limit-recovery-policy.cjs +0 -47
- package/bin/read-batch-policy.cjs +0 -32
- package/bin/read-continuation-policy.cjs +0 -59
- package/bin/recurring-cron-history-policy.cjs +0 -124
- package/bin/relationship-continuity-policy.cjs +0 -143
- package/bin/relationship-curiosity-policy.cjs +0 -107
- package/bin/relationship-learning-policy.cjs +0 -168
- package/bin/release-artifact-freeze-policy.cjs +0 -30
- package/bin/reload-plugin-bootstrap.cjs +0 -18
- package/bin/reload-queue-policy.cjs +0 -38
- package/bin/repeated-assistant-response-policy.cjs +0 -232
- package/bin/repeated-injection-projection.cjs +0 -107
- package/bin/repeated-user-message-projection.cjs +0 -8
- package/bin/research-page-result.cjs +0 -74
- package/bin/retry-checkpoint-policy.cjs +0 -13
- package/bin/runtime-exit-ledger.cjs +0 -144
- package/bin/scoped-cron-run-policy.cjs +0 -358
- package/bin/session-checkpoint-policy.cjs +0 -25
- package/bin/session-compaction-policy.cjs +0 -84
- package/bin/session-replay-policy.cjs +0 -20
- package/bin/session-replay-window-policy.cjs +0 -40
- package/bin/session-resume-checkpoint.cjs +0 -254
- package/bin/session-scrollback-archive.cjs +0 -229
- package/bin/skill-activation-performance-policy.cjs +0 -69
- package/bin/skill-listing-performance-policy.cjs +0 -92
- package/bin/soul-organization-policy.cjs +0 -78
- package/bin/soul-preservation-policy.cjs +0 -20
- package/bin/startup-preferences.cjs +0 -131
- package/bin/streaming-flush-performance-policy.cjs +0 -28
- package/bin/structured-agent-swarm-output.cjs +0 -325
- package/bin/structured-subagent-output.cjs +0 -252
- package/bin/subagent-context-fork-policy.cjs +0 -155
- package/bin/subagent-max-tokens-handoff-policy.cjs +0 -69
- package/bin/subagent-parent-responsiveness.cjs +0 -19
- package/bin/subagent-skill-policy.cjs +0 -206
- package/bin/subagent-timeout-policy.cjs +0 -182
- package/bin/subagent-tool-policy.cjs +0 -60
- package/bin/subagent-usage-rollup-policy.cjs +0 -29
- package/bin/system-prompt-context-policy.cjs +0 -124
- package/bin/system-prompt-token-cache-policy.cjs +0 -60
- package/bin/telegram-addressed-focus.cjs +0 -55
- package/bin/telegram-addressed-priority.cjs +0 -12
- package/bin/telegram-approval-relay.cjs +0 -290
- package/bin/telegram-bot-priority.cjs +0 -17
- package/bin/telegram-console-status-policy.cjs +0 -174
- package/bin/telegram-context-projection-policy.cjs +0 -141
- package/bin/telegram-delivery-lifecycle.cjs +0 -125
- package/bin/telegram-direct-focus-policy.cjs +0 -273
- package/bin/telegram-mcp-compatibility.cjs +0 -49
- package/bin/telegram-media-delivery-policy.cjs +0 -42
- package/bin/telegram-private-conversation-policy.cjs +0 -185
- package/bin/telegram-queue-handoff-policy.cjs +0 -73
- package/bin/telegram-remote-status-policy.cjs +0 -120
- package/bin/telegram-session-queue-runtime.mjs +0 -306
- package/bin/telegram-text-chunk-policy.cjs +0 -63
- package/bin/telegram-truncated-reply-policy.cjs +0 -37
- package/bin/telegram-urgent-policy.cjs +0 -45
- package/bin/telemetry-spool-policy.cjs +0 -57
- package/bin/thinking-activity-status-policy.cjs +0 -132
- package/bin/thinking-only-guard.cjs +0 -80
- package/bin/todo-list-turn-policy.cjs +0 -131
- package/bin/tool-call-loop-policy.cjs +0 -51
- package/bin/tool-file-persistence.cjs +0 -141
- package/bin/tool-result-offload-policy.cjs +0 -359
- package/bin/tool-result-offload-telemetry.cjs +0 -12
- package/bin/tool-schema-token-cache-policy.cjs +0 -41
- package/bin/tool-stream-preview-policy.cjs +0 -9
- package/bin/tui-functional-contract.cjs +0 -55
- package/bin/turn-tool-performance-policy.cjs +0 -486
- package/bin/usage-cache-efficiency-policy.cjs +0 -26
- package/bin/user-home-path-policy.cjs +0 -13
- package/bin/user-message-offload-policy.cjs +0 -103
- package/bin/user-prompt-hook-origin-policy.cjs +0 -34
- package/bin/user-tool-record-policy.cjs +0 -7
- package/bin/validated-learning-insight-policy.cjs +0 -58
- package/bin/validated-learning-outcome-trace.cjs +0 -107
- package/bin/validated-learning-performance-policy.cjs +0 -53
- package/bin/validated-learning-signal.cjs +0 -463
- package/bin/windows-bash-dialect-policy.cjs +0 -25
- package/bin/windows-node-crash-dump.cjs +0 -110
- package/bin/write-continuation-policy.cjs +0 -69
- package/codebase-index/README.md +0 -82
- package/codebase-index/codebase_index.py +0 -470
- package/standard-skills/agent-browser/SKILL.md +0 -19
- package/standard-skills/agent-browser/references/runtime.md +0 -8
- package/standard-skills/blun-session-inspector/SKILL.md +0 -41
- package/standard-skills/blun-session-inspector/scripts/inspect-session.cjs +0 -437
- package/standard-skills/design-taste-frontend/SKILL.md +0 -1206
- package/standard-skills/full-output-enforcement/SKILL.md +0 -49
- package/standard-skills/high-end-visual-design/SKILL.md +0 -98
- package/standard-skills/image-to-code/SKILL.md +0 -1228
- package/standard-skills/industrial-brutalist-ui/SKILL.md +0 -92
- package/standard-skills/minimalist-ui/SKILL.md +0 -85
- package/standard-skills/motion-design-taste/SKILL.md +0 -74
- package/standard-skills/playwright-testing/SKILL.md +0 -19
- package/standard-skills/playwright-testing/references/runtime.md +0 -7
- package/standard-skills/premortem/SKILL.md +0 -148
- package/standard-skills/redesign-existing-projects/SKILL.md +0 -178
- package/standard-skills/research-evidence/SKILL.md +0 -39
- package/standard-skills/research-evidence/references/evidence-format.md +0 -104
- package/standard-skills/research-evidence/scripts/evidence-collection.cjs +0 -260
- package/standard-skills/research-evidence/scripts/score-report.cjs +0 -130
- package/standard-skills/screenshot-lesen/SKILL.md +0 -52
- package/standard-skills/stitch-design-taste/DESIGN.md +0 -121
- package/standard-skills/stitch-design-taste/SKILL.md +0 -184
- package/standard-skills/telegram-channel/SKILL.md +0 -18
- package/standard-skills/telegram-channel/references/runtime.md +0 -7
- package/standard-skills/venture-flywheel/SKILL.md +0 -32
- package/standard-skills/venture-flywheel/identity/project-identity.cjs +0 -146
- package/standard-skills/venture-flywheel/policy/capability-engine.cjs +0 -114
- package/standard-skills/venture-flywheel/policy/repository-trust.cjs +0 -229
- package/standard-skills/venture-flywheel/references/BEISPIELE-phase0.md +0 -146
- package/standard-skills/venture-flywheel/references/CAPABILITY-MAP.md +0 -34
- package/standard-skills/venture-flywheel/references/SPEC-phase0-identity-trust.md +0 -77
- package/standard-skills/venture-flywheel/references/SPEC-phase0-state-events.md +0 -93
- package/standard-skills/venture-flywheel/schemas/capability-decision.schema.json +0 -13
- package/standard-skills/venture-flywheel/schemas/execution-event.schema.json +0 -44
- package/standard-skills/venture-flywheel/schemas/project-identity.schema.json +0 -32
- package/standard-skills/venture-flywheel/schemas/repository-trust.schema.json +0 -57
- package/standard-skills/venture-flywheel/schemas/run-transition.schema.json +0 -59
- package/standard-skills/venture-flywheel/state/execution-event.cjs +0 -191
- package/standard-skills/venture-flywheel/state/task-state-machine.cjs +0 -190
- package/standard-skills/web-lesen/SKILL.md +0 -73
- package/standard-skills/web-lesen/scripts/crawl_public.py +0 -379
- package/standard-skills/windows-mcp/SKILL.md +0 -19
- package/standard-skills/windows-mcp/references/runtime.md +0 -9
- package/telegram-plugin/DELIVERY.md +0 -36
- package/telegram-plugin/bin/telegram-approval-relay.cjs +0 -290
- package/telegram-plugin/bin/telegram-console-status-policy.cjs +0 -175
- package/telegram-plugin/bin/telegram-delivery-lifecycle.cjs +0 -125
- package/telegram-plugin/bin/telegram-direct-reply-policy.cjs +0 -48
- package/telegram-plugin/bin/telegram-launcher-status-queue.cjs +0 -122
- package/telegram-plugin/bin/telegram-private-conversation-policy.cjs +0 -186
- package/telegram-plugin/bin/telegram-remote-status-policy.cjs +0 -121
- package/telegram-plugin/bin/telegram-reply-parts.cjs +0 -149
- package/telegram-plugin/bin/telegram-text-chunk-policy.cjs +0 -63
- package/telegram-plugin/bin/telegram-typing-keepalive.cjs +0 -89
- package/telegram-plugin/compat/mcp-server-fa511cd1.mjs +0 -73825
- /package/{bin → scripts}/fix-node-pty-perms.js +0 -0
package/standard-skills/translate-native/integrations/website_localization_native_reference_store.py
ADDED
|
@@ -0,0 +1,420 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""Durable, fail-closed storage for qualified-native benchmark references.
|
|
3
|
+
|
|
4
|
+
The trusted host owns the SQLite connection, receipt verifier, evidence
|
|
5
|
+
authority, and external artifact loader. The first fully verified reference is
|
|
6
|
+
bound to one route, benchmark policy, and suite job. Every read reverifies both
|
|
7
|
+
the artifact attestation and the qualified-human receipt before returning text.
|
|
8
|
+
"""
|
|
9
|
+
|
|
10
|
+
from __future__ import annotations
|
|
11
|
+
|
|
12
|
+
import hashlib
|
|
13
|
+
import importlib.util
|
|
14
|
+
import json
|
|
15
|
+
import math
|
|
16
|
+
import re
|
|
17
|
+
import sqlite3
|
|
18
|
+
import sys
|
|
19
|
+
import time
|
|
20
|
+
from contextlib import contextmanager
|
|
21
|
+
from dataclasses import asdict
|
|
22
|
+
from pathlib import Path
|
|
23
|
+
from typing import Any, Callable, Iterator
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
STORE_SCHEMA = "blun.website-localization-native-reference-store.v1"
|
|
27
|
+
MAX_ARTIFACT_BYTES = 4 * 1024 * 1024
|
|
28
|
+
ERROR_CODE = re.compile(r"^[a-z][a-z0-9_.-]{0,127}$")
|
|
29
|
+
STORE_COLUMNS = (
|
|
30
|
+
"reference_id", "route_id", "policy_sha256", "job_sha256",
|
|
31
|
+
"artifact_json", "artifact_sha256", "created_at",
|
|
32
|
+
)
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
def _load_module(name: str, path: Path):
|
|
36
|
+
spec = importlib.util.spec_from_file_location(name, path)
|
|
37
|
+
if spec is None or spec.loader is None:
|
|
38
|
+
raise RuntimeError(f"cannot load native-reference dependency: {path.name}")
|
|
39
|
+
module = importlib.util.module_from_spec(spec)
|
|
40
|
+
sys.modules[spec.name] = module
|
|
41
|
+
spec.loader.exec_module(module)
|
|
42
|
+
return module
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
_ROOT = Path(__file__).resolve().parents[1]
|
|
46
|
+
_BENCHMARK = _load_module(
|
|
47
|
+
"blun_website_localization_native_reference_benchmark",
|
|
48
|
+
_ROOT / "integrations" / "website_localization_benchmark.py",
|
|
49
|
+
)
|
|
50
|
+
_WORKER = _BENCHMARK._WORKER
|
|
51
|
+
_SUITE = _BENCHMARK._SUITE
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
class NativeReferenceStoreFailed(RuntimeError):
|
|
55
|
+
"""Content-free failure understood by durable benchmark orchestration."""
|
|
56
|
+
|
|
57
|
+
benchmark_campaign_dependency_failure = True
|
|
58
|
+
|
|
59
|
+
def __init__(self, code: str, *, retryable: bool):
|
|
60
|
+
if not isinstance(code, str) or ERROR_CODE.fullmatch(code) is None:
|
|
61
|
+
raise ValueError("native-reference error code is invalid")
|
|
62
|
+
if not isinstance(retryable, bool):
|
|
63
|
+
raise ValueError("native-reference retryability must be boolean")
|
|
64
|
+
super().__init__(code)
|
|
65
|
+
self.code = code
|
|
66
|
+
self.retryable = retryable
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
def _pairs(items):
|
|
70
|
+
result = {}
|
|
71
|
+
for key, value in items:
|
|
72
|
+
if key in result:
|
|
73
|
+
raise ValueError("duplicate JSON key")
|
|
74
|
+
result[key] = value
|
|
75
|
+
return result
|
|
76
|
+
|
|
77
|
+
|
|
78
|
+
def _constant(value):
|
|
79
|
+
raise ValueError("non-finite JSON number")
|
|
80
|
+
|
|
81
|
+
|
|
82
|
+
def _json_bytes(value: Any, code: str) -> bytes:
|
|
83
|
+
try:
|
|
84
|
+
encoded = json.dumps(
|
|
85
|
+
value,
|
|
86
|
+
ensure_ascii=False,
|
|
87
|
+
allow_nan=False,
|
|
88
|
+
sort_keys=True,
|
|
89
|
+
separators=(",", ":"),
|
|
90
|
+
).encode("utf-8")
|
|
91
|
+
except (TypeError, ValueError, UnicodeEncodeError, RecursionError):
|
|
92
|
+
raise NativeReferenceStoreFailed(code, retryable=False) from None
|
|
93
|
+
if not encoded or len(encoded) > MAX_ARTIFACT_BYTES:
|
|
94
|
+
raise NativeReferenceStoreFailed(code, retryable=False)
|
|
95
|
+
return encoded
|
|
96
|
+
|
|
97
|
+
|
|
98
|
+
def _parse_json(value: Any) -> Any:
|
|
99
|
+
if not isinstance(value, str) or not value:
|
|
100
|
+
raise NativeReferenceStoreFailed(
|
|
101
|
+
"native_reference.store.state_invalid", retryable=False,
|
|
102
|
+
)
|
|
103
|
+
try:
|
|
104
|
+
encoded = value.encode("utf-8")
|
|
105
|
+
if len(encoded) > MAX_ARTIFACT_BYTES:
|
|
106
|
+
raise ValueError("stored JSON is too large")
|
|
107
|
+
return json.loads(
|
|
108
|
+
value, object_pairs_hook=_pairs, parse_constant=_constant,
|
|
109
|
+
)
|
|
110
|
+
except (UnicodeEncodeError, ValueError, RecursionError):
|
|
111
|
+
raise NativeReferenceStoreFailed(
|
|
112
|
+
"native_reference.store.state_invalid", retryable=False,
|
|
113
|
+
) from None
|
|
114
|
+
|
|
115
|
+
|
|
116
|
+
def _hash_bytes(value: bytes) -> str:
|
|
117
|
+
return hashlib.sha256(value).hexdigest()
|
|
118
|
+
|
|
119
|
+
|
|
120
|
+
def _hash_text(value: str) -> str:
|
|
121
|
+
return _hash_bytes(value.encode("utf-8"))
|
|
122
|
+
|
|
123
|
+
|
|
124
|
+
def _timestamp(value: Any = None) -> float:
|
|
125
|
+
value = time.time() if value is None else value
|
|
126
|
+
if (
|
|
127
|
+
isinstance(value, bool)
|
|
128
|
+
or not isinstance(value, (int, float))
|
|
129
|
+
or not math.isfinite(float(value))
|
|
130
|
+
or float(value) < 0
|
|
131
|
+
):
|
|
132
|
+
raise NativeReferenceStoreFailed(
|
|
133
|
+
"native_reference.store.time_invalid", retryable=False,
|
|
134
|
+
)
|
|
135
|
+
return float(value)
|
|
136
|
+
|
|
137
|
+
|
|
138
|
+
def _identifier(value: Any, code: str) -> str:
|
|
139
|
+
if not isinstance(value, str) or _BENCHMARK.IDENTIFIER.fullmatch(value) is None:
|
|
140
|
+
raise NativeReferenceStoreFailed(code, retryable=False)
|
|
141
|
+
return value
|
|
142
|
+
|
|
143
|
+
|
|
144
|
+
def _binding(
|
|
145
|
+
job_payload: Any,
|
|
146
|
+
policy: Any,
|
|
147
|
+
route_id: Any,
|
|
148
|
+
) -> tuple[tuple[str, str, str, str], dict[str, Any], Any]:
|
|
149
|
+
route = _identifier(
|
|
150
|
+
route_id, "native_reference.store.route_invalid",
|
|
151
|
+
)
|
|
152
|
+
try:
|
|
153
|
+
validated_policy = _BENCHMARK._validate_policy(policy)
|
|
154
|
+
job = _WORKER._validated_job(job_payload)
|
|
155
|
+
_BENCHMARK._validate_candidate_job_binding(job, validated_policy)
|
|
156
|
+
if job["target"]["locale"] not in validated_policy.required_locales:
|
|
157
|
+
raise ValueError("locale is not required")
|
|
158
|
+
_SUITE.case_for_job(job)
|
|
159
|
+
except Exception:
|
|
160
|
+
raise NativeReferenceStoreFailed(
|
|
161
|
+
"native_reference.store.binding_invalid", retryable=False,
|
|
162
|
+
) from None
|
|
163
|
+
policy_sha256 = _hash_bytes(_json_bytes(
|
|
164
|
+
asdict(validated_policy), "native_reference.store.binding_invalid",
|
|
165
|
+
))
|
|
166
|
+
job_sha256 = _hash_bytes(_json_bytes(
|
|
167
|
+
job, "native_reference.store.binding_invalid",
|
|
168
|
+
))
|
|
169
|
+
reference_id = "native-reference:" + _hash_bytes(_json_bytes(
|
|
170
|
+
{
|
|
171
|
+
"schema": STORE_SCHEMA,
|
|
172
|
+
"route_id": route,
|
|
173
|
+
"policy_sha256": policy_sha256,
|
|
174
|
+
"job_sha256": job_sha256,
|
|
175
|
+
},
|
|
176
|
+
"native_reference.store.binding_invalid",
|
|
177
|
+
))
|
|
178
|
+
return (
|
|
179
|
+
(reference_id, route, policy_sha256, job_sha256),
|
|
180
|
+
job,
|
|
181
|
+
validated_policy,
|
|
182
|
+
)
|
|
183
|
+
|
|
184
|
+
|
|
185
|
+
def _validated_artifact(
|
|
186
|
+
artifact: Any,
|
|
187
|
+
job: dict[str, Any],
|
|
188
|
+
policy: Any,
|
|
189
|
+
native_reference_verifier: Any,
|
|
190
|
+
evidence_authority: Any,
|
|
191
|
+
) -> dict[str, Any]:
|
|
192
|
+
try:
|
|
193
|
+
return _BENCHMARK._validate_native_reference(
|
|
194
|
+
job,
|
|
195
|
+
artifact,
|
|
196
|
+
policy,
|
|
197
|
+
native_reference_verifier,
|
|
198
|
+
evidence_authority,
|
|
199
|
+
)
|
|
200
|
+
except _BENCHMARK.BenchmarkBlocked as error:
|
|
201
|
+
retryable = error.code in {
|
|
202
|
+
"benchmark.attestation.verify_failed",
|
|
203
|
+
"benchmark.native_reference.verify_failed",
|
|
204
|
+
}
|
|
205
|
+
code = (
|
|
206
|
+
"native_reference.store.verification_unavailable"
|
|
207
|
+
if retryable else "native_reference.store.artifact_invalid"
|
|
208
|
+
)
|
|
209
|
+
raise NativeReferenceStoreFailed(code, retryable=retryable) from None
|
|
210
|
+
except Exception:
|
|
211
|
+
raise NativeReferenceStoreFailed(
|
|
212
|
+
"native_reference.store.artifact_invalid", retryable=False,
|
|
213
|
+
) from None
|
|
214
|
+
|
|
215
|
+
|
|
216
|
+
@contextmanager
|
|
217
|
+
def _transaction(connection: sqlite3.Connection) -> Iterator[None]:
|
|
218
|
+
if connection.in_transaction:
|
|
219
|
+
raise NativeReferenceStoreFailed(
|
|
220
|
+
"native_reference.store.external_transaction", retryable=False,
|
|
221
|
+
)
|
|
222
|
+
try:
|
|
223
|
+
connection.execute("BEGIN IMMEDIATE")
|
|
224
|
+
yield
|
|
225
|
+
except Exception:
|
|
226
|
+
connection.rollback()
|
|
227
|
+
raise
|
|
228
|
+
else:
|
|
229
|
+
connection.commit()
|
|
230
|
+
|
|
231
|
+
|
|
232
|
+
class NativeReferenceArtifactStore:
|
|
233
|
+
"""Persist the first exact verified native reference for one bound route."""
|
|
234
|
+
|
|
235
|
+
def __init__(self, connection: sqlite3.Connection):
|
|
236
|
+
if not isinstance(connection, sqlite3.Connection):
|
|
237
|
+
raise NativeReferenceStoreFailed(
|
|
238
|
+
"native_reference.store.connection_invalid", retryable=False,
|
|
239
|
+
)
|
|
240
|
+
self.connection = connection
|
|
241
|
+
self.connection.row_factory = sqlite3.Row
|
|
242
|
+
self.connection.execute("PRAGMA busy_timeout = 5000")
|
|
243
|
+
with _transaction(self.connection):
|
|
244
|
+
self.connection.execute("""
|
|
245
|
+
CREATE TABLE IF NOT EXISTS benchmark_native_references (
|
|
246
|
+
reference_id TEXT PRIMARY KEY,
|
|
247
|
+
route_id TEXT NOT NULL,
|
|
248
|
+
policy_sha256 TEXT NOT NULL,
|
|
249
|
+
job_sha256 TEXT NOT NULL,
|
|
250
|
+
artifact_json TEXT NOT NULL,
|
|
251
|
+
artifact_sha256 TEXT NOT NULL,
|
|
252
|
+
created_at REAL NOT NULL,
|
|
253
|
+
UNIQUE(route_id, policy_sha256, job_sha256)
|
|
254
|
+
)
|
|
255
|
+
""")
|
|
256
|
+
columns = tuple(
|
|
257
|
+
row[1] for row in self.connection.execute(
|
|
258
|
+
"PRAGMA table_info(benchmark_native_references)"
|
|
259
|
+
).fetchall()
|
|
260
|
+
)
|
|
261
|
+
if columns != STORE_COLUMNS:
|
|
262
|
+
raise NativeReferenceStoreFailed(
|
|
263
|
+
"native_reference.store.schema_unsupported", retryable=False,
|
|
264
|
+
)
|
|
265
|
+
|
|
266
|
+
@staticmethod
|
|
267
|
+
def identity(
|
|
268
|
+
job_payload: Any, policy: Any, route_id: Any,
|
|
269
|
+
) -> tuple[str, str, str, str]:
|
|
270
|
+
return _binding(job_payload, policy, route_id)[0]
|
|
271
|
+
|
|
272
|
+
def load(
|
|
273
|
+
self,
|
|
274
|
+
job_payload: Any,
|
|
275
|
+
policy: Any,
|
|
276
|
+
route_id: Any,
|
|
277
|
+
*,
|
|
278
|
+
native_reference_verifier: Any,
|
|
279
|
+
evidence_authority: Any,
|
|
280
|
+
) -> dict[str, Any] | None:
|
|
281
|
+
identity, job, validated_policy = _binding(
|
|
282
|
+
job_payload, policy, route_id,
|
|
283
|
+
)
|
|
284
|
+
row = self.connection.execute("""
|
|
285
|
+
SELECT * FROM benchmark_native_references
|
|
286
|
+
WHERE reference_id = ?
|
|
287
|
+
""", (identity[0],)).fetchone()
|
|
288
|
+
if row is None:
|
|
289
|
+
return None
|
|
290
|
+
if (
|
|
291
|
+
tuple(row.keys()) != STORE_COLUMNS
|
|
292
|
+
or tuple(row[name] for name in STORE_COLUMNS[:4]) != identity
|
|
293
|
+
or isinstance(row["created_at"], bool)
|
|
294
|
+
or not isinstance(row["created_at"], (int, float))
|
|
295
|
+
or not math.isfinite(float(row["created_at"]))
|
|
296
|
+
or float(row["created_at"]) < 0
|
|
297
|
+
or not isinstance(row["artifact_json"], str)
|
|
298
|
+
or row["artifact_sha256"] != _hash_text(row["artifact_json"])
|
|
299
|
+
):
|
|
300
|
+
raise NativeReferenceStoreFailed(
|
|
301
|
+
"native_reference.store.state_invalid", retryable=False,
|
|
302
|
+
)
|
|
303
|
+
artifact = _parse_json(row["artifact_json"])
|
|
304
|
+
return _validated_artifact(
|
|
305
|
+
artifact,
|
|
306
|
+
job,
|
|
307
|
+
validated_policy,
|
|
308
|
+
native_reference_verifier,
|
|
309
|
+
evidence_authority,
|
|
310
|
+
)
|
|
311
|
+
|
|
312
|
+
def save(
|
|
313
|
+
self,
|
|
314
|
+
job_payload: Any,
|
|
315
|
+
policy: Any,
|
|
316
|
+
route_id: Any,
|
|
317
|
+
artifact: Any,
|
|
318
|
+
*,
|
|
319
|
+
native_reference_verifier: Any,
|
|
320
|
+
evidence_authority: Any,
|
|
321
|
+
now: Any = None,
|
|
322
|
+
) -> dict[str, Any]:
|
|
323
|
+
identity, job, validated_policy = _binding(
|
|
324
|
+
job_payload, policy, route_id,
|
|
325
|
+
)
|
|
326
|
+
verified = _validated_artifact(
|
|
327
|
+
artifact,
|
|
328
|
+
job,
|
|
329
|
+
validated_policy,
|
|
330
|
+
native_reference_verifier,
|
|
331
|
+
evidence_authority,
|
|
332
|
+
)
|
|
333
|
+
artifact_json = _json_bytes(
|
|
334
|
+
verified, "native_reference.store.artifact_invalid",
|
|
335
|
+
).decode("utf-8")
|
|
336
|
+
values = identity + (
|
|
337
|
+
artifact_json,
|
|
338
|
+
_hash_text(artifact_json),
|
|
339
|
+
_timestamp(now),
|
|
340
|
+
)
|
|
341
|
+
with _transaction(self.connection):
|
|
342
|
+
self.connection.execute("""
|
|
343
|
+
INSERT OR IGNORE INTO benchmark_native_references
|
|
344
|
+
VALUES (?, ?, ?, ?, ?, ?, ?)
|
|
345
|
+
""", values)
|
|
346
|
+
stored = self.load(
|
|
347
|
+
job_payload,
|
|
348
|
+
policy,
|
|
349
|
+
route_id,
|
|
350
|
+
native_reference_verifier=native_reference_verifier,
|
|
351
|
+
evidence_authority=evidence_authority,
|
|
352
|
+
)
|
|
353
|
+
if stored != verified:
|
|
354
|
+
raise NativeReferenceStoreFailed(
|
|
355
|
+
"native_reference.store.conflict", retryable=False,
|
|
356
|
+
)
|
|
357
|
+
return stored
|
|
358
|
+
|
|
359
|
+
|
|
360
|
+
def resolve_native_reference_artifact(
|
|
361
|
+
store: NativeReferenceArtifactStore,
|
|
362
|
+
job_payload: Any,
|
|
363
|
+
policy: Any,
|
|
364
|
+
route_id: Any,
|
|
365
|
+
load_artifact: Callable[[], Any],
|
|
366
|
+
*,
|
|
367
|
+
native_reference_verifier: Any,
|
|
368
|
+
evidence_authority: Any,
|
|
369
|
+
operation_guard: Callable[[], Any] | None = None,
|
|
370
|
+
now: Any = None,
|
|
371
|
+
) -> dict[str, Any]:
|
|
372
|
+
"""Reuse verified state or load and persist one exact external artifact."""
|
|
373
|
+
if any(not callable(getattr(store, name, None)) for name in ("load", "save")):
|
|
374
|
+
raise TypeError("store must provide load and save")
|
|
375
|
+
if not callable(load_artifact):
|
|
376
|
+
raise TypeError("load_artifact must be callable")
|
|
377
|
+
if operation_guard is not None and not callable(operation_guard):
|
|
378
|
+
raise TypeError("operation_guard must be callable")
|
|
379
|
+
|
|
380
|
+
def guard_operation() -> None:
|
|
381
|
+
if operation_guard is None:
|
|
382
|
+
return
|
|
383
|
+
try:
|
|
384
|
+
operation_guard()
|
|
385
|
+
except Exception:
|
|
386
|
+
raise NativeReferenceStoreFailed(
|
|
387
|
+
"native_reference.operation_guard_failed", retryable=True,
|
|
388
|
+
) from None
|
|
389
|
+
|
|
390
|
+
# A cache hit still invokes the configured receipt verifier. Guard it just
|
|
391
|
+
# like an external vault lookup rather than assuming verification is local.
|
|
392
|
+
guard_operation()
|
|
393
|
+
cached = store.load(
|
|
394
|
+
job_payload,
|
|
395
|
+
policy,
|
|
396
|
+
route_id,
|
|
397
|
+
native_reference_verifier=native_reference_verifier,
|
|
398
|
+
evidence_authority=evidence_authority,
|
|
399
|
+
)
|
|
400
|
+
if cached is not None:
|
|
401
|
+
return cached
|
|
402
|
+
guard_operation()
|
|
403
|
+
try:
|
|
404
|
+
artifact = load_artifact()
|
|
405
|
+
except NativeReferenceStoreFailed:
|
|
406
|
+
raise
|
|
407
|
+
except Exception:
|
|
408
|
+
raise NativeReferenceStoreFailed(
|
|
409
|
+
"native_reference.loader_failed", retryable=True,
|
|
410
|
+
) from None
|
|
411
|
+
guard_operation()
|
|
412
|
+
return store.save(
|
|
413
|
+
job_payload,
|
|
414
|
+
policy,
|
|
415
|
+
route_id,
|
|
416
|
+
artifact,
|
|
417
|
+
native_reference_verifier=native_reference_verifier,
|
|
418
|
+
evidence_authority=evidence_authority,
|
|
419
|
+
now=now,
|
|
420
|
+
)
|
package/standard-skills/translate-native/integrations/website_localization_quality_profiles.py
ADDED
|
@@ -0,0 +1,235 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""Versioned, provider-neutral quality profiles for every EU target locale."""
|
|
3
|
+
|
|
4
|
+
from __future__ import annotations
|
|
5
|
+
|
|
6
|
+
import hashlib
|
|
7
|
+
import json
|
|
8
|
+
from dataclasses import asdict, dataclass
|
|
9
|
+
from typing import Any
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
SCHEMA = "blun.website-localization-quality-profile.v1"
|
|
13
|
+
CLDR_VERSION = "48"
|
|
14
|
+
CLDR_SUMMARY = "https://www.unicode.org/cldr/charts/48/summary/{language}.html"
|
|
15
|
+
MALTESE_ORTHOGRAPHY_SOURCE = (
|
|
16
|
+
"https://kunsilltalmalti.gov.mt/mistoqssija-u-twegiba-51-76/"
|
|
17
|
+
)
|
|
18
|
+
REQUIRED_RED_TEAM_CHECKS = (
|
|
19
|
+
"translationese",
|
|
20
|
+
"wrong_neighbor_language",
|
|
21
|
+
"mixed_language_varieties",
|
|
22
|
+
"ascii_folding",
|
|
23
|
+
"missing_diacritics_or_native_script",
|
|
24
|
+
"wrong_inflection",
|
|
25
|
+
"meaning_omission",
|
|
26
|
+
"unnatural_cta",
|
|
27
|
+
"marketing_calque",
|
|
28
|
+
)
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
@dataclass(frozen=True)
|
|
32
|
+
class LocaleQualityProfile:
|
|
33
|
+
locale: str
|
|
34
|
+
version: str
|
|
35
|
+
native_review_focus: tuple[str, ...]
|
|
36
|
+
fidelity_review_focus: tuple[str, ...]
|
|
37
|
+
adversarial_focus: tuple[str, ...]
|
|
38
|
+
required_red_team_checks: tuple[str, ...]
|
|
39
|
+
source_refs: tuple[str, ...]
|
|
40
|
+
|
|
41
|
+
def as_payload(self) -> dict[str, Any]:
|
|
42
|
+
body = json.loads(_canonical_json({"schema": SCHEMA, **asdict(self)}))
|
|
43
|
+
body["sha256"] = hashlib.sha256(_canonical_json(body)).hexdigest()
|
|
44
|
+
return body
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
def _canonical_json(value: Any) -> bytes:
|
|
48
|
+
return json.dumps(
|
|
49
|
+
value,
|
|
50
|
+
ensure_ascii=False,
|
|
51
|
+
allow_nan=False,
|
|
52
|
+
sort_keys=True,
|
|
53
|
+
separators=(",", ":"),
|
|
54
|
+
).encode("utf-8")
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
def _profile(
|
|
58
|
+
locale: str,
|
|
59
|
+
native: tuple[str, ...],
|
|
60
|
+
fidelity: tuple[str, ...],
|
|
61
|
+
adversarial: tuple[str, ...],
|
|
62
|
+
*,
|
|
63
|
+
sources: tuple[str, ...] = (),
|
|
64
|
+
) -> LocaleQualityProfile:
|
|
65
|
+
language = locale.split("-", 1)[0]
|
|
66
|
+
return LocaleQualityProfile(
|
|
67
|
+
locale=locale,
|
|
68
|
+
version=f"eu-{locale}-2026-09-1",
|
|
69
|
+
native_review_focus=native,
|
|
70
|
+
fidelity_review_focus=fidelity,
|
|
71
|
+
adversarial_focus=adversarial,
|
|
72
|
+
required_red_team_checks=REQUIRED_RED_TEAM_CHECKS,
|
|
73
|
+
source_refs=(CLDR_SUMMARY.format(language=language), *sources),
|
|
74
|
+
)
|
|
75
|
+
|
|
76
|
+
|
|
77
|
+
PROFILES: tuple[LocaleQualityProfile, ...] = (
|
|
78
|
+
_profile(
|
|
79
|
+
"bg-BG",
|
|
80
|
+
("Use idiomatic Bulgarian Cyrillic, natural clitic placement, verbal aspect, and postposed definite articles.",),
|
|
81
|
+
("Check aspect, tense, evidential meaning, negation, modality, number, gender, and agreement against the source.",),
|
|
82
|
+
("Reject transliteration, Russian or Macedonian leakage, missing article suffixes, stiff CTAs, marketing calques, omissions, and ASCII folding.",),
|
|
83
|
+
),
|
|
84
|
+
_profile(
|
|
85
|
+
"hr-HR",
|
|
86
|
+
("Use contemporary Croatian vocabulary, natural clitic order, case government, aspect, and idiomatic information structure.",),
|
|
87
|
+
("Check case roles, aspect, tense, modality, negation, quantities, terminology, and every source proposition.",),
|
|
88
|
+
("Reject Serbian or Bosnian variety mixing, ekavian leakage, lost diacritics, bad inflection, literal CTAs, marketing calques, and omissions.",),
|
|
89
|
+
),
|
|
90
|
+
_profile(
|
|
91
|
+
"cs-CZ",
|
|
92
|
+
("Use idiomatic Czech word order, aspect, case government, agreement, and native characters including č, ř, š, ě, ů, and ž.",),
|
|
93
|
+
("Check aspect, case roles, negation, modality, quantities, terminology, and complete propositional coverage.",),
|
|
94
|
+
("Reject Slovak leakage, ASCII-folded diacritics, false friends, malformed inflection, source-shaped CTAs, marketing calques, and omissions.",),
|
|
95
|
+
),
|
|
96
|
+
_profile(
|
|
97
|
+
"da-DK",
|
|
98
|
+
("Use contemporary Danish syntax, definiteness, compound formation, modal tone, and concise native web rhythm.",),
|
|
99
|
+
("Check definiteness, negation, modality, quantities, terminology, and the full source meaning.",),
|
|
100
|
+
("Reject Swedish or Norwegian leakage, mixed varieties, lost æ/ø/å, unnatural compounds, literal CTAs, marketing calques, and omissions.",),
|
|
101
|
+
),
|
|
102
|
+
_profile(
|
|
103
|
+
"nl-NL",
|
|
104
|
+
("Use Netherlands Dutch word order, separable verbs, natural compounds, register, and idiomatic web copy.",),
|
|
105
|
+
("Check verb particles, negation, modality, quantities, terminology, conditions, and complete source coverage.",),
|
|
106
|
+
("Reject Belgian-Dutch mixing, German or English calques, bad compounds, stiff CTAs, missing meaning, and inappropriate ASCII substitution.",),
|
|
107
|
+
),
|
|
108
|
+
_profile(
|
|
109
|
+
"en-IE",
|
|
110
|
+
("Use natural contemporary Irish English spelling, idiom, register, punctuation, and concise web-copy rhythm.",),
|
|
111
|
+
("Check negation, modality, quantities, terminology, conditions, and every source proposition without semantic inflation.",),
|
|
112
|
+
("Reject mixed US and Irish conventions, source-language syntax, translationese, unnatural CTAs, marketing calques, and omissions.",),
|
|
113
|
+
),
|
|
114
|
+
_profile(
|
|
115
|
+
"et-EE",
|
|
116
|
+
("Use idiomatic Estonian information structure, case government, quantity degrees, consonant gradation, compounds, and object case.",),
|
|
117
|
+
("Check case roles, total versus partial objects, negation, modality, quantities, terminology, and complete meaning.",),
|
|
118
|
+
("Reject Finnish or Russian leakage, ASCII-folded õ/ä/ö/ü, wrong quantity or inflection, literal CTAs, marketing calques, and omissions.",),
|
|
119
|
+
),
|
|
120
|
+
_profile(
|
|
121
|
+
"fi-FI",
|
|
122
|
+
("Use natural Finnish information structure, case government, agglutination, possessive suffixes, vowel harmony, consonant gradation, clitics, idiomatic compounds, and appropriate politeness.",),
|
|
123
|
+
("Check case roles, scope, negation, modality, quantities, terminology, conditions, and every proposition across the complete source.",),
|
|
124
|
+
("Reject Swedish, Estonian, English, or German leakage and calques; ASCII-folded ä/ö; broken inflection; unnatural CTAs; marketing calques; and omissions.",),
|
|
125
|
+
),
|
|
126
|
+
_profile(
|
|
127
|
+
"fr-FR",
|
|
128
|
+
("Use France French idiom, natural syntax, contractions, agreement, typography, register, and persuasive but credible web rhythm.",),
|
|
129
|
+
("Check gender and number agreement, negation, modality, quantities, terminology, conditions, and complete meaning.",),
|
|
130
|
+
("Reject Canadian or Belgian variety mixing, anglicisms, lost accents, literal CTAs, marketing calques, bad inflection, and omissions.",),
|
|
131
|
+
),
|
|
132
|
+
_profile(
|
|
133
|
+
"de-AT",
|
|
134
|
+
("Use Austrian Standard German vocabulary and conventions, idiomatic clause structure, compounds, case government, register, and natural web rhythm.",),
|
|
135
|
+
("Check case roles, negation, modality, quantities, terminology, conditions, and every source proposition.",),
|
|
136
|
+
("Reject Germany-only defaults where Austrian usage matters, Swiss mixing, ASCII-folded ä/ö/ü/ß, translationese, stiff CTAs, marketing calques, and omissions.",),
|
|
137
|
+
),
|
|
138
|
+
_profile(
|
|
139
|
+
"el-GR",
|
|
140
|
+
("Use monotonic Greek with native Greek script, correct accents, aspect, clitic placement, case, gender, agreement, and natural information structure.",),
|
|
141
|
+
("Check aspect, case roles, negation, modality, quantities, terminology, conditions, and complete source coverage.",),
|
|
142
|
+
("Reject Greeklish, Ancient or Cypriot variety mixing, missing tonos, bad inflection, literal CTAs, marketing calques, and omissions.",),
|
|
143
|
+
),
|
|
144
|
+
_profile(
|
|
145
|
+
"hu-HU",
|
|
146
|
+
("Use idiomatic Hungarian focus order, vowel harmony, case suffixes, definite or indefinite conjugation, compounds, and natural politeness.",),
|
|
147
|
+
("Check focus and scope, conjugation, negation, modality, quantities, terminology, conditions, and complete meaning.",),
|
|
148
|
+
("Reject neighboring-language leakage, ASCII-folded ő/ű, suffix disharmony, bad inflection, source-shaped CTAs, marketing calques, and omissions.",),
|
|
149
|
+
),
|
|
150
|
+
_profile(
|
|
151
|
+
"ga-IE",
|
|
152
|
+
("Use contemporary standard Irish with natural VSO structure, initial mutations, broad or slender consonant spelling, case forms, copula versus bí, and appropriate register.",),
|
|
153
|
+
("Check mutations, possession, genitive relations, negation, modality, quantities, terminology, and every source proposition.",),
|
|
154
|
+
("Reject English word order and calques, Scottish Gaelic leakage, missing fadas, wrong mutations, unnatural CTAs, marketing calques, and omissions.",),
|
|
155
|
+
),
|
|
156
|
+
_profile(
|
|
157
|
+
"it-IT",
|
|
158
|
+
("Use contemporary Italian idiom, natural clitic placement, article and preposition contraction, agreement, register, and web-copy rhythm.",),
|
|
159
|
+
("Check clitic reference, negation, modality, quantities, terminology, conditions, and complete source meaning.",),
|
|
160
|
+
("Reject regional or Swiss-Italian mixing, anglicised syntax, lost accents, bad agreement, literal CTAs, marketing calques, and omissions.",),
|
|
161
|
+
),
|
|
162
|
+
_profile(
|
|
163
|
+
"lv-LV",
|
|
164
|
+
("Use idiomatic Latvian case government, declension, agreement, verb prefixes, information structure, and native diacritics.",),
|
|
165
|
+
("Check case roles, aspectual prefixes, negation, modality, quantities, terminology, conditions, and complete meaning.",),
|
|
166
|
+
("Reject Lithuanian or Russian leakage, ASCII-folded ā/č/ē/ģ/ī/ķ/ļ/ņ/š/ū/ž, bad inflection, literal CTAs, marketing calques, and omissions.",),
|
|
167
|
+
),
|
|
168
|
+
_profile(
|
|
169
|
+
"lt-LT",
|
|
170
|
+
("Use idiomatic Lithuanian case government, declension, agreement, participles, aspect, information structure, and native diacritics.",),
|
|
171
|
+
("Check case roles, aspect, negation, modality, quantities, terminology, conditions, and complete source coverage.",),
|
|
172
|
+
("Reject Latvian, Polish, or Russian leakage, ASCII-folded ą/č/ę/ė/į/š/ų/ū/ž, bad inflection, literal CTAs, marketing calques, and omissions.",),
|
|
173
|
+
),
|
|
174
|
+
_profile(
|
|
175
|
+
"mt-MT",
|
|
176
|
+
("Use contemporary Maltese orthography with ċ, ġ, għ, ħ, and ż; natural Semitic and Romance morphology; fused articles and prepositions; idiomatic syntax; register; and rhythm.",),
|
|
177
|
+
("Check articles, prepositions, agreement, verb morphology, negation, modality, quantities, terminology, conditions, and every source proposition.",),
|
|
178
|
+
("Reject English or Italian calques and word order, neighboring-language leakage, ASCII-folded Maltese letters, false plurals or inflection, unnatural CTAs, marketing calques, and omissions.",),
|
|
179
|
+
sources=(MALTESE_ORTHOGRAPHY_SOURCE,),
|
|
180
|
+
),
|
|
181
|
+
_profile(
|
|
182
|
+
"pl-PL",
|
|
183
|
+
("Use idiomatic Polish aspect, case government, gender and virility agreement, natural word order, register, and native diacritics.",),
|
|
184
|
+
("Check aspect, case roles, negation, modality, quantities, terminology, conditions, and complete meaning.",),
|
|
185
|
+
("Reject Czech, Slovak, or Russian leakage, ASCII-folded ą/ć/ę/ł/ń/ó/ś/ź/ż, bad inflection, literal CTAs, marketing calques, and omissions.",),
|
|
186
|
+
),
|
|
187
|
+
_profile(
|
|
188
|
+
"pt-PT",
|
|
189
|
+
("Use European Portuguese vocabulary, clitic placement, infinitive choices, agreement, register, punctuation, and natural web rhythm.",),
|
|
190
|
+
("Check clitic reference, negation, modality, quantities, terminology, conditions, and every source proposition.",),
|
|
191
|
+
("Reject Brazilian-Portuguese mixing, Spanish or English calques, lost diacritics, bad inflection, unnatural CTAs, marketing calques, and omissions.",),
|
|
192
|
+
),
|
|
193
|
+
_profile(
|
|
194
|
+
"ro-RO",
|
|
195
|
+
("Use contemporary Romanian idiom, enclitic definite articles, case marking, agreement, clitic placement, register, and native diacritics.",),
|
|
196
|
+
("Check article and clitic reference, negation, modality, quantities, terminology, conditions, and complete meaning.",),
|
|
197
|
+
("Reject Moldovan or Italian mixing, ASCII-folded ă/â/î/ș/ț, cedilla substitutions, bad inflection, literal CTAs, marketing calques, and omissions.",),
|
|
198
|
+
),
|
|
199
|
+
_profile(
|
|
200
|
+
"sk-SK",
|
|
201
|
+
("Use idiomatic Slovak aspect, case government, agreement, rhythmic law where relevant, natural word order, and native diacritics.",),
|
|
202
|
+
("Check aspect, case roles, negation, modality, quantities, terminology, conditions, and complete source coverage.",),
|
|
203
|
+
("Reject Czech leakage, ASCII-folded ľ/ĺ/ŕ/ť/ď/ň/ô/ä, bad inflection, source-shaped CTAs, marketing calques, and omissions.",),
|
|
204
|
+
),
|
|
205
|
+
_profile(
|
|
206
|
+
"sl-SI",
|
|
207
|
+
("Use idiomatic Slovenian dual forms, case government, agreement, aspect, clitic order, natural information structure, and native diacritics.",),
|
|
208
|
+
("Check dual and plural number, case roles, negation, modality, quantities, terminology, conditions, and complete meaning.",),
|
|
209
|
+
("Reject Croatian or Serbian leakage, ASCII-folded č/š/ž, lost dual forms, bad inflection, literal CTAs, marketing calques, and omissions.",),
|
|
210
|
+
),
|
|
211
|
+
_profile(
|
|
212
|
+
"es-ES",
|
|
213
|
+
("Use Spain Spanish idiom, natural clitic use, mood and aspect, agreement, register, punctuation, and credible web-copy rhythm.",),
|
|
214
|
+
("Check mood, aspect, pronoun reference, negation, modality, quantities, terminology, conditions, and complete meaning.",),
|
|
215
|
+
("Reject Latin-American variety mixing, anglicisms, lost accents or ñ, bad inflection, literal CTAs, marketing calques, and omissions.",),
|
|
216
|
+
),
|
|
217
|
+
_profile(
|
|
218
|
+
"sv-SE",
|
|
219
|
+
("Use Sweden Swedish word order, definiteness, compound formation, modal tone, punctuation, register, and concise native web rhythm.",),
|
|
220
|
+
("Check definiteness, negation, modality, quantities, terminology, conditions, and every source proposition.",),
|
|
221
|
+
("Reject Finnish-Swedish, Danish, or Norwegian mixing, ASCII-folded å/ä/ö, split compounds, literal CTAs, marketing calques, and omissions.",),
|
|
222
|
+
),
|
|
223
|
+
)
|
|
224
|
+
|
|
225
|
+
_BY_LOCALE = {profile.locale: profile for profile in PROFILES}
|
|
226
|
+
if len(_BY_LOCALE) != len(PROFILES):
|
|
227
|
+
raise RuntimeError("duplicate website-localization quality profile")
|
|
228
|
+
|
|
229
|
+
|
|
230
|
+
def quality_profile_for(locale: str) -> dict[str, Any]:
|
|
231
|
+
try:
|
|
232
|
+
profile = _BY_LOCALE[locale]
|
|
233
|
+
except (KeyError, TypeError):
|
|
234
|
+
raise ValueError("unsupported quality-profile locale") from None
|
|
235
|
+
return profile.as_payload()
|