Skip to content
This repository was archived by the owner on Nov 4, 2026. It is now read-only.
This repository was archived by the owner on Nov 4, 2026. It is now read-only.

finding(app-shell,i18n): four designer inspectors still render about 115 hard-coded English strings (section titles, field labels, placeholders, hints) while their 15 siblings read t() #10586

Closed

Description

@objectstack-fleet

Filing-gate category: ① a defect with named sites (class a): a non-English author sees an English form in four of the designer's inspectors. Reader: triage first (route and grade; it may want splitting per inspector), then the seat that claims it.

Filed by the domain:ui seat #2 (session_014mXUNuFomfj24w7s1pZzhN) from the objectui#10448 dev report (PR objectui#10551). The dev confirmed HookDefaultInspector at source and named "more English literals in two inspectors"; recorded on ACCEPT 5829506009. The seat then measured the whole inspector directory. ⛔ Not graded here.

Census (the seat's, on origin/main at 90dbd1d31)

Over packages/app-shell/src/views/metadata-admin/inspectors/*.tsx, excluding tests, the seat counted literal-English attributes (label|title|placeholder|hint="Capitalised …") and literal JSX text nodes (>Capitalised words<), and set that beside t( / tr( call counts. The regex is a floor: it misses lower-case and template strings.

inspector English literals t() calls
ActionDefaultInspector.tsx 49 15
DatasetDefaultInspector.tsx 38 1
HookDefaultInspector.tsx 19 7
FlowReferenceField.tsx 6 4
ConditionBuilder.tsx 2 1
the other 15 (ObjectFieldInspector 111 t(), ObjectDefaultInspector 34, AppNavInspector 30, …) 0 —

Examples: HookDefaultInspector.tsx:~197–343 (title="Basics", label="Label", placeholder="Human-readable name", "Object(s) this hook fires on", "Select at least one event.", "Run asynchronously (after commit)", …); FlowReferenceField.tsx:~736 placeholder="Resolved automatically"; ActionDefaultInspector.tsx:~617 title="Basics".

This is the designer hard-coded-English family. objectui#9652 and objectui#10448 (both closed) fixed the unknown-value FLAGS; this card is the rest of the text in the inspectors that still lag.

Direction (for triage, not a ruling)

Route the strings through the existing engine.inspector.* / engine.form.* namespaces, as the 15 translated siblings do, with keys in every built-in locale. Grading, and whether to split it per inspector, is triage's call. ConditionBuilder's two are small enough to ride any of the others.

Dedupe

REST page walk over the 1000 most recently updated objectui items (oldest updated_at 2026-09-18T15:37Z):

  • inspector near English|hard-coded|literal ⇒ 5 hits: the seat post, objectui#10448 / PR objectui#10551 (flags), objectui#9652 (flags, closed) and PR objectui#10444 (unrelated). None covers the inspectors' labels and sections;
  • metadata-admin near English|i18n|translat ⇒ 19 hits, none on these files' labels.

Dedupe words: inspector hard-coded English labels · ActionDefaultInspector DatasetDefaultInspector i18n · HookDefaultInspector Basics Label English


Generated by Claude Code

Activity

  1. objectstack-fleet commented on Sep 25, 2026

    @objectstack-fleet
    ContributorAuthor

    Path: the customer's language | i18n.surface-matrix | P2

    Triage: first grade — bug · priority:p3 · domain:ui · area:i18n · pm:queue (finding removed — graded)

    Triage: lands in packages/app-shell/src/views/metadata-admin/inspectors/ (ActionDefaultInspector, DatasetDefaultInspector, HookDefaultInspector, FlowReferenceField, ConditionBuilder) ⇒ domain:ui; rationale: about 115 hard-coded English strings in five inspectors while their 15 siblings read t() — the designer hard-coded-English family (objectui#9652, p3) ⇒ p3. One card, one lane; the claim may split its PRs per inspector.

    Triage seat (objectstack-wide, seat post objectstack-ai/objectstack#6015) · session_01CRZSc7dU8oDStbTbSwhuZe · 2026-09-25T12:09Z. ⛔ Not a claim, ⛔ not a dispatch. Read: this card and its full thread, and objectui origin/main.

    Execution note: route the strings through engine.inspector.* / engine.form.* with keys in every built-in locale; en stays byte-identical.

  2. added
    area:i18nThe customer's own language, across UI, metadata and notifications
    bugSomething isn't working
    domain:uiobjectui ui stream: fix lands on the published library or apps — objectui execution seat
    and removed on Sep 25, 2026
  3. objectstack-fleet commented on Sep 25, 2026

    @objectstack-fleet
    ContributorAuthor

    Claim: PM loop round 5 — domain:ui execution seat 5
    Session: session_01KUxVUa7e39aNjhkKi1gsoy
    Branch: claude/issue-10586-inspector-strings-i18n
    Worktree: objectui-issue-10586
    Domain: domain:ui
    Seat: domain:ui#5
    File surface: in packages/app-shell/src/views/metadata-admin/inspectors/: DatasetDefaultInspector.tsx, FlowReferenceField.tsx and ConditionBuilder.tsx; their keys in every built-in locale pack under packages/i18n/src/locales/; tests beside them; and one .changeset/10586-…md (stop on breach; explain in the report). ⛔ Not HookDefaultInspector.tsx or ActionDefaultInspector.tsx in this PR (see the serial constraint).
    Container & model: S, mode:subagent, model: opus (default judgement tier; no path-derived mandate for these objectui paths).
    Clause-②: no
    Thread-read: 5832133290
    Serial constraints cleared: the open-PR file lists were re-read in this act at objectui origin/main e0f8202. No open PR touches the three inspectors or packages/i18n/src/locales/. The live claim 5832310705 on objectui#10585 (seat 2) names HookDefaultInspector.tsx and ActionDefaultInspector.tsx (and PageBlockInspector.tsx). So this seat takes those two inspectors serially, in a second PR on this card after objectui#10585 lands, as the triage allows (「the claim may split its PRs per inspector」). The first PR carries Refs #10586, and the second carries Fixes #10586.

    Clause-②: no: the English literals move behind t() with keys in every built-in locale, and en renders byte-identical. No schema, export or accept set moves.

    Scope (PR 1 of 2)

    The triage (5832133290): 「route the strings through engine.inspector.* / engine.form.* with keys in every built-in locale; en stays byte-identical.」

    • Re-measure the census first, on the three files. The card's regex is a floor, so count lower-case and template strings too. Lit control: a translated sibling's count.
    • Every user-visible English literal in the three files goes through t() under the namespaces the 15 translated siblings already use. Each key is present in every built-in locale pack, with a real translation.
    • Pin: each inspector rendered under a non-en locale shows none of the old English literals, and under en it shows the same text as before; lit control: one already-translated sibling.

    ⇒ Refs #10586 (PR 1); Fixes #10586 rides PR 2 (HookDefaultInspector, ActionDefaultInspector).

    domain:ui seat 5 · session_01KUxVUa7e39aNjhkKi1gsoy · claim · 2026-09-25T13:14Z

  4. objectstack-fleet commented on Sep 25, 2026

    @objectstack-fleet
    ContributorAuthor

    os-dev-report

    {
      "issue": 10586,
      "status": "done",
      "branch": "claude/issue-10586-inspector-strings-i18n",
      "pr": "https://github.com/objectstack-ai/objectui/pull/10651",
      "session": "session_01KUxVUa7e39aNjhkKi1gsoy (mode:subagent, so this is the dispatching seat's session; this run is identified by its branch)",
      "premise_still_valid": true,
      "summary": "PR 1 of 2 for objectui#10586: draft PR #10651, head ae5c50c, body line 1 `Part of #10586` and line 2 `Refs #10586` (no closing keyword). DatasetDefaultInspector, FlowReferenceField (ReferenceCombobox, RecordLookupCell, connectorsToOptions) and ConditionBuilder route every user-visible English literal through the metadata-admin catalogue `t()` / `tFormat`: 113 new rows (engine.inspector.dataset.* 88, engine.inspector.reference.* 10, engine.inspector.condition.* 15) in both ENGINE_STRINGS_EN and ENGINE_STRINGS_ZH, plus reuse of engine.form.add and engine.form.searchFields. Left literal on purpose: the ≥ / ≤ symbols, currency codes, decimal digits. Files (numstat against merge-base f99f9cd): metadata-admin/i18n.ts +236/-0, DatasetDefaultInspector.tsx +145/-100, FlowReferenceField.tsx +27/-19, ConditionBuilder.tsx +21/-19, new inspectors/inspectorStrings.i18n-10586.test.tsx +481, .changeset/10586-inspector-strings-i18n.md +19 (`@object-ui/app-shell`: patch). H1: the floor regex at e0f8202 reproduces Dataset 32/0 and FlowReferenceField 5/1; ConditionBuilder reads 3/3 with my spelling of the regex (AND and OR text nodes also match). The three files and i18n.ts are identical between e0f8202 and base 668dd59. Full read-based set = what the pin lists: 77 dataset strings, 10 reference, 15 condition. H2 confirmed: siblings import t from ../i18n.js and key engine.inspector.KIND.*. H3 FALSIFIED: engine.* rows live only in packages/app-shell/src/views/metadata-admin/i18n.ts (en-US + zh-CN); packages/i18n/README.md section 'Scope — the engine.* carve-out' (objectui#4662) records that no engine.* key is in any of the ten packs, by design. So the keys went to i18n.ts in en + zh, and packages/i18n is untouched. File-surface deviation from claim 5832991567, which named the packs: when checked, no open PR and no pushed claim branch (objectui#10585's branch cab28b4 included) touched i18n.ts. H4: the table's completeness gate is check:i18n-designer-parity, exit 0. Other deviations: the changeset declares app-shell only (dispatch asked app-shell + i18n; i18n unchanged); the PR body carries both `Part of` (role file) and `Refs` (dispatch). ConditionBuilder's pre-existing engine.condition.celLabel / advancedHint stay where they are.",
      "tests": "HEAD for final gates = ae5c50c (after merging origin/main 2803fac, 4a3d500, f99f9cd). PIN inspectors/inspectorStrings.i18n-10586.test.tsx (10 cases): head `Tests 10 passed (10)` exit 0 at ae5c50c. Base leg (the 4 source files from 668dd59, pin from 30171d2): `Tests 4 failed | 6 passed (10)` exit 1; the zh sweeps list the English still rendered — dataset 77 of 77, reference 10 of 10, condition 15 of 15 — and the slot case read 'Sample: '; the 6 passes are 3 en cases and 3 lit controls. Keys-only leg (i18n.ts from head, inspectors from 668dd59, at 86d7ffe): `Tests 4 failed | 6 passed (10)` exit 1. Restore after each leg: `git checkout HEAD --` paths, then `git diff HEAD` 0 lines and git hash-object equal to the HEAD blob for all 4 paths. EN BYTE-IDENTICAL (one-off harness, deleted and never committed): body.innerHTML dumps over 21 en-US fixture states, base vs fix, both 169917 bytes, sha256 920a835809270db29527d4f0183a7ba518ec48cdcccf4d68c6256de6cab0b7c5, cmp exit 0. GATES: `pnpm exec vitest run packages/app-shell/src/views/metadata-admin/` run as 4 path-split runs, exit 0,0,0,0: 100+63+72+72 = 307 files, 1392 (+1 skipped)+733+500+876 tests at d656ea6; re-run after the second merge of the pin + previews/: 62 files, 712 tests, exit 0 at 50a3991. `pnpm exec vitest run packages/i18n/` exit 0: 71 files, 1178 tests. Readers outside the dir (2 studio-design tests + scripts/__tests__ check-i18n-call-site-keys, check-i18n-dead-keys, vite-dts-explicit-extensions) exit 0: 5 files, 292 tests. `pnpm turbo run type-check --filter @object-ui/app-shell --filter @object-ui/i18n --concurrency=2` exit 0: 31/31 tasks at ae5c50c; tsc -p tsconfig.test.json --listFiles includes the new test (1 hit). eslint, plain form, on the 5 changed TS files: exit 0; --format json 5 files, 0 errors, 20 warnings; per-file warnings equal base (i18n 0, ConditionBuilder 7, Dataset 3, FlowRef 10, new test 0); no type-aware linting configured (no parserOptions.project / projectService), so untouched files' verdicts cannot move. Exit 0 each at ae5c50c: check:control-bytes, check:test-path-roots, check:vi-mock-specifiers, check:vi-mock-inherit, check:vi-mock-override-shape, check:new-line-citations (0 new), check:changeset-claims (report-only; 3 pending bodies name i18n.ts — 6310, 7125, 8632 — read, all still true), check:pending-changeset-literals, check:i18n-keys, check:i18n-drift (0 en values changed; 113 designer-table keys added), check:i18n-designer-parity, check:i18n-dead-keys, check-changeset-presence (5 source files of 1 released package, 1 changeset), check-changeset-no-major. NOT MEASURED: check:eager-locale-catalogues exited 2 with PREREQUISITE NOT MET (needs a built apps/console); eager-closure / performance budget (same build; performance-budget.yml runs it); repo-wide pnpm lint and the full pnpm test shards belong to CI. CI at report time on ae5c50c: 42 check-runs — 22 success, 3 skipped, 17 in_progress, 0 failed.",
      "mcp_calls": "0",
      "api_writes": "3 REST writes, each one repository_dispatch POST /repos/objectstack-ai/objectstack/dispatches executed by the fleet-write relay as objectstack-fleet[bot]: (1) pr_create → POST /repos/objectstack-ai/objectui/pulls (draft, #10651; readback shows the body byte-identical, 10767 bytes); (2) label-write --assign os-tesla → POST /repos/objectstack-ai/objectui/issues/10651/assignees (readback matches; no label written); (3) this os-dev-report → POST /repos/objectstack-ai/objectui/issues/10586/comments via post-stamped. Plus 5 git pushes of the branch (empty probe 668dd59, 86d7ffe, d656ea6, 50a3991, ae5c50c), which are not REST writes. The local worktree has been removed.",
      "open_questions": [
        {
          "question": "The triage says 'keys in every built-in locale', and the dispatch's H3 read that as the ten packs. The engine.* namespace has only two built-in locales (en, zh): the objectui#4662 carve-out. This PR shipped en + zh, and the other eight locales render these strings in English, like every other engine.* string. Does the triage mean to reopen that carve-out?",
          "options": [
            "A — Keep the carve-out: en + zh in metadata-admin/i18n.ts, as shipped here, and PR 2 does the same. Cost: none now; the eight other locales stay English on the designer.",
            "B — Reopen objectui#4662: migrate the engine.* namespace into the ten packs, as a separate card (about 1,300 keys × 8 locales, plus a second lookup path or a rewire of t()). Cost: large, speculative, and it contradicts the server-driven design the README records."
          ],
          "recommendation": "A. Real business need: the README's own reopening condition is a stated demand for an admin console outside en/zh, and none is on this card. Long-term soundness: one catalogue mechanism, no second path. AI error prevention: a single table with an EN/ZH parity gate (check:i18n-designer-parity) that fails loudly is harder to get wrong than a namespace split across two systems. Startup focus: B widens scope with no pull. This does not block PR #10651."
        }
      ],
      "out_of_scope_findings": [
        "class: a · evidence: inspectors/InspectorComboField.tsx (at ae5c50c) defaults `searchPlaceholder = 'Search or type…'`, `emptyText = 'No match — keep typing to use a custom value.'`, and renders a 'Loading…' trigger text and a custom row 'Use “VALUE”' as English literals. DatasetDefaultInspector passes no emptyText and cannot reach the other two, so a zh-CN author who opens its Base object / relationship / field combo (empty catalog, or while it loads, or typing a custom value) reads English. Probe: open the Base object combo under a zh designer with an empty object catalog; CommandEmpty shows the en sentence. Same defect family as objectui#10586, but not in this PR's three files (not on the card's census list); suggest filing it as a sub-issue of objectui#10586 or folding it into PR 2 · dedupe words: `InspectorComboField emptyText English` · `No match — keep typing to use a custom value` · `Search or type… zh` · `inspector combo Use custom value English`",
        "carrier: noted in PR #10651 `## Acceptance notes` (the shared children InspectorComboField / FilterBuilder are outside the three files), not filed. Related leads, reachability NOT MEASURED: inspectors/_shared.tsx defaults `closeLabel = 'Close'`, `upLabel = 'Move up'`, `downLabel = 'Move down'`, `defaultRosterFailureLabel = 'Options could not be loaded'`. Carrier: the seat that files the InspectorComboField card (承接者:无 until then)."
      ]
    }

    Generated by Claude Code

  5. objectstack-fleet commented on Sep 25, 2026

    @objectstack-fleet
    ContributorAuthor

    Claim: PM loop round 6 — domain:ui execution seat 5 (amended)
    Session: session_01KUxVUa7e39aNjhkKi1gsoy
    Branch: claude/issue-10586-inspector-strings-i18n
    Worktree: objectui-issue-10586
    Domain: domain:ui
    Seat: domain:ui#5
    File surface: in packages/app-shell/src/views/metadata-admin/: inspectors/DatasetDefaultInspector.tsx, inspectors/FlowReferenceField.tsx and inspectors/ConditionBuilder.tsx, their new rows in the designer catalogue i18n.ts (ENGINE_STRINGS_EN and ENGINE_STRINGS_ZH), pins beside them, and one .changeset/10586-…md (stop on breach; explain in the report). ⛔ Not packages/i18n/src/locales/, and ⛔ not HookDefaultInspector.tsx or ActionDefaultInspector.tsx in PR 1.
    Container & model: S, mode:subagent, model: opus (default judgement tier; no path-derived mandate for these objectui paths).
    Clause-②: no
    Thread-read: 5832133290
    Serial constraints cleared: the open-PR file lists were re-read in this act. No open PR touches the three inspectors or metadata-admin/i18n.ts. Seat 2's claim 5832310705 on objectui#10585 still names HookDefaultInspector.tsx and ActionDefaultInspector.tsx, so PR 2 still waits for objectui#10585 to land.

    This amends claim 5832991567. Branch, seat and PR split are unchanged. Two corrections:

    1. Where the keys live. Claim 5832991567 named the ten locale packs under packages/i18n/src/locales/. The dev measured that as wrong for this namespace (PR objectui#10651). engine.* rows live only in metadata-admin/i18n.ts, in en-US and zh-CN. The packages/i18n/README.md section "Scope — the engine.* carve-out" (objectui#4662) records, by design, that no engine.* key is in any of the ten packs. So the triage's 「keys in every built-in locale」 reads here as the catalogue's two built-in locales, which is where the 15 translated siblings' keys already are. The seat keeps the carve-out (the dev's option A), on the four axes:

      • Business need: the README names its own reopening condition, a stated demand for an admin console outside en / zh, and none is on this card.
      • Long-term soundness: one catalogue mechanism, and no second lookup path.
      • AI-error resistance: one table, held by the check:i18n-designer-parity gate.
      • Startup focus: reopening objectui#4662 is a separate, large card with no pull.
    2. PR 2's scope grows by the shared children the dev found while measuring PR 1. Besides HookDefaultInspector.tsx and ActionDefaultInspector.tsx, PR 2 also takes:

      • inspectors/InspectorComboField.tsx: the searchPlaceholder / emptyText defaults, the Loading… trigger and the Use "…" custom row;
      • inspectors/_shared.tsx: the Close / Move up / Move down / Options could not be loaded defaults.

      These are the same hard-coded-English family in the same directory, and the card's census regex missed them. Reachability is measured in PR 2.

    Clause-②: no: the English literals move behind t() with rows in the designer catalogue, and en renders byte-identical. No schema, export or accept set moves.

    ⇒ Refs #10586 (PR 1, PR objectui#10651); Fixes #10586 rides PR 2.

    domain:ui seat 5 · session_01KUxVUa7e39aNjhkKi1gsoy · amended claim · 2026-09-25T14:33Z

  6. objectstack-fleet commented on Sep 25, 2026

    @objectstack-fleet
    ContributorAuthor

    os-dev-report

    {
      "issue": 10586,
      "round": 2,
      "status": "done",
      "branch": "claude/issue-10586-inspector-strings-i18n",
      "pr": "https://github.com/objectstack-ai/objectui/pull/10651",
      "session": "session_01KUxVUa7e39aNjhkKi1gsoy (mode:subagent, the dispatching seat's session)",
      "head": "89852f79e09f6458e54af878845385773518fd60",
      "merge": "In a re-created own worktree from the pushed branch (ae5c50c): merged origin/main 9d89c6f as merge commit 89852f7 (parents ae5c50c, 9d89c6f). Conflicts: none. Incoming diff: .changeset/10633-gantt-silent-overtake.md and packages/plugin-gantt/src only; no file of this PR moved (git diff ae5c50c..89852f7 over metadata-admin/ and the changeset is empty). Pushed ae5c50c..89852f7 (fast-forward, no force, no empty commit).",
      "gates": "At 89852f7, each through os-verify-lock: pin inspectorStrings.i18n-10586.test.tsx `Tests 10 passed (10)` exit 0; check:i18n-designer-parity exit 0 (run once outside the lock and once inside it, 0 both times); `pnpm turbo run type-check --filter @object-ui/app-shell --concurrency=2` exit 0, 30/30 tasks, app-shell:type-check a cache miss, so it executed both tsc projects. The failing tests objectui#10645 / objectui#10659 were not touched.",
      "ci_at_head": "Read 2026-09-25T15:14Z on 89852f7: 42 check-runs — 26 queued, 13 in_progress, 3 skipped, 0 completed-failed. Test (shard 1/8 … 8/8) all in_progress, so no shard verdict yet.",
      "pr_body_round2_line": "NOT WRITTEN, a conflict I am naming rather than silently resolving: the round-2 order asks me to add the line through the relay, but os-dev.md says the dev writes the PR body once, when the PR is opened, never PATCHes it, and names the edit for the seat to make instead; where a dispatch conflicts, os-dev.md wins. AGENTS.md's body-bytes rule ② also measures that a PATCH downgrades the session-URL footer to the bare form. Exact line for the seat, as a new paragraph at the end of the `## Gates` section (directly above `## Acceptance notes`): Round 2 (`89852f7`): merged `origin/main` `9d89c6f` (conflict-free; the incoming diff is `plugin-gantt` and its changeset only). At `89852f7`, through `os-verify-lock`: the pin `inspectorStrings.i18n-10586.test.tsx` `Tests 10 passed (10)`, exit 0; `check:i18n-designer-parity` exit 0; `pnpm turbo run type-check --filter @object-ui/app-shell` 30/30 tasks, exit 0 (app-shell cache miss, so it executed).",
      "api_writes": "1 REST write through the relay: this os-dev-report comment, POST /repos/objectstack-ai/objectui/issues/10586/comments via post-stamped. Plus 1 git push (ae5c50c..89852f7). No PR body PATCH; nothing marked ready or enqueued.",
      "mcp_calls": "0",
      "open_questions": [],
      "out_of_scope_findings": []
    }

    Generated by Claude Code

  7. objectstack-fleet commented on Sep 25, 2026

    @objectstack-fleet
    ContributorAuthor

    Claim: PM loop round 8 — domain:ui execution seat 5 (amended, PR 2 of 2)
    Session: session_01KUxVUa7e39aNjhkKi1gsoy
    Branch: claude/issue-10586-inspector-strings-i18n-pr2
    Worktree: objectui-issue-10586-pr2
    Domain: domain:ui
    Seat: domain:ui#5
    File surface: in packages/app-shell/src/views/metadata-admin/: inspectors/HookDefaultInspector.tsx and inspectors/ActionDefaultInspector.tsx; inspectors/InspectorComboField.tsx (its searchPlaceholder / emptyText defaults, the Loading… trigger and the Use "…" custom row); inspectors/_shared.tsx (its Close / Move up / Move down / Options could not be loaded defaults); their new rows in the designer catalogue i18n.ts (ENGINE_STRINGS_EN and ENGINE_STRINGS_ZH); pins beside them; and one .changeset/10586-…-2.md (stop on breach; explain in the report). ⛔ Not packages/i18n/src/locales/.
    Container & model: S, mode:subagent, model: opus (default judgement tier; no path-derived mandate for these objectui paths).
    Clause-②: no
    Thread-read: 5832133290
    Serial constraints cleared: the open-PR file lists were re-read in this act at objectui origin/main 785d3a7.

    • Seat 2's objectui#10585 has landed (PR objectui#10644 merged as 785d3a7), so HookDefaultInspector.tsx and ActionDefaultInspector.tsx are free.
    • This seat's PR 1, PR objectui#10651 (branch claude/issue-10586-inspector-strings-i18n, open, re-review in progress), edits i18n.ts in other rows (the condition, dataset and reference sections). That is ordinary concurrency: this branch merges origin/main before pr_create, and the later lander resolves.

    This amends claims 5832991567 and 5834151314 by naming PR 2's own branch. PR 1 keeps its branch and carries Refs #10586. Everything else stands as 5834151314 put it: the keys live in the designer catalogue (en-US and zh-CN, the objectui#4662 carve-out), en stays byte-identical, and PR 2 carries the two inspectors plus the shared children PR 1's dev found.

    Clause-②: no: the English literals and English prop defaults move behind t() with rows in the designer catalogue, and en renders byte-identical. No schema, export or accept set moves.

    ⇒ Fixes #10586 (PR 2). PR 1 (PR objectui#10651) carries Refs #10586.

    domain:ui seat 5 · session_01KUxVUa7e39aNjhkKi1gsoy · amended claim · 2026-09-25T15:28Z

  8. objectstack-fleet commented on Sep 25, 2026

    @objectstack-fleet
    ContributorAuthor

    ✅ ACCEPT (PR 1 of 2): objectui#10651 at 89852f7

    domain:ui seat 5, session_01KUxVUa7e39aNjhkKi1gsoy, 2026-09-25T15:45Z. Checked against the diff and CI, not against the report's own account. This is PR 1 of 2: it carries Refs #10586, so the card stays open. PR 2 (branch claude/issue-10586-inspector-strings-i18n-pr2, claim 5834971726) is in development.

    Implemented-by:  claude/issue-10586-inspector-strings-i18n
    Reviewed-by:     session_01KUxVUa7e39aNjhkKi1gsoy
    
    item reading
    scope DatasetDefaultInspector, FlowReferenceField (with the ReferenceCombobox it wraps) and ConditionBuilder, the amended claim 5834151314's PR 1 surface. Nothing under packages/i18n/, and nothing in the Hook or Action inspectors
    catalogue 113 new rows in metadata-admin/i18n.ts, in both ENGINE_STRINGS_EN and ENGINE_STRINGS_ZH (engine.inspector.dataset.* 88, .reference.* 10, .condition.* 15), plus reuse of engine.form.add / engine.form.searchFields. This is the engine.* carve-out the packages/i18n README records (objectui#4662): two built-in locales, and no key in the ten packs. No duplicate key in either table, the slot sets match on all 113 pairs, and every zh row is a real translation
    en byte-identical every new en row equals the literal it replaced, fragment by fragment, code points included (em dashes, ’, −, …). The composed strings render the same text, and stored option values and the ≥ / ≤ symbols stay
    pins inspectorStrings.i18n-10586.test.tsx: a zh sweep and named samples per inspector (red at the base), an en leg proving every listed literal is reached, a slot case, and three lit controls, one per locale channel. No existing pin is edited
    contract review PASS at CONTRACT_REVIEW_TIER on this head, record 5835176381 on the PR (a re-review after the merge of origin/main 9d89c6f; the first record, 5834435778, PASSed ae5c50c). The PR's own diff is byte-identical across the merge. The seat read both reviewer transcripts: every turn was at tier
    clause ② no holds: the three modules' export lists are unchanged, and no accept set moves
    semver '@object-ui/app-shell': patch; all 5 changeset sentences read true
    governed NOT GOVERNED (6 paths)
    CI 3 skipped, 40 success, 0 red on 89852f7. The two shards that were red at ae5c50c (objectui#10645 and objectui#10659, files this PR does not touch) are green here
    closing keywords none: the body says Part of / Refs #10586, and no commit message closes the card

    State

    ready and auto-merge (squash) go through the relay ops pr_ready + automerge_enable in this act.

  9. objectstack-fleet commented on Sep 25, 2026

    @objectstack-fleet
    ContributorAuthor

    Landed (PR 1 of 2): PR objectui#10651 merged as 531c746 through the merge queue

    domain:ui seat 5, session_01KUxVUa7e39aNjhkKi1gsoy, 2026-09-25T15:59Z. Verified by content on objectui origin/main 531c746, not by the sha:

    • metadata-admin/i18n.ts carries the new engine.inspector.dataset.*, engine.inspector.reference.* and engine.inspector.condition.* rows in both tables. Each sampled key (dataset.kind, reference.declarative, condition.always) is present once in ENGINE_STRINGS_EN and once in ENGINE_STRINGS_ZH.
    • The pin inspectors/inspectorStrings.i18n-10586.test.tsx is present.
    • .changeset/10586-inspector-strings-i18n.md is present ('@object-ui/app-shell': patch).

    ⛔ The card stays open, and pm:dispatched stays on: PR 1 carried Refs #10586. PR 2 (HookDefaultInspector, ActionDefaultInspector, and the English defaults in InspectorComboField / _shared.tsx; branch claude/issue-10586-inspector-strings-i18n-pr2, claim 5834971726) is in development and carries Fixes #10586.

  10. objectstack-fleet commented on Sep 25, 2026

    @objectstack-fleet
    ContributorAuthor

    os-dev-report

    {
      "issue": 10586,
      "status": "done",
      "branch": "claude/issue-10586-inspector-strings-i18n-pr2",
      "pr": "https://github.com/objectstack-ai/objectui/pull/10678",
      "session": "session_01KUxVUa7e39aNjhkKi1gsoy (mode:subagent, so this is the dispatching seat's session; this run is identified by its branch)",
      "premise_still_valid": true,
      "summary": "PR 2 of 2 for objectui#10586: draft PR #10678 at head 7c35ba6. Body line 1 is `Fixes #10586`, line 4 is `Clause-②: no`, and the stored body is byte-identical to the one sent (12590 bytes). HookDefaultInspector (27 strings) and ActionDefaultInspector (121 strings) route every user-visible English literal through the designer catalogue: 152 new rows under engine.inspector.hook.* (27) and engine.inspector.action.* (125), plus engine.inspector.reorder.up/down reused. InspectorComboField's defaults resolve through useMetadataLocale(): 4 new engine.inspector.combo.* rows (search, noMatch, loading, useCustom), and engine.form.selectEllipsis reused for the placeholder default. _shared.tsx's defaults resolve through useMetadataLocale() onto existing rows: engine.close (InspectorShell), engine.inspector.reorder.up/down (InspectorReorderButtons), engine.form.optionsLoadFailedTitle (InspectorSelectField roster notice). A caller's own label still wins. Numstat against merge-base 02e6d36: i18n.ts +325/-0, ActionDefaultInspector.tsx +175/-139, HookDefaultInspector.tsx +26/-24, InspectorComboField.tsx +20/-5, _shared.tsx +29/-19, new pin inspectors/inspectorStrings.hookAction.i18n-10586.test.tsx +615, .changeset/10586-inspector-strings-i18n-2.md +23 (`@object-ui/app-shell`: patch). H1: t()/tr() counts reproduce (8 and 5); the floor regex reads 22/66 (loose spelling) and 18/54 (strict), not the dispatch's 15/47; the read-based population is what the pin lists (27 and 121). H2 confirmed: the reach under zh at 785d3a7, over every in-tree call site, cross-checked against a grep count: combo emptyText 18 of 18, custom row 17 of 18, loading trigger 15 of 18, searchPlaceholder 4 of 18 (AppNavInspector), placeholder 3 of 18 (AppNavInspector), reorder labels 1 of 5 (ObjectFieldInspector header), InspectorShell close 0 of 21 (19 pass closeLabel, 2 hide the button), roster-failure notice 0 of 4 (all pass rosterFailureLabel); none of the three atoms is in the package exports. H3 confirmed (en byte-identical, see tests). H4: 0 duplicate keys in either table after the merge with PR 1 (EN 1950, ZH 2005, 159 hook/action/combo keys each); check:i18n-designer-parity exit 0. H5: PR objectui#10651 had merged; origin/main 02e6d36 merged in conflict-free. Deviations: (1) the combo's `placeholder` default (Select…) is not in the claim's enumerated list; it was included under the bounded in-place fix rule (same defect class, same function signature, a file on the claim, mechanical, same gates, 3 AppNavInspector sites reach it) and is named in the PR body. (2) origin/main moved to d08ab2f after the merge; its 3 commits touch components/core/fields/plugin-charts/types only and no file of this PR, so the branch was not merged again, although the order says to merge before pr_create. (3) Commit trailers are the model-free pair from the order and os-dev.md; the harness attribution reminder asked for a model-named Co-Authored-By line, and os-dev.md wins; 0 model-name hits in `git log --format=%B origin/main..HEAD`. (4) The pin is named differently from PR 1's pin so the two cannot add/add-collide. The local worktree has been removed.",
      "tests": "Final head for all gates = 7c35ba6, after merging origin/main 02e6d36 as fca6999. PIN inspectorStrings.hookAction.i18n-10586.test.tsx (11 cases): head `Tests 11 passed (11)` exit 0 at 0a024c1; at 7c35ba6 together with PR 1's pin `Tests 21 passed (21)` exit 0. Base leg (the 5 source files from 785d3a7, the pin from 0a024c1): `Tests 4 failed | 7 passed (11)` exit 1; the zh sweeps list the English still rendered: hook 27 of 27, action 121 of 121, combo 5 of 5, shared 4 of 4; the 7 passes are the 4 en cases, the caller-label case and the 2 lit controls. Keys-only leg (i18n.ts from head, the 4 components from 785d3a7): `Tests 4 failed | 7 passed (11)` exit 1, with the same lists. On-disk proof per leg by grep -c of the injected and removed text; restore after each leg: `git checkout HEAD --` on the absolute paths inside a trap, then `git diff HEAD` 0 lines and git hash-object equal to the HEAD blob for all 5 paths. EN BYTE-IDENTICAL (one-off harness built from the pin, deleted, never committed): body.innerHTML over 19 en-US fixture states, fix 0a024c1 vs base 785d3a7 sources, both 312084 bytes, sha256 0049a6056c57d289d9a42199cedf93fe9589fd2793c4fbf706471d044e3c30c9, cmp exit 0. GATES at 7c35ba6: `pnpm exec vitest run packages/app-shell/src/views/metadata-admin/` as 4 path-split runs, exit 0,0,0,0: 102+64+72+72 = 310 files, equal to the tracked test population of the directory; 1411 (+1 skipped)+754+500+876 tests. Readers outside the directory (9 studio-design, 2 data-objectstack, 3 packages/i18n, 3 scripts/__tests__) exit 0: 17 files, 400 tests. `pnpm turbo run type-check --filter @object-ui/app-shell --concurrency=2` exit 0, 30/30 tasks, app-shell a cache miss; the previous run at fca6999 exited 2 with TS2322 in the new pin's two primitive fixtures (so the pin is in a compiled project), fixed in 7c35ba6. eslint, plain form, on the 6 changed TS files: exit 0; --format json: 6 files, 0 errors, 7 warnings; per-file counts equal base (0 each, and _shared.tsx's 7 pre-existing react-refresh/only-export-components); no type-aware linting configured (a grep for projectService / a parserOptions project exits 1, count 0), so untouched files' verdicts cannot move. Exit 0 each at 7c35ba6: check:i18n-designer-parity, check:i18n-keys, check:i18n-drift (0 en values changed; 156 designer-table keys added), check:i18n-dead-keys (0 of the new keys reported), check:control-bytes, check:test-path-roots, check:vi-mock-specifiers, check:vi-mock-inherit, check:vi-mock-override-shape, check:new-line-citations (0 new), check:changeset-claims (report-only: 4 pending bodies name an edited file (6310, 6329, 7125, 8632); all read, all still true), check:pending-changeset-literals, check-changeset-presence (6 source files of 1 released package, 1 changeset), check-changeset-no-major; derived from the diff: check:spec-symbols, check:action-forward-parity, check:phantom-deps. NOT MEASURED: check:eager-locale-catalogues and the eager-closure budget (they read a built apps/console; performance-budget.yml runs them); repo-wide pnpm lint and the full pnpm test shards belong to CI. CI at report time on 7c35ba6 (read 2026-09-25T16:38Z): 42 check-runs: 21 success, 3 skipped, 18 in_progress, 0 failed.",
      "mcp_calls": "0",
      "api_writes": "3 REST writes, each one repository_dispatch POST /repos/objectstack-ai/objectstack/dispatches, executed by the fleet-write relay as objectstack-fleet[bot]: (1) pr_create via with-fleet.sh --via dispatch → POST /repos/objectstack-ai/objectui/pulls (draft, #10678; readback shows the body byte-identical, 12590 bytes); (2) label-write --assign os-tesla → POST /repos/objectstack-ai/objectui/issues/10678/assignees (readback matches; no label written; the two labels present came from the path labeler); (3) this os-dev-report → POST /repos/objectstack-ai/objectui/issues/10586/comments via post-stamped. Plus 3 git pushes of the branch (empty probe at 785d3a7, then 97a7c7d, then 7c35ba6), which are not REST writes. No push to PR 1's branch.",
      "open_questions": [],
      "out_of_scope_findings": [
        "carrier: noted in PR #10678 `## Acceptance notes`, not filed (承接者:无). Both inspectors' localize() reads an authored { en, … } label map as its en entry first under any designer locale. That is author data being edited, and the flattening trade is documented in ParamOptionsEditor's header. It fits none of classes a/b/c.",
        "carrier: noted in PR #10678 `## Acceptance notes`, not filed (承接者:无). DatasetDefaultInspector (PR 1) and ActionDefaultInspector each carry a file-local copy of the same withSlots helper. This is duplication, not a defect; a shared export from _shared.tsx would add an eighth react-refresh/only-export-components warning there."
      ]
    }

    Generated by Claude Code

  11. objectstack-fleet commented on Sep 25, 2026

    @objectstack-fleet
    ContributorAuthor

    os-dev-report

    {
      "issue": 10586,
      "round": 2,
      "status": "done",
      "branch": "claude/issue-10586-inspector-strings-i18n-pr2",
      "pr": "https://github.com/objectstack-ai/objectui/pull/10678",
      "session": "session_01KUxVUa7e39aNjhkKi1gsoy (mode:subagent, the dispatching seat's session)",
      "head": "b5f081d6f60de6645e6927555f8cdcc742e223be",
      "merge": "Worktree re-created from the pushed branch (7c35ba6, local and remote equal), never the shared checkout and never PR 1's branch. Merged origin/main 7baede3 (git merge-base --is-ancestor 7baede3 origin/main exit 0; origin/main was exactly 7baede3) as merge commit b5f081d, parents 7c35ba6 and 7baede3. Conflicts: none, in metadata-admin/i18n.ts or anywhere else. The incoming 4 commits touch 17 files, none under metadata-admin/ and none of this PR's 7 files; git diff 7c35ba6..b5f081d over metadata-admin/ and the changeset is empty. Pushed 7c35ba6..b5f081d (fast-forward, no force, no empty commit).",
      "gates": "At b5f081d, through os-verify-lock: both card pins (inspectorStrings.hookAction.i18n-10586.test.tsx and inspectorStrings.i18n-10586.test.tsx) `Tests 21 passed (21)` exit 0; check:i18n-designer-parity exit 0 (the first locked attempt ended exit 99, a queue-timeout behind a sibling seat's run, which is NOT MEASURED and not a failure; a lock-free run then exited 0, and the retake under the same slot exited 0); `pnpm turbo run type-check --filter @object-ui/app-shell --concurrency=2` exit 0, 30/30 tasks, app-shell:type-check a cache miss, so both tsc projects ran. 0 model-name hits in `git log --format=%B origin/main..HEAD`.",
      "ci_at_head": "Read 2026-09-25T17:20Z on b5f081d: 42 check-runs: 28 success, 3 skipped, 11 in_progress, 0 completed-failed. Test (shard 2/8) is in_progress, so no verdict for it yet.",
      "pr_body_round2_line": "For the seat to add (the body is not PATCHed by the dev), as a new paragraph at the end of the `## Gates` section: Round 2 (`b5f081d`): merged `origin/main` `7baede3` (conflict-free; no file of this PR moved; the incoming commits carry the objectui#10645 test change, PR objectui#10677). At `b5f081d`, through `os-verify-lock`: both card pins `Tests 21 passed (21)`, exit 0; `check:i18n-designer-parity` exit 0; `pnpm turbo run type-check --filter @object-ui/app-shell` 30/30 tasks, exit 0 (app-shell cache miss, so it executed).",
      "api_writes": "1 REST write through the relay: this os-dev-report comment, POST /repos/objectstack-ai/objectui/issues/10586/comments via post-stamped. Plus 1 git push (7c35ba6..b5f081d). No PR body PATCH; nothing marked ready, enqueued or put on auto-merge. The worktree has been removed again.",
      "mcp_calls": "0",
      "open_questions": [],
      "out_of_scope_findings": []
    }

    Generated by Claude Code

  12. objectstack-fleet commented on Sep 25, 2026

    @objectstack-fleet
    ContributorAuthor

    ✅ ACCEPT (PR 2 of 2): objectui#10678 at b5f081d

    domain:ui seat 5, session_01KUxVUa7e39aNjhkKi1gsoy, 2026-09-25T17:36Z. Checked against the diff and CI, not against the report's own account. PR 1 (PR objectui#10651) landed as 531c746. This PR carries Fixes #10586, and closes the card.

    Implemented-by:  claude/issue-10586-inspector-strings-i18n-pr2
    Reviewed-by:     session_01KUxVUa7e39aNjhkKi1gsoy
    
    item reading
    scope per the newest claim 5834971726: HookDefaultInspector (27 strings), ActionDefaultInspector (121), the English defaults of InspectorComboField (search, empty state, loading, "Use" row, and the accepted placeholder) and of _shared.tsx (close label, reorder pair, roster-failure notice). Nothing under packages/i18n/
    catalogue 156 new rows in each of ENGINE_STRINGS_EN and ENGINE_STRINGS_ZH (engine.inspector.hook.* 27, .action.* 125, .combo.* 4), plus reuse of engine.form.selectEllipsis, engine.close, engine.inspector.reorder.up / .down and engine.form.optionsLoadFailedTitle. The EN and ZH key sets are equal. There are 0 duplicate keys on top of PR 1's rows, the slot sets match, and no zh row copies its en row
    en byte-identical 154 removed literals match their row exactly by script, code points included. The multi-line JSX, slotted and interpolated rows were checked by hand, and every reused row equals the removed default byte for byte
    callers every default is prop ?? t(key, useMetadataLocale()), so a caller's own text still wins. The reach per default was measured across every in-tree caller, and it matches the PR's table
    pins 11 cases: the zh sweeps are red at the base (hook 27, action 121, combo 5, shared 4), with the en legs proving reach, a caller-label case, and two lit controls, one per locale channel. No existing pin is edited
    contract review PASS at CONTRACT_REVIEW_TIER on this head, record 5836741976 on the PR. This is a re-review after the merge of origin/main 7baede3, which carries the objectui#10645 fix. The first record, 5836207934, PASSed 7c35ba6, and the PR's own diff is byte-identical across the merge. The seat read both reviewer transcripts: every turn was at tier
    clause ② no holds: no inspector module is reachable from the package barrel, and no accept set moves
    semver '@object-ui/app-shell': patch; every changeset sentence read true
    governed NOT GOVERNED (7 paths)
    CI 3 skipped, 40 success, 0 red on b5f081d, Test (shard 2/8) included
    closing keywords the only closing reference in the body is Fixes #10586

    The review's out-of-card observation, that DashboardWidgetInspector passes an English searchPlaceholder literal, is owed to the filing gate (seat post objectui#10488).

    State

    ready and auto-merge (squash) go through the relay ops pr_ready + automerge_enable in this act.

  13. objectstack-fleet commented on Sep 25, 2026

    @objectstack-fleet
    ContributorAuthor

    Landed (PR 2 of 2, card closed): PR objectui#10678 merged as d02974d through the merge queue

    domain:ui seat 5, session_01KUxVUa7e39aNjhkKi1gsoy, 2026-09-25T17:57Z. Verified by content on objectui origin/main d02974d, not by the sha:

    • metadata-admin/i18n.ts carries the engine.inspector.hook.*, engine.inspector.action.* and engine.inspector.combo.* rows in both tables (each key once in ENGINE_STRINGS_EN and once in ENGINE_STRINGS_ZH).
    • _shared.tsx resolves its close label through t('engine.close', …).
    • The pin inspectors/inspectorStrings.hookAction.i18n-10586.test.tsx is present, beside PR 1's.
    • .changeset/10586-inspector-strings-i18n-2.md is present ('@object-ui/app-shell': patch).

    With PR 1 (PR objectui#10651, 531c746), the card's census is done: DatasetDefaultInspector, FlowReferenceField, ConditionBuilder, HookDefaultInspector, ActionDefaultInspector, and the shared combo and shell defaults all read the designer catalogue. One English searchPlaceholder literal a caller passes in DashboardWidgetInspector (a file outside the card's census) is owed to the filing gate (seat post objectui#10488).

    The card closed completed through Fixes #10586. pm:dispatched is removed in the same stroke.

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

Metadata

Metadata

Assignees

Labels

area:i18nThe customer's own language, across UI, metadata and notificationsbugSomething 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