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.

Delete the two spot-verified dead i18n namespaces: workflow.* (54 keys) and publicForm.demo.* (36 keys) across the ten packs #4742

Closed

Description

@yinlianghui

Part of #4730 — the mechanically-safe carve-out of its CONFIRMED tier. The umbrella card stays open for console.objectView.* (needs a product decision: is the ListViewSchema-backed settings panel meant to exist?) and the not-yet-spot-checked smaller namespaces (configPanel, renderer, table, report, search, form, …).

Scope — exactly two namespaces, both spot-verified on the umbrella card

  1. workflow.* — 54 of 58 keys CONFIRMED dead by scripts/check-i18n-dead-keys.mjs (the other 4 appear only as test-fixture mentions in ellipsis-glyph-3878.test.ts / untranslated-identity-4376.test.ts, not consumers — re-measure and handle per evidence: a fixture mention is not a reader). The plausible consumer, packages/plugin-designer/src/ProcessDesigner.tsx, hardcodes English labels and imports no translation hook at all — the vocabulary has zero i18n integration anywhere.
  2. publicForm.demo.* — 36/36 CONFIRMED, zero hits anywhere in the repo outside the locale packs.

Evidence standard is #4658's (PR #4731): zero call sites per the AST pass, zero textual footprint per the safety net, plus a spot-checked plausible consumer confirming no wiring exists. Re-run node scripts/check-i18n-dead-keys.mjs at your tree first — the numbers will have drifted since the umbrella card's measurement (today's merges added keys).

Deliverables

  • Delete the two namespaces from all ten packs (packages/i18n/src/locales/*.ts).
  • Post-deletion, check-i18n-dead-keys.mjs no longer lists either namespace; check-i18n-call-site-keys.mjs stays green (nothing referenced them — that is the point); check-i18n-en-drift abstains (deletions are parity's business).
  • The four workflow.* test-fixture mentions: update the fixtures to use live keys if the fixtures merely need a key, or delete the fixture rows if they exist to pin those specific keys — judge by what each test asserts and say which in the PR body.
  • Changeset: @object-ui/i18n patch, stating the count and that no reader exists.

Explicitly out of scope

PR discipline

PR body first line: Part of #4730 — no closing keyword anywhere; this card is the one the PR closes (Fixes #<this> as sole closing keyword on line 2).

Activity

  1. self-assigned this
    on Aug 15, 2026
  2. yinlianghui commented on Aug 15, 2026

    @yinlianghui
    ContributorAuthor

    Dispatched by the repo:objectui PM seat (session session_01RnQd8iMMUwXQEV1crFmQiQ), branch claude/issue-4742-dead-namespace-deletion. Carved out of #4730 under delegated adjudication (no-consumer retirement family precedent: #4152 → #4241 → #4659; evidence standard from #4658 / PR #4731). Maintainer veto window open as always.

    Adjudication. Deletion-class, two namespaces only, per the card. Re-measure first at your tree — the umbrella's numbers predate today's merges.

    Mechanism assumptions (from the umbrella card, re-verify): ProcessDesigner.tsx has zero translation imports (the whole workflow.* vocabulary has no reader); publicForm.demo.* has zero textual footprint outside the packs; the dead-keys sweep's CONFIRMED tier plus the text safety net is the measuring instrument, and it must be re-run both before (scope) and after (proof of removal) the deletion.

    Review note: deletion-class means the PM will independently re-test the reference faces on origin/main before ACCEPT — leave the exact commands you used in the PR body so the re-test is a re-run, not a reconstruction.


    Generated by Claude Code

  3. yinlianghui commented on Aug 15, 2026

    @yinlianghui
    ContributorAuthor
    {
      "issue": 4742,
      "branch": "claude/issue-4742-dead-namespace-deletion",
      "pr_number": 4743,
      "pr": "https://github.com/objectstack-ai/objectui/pull/4743",
      "head_sha": "c0a3ba7b8f6f1495f79f8bb0226220396e0e4119",
      "status": "done",
      "premise_still_valid": true,
      "summary": "Deleted `workflow.*` (58 keys) and `publicForm.demo.*` (36 keys) from all ten locale packs — 94 keys x 10 packs = 940 strings, no reader anywhere. Re-measured before touching anything: the umbrella's per-namespace numbers still hold on today's tree (54/4 and 36/0), only the totals drifted (2927 -> 2933 pack keys, 13776 -> 13811 referenced). After deletion the sweep reports exactly -94 pack keys, -90 CONFIRMED, -4 NEEDS-REVIEW, and neither namespace appears. No key in either namespace had a live reader, so nothing was excluded. The four `workflow.*` fixture mentions were pinning those specific keys (a converged-key census and a key-level allowlist), not merely using a key, so their rows were deleted rather than re-pointed — stated with reasoning in the PR body.",
      "mechanism_assumptions_checked": [
        "ProcessDesigner.tsx has zero translation imports — CONFIRMED: `grep -cE 'useTranslation|useObjectTranslation|useDesignerTranslation|@object-ui/i18n|react-i18next'` returns 0 (exit 1). It hardcodes the same vocabulary in English. Strengthened: six sibling components in the same package DO use a translation hook, so this is one unwired component, not a package with no i18n.",
        "publicForm.demo.* has zero textual footprint outside the packs — CONFIRMED, and stronger than stated: `grep -rF 'publicForm.demo'` returns zero hits repo-wide including the packs, because the packs nest it as an object literal and never spell the dotted form.",
        "workflow.* textual footprint — CONFIRMED: all 58 keys greped as fixed strings across the repo return exactly the four known fixture mentions (ellipsis-glyph-3878.test.ts x2, untranslated-identity-4376.test.ts x2) and nothing else.",
        "The dead-keys sweep is the measuring instrument, run before (scope) and after (proof) — DONE, both as --json, deltas exact and fully accounted for.",
        "Independent AST cross-check beyond the script: no `t()`/`tt()` call site and no object-path access (`.workflow` / `.publicForm` / `.demo`) names either namespace anywhere in packages/apps/examples/e2e.",
        "Beyond the card: sibling repo ../objectstack has zero references (its one `workflow.` hit is the filename workflow.zod.ts); neither i18n baseline JSON (en-drift, call-site) names a key in either namespace, so no waiver ledger is left dangling.",
        "Reverse verification, fix committed first: reverting ONLY the two fixture files to origin/main while keeping the pack deletions turns both guards red by name (`en workflow.fromPlaceholder missing`, `these allowlist entries no longer match any identity: ['workflow.webhook', ...]`). Expected direction red, observed red. Restored from the branch; `git diff --stat HEAD` empty; suite re-run green from the restored state."
      ],
      "gates": {
        "check-i18n-dead-keys": "green — neither namespace listed; 2933 -> 2839 pack keys, 626 -> 532 candidates, 384 -> 294 CONFIRMED, 242 -> 238 NEEDS-REVIEW",
        "check-i18n-call-site-keys": "green (exit 0) — 2415/2415 literal keys resolve against the en pack (2839 keys)",
        "check-i18n-en-drift": "green (exit 0), abstains as designed — '0 en value(s) changed (0 added, 94 removed — those are all-locales-key-parity's)'",
        "i18n test suite (pnpm exec vitest run packages/i18n/)": "green — 45 files, 804 tests passed, including all-locales-key-parity, ellipsis-glyph-3878 and untranslated-identity-4376",
        "pack-consumer sweep outside packages/i18n": "green — 17 files, 236 tests passed (the three script gates' own tests plus every file importing builtInLocales)",
        "type-check (@object-ui/i18n)": "green (exit 0), after building the dep closure `pnpm --filter '@object-ui/i18n^...' build` in the fresh worktree",
        "lint (@object-ui/i18n)": "green — 0 errors; 35 pre-existing warnings, none in any file this PR touches",
        "check-changeset-presence": "green — 12 source files changed, 1 changeset declared",
        "check-changeset-fixed / check-changeset-no-major": "green (exit 0 both)",
        "check-control-bytes": "green — 4260 tracked text files scanned",
        "CI on the draft PR": "in_progress — reported at draft-PR time per the dispatch contract, not waited on"
      },
      "deviations": [
        "One bounded in-place fix, named in the PR body: untranslated-identity-4376.test.ts's header said '22 keys below' while the list held 23 on origin/main (nothing asserts the number). My deletion moves the same sentence again, so the count was removed from the prose rather than restated — the list is its own count and the file's own `no dead entries` assertion keeps it honest. Same file, same defect class, mechanical, no new verification surface.",
        "`skip-changeset` label NOT applied, per the dispatch's explicit instruction (this overrides the standing dev-contract clause); the PR carries a real @object-ui/i18n patch changeset instead."
      ],
      "followups_filed": [],
      "observations_for_umbrella_4730": [
        "The PARENT `publicForm.*` namespace is itself largely unread: 12 CONFIRMED and 7 NEEDS-REVIEW of its 19 remaining keys, with no t() call site anywhere in packages/ or apps/ (the live-looking `submit`, `submitting`, `poweredBy` reach the NEEDS-REVIEW tier only through i18n fixture mentions). Left untouched — it is the umbrella's namespace-by-namespace pass, not this carve-out. No separate issue filed: it is inside #4730's stated completion scope and filing would duplicate it."
      ]
    }

    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

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions