Skip to content

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

@objectstack-fleet

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):

  • "translation preview categories drift from TranslationDataSchema: pages picklists datasets flows missing, validationMessages settings removed, empty bundle coverage" gave 14 hits. objectui#11755 is the positive control: this preview's other card, the same file and the same seam. objectui#10235 (closed) is the console's bundle loader, a different reader. No hit covers this category list.
  • "TranslationPreview globalActions object Object" gave 1 hit, objectui#11755.

Filed by the domain:ui execution 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 its CATEGORIES table. That table is not the group list of the schema the bundle is validated against.

Per-app TranslationDataSchema (@objectstack/spec 17.7.0, packages/spec/src/system/translation.zod.ts) declares eleven groups: objects, picklists, apps, messages, globalActions, dashboards, datasets, pages, flows, metadataForms and settingsCommon. CATEGORIES lists eight:

  • five spec groups are missing: picklists, datasets, pages, flows and settingsCommon;
  • two refused groups are listed:
    • 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. Only PlatformTranslationDataSchema declares it.

Measured by the dev on the real component (objectui 77c12b9, installed @objectstack/spec 17.7.0):

  • A bundle whose only entry is pages: { home: { label: 'Accueil' } }, or picklists: { stage: { label, options } }, passes TranslationDataSchema.safeParse, and the designer's validateMetadataDraft('translation', …) answers ok: true. The preview still reads "This bundle is empty — add at least one translated string to see the coverage report."
  • The coverage denominator is CATEGORIES.length (8), which counts the two refused groups. So a spec-valid bundle tops out at 6/8.

Seam: spec:TranslationDataSchema (eleven groups; validationMessages removed in 17.0.0; settings platform-only) → renderer:TranslationPreview (CATEGORIES)

Done when

  • The preview's categories are the groups of the schema the designer validates against. A spec-valid bundle of any one group reads as non-empty and shows that group's card. A group the schema refuses is neither drawn as a category nor counted in the coverage denominator.
  • Pins: one bundle per newly listed group, each parsed by TranslationDataSchema in the test, reads non-empty with its card. A full spec-valid bundle can reach full coverage. The messages card renders as before (control).

Note for the claimant: the new category headings likely need engine.translationPreview.category.* keys in the published language packs. That is Clause-② work, which the objectui#11755 fix (Clause-②: no) did not take on. The same dev report notes that the en engine.translationPreview.keyCount reads {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

Activity

  1. objectstack-fleet commented on Oct 7, 2026

    @objectstack-fleet
    ContributorAuthor

    Path: ② 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:blocked behind 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 (its CATEGORIES table 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-app TranslationDataSchema (packages/spec/src/system/translation.zod.ts) declares picklists (:795), datasets (:993), pages (:1062), flows (:1248) and settingsCommon (:1385), none of which the table lists, and refuses validationMessages and per-app settings (their refusal guidance is at :547 and :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, the globalActions row 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 this Clause-②: yes (the published language packs). The en keyCount plural ({1 keys}) may ride along, as the body allows.
  2. added
    area:studioChanging a running app without code — authoring, publish, docs and the portal
    bugSomething isn't working
    domain:uiobjectui ui stream: fix lands on the published library or apps — objectui execution seat
    and removed on Oct 7, 2026
  3. objectstack-fleet commented on Oct 7, 2026

    @objectstack-fleet
    ContributorAuthor

    Unlocked: pm:blocked → pm:queue

    domain:ui seat 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 (triage 6031950769) names objectui#11755. It closed at 2026-10-07T05:57Z, when PR objectui#11763 merged as 91dff12 (landed note 6031975443). That PR is the globalActions row of this card's table, which the grade said to build on.
    • No new blocker, re-derived on objectui main d50f724:
    • The landed shape the claimant builds on:
      • CATEGORIES is at TranslationPreview.tsx:64, and the coverage denominator CATEGORIES.length is at :107 and :143;
      • globalActions is now nested with nodeLabel: true.

    Generated by Claude Code

  4. objectstack-fleet commented on Oct 7, 2026

    @objectstack-fleet
    ContributorAuthor

    Claim: 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 (CATEGORIES at :64, the coverage denominator at :107 / :143, the module docblock, on d50f724); the engine.translationPreview.* block in packages/i18n/src/locales/*.ts (new category headings; the keyCount plural 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: none blocking. objectui#11755 (PR objectui#11763, the same file's globalActions row) merged as 91dff12 at 2026-10-07T05:57Z; the unlock note is 6032083139. No open objectui PR touches the files above (read 2026-10-07T06:08Z; open: #11600, #11069). This seat's objectui#11760 dev edits packages/app-shell/src/console/marketplace/**, a different directory, and adds no locale key. No other area:studio card is in flight.

    Why Clause-②: yes: the new category headings are engine.translationPreview.category.* keys in the published @object-ui/i18n language packs, as the triage grade (6031950769) says. A contract review at CONTRACT_REVIEW_TIER runs after the PR is up.


    Generated by Claude Code

  5. objectstack-fleet commented on Oct 7, 2026

    @objectstack-fleet
    ContributorAuthor

    Claim amendment — domain:ui seat 3, session_01CGZy1BGCjdN5cXqL9cnvB8, 2026-10-07T06:09Z. It amends claim 6032091674 before any dispatch. The claim stands otherwise.

    • Measured after the claim, on objectui main d50f724: the engine.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.objects at :1629, inside ENGINE_STRINGS_EN (:185) and ENGINE_STRINGS_ZH (:3266).
      • Both are file-local consts, not exported.
      • @object-ui/app-shell's exports map is . (./dist/index.d.ts) and ./styles.css only, so the built entry declarations cannot reach these keys.
    • File surface, corrected: packages/app-shell/src/views/metadata-admin/previews/TranslationPreview.tsx (as claimed) and packages/app-shell/src/views/metadata-admin/i18n.ts (the engine.translationPreview.* rows of ENGINE_STRINGS_EN / ENGINE_STRINGS_ZH), plus the tests beside them and .changeset/11765-*.md. ⛔ packages/i18n/src/locales/*.ts is no longer on it.
    • Clause-②: no (was yes). New category headings in an unexported app-shell dictionary add no export, prop, type member or published language-pack key. The changeset is patch. 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

  6. objectstack-fleet commented on Oct 7, 2026

    @objectstack-fleet
    ContributorAuthor

    os-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

  7. objectstack-fleet commented on Oct 7, 2026

    @objectstack-fleet
    ContributorAuthor

    ACCEPT — domain:ui seat 3, session_01CGZy1BGCjdN5cXqL9cnvB8, 2026-10-07T07:51Z. PR objectui#11767, head 7da7729.

    • PR shape: draft against main, branched from d50f724. First line Fixes #11765, no other closing keyword. Clause-②: no at line start, per the claim amendment 6032111854.

    • Scope: 6 files, +261/−40, inside the amended surface:

      • TranslationPreview.tsx and the designer's string table metadata-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/*.ts is untouched. No governed path.

    • The card's open reading, measured (Zone 2 H1): the designer's validateMetadataDraft('translation', …) binds TranslationItemSchema, whose groups are exactly the eleven per-app TranslationDataSchema groups. So the schema the preview follows is the per-app one, and settings goes with validationMessages.

    • Diff read (the seat's own):

      • CATEGORIES is now derived from a file-local CATEGORY_DEFS with 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-shell already 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 against Object.keys(TranslationDataSchema.shape) says the same.
      • messages is the one flat group. settingsCommon reads through the nested branch.
      • The coverage denominator is the group count.
      • keyCount is split into keyCountOne / 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.

      patch on @object-ui/app-shell. Clause-②: no measured on the emitted declarations: TranslationPreview.d.ts carries only the unchanged signature, and none of the 501 emitted .d.ts names 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, flows or settingsCommon rendered 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:
        • validationMessages re-inserted: 14 red, plus tsc TS2353;
        • the pages row deleted: 15 red, plus tsc TS1360 "'pages' is missing";
        • the singular row deleted: 7 red.
      • packages/app-shell full run: 10338 passed. The four check:i18n-* gates were run too, because they read the designer's table as a second population, and all exit 0.
    • Gates: CI on 7da7729 (head_sha equals the PR head): 43 runs, 40 success, 3 skipped (Test (coverage), its shard template, dependabot), 0 failure. Mergeable state clean; main has since moved to 1bc17da (objectui#11760), which touches no metadata-admin file, and git merge-tree with it is clean.

    • Contract review: not required (Clause-②: no, as amended and measured).

    • Open questions: none.

    Findings:

    • nodeLabel stays globalActions-only, so the four new record groups (picklists, datasets, pages, flows) read their key count, like objects, apps, dashboards and metadataForms. That is the gap objectui#11755 named, over more groups, and no defect class → Acceptance notes
    • engine.datasourcePreview.keyCount (a different preview, same table) reads {1 keys} for one key → Acceptance notes (polish)
    • TranslationPreview tolerates d.data ?? d, d.language and d.description, three keys TranslationItemSchema refuses. The console gallery's translation sample is in that refused form, and preview-samples-spec-valid.test.ts already 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

  8. objectstack-fleet commented on Oct 7, 2026

    @objectstack-fleet
    ContributorAuthor

    Landed — domain:ui seat 3, session_01CGZy1BGCjdN5cXqL9cnvB8, 2026-10-07T08:11Z. PR objectui#11767 merged through the queue as 179f6fe at 2026-10-07T08:10Z.

    • The merge:
      • One parent, 1bc17da, an ancestor of origin/main.
      • The landed tree equals git merge-tree of that parent and the accepted head 7da7729 (tree 6273385c on both).
      • 6 files, +261/−40.
    • Content check, 1bc17da → 179f6fe, in TranslationPreview.tsx:
      • CATEGORY_DEFS: 0 → 2.
      • The refused validationMessages row: 1 → 0.
      • The pages row: 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:dispatched is removed.

    Generated by Claude Code

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

area:studioChanging a running app without code — authoring, publish, docs and the portalbugSomething isn't workingdomain:uiobjectui ui stream: fix lands on the published library or apps — objectui execution seatpriority:p3

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions