From 8564da16c3629bb7c584e4cc51ef9eefd2fd8679 Mon Sep 17 00:00:00 2001 From: J Date: Tue, 21 Jul 2026 19:38:49 +0900 Subject: [PATCH] fix(frontend): scope the externalization obligation proportionally Bound the defect claim to strings the work introduces or changes, name public/open-source/store delivery as a discovery signal rather than proof of multi-locale intent, keep deliberately single-locale surfaces and narrow fixes out of scope, and drop Qt idiom from the neutral layer; pin the scoping in the contract test. --- .claude-plugin/marketplace.json | 2 +- .claude-plugin/plugin.json | 2 +- .codex-plugin/plugin.json | 2 +- package-lock.json | 4 ++-- package.json | 2 +- skills/superloopy-frontend/references/ux.md | 2 +- test/frontend-ux-contract.test.js | 5 +++-- 7 files changed, 10 insertions(+), 9 deletions(-) diff --git a/.claude-plugin/marketplace.json b/.claude-plugin/marketplace.json index dce73d7..2c56485 100644 --- a/.claude-plugin/marketplace.json +++ b/.claude-plugin/marketplace.json @@ -9,7 +9,7 @@ "name": "superloopy", "source": "./", "description": "Strict evidence loop harness: repo-local loop state, success criteria, append-only ledgers, evidence-gated completion, plus skills (loop, research, frontend, clone) and a read-only/worker crew. Works on Claude Code and Codex from one repo.", - "version": "0.12.1", + "version": "0.12.2", "license": "MIT", "keywords": [ "claude-code", diff --git a/.claude-plugin/plugin.json b/.claude-plugin/plugin.json index f6ede93..844734c 100644 --- a/.claude-plugin/plugin.json +++ b/.claude-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "superloopy", - "version": "0.12.1", + "version": "0.12.2", "description": "Lightweight loop harness with strict evidence gates — Claude Code edition.", "homepage": "https://github.com/beefiker/superloopy#readme", "repository": "https://github.com/beefiker/superloopy", diff --git a/.codex-plugin/plugin.json b/.codex-plugin/plugin.json index 0a52dae..167ec02 100644 --- a/.codex-plugin/plugin.json +++ b/.codex-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "superloopy", - "version": "0.12.1", + "version": "0.12.2", "description": "Lightweight loop harness with strict evidence gates.", "homepage": "https://github.com/beefiker/superloopy#readme", "repository": "https://github.com/beefiker/superloopy", diff --git a/package-lock.json b/package-lock.json index e2190ae..ef96563 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "superloopy", - "version": "0.12.1", + "version": "0.12.2", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "superloopy", - "version": "0.12.1", + "version": "0.12.2", "license": "MIT", "bin": { "superloopy": "src/cli.js" diff --git a/package.json b/package.json index ff1f58e..5825bfa 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "superloopy", - "version": "0.12.1", + "version": "0.12.2", "description": "A lightweight loop harness for Codex and Claude Code with strict evidence gates.", "type": "module", "bin": { diff --git a/skills/superloopy-frontend/references/ux.md b/skills/superloopy-frontend/references/ux.md index b533980..219fbed 100644 --- a/skills/superloopy-frontend/references/ux.md +++ b/skills/superloopy-frontend/references/ux.md @@ -139,7 +139,7 @@ Use consequence-scaled error handling. Preserve input, identify the specific cor ## Internationalization and bidirectionality -Internationalization begins during discovery. When the brief, audience, or distribution intent implies more than one locale (public release, open-source distribution, app-store or marketplace delivery), every user-visible string ships through the platform's translation mechanism (`tr()`/`qsTr()`, resource bundles, message catalogs) from the first artifact; hardcoded single-locale copy in a distribution-targeted surface is a defect, not a follow-up. When copy ships in a language different from the brief's language, record the locale decision and its reason instead of defaulting silently. Avoid display-string concatenation; use locale-aware formatting, sorting, searching, pluralization, and input. Carry language and direction metadata, and define whether a product language override follows the system, persists locally, syncs, or is unavailable. +Internationalization begins during discovery. When the brief, audience, or distribution intent implies more than one locale, every user-visible string the work introduces or changes ships through the platform's translation mechanism (resource bundles, message catalogs) from the first artifact; hardcoded single-locale copy in new distribution-targeted work is a defect, not a follow-up. Public release, open-source distribution, or store delivery is a signal to resolve locale intent during discovery, not proof of it: a deliberately single-locale surface stays single-locale, and a narrow change on one does not by itself demand retrofitting externalization. When copy ships in a language different from the brief's language, record the locale decision and its reason instead of defaulting silently. Avoid display-string concatenation; use locale-aware formatting, sorting, searching, pluralization, and input. Carry language and direction metadata, and define whether a product language override follows the system, persists locally, syncs, or is unavailable. Test representative long text, unbroken content, bidirectional content, and taller-script content without assuming one universal expansion percentage. Mirroring is selective: media controls, charts, maps, and user-authored direction may not mirror with surrounding navigation. diff --git a/test/frontend-ux-contract.test.js b/test/frontend-ux-contract.test.js index dd4594d..99a0db4 100644 --- a/test/frontend-ux-contract.test.js +++ b/test/frontend-ux-contract.test.js @@ -540,8 +540,9 @@ test("i18n contract requires string externalization for distribution-targeted su const ux = await read(reference("ux")); const qt = await read(reference("qt")); - assert.match(ux, /more than one locale.*every user-visible string ships through the platform's translation mechanism/is); - assert.match(ux, /hardcoded single-locale copy in a distribution-targeted surface is a defect, not a follow-up/iu); + assert.match(ux, /more than one locale.*every user-visible string the work introduces or changes ships through the platform's translation mechanism/is); + assert.match(ux, /hardcoded single-locale copy in new distribution-targeted work is a defect, not a follow-up/iu); + assert.match(ux, /signal to resolve locale intent during discovery, not proof of it.*deliberately single-locale surface stays single-locale/is); assert.match(ux, /language different from the brief's language.*record the locale decision/is); assert.match(qt, /strings pass through `tr\(\)`\/`qsTr\(\)` with a translation setup/iu); });