Skip to content

docs(i18n): state the import rule the placeholder-spelling suite actually obeys - #8418

Merged
baozhoutao merged 1 commit into
mainfrom
claude/issue-8029-i18n-fallback-header-import-claim
Sep 7, 2026
Merged

baozhoutao merged 1 commit into
mainfrom
claude/issue-8029-i18n-fallback-header-import-claim

Conversation

@baozhoutao

Copy link
Copy Markdown
Contributor

Fixes #8029

Comment-only. One paragraph of packages/i18n/src/__tests__/fallback-placeholder-spelling-3512.test.ts's header, plus a changeset declaring no release. No assertion, no runtime source, no gate moved.

The falsification, verified on origin/main at 4b5e07a53 before editing

The header's ## Why this file lives in @object-ui/i18n when two of its surfaces do not said, of this file:

This file imports nothing outside its own package: it READS the source files as text and parses them, which is not a module dependency in either direction.

The file's actual import list today (lines 136-143):

vitest
node:path
node:url
@object-ui/test-support/defaults-table-scan   <- outside its own package
./placeholder-spelling-rule                    (same package; arrived with objectui#7310)
../locales                                     (same package)

The @object-ui/test-support import arrived with objectui#7884, when the defaults-table walk moved there so this gate and objectui#4401's would ask their question of one population — which the same header already describes correctly a hundred lines further down. So the sentence was false, and self-contradicted within one document.

What the file actually obeys, and how that was derived from the tree

The sentence is load-bearing: it is the stated reason this file may live in @object-ui/i18n rather than move to app-shell like defaults-maps-mirror-en-pack.test.tsx. So it is rewritten rather than deleted, and the invariant it now states is direction, not absence.

Derivation — four measurements on this tree:

  1. The sibling's imports are what moved it, and they are not the test-support one. packages/app-shell/src/__tests__/defaults-maps-mirror-en-pack.test.tsx imports @object-ui/plugin-detail, @object-ui/plugin-list, @object-ui/plugin-designer — and @object-ui/test-support/defaults-table-scan, the very same import. The shared import is therefore provably not the discriminator.
  2. The three plugin packages each declare @object-ui/i18n, so importing them from inside i18n inverts the dependency:
    • plugin-detail — dependencies
    • plugin-designer — dependencies
    • plugin-list — peerDependencies and devDependencies
  3. @object-ui/test-support declares no @object-ui/* dependency in any of its four fields, and is private: true, never published — no path back to @object-ui/i18n exists. (plugin-detail and plugin-list themselves take it as a devDependency, which puts it below both.)
  4. The reach and ship conditions are already written down elsewhere in the tree: defaults-table-scan.ts's own header records that parking the walk in either caller "would either invert a dependency or force a deep subpath import into another package's src/__tests__/, the shape objectui#4325 ruled out"; packages/i18n/tsconfig.json excludes **/__tests__/** from the emitting program (check:published-tsconfig-exclude); and check-phantom-dependencies.mjs judges that same tooling tier against dev dependencies rather than runtime ones, "on the ground that no consumer ever resolves such a file".

⇒ The rewritten paragraph states it as three checks a new import has to pass — direction (the imported package must not depend on @object-ui/i18n, directly or transitively), reach (a declared exports subpath, never a deep path into another package's tests), ship (a devDependency, imported from a file under __tests__/) — and keeps separate the property that is still true and still load-bearing: the gated surfaces (defaults tables, needle files) are read as text and parsed, never imported. Only the walk that discovers them is an import.

A premise in the card that did not survive contact with the tree

The card's "Shape of a fix" and the triage comment both name "scripts/placeholder-spelling.mjs-shaped helpers (since #7310)" as a second example of a dependency pointing away. No such file exists. objectui#7310 (PR #8028) put the rule in packages/i18n/src/__tests__/placeholder-spelling-rule.ts — inside this package — and scripts/__tests__/placeholder-spelling-parity.test.ts reaches into it by relative path. That file's own header records why the scripts/-side option was measured and rejected in both directions (TS2307 / ERR_MODULE_NOT_FOUND one way, TS7016 for lack of allowJs the other). The rewritten paragraph therefore does not cite it.

⛔ Not covered by any gate

Comment accuracy is not mechanically checkable here, which is how the old sentence survived objectui#7884 for as long as it did. This PR does not change that, and the paragraph now says so in its last line rather than leaving an implied "now covered". Adding a gate for it was not in scope and no obvious one exists.

Changeset

node scripts/check-changeset-presence.mjs asks for one (the edited file is under a released package's src/), so .changeset/i18n-header-import-rule-8029.md carries an empty frontmatter — the explicit "releases nothing" declaration, which is a first-class pass, not a workaround. Not guessed: the gate went from EXIT=1 to EXIT=0 on adding it.

Verification (real output; heavy runs through the shared lock)

packages/i18n — the package that owns the edited file:

os-verify-lock: VERDICT command-exit 0 - held the lock 15s - waited 0s
 Test Files  62 passed (62)
      Tests  1036 passed (1036)

Dependency-closure build + this package's type-check, whose tsconfig.test.json includes src/**/*.test.ts, so the edited file is a program input rather than merely adjacent to one:

os-verify-lock: VERDICT command-exit 0 - held the lock 23s - waited 0s
> @object-ui/i18n@17.6.0 type-check
> tsc --noEmit && tsc -p tsconfig.test.json

The four suites elsewhere in the tree that name this file, run explicitly rather than assumed unaffected:

os-verify-lock: VERDICT command-exit 0 - held the lock 22s - waited 1s
 Test Files  4 passed (4)
      Tests  160 passed (160)

Repo lint, run in full rather than narrowed:

os-verify-lock: VERDICT command-exit 0 - held the lock 186s (3m06s) - waited 0s
 Tasks:    47 successful, 47 total

Gates:

node scripts/check-changeset-presence.mjs      EXIT=0   (1 changeset, empty frontmatter)
node scripts/check-control-bytes.mjs           EXIT=0   (6662 tracked text files)
node scripts/check-governed-queue-guard.mjs    EXIT=0   NOT GOVERNED - 2 paths, 5 surfaces, none matched
pnpm check:published-tsconfig-exclude          EXIT=0   34 enforced packages carry the directory form
pnpm check:phantom-deps                        EXIT=0   40 packages, 20422 specifiers

The last two are not incidental: they are the two gates the new paragraph cites, re-run so the citations are true as of this commit. Exit codes captured before any pipe.

Every changed line in the .ts file is a block-comment line — measured, not asserted: git diff HEAD~1 -- <that file> | grep -E '^[+-]' | grep -v '^[+-][+-][+-]' | grep -vcE '^[+-] \*' returns 0.

Status

Stays draft by dispatch instruction; the governed-surface guard reports this diff as not governed.

🤖 Generated with Claude Code

Generated by Claude Code


Generated by Claude Code

`fallback-placeholder-spelling-3512.test.ts`'s header claimed the file
"imports nothing outside its own package". It has imported
`@object-ui/test-support/defaults-table-scan` since objectui#7884, when
the defaults-table walk moved there so this gate and objectui#4401's
would ask their question of one population -- a change the same header
already described correctly a hundred lines further down.

The sentence is load-bearing: it is the stated reason this file may live
in `@object-ui/i18n` rather than move to `app-shell` like
`defaults-maps-mirror-en-pack.test.tsx`. Read as written it declares a
rule the file itself breaks, so the paragraph now states the invariant
that actually holds -- DIRECTION, not absence -- as three checks a new
import has to pass: the imported package must not depend on
`@object-ui/i18n` (test-support declares no `@object-ui/*` dependency at
all and is `private: true`); it must be reached through a declared
`exports` subpath, not a deep path into another package's tests; and it
must not reach a consumer (devDependency, imported from `__tests__/`,
which this package's build tsconfig excludes).

Comment-only. No assertion, no runtime source and no gate changed.

Fixes #8029

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FhBNJcLRZLe8M87VcUgpKr
@github-actions

github-actions Bot commented Sep 7, 2026

Copy link
Copy Markdown
Contributor

✅ Console Performance Budget

Metric Value Budget
Eager closure (gzip, 50 chunks) 3472.5 KB 3512.7 KB
Main entry chunk (gzip) 143.9 KB 350 KB
Entry file index-BeaSh76w.js —
Status PASS —

The eager closure is every chunk the entry reaches through static imports — what the browser fetches and parses before the app renders. The entry chunk on its own is a small fraction of it.


📦 Bundle Size Report

Package Size Gzipped
app-shell (consoleActionDispatch.js) 0.20KB 0.19KB
app-shell (index.js) 15.67KB 5.75KB
app-shell (runtime-config.js) 20.68KB 7.36KB
app-shell (types.js) 0.01KB 0.04KB
app-shell (urlParams.js) 10.06KB 3.86KB
auth (ActiveOrganizationStorage.js) 25.05KB 9.16KB
auth (AuthContext.js) 0.31KB 0.24KB
auth (AuthGuard.js) 2.07KB 1.00KB
auth (AuthProvider.js) 40.18KB 10.59KB
auth (AuthShell.js) 3.49KB 1.40KB
auth (ForgotPasswordForm.js) 12.21KB 3.45KB
auth (LoginForm.js) 18.15KB 5.39KB
auth (PreviewBanner.js) 0.90KB 0.50KB
auth (RegisterForm.js) 6.65KB 2.22KB
auth (SocialSignInButtons.js) 9.61KB 3.89KB
auth (UserMenu.js) 3.41KB 1.23KB
auth (auth-gate-events.js) 1.29KB 0.66KB
auth (authStyles.js) 5.04KB 1.72KB
auth (createAuthClient.js) 40.21KB 10.80KB
auth (createAuthenticatedFetch.js) 8.46KB 3.43KB
auth (index.js) 3.19KB 1.44KB
auth (invitation-status.js) 1.22KB 0.70KB
auth (org-roles.js) 6.66KB 2.78KB
auth (phone-identifier.js) 1.11KB 0.66KB
auth (types.js) 0.59KB 0.35KB
auth (useAuth.js) 5.30KB 1.02KB
auth (useWorkspaceAdminStatus.js) 5.13KB 2.35KB
collaboration (CommentThread.js) 26.08KB 7.56KB
collaboration (LiveCursors.js) 3.17KB 1.27KB
collaboration (PresenceAvatars.js) 6.49KB 2.64KB
collaboration (PresenceProvider.js) 2.79KB 1.13KB
collaboration (index.js) 1.68KB 0.73KB
collaboration (useCollaborationTranslation.js) 6.05KB 2.52KB
collaboration (useCommentSearch.js) 1.98KB 0.88KB
collaboration (useConflictResolution.js) 7.75KB 1.86KB
collaboration (useMentionNotifications.js) 1.81KB 0.68KB
collaboration (usePresence.js) 6.33KB 1.84KB
collaboration (useRealtimeSubscription.js) 7.91KB 2.01KB
components (index.js) 498.55KB 114.03KB
core (index.js) 7.48KB 2.96KB
create-plugin (index.js) 10.12KB 3.28KB
data-objectstack (index.js) 189.15KB 52.56KB
fields (index.js) 243.15KB 61.40KB
i18n (LocalizationContext.js) 1.76KB 0.96KB
i18n (builtinAggregateLabels.js) 0.86KB 0.49KB
i18n (currency.js) 1.22KB 0.64KB
i18n (fallbackInterpolation.js) 6.25KB 2.77KB
i18n (i18n.js) 6.57KB 2.76KB
i18n (index.js) 3.65KB 1.47KB
i18n (pickLocalized.js) 7.62KB 3.26KB
i18n (provider.js) 26.89KB 9.04KB
i18n (useDisplayLocale.js) 2.85KB 1.45KB
i18n (useObjectLabel.js) 34.34KB 9.17KB
i18n (useSafeTranslation.js) 5.60KB 2.33KB
layout (index.js) 38.84KB 10.94KB
mobile (MobileProvider.js) 0.92KB 0.49KB
mobile (ResponsiveContainer.js) 0.94KB 0.38KB
mobile (breakpoints.js) 1.51KB 0.70KB
mobile (createOfflineDataSource.js) 5.61KB 1.75KB
mobile (index.js) 1.99KB 0.87KB
mobile (offlineQueue.js) 3.91KB 1.35KB
mobile (pwa.js) 0.97KB 0.49KB
mobile (serviceWorker.js) 1.48KB 0.62KB
mobile (serviceWorkerSource.js) 3.41KB 1.48KB
mobile (useBreakpoint.js) 1.54KB 0.65KB
mobile (useGesture.js) 6.96KB 1.98KB
mobile (useOfflineSync.js) 1.99KB 0.72KB
mobile (usePullToRefresh.js) 2.53KB 0.85KB
mobile (useResponsive.js) 0.72KB 0.42KB
mobile (useSpecGesture.js) 4.39KB 1.66KB
mobile (useTouchTarget.js) 1.01KB 0.54KB
permissions (MePermissionsProvider.js) 11.71KB 4.29KB
permissions (PermissionContext.js) 0.31KB 0.25KB
permissions (PermissionGuard.js) 0.89KB 0.45KB
permissions (PermissionProvider.js) 6.24KB 2.16KB
permissions (discardProofCache.js) 1.04KB 0.55KB
permissions (evaluator.js) 5.12KB 1.74KB
permissions (index.js) 0.93KB 0.41KB
permissions (store.js) 0.91KB 0.42KB
permissions (useFieldPermissions.js) 1.28KB 0.53KB
permissions (usePermissions.js) 4.83KB 2.27KB
plugin-ai (index.js) 15.16KB 3.68KB
plugin-calendar (index.js) 49.00KB 13.91KB
plugin-charts (index.js) 71.39KB 19.92KB
plugin-chatbot (index.js) 194.49KB 46.33KB
plugin-dashboard (index.js) 131.48KB 34.45KB
plugin-designer (index.js) 213.21KB 43.63KB
plugin-detail (index.js) 248.68KB 63.94KB
plugin-editor (index.js) 2.23KB 1.05KB
plugin-form (index.js) 131.01KB 32.32KB
plugin-gantt (index.js) 167.16KB 40.99KB
plugin-grid (index.js) 208.58KB 56.63KB
plugin-kanban (index.js) 55.38KB 15.72KB
plugin-list (index.js) 113.38KB 27.73KB
plugin-map (index.js) 20.49KB 6.83KB
plugin-markdown (index.js) 13.88KB 4.80KB
plugin-report (index.js) 43.42KB 11.92KB
plugin-timeline (index.js) 30.10KB 8.74KB
plugin-tree (index.js) 9.33KB 3.25KB
plugin-view (index.js) 84.46KB 20.80KB
providers (DataSourceProvider.js) 0.75KB 0.39KB
providers (MetadataProvider.js) 1.37KB 0.59KB
providers (ThemeProvider.js) 1.90KB 0.85KB
providers (UploadProvider.js) 11.66KB 3.50KB
providers (index.js) 0.45KB 0.23KB
providers (types.js) 0.01KB 0.04KB
react-runtime (index.js) 5.62KB 2.34KB
react (LazyPluginLoader.js) 4.47KB 1.63KB
react (SchemaRenderer.js) 81.07KB 26.86KB
react (data-invalidation.js) 5.05KB 2.08KB
react (index.js) 4.63KB 2.18KB
react (schema-input.js) 2.32KB 1.24KB
react (spec-input.js) 0.20KB 0.18KB
sdui-parser (codegen.js) 6.58KB 2.74KB
sdui-parser (dashboard-widget-options.js) 3.08KB 1.30KB
sdui-parser (index.js) 5.55KB 2.45KB
sdui-parser (input-type.js) 2.84KB 1.40KB
sdui-parser (parse.js) 20.57KB 5.88KB
sdui-parser (provenance.js) 3.66KB 1.82KB
sdui-parser (types.js) 0.28KB 0.23KB
sdui-parser (validate.js) 13.64KB 4.59KB
types (ai.js) 0.20KB 0.17KB
types (api-types.js) 0.20KB 0.18KB
types (app.js) 2.87KB 1.00KB
types (base.js) 0.20KB 0.18KB
types (blocks.js) 0.20KB 0.18KB
types (complex.js) 2.93KB 1.49KB
types (crud.js) 0.20KB 0.18KB
types (dashboard-filter-alias.js) 6.23KB 2.74KB
types (data-display.js) 3.75KB 1.85KB
types (data-protocol.js) 0.20KB 0.19KB
types (data.js) 0.20KB 0.18KB
types (designer.js) 1.85KB 0.85KB
types (disclosure.js) 0.20KB 0.18KB
types (error-code.js) 1.54KB 0.88KB
types (expression.js) 0.20KB 0.18KB
types (feedback.js) 0.20KB 0.18KB
types (field-types.js) 0.20KB 0.18KB
types (form.js) 0.20KB 0.18KB
types (http-inflight.js) 8.87KB 3.73KB
types (http-retry.js) 4.32KB 2.02KB
types (icon-key-migration.js) 4.26KB 1.63KB
types (index.js) 4.74KB 2.25KB
types (layout.js) 0.20KB 0.18KB
types (managed-by.js) 0.19KB 0.18KB
types (mobile.js) 4.73KB 2.28KB
types (navigation.js) 0.20KB 0.18KB
types (objectql.js) 0.20KB 0.18KB
types (overlay.js) 0.20KB 0.18KB
types (permissions.js) 0.20KB 0.18KB
types (plugin-scope.js) 0.20KB 0.18KB
types (record-components.js) 0.20KB 0.19KB
types (record-semantics.js) 1.28KB 0.67KB
types (registry.js) 0.20KB 0.18KB
types (reports.js) 0.20KB 0.18KB
types (select-option.js) 0.20KB 0.19KB
types (spec-report.js) 5.05KB 1.93KB
types (spec-ui-namespace.js) 0.20KB 0.19KB
types (system-fields.js) 3.33KB 1.54KB
types (theme.js) 6.28KB 2.87KB
types (ui-action.js) 8.11KB 3.32KB
types (views.js) 0.20KB 0.18KB
types (widget.js) 0.20KB 0.18KB

Size Limits

  • ✅ Core packages should be < 50KB gzipped
  • ✅ Component packages should be < 100KB gzipped
  • ⚠️ Plugin packages should be < 150KB gzipped

@claude

claude Bot commented Sep 7, 2026

Copy link
Copy Markdown
Contributor

ACCEPT — domain:devx @ objectui execution seat, PM session session_01FhBNJcLRZLe8M87VcUgpKr, R46, reviewed 2026-09-07T21:35Z against GitHub and the tree, ⛔ never against the report's narrative.

⭐ The finding of this review: a sub-premise of the CARD and of TRIAGE is false, and copying it would have written a new false sentence into a card about a false sentence

Both #8029's body and its triage comment cite "scripts/placeholder-spelling.mjs-shaped helpers (since #7310)" as a second example of a dependency pointing away from the package. No such file exists. Verified here on origin/main — every placeholder-spelling path in the tree:

.changeset/placeholder-spelling-one-rule.md
packages/i18n/src/__tests__/fallback-placeholder-spelling-3512.test.ts
packages/i18n/src/__tests__/placeholder-spelling-rule.ts
scripts/__tests__/placeholder-spelling-parity.test.ts

#7310 (PR #8028) put the rule inside this package, and scripts/__tests__/placeholder-spelling-parity.test.ts reaches into it by relative path — the arrow points the opposite way from what the card describes. The dev found this, declined to cite the non-existent helper, and says in as many words that had the paragraph been copied from the card verbatim, "this PR would have replaced one false sentence with another."

⇒ ⭐ That is the whole hazard of a stale-prose card, hit at one remove: the fix instructions were themselves stale. It is also why the parity file's own header records that the scripts/-side option was measured and rejected in both directions (@object-ui/i18n does not resolve from scripts/ — TS2307 and ERR_MODULE_NOT_FOUND; a shared .mjs fails in packages/i18n, whose tsconfig.test.json has no allowJs).

The rule was derived from the tree, and it checks out

The dev concluded the real invariant is direction, not absence, with three applicable checks — Direction / Reach / Ship. The load-bearing step is the disproof of "no cross-package import": the sibling defaults-maps-mirror-en-pack.test.tsx also imports @object-ui/test-support/defaults-table-scan, so the shared import provably is not what moved it; what moved it is the three plugin packages, each of which declares @object-ui/i18n (plugin-detail and plugin-designer in dependencies, plugin-list in peer + dev).

Verified independently by this seat: @object-ui/test-support is private: true and declares zero @object-ui/* entries across all four dependency fields. No path back exists, so the import cannot invert anything. The direction rule is sound on today's tree.

Reach and Ship were likewise taken from things already written down — defaults-table-scan.ts's header on the deep-subpath shape #4325 ruled out, packages/i18n/tsconfig.json excluding **/__tests__/**, and check-phantom-dependencies.mjs judging that tier against dev dependencies — ⛔ not invented for this paragraph.

Comment-only, measured rather than asserted

+48/-8 across two files. Of the 52 changed lines in the test file, 0 are non-comment — checked here by scanning the patch. No assertion, no runtime source, no gate moved, and the @object-ui/test-support import that falsified the sentence stays, as the dispatch required.

⭐ And the new paragraph ends by stating that nothing mechanical holds it to the import list above. That is the same discipline #8414 showed three hours ago: the cause that let the old sentence survive is unchanged, and the file says so rather than leaving a "now covered" impression behind a rewritten paragraph.

The declared deviation is handled correctly

The commit message carries a Fixes #8029 trailer, against the convention that the card relationship is declared once in the PR body because a squash concatenates commit messages. The commit is already pushed, so amending or force-pushing it is forbidden — the dev reports it rather than repairing it, and assesses the harm: one commit, one card, and it is the card this PR closes, so the concatenation can neither contradict itself nor close a second card. Checked: no other issue number in either the body or the commit message sits adjacent to a closing keyword. ⇒ Reporting a pushed-commit blemish beats breaking the never-amend rule to tidy it, and the assessment is right.

The four-axis answer refused the tempting option, and priced it

Option D — add a gate binding the comment to the import list — is acknowledged as long-term strongest on axis 2 and then rejected on axis 4: a new checker guarding a defect class this repo has seen once, structurally fragile (comment rewordings are unbounded, so the matcher is either too loose or noisy), with no pull. ⛔ No card was filed to build it either, since the card itself says no gate moves. ⭐ The cost of that refusal is stated out loud in the file rather than hidden — which is what makes it a decision instead of an omission.

A changeset is owed and present, with empty frontmatter (declared as releasing nothing) — measured both ways: check-changeset-presence exit 1 before, exit 0 after. Not governed surface; PR stays draft.

Next: CI convergence → flip ready → post-flip guard → auto-merge SQUASH → queue confirmation → landing probe (the header states the direction rule and the @object-ui/test-support/defaults-table-scan import is still present on re-fetched origin/main; control: packages/test-support/package.json still declares zero @object-ui/* dependencies — if that ever changes, the rule the paragraph now states is what tells the next reader the import has become illegal) → LANDED here and on #8029, which closes via Fixes.

⚠️ For the triage seat, recorded and ⛔ not re-filed: the scripts/placeholder-spelling.mjs citation is wrong in both this card's body and its triage comment. The card closes with this PR, so there is nothing to re-grade — this note is the correction, placed where anyone following that citation will find it.


Generated by Claude Code

@baozhoutao
baozhoutao marked this pull request as ready for review September 7, 2026 21:33
@baozhoutao
baozhoutao added this pull request to the merge queue Sep 7, 2026
@claude

claude Bot commented Sep 7, 2026

Copy link
Copy Markdown
Contributor

Armed: PR #8418 flipped ready at 2026-09-07T21:33:00Z on head 9cb40c041 after CI converged all green (31 checks, Live E2E excluded, read 21:32:55Z); post-flip Governed Surface Queue Guard completed/success at 21:33:20Z; auto-merge SQUASH enabled; queued (added_to_merge_queue at 21:33:29Z, read 21:33:34Z).

Landing probe on merge, on re-fetched origin/main: the header states the direction rule (three checks — Direction / Reach / Ship) and the @object-ui/test-support/defaults-table-scan import is still present. ⚠️ Both halves matter: the card's failure mode was a rule stated as absence, and the two wrong repairs were deleting the sentence or deleting the import to "restore compliance" with a rule that was never true.

Control: packages/test-support/package.json still declares zero @object-ui/* entries across all four dependency fields and is still private: true. That is what makes the import legal under the new rule rather than merely tolerated — and if it ever changes, the paragraph now states the test by which the next reader can tell the import has become illegal. ⛔ The paragraph is held to the import list by nothing mechanical, and it says so; that is the unchanged cause of this card, recorded rather than papered over.

Then LANDED here and on #8029, which closes via Fixes. — domain:devx @ objectui seat, PM session session_01FhBNJcLRZLe8M87VcUgpKr.


Generated by Claude Code

Merged via the queue into main with commit 4b4d35a Sep 7, 2026
34 checks passed
@baozhoutao
baozhoutao deleted the claude/issue-8029-i18n-fallback-header-import-claim branch September 7, 2026 21:49
@claude

claude Bot commented Sep 7, 2026

Copy link
Copy Markdown
Contributor

LANDED — merged into main at 2026-09-07T21:49:02Z as 4b4d35a7d (squash), read 21:49:06Z. #8029 closed completed via Fixes.

Content probe on re-fetched origin/main (tip 4b4d35a7d, read 21:51Z) — the claim, its two failure modes, and the control:

  1. The rule is stated as DIRECTION, at line 115 — "The rule is DIRECTION, not absence" — with three numbered, applicable checks at 129–146 (Direction / Reach / Ship).
  2. ⛔ The import that falsified the old sentence is still there (:178). That was the first wrong repair the dispatch fenced off: deleting correct code to "restore compliance" with a rule that was never true. finding(i18n/gate): the defaults-maps mirror covers 3 hand-listed tables, so "a defaults row whose key no pack defines" is rejected in three packages and unjudged in the rest #7884 put it there so this gate and detail.editFieldsInline renders two different labels depending on whether an I18nProvider is mounted — the defaults map says "Edit fields inline", the en pack says "Edit fields" #4401's would ask their question of one population.
  3. The false sentence is gone — imports nothing outside its own package now matches 0 times. That was the second wrong repair: the sentence was the stated reason the file may live in @object-ui/i18n, so deleting it wholesale would have removed the reason along with the error.

Control on the merged tip: packages/test-support/package.json is still private: true with 0 @object-ui/* entries across all four dependency fields. ⇒ The import is legal under the new rule rather than merely tolerated, and check 1 now cites exactly that fact, so a future change to it makes the paragraph fail loudly to a reader instead of silently.

⭐ Each check is anchored to something already in the tree rather than invented for the paragraph: check 2 cites the exports subpath and the deep-src/__tests__/ shape objectui#4325 ruled out; check 3 cites this package's build tsconfig.json exclude (check:published-tsconfig-exclude) and the tooling tier check-phantom-dependencies.mjs judges against dev dependencies. ⇒ The rule is checkable by anyone, not just believable.

⚠️ Recorded for triage, ⛔ not re-filed (the card closes here, so there is nothing to re-grade): both this card's body and its triage comment cite a scripts/placeholder-spelling.mjs-shaped helper "since #7310". No such file exists — #7310 put the rule inside this package at packages/i18n/src/__tests__/placeholder-spelling-rule.ts, and scripts/__tests__/placeholder-spelling-parity.test.ts reaches into it, so the arrow points the other way. The dev caught it and declined to cite it; copying the card verbatim would have replaced one false sentence with another, in a card about a false sentence.


Generated by Claude Code

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

Projects

None yet

Development

Successfully merging this pull request may close these issues.

finding(i18n): fallback-placeholder-spelling-3512.test.ts still claims it "imports nothing outside its own package" — false since #7884

2 participants