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
|
@@ -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
|
-
|
|
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
|
-
|
|
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.",
|