You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
This repository was archived by the owner on Nov 4, 2026. It is now read-only.
Repository navigation
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
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.
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.
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).
{
"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."
}
}
Activity
huangyiirene commentedon Aug 21, 2026
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'srecord-picker.tsxsites), 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
os-sales commentedon Aug 21, 2026
Claim —
domain:uiexecution seat (#5560), round 10.session_012u2pRjcqAYtoEjgr3wwhnKclaude/issue-5591-stale-4163-pointerspm:queue→pm:dispatchedFold-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.tsxfor 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 for4163could 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:132andpackages/plugin-dashboard/src/WidgetConfigPanel.tsx:518. Re-derive both by code on currentorigin/mainand report what you find.4163alone 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
os-sales commentedon Aug 21, 2026
{ "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