Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .claude-plugin/marketplace.json
Original file line number Diff line number Diff line change
Expand Up @@ -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.0",
"version": "0.12.1",
"license": "MIT",
"keywords": [
"claude-code",
Expand Down
2 changes: 1 addition & 1 deletion .claude-plugin/plugin.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "superloopy",
"version": "0.12.0",
"version": "0.12.1",
"description": "Lightweight loop harness with strict evidence gates — Claude Code edition.",
"homepage": "https://github.com/beefiker/superloopy#readme",
"repository": "https://github.com/beefiker/superloopy",
Expand Down
2 changes: 1 addition & 1 deletion .codex-plugin/plugin.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "superloopy",
"version": "0.12.0",
"version": "0.12.1",
"description": "Lightweight loop harness with strict evidence gates.",
"homepage": "https://github.com/beefiker/superloopy#readme",
"repository": "https://github.com/beefiker/superloopy",
Expand Down
4 changes: 2 additions & 2 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "superloopy",
"version": "0.12.0",
"version": "0.12.1",
"description": "A lightweight loop harness for Codex and Claude Code with strict evidence gates.",
"type": "module",
"bin": {
Expand Down
1 change: 1 addition & 0 deletions skills/superloopy-frontend/references/qt.md
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,7 @@ For Qt-owned non-Web pixels, this checklist replaces the Web anti-slop, browser-
- [ ] Newer APIs have guards, a fallback, and a testable boundary.
- [ ] The existing design source remains authoritative; any `DESIGN.md` is either that established source or a synchronized scoped mapping, and app semantics do not freeze the system palette, platform font, native metrics, or accessibility preferences.
- [ ] Every supported input path (pointer, keyboard, touch, pen, switch, or assistive action as applicable) reaches the same truthful semantic outcome.
- [ ] User-visible strings pass through `tr()`/`qsTr()` with a translation setup when the target implies more than one locale; a mismatched shipped language records its locale decision.
- [ ] CJK, RTL, emoji/font fallback, long translations, and enlarged text remain usable.
- [ ] High-DPI geometry and assets are correct across each target-supported DPR and display transition; unsupported transitions are recorded as not applicable.
- [ ] Motion preferences and target-native system chrome are preserved or an explicit replacement is fully verified.
Expand Down
2 changes: 1 addition & 1 deletion skills/superloopy-frontend/references/ux.md
Original file line number Diff line number Diff line change
Expand Up @@ -139,7 +139,7 @@ Use consequence-scaled error handling. Preserve input, identify the specific cor

## Internationalization and bidirectionality

Internationalization begins during discovery. 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 (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.

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.

Expand Down
10 changes: 10 additions & 0 deletions test/frontend-ux-contract.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -535,3 +535,13 @@ test("new UX references and contract tests are inventoried as original Superloop
assert.match(fileAudit, /references\/ux\.md.*Superloopy-native.*original prose/is);
assert.match(golden, /test\/frontend-ux-contract\.test\.js.*node --test/is);
});

test("i18n contract requires string externalization for distribution-targeted surfaces", async () => {
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, /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);
});
Loading