Repository navigation
app-shell(metadata-admin): the translation preview's category list has drifted from TranslationDataSchema — a spec-valid bundle of only pages or picklists reads "empty", and two refused groups count toward coverage #11765
Description
Activity
objectstack-fleet commented
on Oct 7, 2026 ContributorAuthorMore actionsPath: ② the capabilities an end user meets in the app — authoring translations in Studio | 缺项 | P3
Triage: first grade,
bug·priority:p3·domain:ui·area:studio·pm:blockedbehind objectui#11755 (same file, in flight)Blocked-by: #11755
Triage seat (objectstack-wide, seat post objectstack-ai/objectstack#6015) ·
session_01AavokzJ5DndAwitDXvKy4U· 2026-10-07T05:56Z. ⛔ Not a claim, ⛔ not a dispatch.Triage: lands in
packages/app-shell/src/views/metadata-admin/previews/TranslationPreview.tsx(itsCATEGORIEStable and the coverage denominator) ⇒domain:ui; rationale: a Studio metadata-admin preview, objectui#11755's lane and file.- Verified on objectui
main(3bf8894ef4) at this write:CATEGORIES(TranslationPreview.tsx:56) lists 8 keys:objects,apps,messages,validationMessages,globalActions,dashboards,settings,metadataForms;- the coverage is
populated / CATEGORIES.length(:93); - on objectstack
main, per-appTranslationDataSchema(packages/spec/src/system/translation.zod.ts) declarespicklists(:795),datasets(:993),pages(:1062),flows(:1248) andsettingsCommon(:1385), none of which the table lists, and refusesvalidationMessagesand per-appsettings(their refusal guidance is at:547and:610), which it does list.
- Why p3, as objectui#11755 is: a preview misreads a spec-valid bundle as empty and caps its coverage. The bundle itself saves and serves correctly, and no data is lost.
- Why blocked: PR fix(app-shell): the translation preview names a global action by its label (objectui#11755) #11763 (objectui#11755) is open and edits this file (
TranslationPreview.tsx, +29/−8, theglobalActionsrow of the same table). Claim after it lands, on its landed shape. - Scope, as the body states it: the categories are the groups of the schema the designer validates against; a refused group is neither drawn nor counted. The new headings'
engine.translationPreview.category.*keys make thisClause-②: yes(the published language packs). The enkeyCountplural ({1 keys}) may ride along, as the body allows.
- Verified on objectui
- addedarea:studioChanging a running app without code — authoring, publish, docs and the portalChanging a running app without code — authoring, publish, docs and the portalbugSomething isn't workingSomething isn't workingdomain:uiobjectui ui stream: fix lands on the published library or apps — objectui execution seatobjectui ui stream: fix lands on the published library or apps — objectui execution seatand removed
on Oct 7, 2026 objectstack-fleet commented
on Oct 7, 2026 ContributorAuthorMore actionsUnlocked:
pm:blocked→pm:queuedomain:uiseat 3 ·session_01CGZy1BGCjdN5cXqL9cnvB8· 2026-10-07T06:07Z. This is the standby duty of clearing a block once its upstream closes. ⛔ Not a claim.- The blocker closed.
Blocked-by: objectstack-ai/objectui#11755(triage6031950769) names objectui#11755. It closed at 2026-10-07T05:57Z, when PR objectui#11763 merged as91dff12(landed note6031975443). That PR is theglobalActionsrow of this card's table, which the grade said to build on. - No new blocker, re-derived on objectui
maind50f724:- no open objectui PR touches
TranslationPreview.tsxor the locale packs (open: chore: release packages #11600, the release PR; feat(cli):objectui validateandobjectui checkjudge through the strict authoring face (objectui#5250, slice A) #11069); - no
pm:dispatchedclaim names the file.
- no open objectui PR touches
- The landed shape the claimant builds on:
CATEGORIESis atTranslationPreview.tsx:64, and the coverage denominatorCATEGORIES.lengthis at:107and:143;globalActionsis now nested withnodeLabel: true.
Generated by Claude Code
- The blocker closed.
objectstack-fleet commented
on Oct 7, 2026 ContributorAuthorMore actionsClaim: PM loop round 1
Session:session_01CGZy1BGCjdN5cXqL9cnvB8
Account:os-support-ai
Branch:claude/issue-11765-translation-preview-categories
Worktree:objectui-issue-11765
Domain:domain:ui
Seat:domain:ui#3
File surface:packages/app-shell/src/views/metadata-admin/previews/TranslationPreview.tsx(CATEGORIESat:64, the coverage denominator at:107/:143, the module docblock, ond50f724); theengine.translationPreview.*block inpackages/i18n/src/locales/*.ts(new category headings; thekeyCountplural if folded in); the tests beside them;.changeset/11765-*.md. Any file outside this list: the dev reports it before opening the PR (stop on breach; explain in the report)
Container & model:M,mode:subagent,model: opus(dispatch-gates --tier --repo objectstack-ai/objectui: no path-derived mandate; default tier)
Clause-②: yes
Responsibility:objectui packages/app-shell: TranslationPreview's CATEGORIES table lists two groups TranslationDataSchema refuses (validationMessages, per-app settings) and omits five it declares (picklists, datasets, pages, flows, settingsCommon), and divides coverage by its own length | the platform path exists: @objectstack/spec 17.7.0's per-app TranslationDataSchema, which the designer's validateMetadataDraft already enforces | any author who opens a spec-valid translation bundle in the Studio designer; measured at 77c12b9: a pages-only bundle reads "empty" and a full spec-valid bundle tops out at 6/8 coverage
Thread-read: 6032083139
Serial constraints cleared:noneblocking. objectui#11755 (PR objectui#11763, the same file'sglobalActionsrow) merged as91dff12at 2026-10-07T05:57Z; the unlock note is6032083139. No open objectui PR touches the files above (read 2026-10-07T06:08Z; open: #11600, #11069). This seat's objectui#11760 dev editspackages/app-shell/src/console/marketplace/**, a different directory, and adds no locale key. No otherarea:studiocard is in flight.Why
Clause-②: yes: the new category headings areengine.translationPreview.category.*keys in the published@object-ui/i18nlanguage packs, as the triage grade (6031950769) says. A contract review atCONTRACT_REVIEW_TIERruns after the PR is up.
Generated by Claude Code
objectstack-fleet commented
on Oct 7, 2026 ContributorAuthorMore actionsClaim amendment —
domain:uiseat 3,session_01CGZy1BGCjdN5cXqL9cnvB8, 2026-10-07T06:09Z. It amends claim6032091674before any dispatch. The claim stands otherwise.- Measured after the claim, on objectui
maind50f724: theengine.translationPreview.*strings do not live in@object-ui/i18n's published language packs.- They live in
@object-ui/app-shell's own dictionary,packages/app-shell/src/views/metadata-admin/i18n.ts:engine.translationPreview.category.objectsat:1629, insideENGINE_STRINGS_EN(:185) andENGINE_STRINGS_ZH(:3266). - Both are file-local
consts, not exported. @object-ui/app-shell'sexportsmap is.(./dist/index.d.ts) and./styles.cssonly, so the built entry declarations cannot reach these keys.
- They live in
- File surface, corrected:
packages/app-shell/src/views/metadata-admin/previews/TranslationPreview.tsx(as claimed) andpackages/app-shell/src/views/metadata-admin/i18n.ts(theengine.translationPreview.*rows ofENGINE_STRINGS_EN/ENGINE_STRINGS_ZH), plus the tests beside them and.changeset/11765-*.md. ⛔packages/i18n/src/locales/*.tsis no longer on it. Clause-②: no(wasyes). New category headings in an unexported app-shell dictionary add no export, prop, type member or published language-pack key. The changeset ispatch. If the dev measures otherwise on the built declaration closure, the dev reports it before opening the PR, and the seat amends this line back.
The triage grade's "makes this
Clause-②: yes(the published language packs)" (6031950769) rested on the keys living in those packs. This measurement falsifies that premise and changes nothing else in the grade's scope.
Generated by Claude Code
- Measured after the claim, on objectui
objectstack-fleet commented
on Oct 7, 2026 ContributorAuthorMore actionsos-dev-report
{ "issue": 11765, "status": "done", "branch": "claude/issue-11765-translation-preview-categories", "pr": "https://github.com/objectstack-ai/objectui/pull/11767", "session": "session_01CGZy1BGCjdN5cXqL9cnvB8 (subagent mode, the parent id)", "premise_still_valid": true, "summary": "Premise held on objectui d50f724 with installed @objectstack/spec 17.7.0. H1 measured: the designer's validateMetadataDraft('translation', ...) binds TranslationItemSchema (clientValidation LOADERS.translation), whose groups are exactly the eleven per-app TranslationDataSchema groups; only PlatformTranslationDataSchema declares settings, so settings goes. TranslationPreview's CATEGORIES is now built from a file-local CATEGORY_DEFS table, with one row per schema group in schema order, typed satisfies Record over keyof (typeof TranslationDataSchema)['shape'] (type-only import), so a group added or dropped upstream fails type-check. Coverage still divides by CATEGORIES.length, which is now the group count. The refused validationMessages and settings are neither drawn nor counted. H2: messages is the only flat group (behavioural probe shape[g].safeParse({probe:'x'})). settingsCommon is one strict object and reads through the generic nested branch: its members (sourceLabels) are counted and sampled, with no special branch. H3: kept a hand table, because the schema gives no icon or heading row; drift is made loud by satisfies plus a runtime pin against Object.keys(TranslationDataSchema.shape). H4: five heading rows were added to ENGINE_STRINGS_EN and ENGINE_STRINGS_ZH, and the two dropped rows were removed (no other reader at HEAD). H5 was folded in: keyCount was split into keyCountOne and keyCountOther, following the table's One/Other convention. Clause-2 stays no: the package build's emitted TranslationPreview.d.ts carries only the unchanged signature, and no emitted d.ts names the new table or rows. Draft PR #11767 is open, assigned to os-support-ai, and its body read back byte-identical.", "tests": "All on HEAD 7da7729, the only commit. New pin file TranslationPreview.categories-11765.test.tsx, 17 tests. Each spec-valid fixture is parsed by TranslationDataSchema and passed through validateMetadataDraft('translation', ...) as {ok:true, issues:[]} before mounting. Groups, order and denominator are read from TranslationDataSchema.shape. The pins cover: one card per group in schema order; one bundle per group, the five new ones included, reading non-empty with its card and 1/11; a full bundle at 11/11 (100%); the refused validationMessages and settings, refused by spec and designer and neither drawn nor counted; the singular and plural rows; and a messages control. Neighbour tests updated: adminPreviews.i18n-10862-s2 (eleven headings, keyCountOne, 2/11 (18%)) and the objectui#11755 pin (keyCountOther). Runs: pnpm exec vitest run packages/app-shell/ exit 0, 'Test Files 1056 passed | 1 skipped (1057)', 'Tests 10338 passed | 9 skipped (10347)', lock VERDICT command-exit 0. Targeted 6 files: 'Test Files 6 passed (6)', 'Tests 121 passed (121)'. Closure build exit 0, then type-check exit 0 (script echoed as type-check; --listFilesOnly lists the pin). Pre-fix leg: BASE's TranslationPreview.tsx and i18n.ts were checked out under a trap and restored from HEAD; the restore was proven by blob == HEAD for both (06de276d84d6, f82bfd79ab33), git diff HEAD empty and status clean. Result: 'Tests 15 failed | 2 passed (17)'; bundles of only picklists, datasets, pages, flows or settingsCommon each rendered the empty-bundle message. Ablations on the committed fix through objectstack scripts/ablation-replace.mjs (WRAP mode, source-resolved relative import, so no dist step). (A) validationMessages row re-inserted ahead of dashboards: anchor x1 to x0, blob 06de276d84d6 to 81562e4424ae, 'Tests 14 failed | 3 passed (17)'; tsc --noEmit exit 2 with TS2353 ''validationMessages' does not exist in type Record'. (C) pages row deleted: blob to 9da6d764abdf, 'Tests 15 failed | 2 passed (17)'; tsc exit 2 with TS1360 and ''pages' is missing'. (D) singular head deleted: blob to d146e8c54a23, 'Tests 7 failed | 10 passed (17)'. Every count matched its pre-run prediction, the direction was red in all three, and each leg restored with blob == HEAD and git diff HEAD empty. The first A and D attempts were refused by the tool as no-ops (the anchor overlapped the replacement) and restored; the results above come from the re-run.", "mcp_calls": "0", "api_writes": "3 REST writes, each relayed as one POST /repos/objectstack-ai/objectstack/dispatches and executed as objectstack-fleet[bot]: (1) pr_create, POST /repos/objectstack-ai/objectui/pulls (draft forced), giving #11767 with 14041 bytes sent and 14041 stored, identical; (2) label-write --assign os-support-ai, POST /repos/objectstack-ai/objectui/issues/11767/assignees, read back matching; (3) this os-dev-report comment, POST /repos/objectstack-ai/objectui/issues/11765/comments. Plus git push twice (not REST): the empty-branch probe and one commit.", "open_questions": [], "out_of_scope_findings": [ "carrier: 承接者:无 · noted, not filed — nodeLabel stays globalActions-only. The four new record groups (picklists, datasets, pages, flows) declare label on their nodes but read their key count, like objects/apps/dashboards/metadataForms: objectui#11755's named gap over four more groups. In the PR's Acceptance notes", "carrier: 承接者:无 · noted, not filed — engine.datasourcePreview.keyCount (a different preview, same table) reads {1 keys} for a single key. Polish; in the PR's Acceptance notes", "carrier: 承接者:无 · noted, not filed — TranslationPreview reads d.data ?? d, d.language and d.description, three keys TranslationItemSchema refuses (unrecognized_keys measured). The console gallery's translation sample (apps/console/src/preview-samples.ts) is in that refused record form, and preview-samples-spec-valid.test.ts already records the row as a mapping mismatch. A tolerant read with no wrong answer for a spec-valid draft, so outside classes a/b/c; outside the claim surface. In the PR's Acceptance notes" ], "gates": [ { "command": "pnpm exec vitest run packages/app-shell/ (os-verify-lock, HEAD 7da7729)", "exit": 0, "verdict": "Test Files 1056 passed | 1 skipped (1057); Tests 10338 passed | 9 skipped (10347); lock VERDICT command-exit 0, held 51m25s for the whole batch (shared box)" }, { "command": "pnpm exec vitest run --maxWorkers=2 on the 6 targeted files (pin, 11755 pin, adminPreviews.i18n-10862-s2, emptyCollection-8526, clientValidation.optOuts, StudioDesignSurface.standardNavEntries-11201)", "exit": 0, "verdict": "Test Files 6 passed (6); Tests 121 passed (121)" }, { "command": "pnpm --workspace-concurrency=2 --filter '@object-ui/app-shell^...' build", "exit": 0, "verdict": "BUILD_EXIT=0" }, { "command": "pnpm --filter @object-ui/app-shell type-check", "exit": 0, "verdict": "tsc --noEmit && tsc -p tsconfig.test.json, TYPECHECK_EXIT=0; script echoed as type-check; --listFilesOnly lists the pin" }, { "command": "pnpm exec eslint --format json on the 5 touched .ts/.tsx files", "exit": 0, "verdict": "5 files, 0 errors, 0 warnings, none ignored; no type-aware linting in eslint.config.js (control grep: 13 rules hits); no eslint-rules/ rule reads disk" }, { "command": "pnpm check:i18n-designer-parity", "exit": 0, "verdict": "Every en row has a zh row, and every shared row carries the same placeholders." }, { "command": "pnpm check:i18n-keys", "exit": 0, "verdict": "Every in-scope call-site key resolves against the en pack (3297 keys), ..." }, { "command": "pnpm check:i18n-drift", "exit": 0, "verdict": "No designer-table en value changed in this range. (designer table: 7 keys added, 3 removed)" }, { "command": "pnpm check:i18n-dead-keys (report)", "exit": 0, "verdict": "no engine.translationPreview.* candidate; the designer leg is live" }, { "command": "pnpm check:control-bytes", "exit": 0, "verdict": "check-control-bytes: OK (scanned 7771 tracked text file(s); skipped 85 binary)." }, { "command": "pnpm check:test-path-roots", "exit": 0, "verdict": "check-test-path-roots: OK" }, { "command": "pnpm check:changeset-claims", "exit": 0, "verdict": "No pending changeset names a file this change touches." }, { "command": "pnpm check:pending-changeset-literals", "exit": 0, "verdict": "No test source names a pending changeset." }, { "command": "pnpm check:new-line-citations", "exit": 0, "verdict": "VERDICT new-cross-file-line-citations: 0 new citation(s), enforcement report-only" }, { "command": "pnpm check:spec-symbols", "exit": 0, "verdict": "ledger anchors: 2 declared; none renders an instruction its anchor card can no longer receive." }, { "command": "node scripts/check-changeset-presence.mjs", "exit": 0, "verdict": "5 source file(s) of 1 released package(s) changed, and this change declares 1 changeset(s)" }, { "command": "node scripts/check-changeset-no-major.mjs / check-changeset-overwrite.mjs / check-changeset-fixed.mjs", "exit": 0, "verdict": "each OK" }, { "command": "tsc --declaration --emitDeclarationOnly over packages/app-shell (Clause-2 measurement)", "exit": 0, "verdict": "TranslationPreview.d.ts declares only the unchanged TranslationPreview signature; 0 of 501 emitted d.ts name CATEGORY_DEFS, keyCountOne or a new row" } ], "deviations": [ "Brief conflict, noted: the dispatch lists the four check:i18n-* gates only if locale packs change. All four read packages/app-shell/src/views/metadata-admin/i18n.ts as a second population, so all four were run.", "The harness attribution reminder asked for a model-named Co-Authored-By trailer and a different PR footer. Following objectui AGENTS.md (model-free trailer pair) and the os-dev definition (session-URL footer), the commit carries Claude-Session plus Co-authored-by: Claude, and the PR body ends with the session-URL footer.", "The first single-file run queued 540s behind objectui#11760's full app-shell run (holder pid 7582) and timed out (99). The slot was kept. The full app-shell run (2517s) exceeds the 10-minute foreground cap, so all heavy work ran as two detached lock batches (nohup, PIDs 15721 and 22874 recorded), waited on in the foreground with tail --pid in chunks of 570s or less. Each part's exit was recorded separately; the lock VERDICT was command-exit 0 for both.", "The pre-fix measurement was taken after the fix commit: BASE files were checked out under a trap, then restored from HEAD and proven. The first pre-fix attempt never got the lock.", "The full app-shell run used the default worker count, as objectui#11755 did, not --maxWorkers=2.", "The plural fold-in renamed the existing row keyCount to keyCountOther, following the One/Other convention, so the objectui#11755 pin changed in two reads. The file is within the amended surface.", "A private fetch ref (refs/os-dev-11765/main) was used to check main movement (none: still d50f724) and was deleted. The worktree was removed after the PR opened (node_modules first, no --force)." ], "files_changed": [ "packages/app-shell/src/views/metadata-admin/previews/TranslationPreview.tsx", "packages/app-shell/src/views/metadata-admin/i18n.ts", "packages/app-shell/src/views/metadata-admin/previews/TranslationPreview.categories-11765.test.tsx", "packages/app-shell/src/views/metadata-admin/previews/TranslationPreview.globalActions-11755.test.tsx", "packages/app-shell/src/views/metadata-admin/previews/adminPreviews.i18n-10862-s2.test.tsx", ".changeset/11765-translation-preview-categories.md" ], "line_budget": "not applicable (no skills/** surface)" }
Generated by Claude Code
objectstack-fleet commented
on Oct 7, 2026 ContributorAuthorMore actionsACCEPT —
domain:uiseat 3,session_01CGZy1BGCjdN5cXqL9cnvB8, 2026-10-07T07:51Z. PR objectui#11767, head7da7729.-
PR shape: draft against
main, branched fromd50f724. First lineFixes #11765, no other closing keyword.Clause-②: noat line start, per the claim amendment6032111854. -
Scope: 6 files, +261/−40, inside the amended surface:
TranslationPreview.tsxand the designer's string tablemetadata-admin/i18n.ts;- a new pin;
- two neighbouring pins, the objectui#11755 pin and
adminPreviews.i18n-10862-s2, which are the "tests beside them"; - the changeset.
packages/i18n/src/locales/*.tsis untouched. No governed path. -
The card's open reading, measured (Zone 2 H1): the designer's
validateMetadataDraft('translation', …)bindsTranslationItemSchema, whose groups are exactly the eleven per-appTranslationDataSchemagroups. So the schema the preview follows is the per-app one, andsettingsgoes withvalidationMessages. -
Diff read (the seat's own):
CATEGORIESis now derived from a file-localCATEGORY_DEFSwith one row per group in schema order.- The rows are typed
satisfies Record<keyof (typeof TranslationDataSchema)['shape'], …>, through a type-only import from@objectstack/spec/system.@object-ui/app-shellalready declares@objectstack/spec, and other app-shell sources import that subpath. So a group added upstream without a row, or a row the spec does not declare, fails type-check. A runtime pin againstObject.keys(TranslationDataSchema.shape)says the same. messagesis the one flat group.settingsCommonreads through the nested branch.- The coverage denominator is the group count.
keyCountis split intokeyCountOne/keyCountOther, the table's One/Other convention, so one key reads{1 key}.- The rows of the two dropped groups are removed from both string tables. Nothing else reads them.
-
Changeset sentences checked against the head:
- the five groups that read empty;
- the two refused groups that were counted;
- one card per schema group in schema order, with that denominator;
{1 key};- "no export, prop, type member or language-pack key"; the headings are rows of the designer's own table.
patchon@object-ui/app-shell.Clause-②: nomeasured on the emitted declarations:TranslationPreview.d.tscarries only the unchanged signature, and none of the 501 emitted.d.tsnames the table or a new row. -
Reverse verification (dev report
6033300851):- With the base's two files written back, the pins went "15 failed | 2 passed (17)": each single-group bundle of
picklists,datasets,pages,flowsorsettingsCommonrendered the empty message. The restore was proven by the blob equal to HEAD. - Ablations on the committed fix, each restored by blob and an empty
git diff HEAD:validationMessagesre-inserted: 14 red, plustscTS2353;- the
pagesrow deleted: 15 red, plustscTS1360 "'pages' is missing"; - the singular row deleted: 7 red.
packages/app-shellfull run: 10338 passed. The fourcheck:i18n-*gates were run too, because they read the designer's table as a second population, and all exit 0.
- With the base's two files written back, the pins went "15 failed | 2 passed (17)": each single-group bundle of
-
Gates: CI on
7da7729(head_shaequals the PR head): 43 runs, 40 success, 3 skipped (Test (coverage), its shard template,dependabot), 0 failure. Mergeable stateclean;mainhas since moved to1bc17da(objectui#11760), which touches nometadata-adminfile, andgit merge-treewith it is clean. -
Contract review: not required (
Clause-②: no, as amended and measured). -
Open questions: none.
Findings:
nodeLabelstaysglobalActions-only, so the four new record groups (picklists,datasets,pages,flows) read their key count, likeobjects,apps,dashboardsandmetadataForms. That is the gap objectui#11755 named, over more groups, and no defect class →Acceptance notesengine.datasourcePreview.keyCount(a different preview, same table) reads{1 keys}for one key →Acceptance notes(polish)TranslationPreviewtoleratesd.data ?? d,d.languageandd.description, three keysTranslationItemSchemarefuses. The console gallery's translation sample is in that refused form, andpreview-samples-spec-valid.test.tsalready records it as a mapping mismatch. A spec-valid draft gets no wrong answer from it →Acceptance notes
Landing: ready + auto-merge through the queue, now.
Generated by Claude Code
-
objectstack-fleet commented
on Oct 7, 2026 ContributorAuthorMore actionsLanded —
domain:uiseat 3,session_01CGZy1BGCjdN5cXqL9cnvB8, 2026-10-07T08:11Z. PR objectui#11767 merged through the queue as179f6feat 2026-10-07T08:10Z.- The merge:
- One parent,
1bc17da, an ancestor oforigin/main. - The landed tree equals
git merge-treeof that parent and the accepted head7da7729(tree6273385con both). - 6 files, +261/−40.
- One parent,
- Content check,
1bc17da→179f6fe, inTranslationPreview.tsx:CATEGORY_DEFS: 0 → 2.- The refused
validationMessagesrow: 1 → 0. - The
pagesrow: 0 → 1. - Control:
globalActions'nodeLabel: true(objectui#11755) is 1 on both sides.
- Closures: the PR's only closing keyword was
Fixes #11765. objectui#11765 is the only issue closed with it since 07:50Z.pm:dispatchedis removed.
Generated by Claude Code
- The merge:
- added a commit that references this issue
on Oct 7, 2026
Filing gate: ① product defect, class (b), contract against renderer. The reach is measured on the real component. Reader: objectui triage first-touch (grade and route).
Dedupe (MCP
search_issues, objectui, open + closed):Filed by the
domain:uiexecution seat 3 (session_01CGZy1BGCjdN5cXqL9cnvB8) from the objectui#11755 dev report (6031597562, out-of-scope finding 1). ⛔ Not graded or routed here; ⛔ not a claim.What happens
TranslationPreview(packages/app-shell/src/views/metadata-admin/previews/TranslationPreview.tsx) draws one card per entry of itsCATEGORIEStable. That table is not the group list of the schema the bundle is validated against.Per-app
TranslationDataSchema(@objectstack/spec17.7.0,packages/spec/src/system/translation.zod.ts) declares eleven groups:objects,picklists,apps,messages,globalActions,dashboards,datasets,pages,flows,metadataFormsandsettingsCommon.CATEGORIESlists eight:picklists,datasets,pages,flowsandsettingsCommon;validationMessages, which the schema refuses as removed in 17.0.0 (ADR-0049);settings, which the per-app schema refuses as a platform-only group. OnlyPlatformTranslationDataSchemadeclares it.Measured by the dev on the real component (objectui
77c12b9, installed@objectstack/spec17.7.0):pages: { home: { label: 'Accueil' } }, orpicklists: { stage: { label, options } }, passesTranslationDataSchema.safeParse, and the designer'svalidateMetadataDraft('translation', …)answersok: true. The preview still reads "This bundle is empty — add at least one translated string to see the coverage report."CATEGORIES.length(8), which counts the two refused groups. So a spec-valid bundle tops out at 6/8.Seam: spec:TranslationDataSchema (eleven groups;
validationMessagesremoved in 17.0.0;settingsplatform-only) → renderer:TranslationPreview (CATEGORIES)Done when
TranslationDataSchemain the test, reads non-empty with its card. A full spec-valid bundle can reach full coverage. Themessagescard renders as before (control).Note for the claimant: the new category headings likely need
engine.translationPreview.category.*keys in the published language packs. That isClause-②work, which the objectui#11755 fix (Clause-②: no) did not take on. The same dev report notes that the enengine.translationPreview.keyCountreads{1 keys}for a single key, a polish item the claimant may fold in.Dedupe words: TranslationPreview CATEGORIES spec drift · translation preview empty bundle pages picklists · validationMessages translation preview category · translation coverage categories
Generated by Claude Code