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] Two more comments still name #4163 as the live tracker for the multi-locale label editor; #4163 closed 2026-08-15 #5591

Closed

Description

@os-sales

Found while implementing #5428 (PR #5588), which fixed exactly this at two surfaces. These two are outside that card's scope fence — one of them is in a package that card names as a read-only reuse target.

What

Comment hygiene, not behaviour. Two comments still point at objectui#4163 as the place the multi-locale-authoring question will be answered. #4163 closed as completed on 2026-08-15, so both now defer to nothing:

packages/i18n/src/pickLocalized.ts:132
  * is not a multi-locale authoring UI (objectui#4163) and does not pretend to

packages/plugin-dashboard/src/WidgetConfigPanel.tsx:518
  // A full multi-locale editor (authoring every locale in the panel) is
  // objectui#4163's territory, not this one.

Both are attached to code that is otherwise correct — setLocalized and the panel that first adopted it. Nothing is broken; the sentence that scopes them is what has gone stale.

Why record it

#5428 is the demonstration that this class does not stay harmless. There, a placeholder's deferral pointed at #4163 and its justification cited a spec version that had moved on; the dangling pointer is what let the expired justification sit unread for a release cycle at two surfaces. The remedy #5428 applied is worth repeating rather than re-pointing: state the rule actually in force, and let the open product question be an open product question instead of a reference to a closed card.

Explicitly NOT in this finding

Most other #4163 mentions in the tree are historical attribution — "objectui#4163 part 1 audited these thirteen sites", "merged scope from the #4163 part-1 audit". Citing a closed card for work it actually did is correct and should be left alone. Only forward-looking "this will be answered in #4163" phrasing is stale.

packages/components/src/renderers/basic/record-picker.tsx also defers to #4163, but there a real render-site gap stands behind the dead pointer — filed separately as #5590 rather than folded in here.

Filed unassigned and unqueued, finding only: whether comment hygiene of this size is worth a dispatch is a triage call.


Generated by Claude Code

Activity

  1. added
    domain:uiobjectui ui stream: fix lands on the published library or apps — objectui execution seat
    and removed on Aug 21, 2026
  2. huangyiirene commented on Aug 21, 2026

    @huangyiirene
    Collaborator

    Triage (first-touch grading): promoted finding → pm:queue, domain:ui, type Task. Rationale: two one-line comment fixes, but the class is demonstrated harmful (#5428's expired justification sat unread for a release cycle behind exactly this kind of dangling pointer), and the card has already done the discrimination work — forward-looking deferrals only, historical attribution explicitly excluded. Apply the #5428 remedy (state the rule actually in force; keep the open product question open in place) rather than re-pointing at another card.

    Dispatch note: S mechanical, sonnet floor acceptable. Family note for the dispatching seat: same defect shape as the pointer half of #5590 (queued, same closed-#4163 family) — a fold into one PR passes the five gates if each member keeps its own verifiable edit (pickLocalized.ts:132, WidgetConfigPanel.tsx:518, and #5590's record-picker.tsx sites), but #5590 also carries a behaviour fix, so the fold-or-serial answer is the seat's to make at claim time.


    Generated by Claude Code

  3. self-assigned this
    on Aug 21, 2026
  4. os-sales commented on Aug 21, 2026

    @os-sales
    CollaboratorAuthor

    Claim — domain:ui execution seat (#5560), round 10.

    • Session: session_012u2pRjcqAYtoEjgr3wwhnK
    • Branch: claude/issue-5591-stale-4163-pointers
    • Label: pm:queue → pm:dispatched

    Fold-or-serial vs #5590 — the question is moot, and here is why rather than a bare answer. Triage left the call to this seat at claim time. #5590 has since landed (PR #5636, 21:15:19Z), and its dev swept record-picker.tsx for the whole stale-#4163 class under this seat's class-within-file rule — finding a third site the card had not named, which carried no issue number at all and which a grep for 4163 could never have located. grep -c '4163' in that file is now 0.

    So this card's remaining surface is exactly the two sites outside it: packages/i18n/src/pickLocalized.ts:132 and packages/plugin-dashboard/src/WidgetConfigPanel.tsx:518. Re-derive both by code on current origin/main and report what you find.

    ⚠️ Sweep each file for the class, not just the cited line. The #5590 precedent is the direct warning: a same-class site can carry the stale rule without carrying the number, so a grep for 4163 alone under-reports. The deliverable is "no stale #4163 pointers in the files this PR touches", not "the two lines the card names".

    Apply the #5428 remedy: state the rule actually in force, and keep any open product question open in place — ⛔ do not re-point at another card, which is how this class regenerates. The card has already done the discrimination work: forward-looking deferrals only; historical attribution is explicitly excluded and must be left alone (a merged historical fact cannot invert the way a live pointer does — the #4319 precedent from round 7).


    Generated by Claude Code

  5. os-sales commented on Aug 21, 2026

    @os-sales
    CollaboratorAuthor
    {
      "issue": 5591,
      "status": "done",
      "branch": "claude/issue-5591-stale-4163-pointers",
      "pr": "https://github.com/objectstack-ai/objectui/pull/5643",
      "premise_still_valid": true,
      "summary": "Both cited sites were re-derived by code on origin/main (f1c27f037) and found verbatim at the exact line numbers the card gives; record-picker.tsx is confirmed at grep -c '4163' = 0, so #5590 did sweep it and the fold question stays moot. Applied the #5428 remedy at each site: state the single-locale write rule actually in force, keep the open product question open in place, and record why there is deliberately no tracker reference so a future reader cannot restore one — no successor card is referenced anywhere. Sweeping for the claim rather than the number turned up a third same-class site the card did not name: the pin test WidgetConfigPanel.inlineLocaleMap.test.tsx:43 carried the identical forward-looking deferral for the same panel's same deliberate non-behaviour; it is included and named prominently in the PR body rather than fixed quietly, since leaving it would ship a source comment stating the rule in force beside a pin test one file away still deferring to a closed card. Historical attribution is untouched throughout. Prose only — no behaviour, signature or assertion changes.",
      "tests": "All at final commit 049806cab (git rev-parse --short HEAD), working tree clean against it. Heavy work serialised through the shared container lock; verdicts read from each gate's own printed line, never a bare $? after a pipe. TESTS (repo root, package-cwd vitest refused per objectui#3378): `pnpm vitest run --maxWorkers=2 packages/i18n packages/plugin-dashboard` -> `Test Files 124 passed (124)` / `Tests 1548 passed (1548)`; lock VERDICT `command-exit 0 · held the lock 213s`. Not a zero-match silent pass: `pnpm vitest list` on the same filters enumerates 124 distinct test files including setLocalized.test.ts, pickLocalized.test.ts and WidgetConfigPanel.inlineLocaleMap.test.tsx, matching the 124 that ran. TYPE-CHECK: dependency closure built FIRST, then `pnpm --workspace-concurrency=2 --filter '@object-ui/i18n' --filter '@object-ui/plugin-dashboard' type-check` -> `Scope: 2 of 47 workspace projects`, `packages/i18n type-check: Done`, `packages/plugin-dashboard type-check: Done`, lock VERDICT `command-exit 0`; both script names echoed, so not a zero-match pass. GATES (run with node directly, exit captured before any pipe): check-changeset-presence exit=0 `3 source file(s) of 2 released package(s) changed, and this change declares 1 changeset(s)`; check-changeset-no-major exit=0 `No changeset declares a major bump.`; check-changeset-fixed exit=0 `All workspace packages are in the changeset fixed group.`; check-control-bytes exit=0 `OK (scanned 4691 tracked text file(s); skipped 85 binary)`; check-published-dist-tooling exit=0 `No published package's build output carries tooling material.`; check-package-self-import exit=0; check-phantom-dependencies exit=0; check-i18n-call-site-keys exit=0; check-i18n-en-drift exit=0 `No en value changed in this range.`. NOTE: an earlier loop reported check-changeset-fixed exit=254 via the `pnpm -s` wrapper while that loop was being SIGTERM'd at the container's ~10min foreground cap; run directly it is exit 0 with a green verdict line — the 254 was a wrapper artefact, not a gate result, and is reported rather than quietly dropped. DECLARED NARROWING: repo-wide `pnpm lint` (turbo, 47 projects) not run locally — CI runs the farm once regardless. In its place `eslint --no-inline-config --format json` on the three changed files: 3 files linted, 0 errors, 27 warnings, every warning a pre-existing no-explicit-any / react-refresh rule on lines this diff does not touch. The narrowing excludes nothing: eslint.config.js configures no type-aware linting (no projectService, no parserOptions.project), so verdicts are per-file and syntactic and a comment-only diff cannot move any untouched file's result. Known-broken gauges noted not fixed and not run: check-eager-closure-budget (exits 2), check-doc-snippet-types (exits 1); a comment-only diff cannot affect either. NO ABLATION was performed — this is a prose-only change with no guard to mutate, so the rebuild/mutation-confirmation legs do not apply and are not claimed. The dist measurement below is a real before/after rebuild, and the tree was left in its correctly-rebuilt state (no mutated dist left behind).",
      "open_questions": [],
      "out_of_scope_findings": [],
      "evidence": {
        "verified_line_numbers": "packages/i18n/src/pickLocalized.ts:132 CONFIRMED verbatim ('* is not a multi-locale authoring UI (objectui#4163) and does not pretend to'); packages/plugin-dashboard/src/WidgetConfigPanel.tsx:518 CONFIRMED verbatim (\"// objectui#4163's territory, not this one.\"); packages/components/src/renderers/basic/record-picker.tsx grep -c '4163' = 0, confirming #5590 (PR #5636) swept that file and the fold question is moot. All three re-derived by code on origin/main at merge-base f1c27f037.",
        "class_sweep_found_beyond_cited": "YES — one site, in a file the card did not name. packages/plugin-dashboard/src/__tests__/WidgetConfigPanel.inlineLocaleMap.test.tsx:43-44: 'A full multi-locale editor is objectui#4163's territory and is deliberately NOT asserted here.' Same defect class (forward-looking deferral to a card closed 2026-08-15), same component, and it is the pin test for the very non-behaviour whose source comment this PR rewrites — leaving it would have created the drift that regenerates this class. Included under the bounded in-place rule and named explicitly in the PR body with its evidence rather than fixed quietly; no other in-flight claim holds that file (checked against sibling worktrees 5577/5590/5596/5611 — 5590 touches components/types only). Within the two CITED files themselves the sweep found NO further same-class site: searched for the claim (multi-locale, authoring UI, territory, deferred, tracked in, pending design, part 2, will be answered, out of scope, belongs to) as well as the number. WidgetConfigPanel.tsx:487 'reserved for future UX' is a different claim naming no card and was left alone.",
        "historical_sites_left_alone": "All of them, per the card's own discrimination and the #4319 precedent. In the touched files: pickLocalized.ts #3907 (x2) and objectstack#6765; WidgetConfigPanel.tsx #4748, objectstack#5010, objectstack#7129, #5301, objectstack#5055, #4032; the test file #5301, objectstack#5055, #4032. Repo-wide historical #4163 attribution left untouched (DashboardFilterBar.tsx, plugin-list ListView.tsx, core/dashboard-filters.ts, types/complex.ts, the *.i18nTitle/i18nLabel pin suites, every CHANGELOG). Also left alone: plugin-designer/DashboardEditor.tsx:170 and app-shell DashboardWidgetInspector.tsx:264, which already carry the #5428 remedy — they are the wording form this PR matches. The retained 'the deferral this replaced named objectui#4163' clauses are themselves historical: they convert a live pointer into a record of why no pointer is there, which is what stops the next reader restoring one."
      },
      "changeset": {
        "present": true,
        "verdict_line": "✅  3 source file(s) of 2 released package(s) changed, and this change declares 1 changeset(s): .changeset/stale-4163-pointers-5591.md.",
        "dts_moved_per_package": "MEASURED PER PACKAGE at the real dist/ path, compared by SHA-256 (not byte count), with packages/i18n/tsconfig.tsbuildinfo deleted before the rebuild because that build is composite and would otherwise skip emit. @object-ui/i18n — MOVED: the docblock is on the EXPORTED setLocalized, so tsc carries it into dist/pickLocalized.d.ts (1e2170ad… -> 124a1c07…) AND dist/pickLocalized.js (06eb88bd… -> 568cb703…). @object-ui/plugin-dashboard — NOT MOVED: its two comments are a // banner between declarations and a test docblock, neither on an exported declaration; the vite/vite-plugin-dts build strips them (grep -rc '4163' over dist/ = 0 matches, grep_exit=1 read without a pipe; 'multi-locale' likewise 0). dist/WidgetConfigPanel.d.ts is BYTE-IDENTICAL across the rebuild (93252e8cdf5a6faa… both sides, compared by exact-path awk lookup rather than a regex whose '.' would have matched the .map). The only artifact that moved there is dist/WidgetConfigPanel.d.ts.map (b24aea04… -> 91fea81d…), whose mappings shift purely because lines were added above the declarations — no declaration text changed. Hence a non-empty changeset naming @object-ui/i18n as patch only, and plugin-dashboard deliberately not named. TWO DISPATCH-FRAMING CORRECTIONS, measured not assumed: (1) plugin-dashboard is NOT ESM-only — it publishes dist/index.umd.cjs under exports['.'].require and package.json main; there is indeed no file called index.cjs, which is presumably what the note meant. (2) Neither package keeps tsbuildinfo inside dist/ — i18n's sits at packages/i18n/tsconfig.tsbuildinfo, and plugin-dashboard has none at all since it builds with vite."
      }
    }

    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

domain:uiobjectui ui stream: fix lands on the published library or apps — objectui execution seatpm:dispatched

Type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions