fix(platform-objects): the zh-CN dashboard gap help text says what its source now says - #16163
Queued
zhuangjianguo wants to merge 2 commits into
Queued
fix(platform-objects): the zh-CN dashboard gap help text says what its source now says#16163zhuangjianguo wants to merge 2 commits into
gap help text says what its source now says#16163zhuangjianguo wants to merge 2 commits into
Conversation
…t its source moved out from under `metadataForms.dashboard.fields.gap.helpText` read 「栅格间距(Tailwind 单位)」 — a faithful translation of `Grid gap (Tailwind units)`, which the source no longer says. `packages/spec/src/ui/dashboard.form.ts:25` now reads `Space between widgets, in steps of 0.25rem (4 = 1rem)`: it dropped the framework unit an app author cannot act on and gained a magnitude the author can compute with. The leaf kept the retired vocabulary and never gained the magnitude, because bundle merge fills gaps only — a present-but-stale leaf is not a gap. Now 「组件之间的间距,每级 0.25rem(4 = 1rem)」: `widgets` is 「组件」 as everywhere else in this bundle, the grid framing is gone as it is upstream, and the conversion is carried so a zh author can size `gap` without reading the English. One leaf. `columns` is deliberately unchanged upstream, so 「栅格列数(默认 12)」 stays accurate, and the rest of the subtree was corrected on 2026-09-03. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01ARYe3yQTQCUFm5qPYNgKaJ
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01ARYe3yQTQCUFm5qPYNgKaJ
Contributor
📓 Docs Drift CheckNothing in this diff resolved to a documentable surface (no symbol, route or SDK anchor derived from 1 changed package(s)), so this run has no opinion about the docs. What this run could not see
Coarse fallback — 2 page(s) merely mention a changed package (the pre-#9192 predicate, kept for the deliberately-wide backstop): |
This was referenced Sep 6, 2026
zhuangjianguo
marked this pull request as ready for review
September 6, 2026 04:13
zhuangjianguo
added this pull request to the merge queue
Sep 6, 2026
Any commits made after this event will not be merged.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Fixes #15511
One leaf.
metadataForms.dashboard.fields.gap.helpTextin the zh-CN metadata-form bundlewas a faithful translation of a source sentence that no longer exists.
Grid gap (Tailwind units)packages/spec/src/ui/dashboard.form.ts:25)Space between widgets, in steps of 0.25rem (4 = 1rem):943):943)Both strings were re-located by text, not by the line numbers triage recorded. The
English is unmoved and still reads exactly what triage quoted, at the same
dashboard.form.ts:25. The zh leaf has drifted from:935to:943as the bundlegrew, so the fix follows the text.
Why the wording
The new English does two things on purpose, and the replacement has to do both.
It drops the framework unit. "Tailwind units" names a CSS library the app author never
chose and cannot act on. So 「Tailwind 单位」 goes, and with it 「栅格间距」 — the English
stopped saying "Grid gap" too, and the author is spacing widgets, not addressing a grid.
The head clause is now 「组件之间的间距」:
widgetsis 「组件」 everywhere else in thisbundle (
widgets.label, 「放置在栅格上的卡片与图表」, 「应用到所有组件的默认筛选与全局筛选」),so the register matches the five sibling leaves this subtree had corrected on 2026-09-03.
It gains a magnitude. The dashboard renderer computes the gap as
gap * 0.25rem, soone step is exactly 0.25rem and the scale is linear — that is why the English kept
in steps of 0.25rem (4 = 1rem)rather than simplifying to a direction. A zh author whoonly reads 「间距」 cannot size a dashboard; one who reads 「每级 0.25rem(4 = 1rem)」 can do
the same arithmetic the English reader does. 「每级 0.25rem」 renders "in steps of" as a
scale rather than a word-for-word calque, and the parenthetical carries the conversion by
example, which is what actually teaches it.
Two register choices, both measured against this bundle rather than picked:
=over 「即」. This bundle already spells an equivalence inside a full-widthparenthetical as 「(留空 = 永久)」 — the same shape, an input value mapped to its meaning.
Keeping
=also preserves the source's equation exactly, which matters for a numericconversion.
full-width commas against 7 half-width, and all 7 half-width ones sit inside JSON or code
literals where they belong; 79 full-width parens against 6, same split.
The head clause deliberately matches the objectui Studio overlay's own opening,
组件之间的间距(objectuimetadata-form-i18n.ts:90). objectui#7369 plans to delete thatoverlay and consume this bundle instead, and objectui triage's reading on objectui#7673 was
that for a Chinese-reading audience, adding the magnitude beats deleting the overlay. This
string is what that convergence would land on, so it opens the way the overlay already
opens and adds precisely what the overlay lacks. Neither of those cards is touched here and
both remain open.
No instrument in this repo can see this
Re-run in this branch's worktree, exit codes captured by redirect-then-read, never through
a pipe:
The numbers are identical either side of the change. That is the durable half of this
card: a green gate here is not evidence the change was needed, and not evidence it worked.
check:i18ncompares committed bundles against a fresh extraction. Merge fills gapsonly — the generated file's own header says so — and a present-but-stale leaf is not a
gap, so
--writerewrites theenleaf (a copy of the source, never merged) and leaveszh-CN alone. Regeneration is structurally incapable of fixing this.
check:i18n-stale-fillinfers a stale fill from cross-locale agreement: it catches aleaf that is a copy of the English wearing a translation's name.
「栅格间距(Tailwind 单位)」 was a real translation, written by a translator, agreeing with
no other locale. It is invisible to that predicate by construction, not by accident.
zh-CN.source-hashes.generated.tscarries nodashboardentry at all — verified here, case-insensitively, real exit code 1 and zeromatching lines, with a firing control on the same file (
objectmatches 400 times). Perthat file's own header, "a path with no entry is LEGACY-TRUSTED and never reported stale".
check:i18ninitially returned exit 3 on the untouched tree —PREREQUISITE NOT MET,the built CLI absent. That is not a red and not a green; the closure was built and the gate
re-run to a real verdict before any reading above was taken.
A fourth instrument, and it is blind too
The Docs Drift Check on this PR returned no opinion, and its stated reason lands on
this card. Re-run locally against the base commit
(
node scripts/docs-audit/affected-docs.mjs --json 932acc3df), reading the fields ratherthan the rendered comment:
The name it could not anchor is
dashboard, notgap. That distinction matters,because the two are blind in different ways:
dashboardWAS derived as an anchor candidateand then dropped as a single lowercase word, while
gapwas never derived as a candidateat all —
anchorsis empty andweakAnchorsDroppedhas exactly one entry. So no pagedocumenting this leaf can surface in that work list, by either route.
That makes four independent instruments structurally blind to this one stale string:
check:i18n,check:i18n-stale-fill, the provenance table, and the docs drift anchorderivation. Not one of them is broken; each is answering a different question correctly, and
this defect falls between all four. That is the durable half of this card.
The hand pass the drift check could not do
Searched
content/docsby hand for pages documenting the dashboardgapfield by name orby its help text, using the plain
content/docsdirectory pathspec:Space between widgetsin steps of 0.25rem0.25remGrid gapTailwind unitsControls that fire, so the zeros are real zeros and not a pathspec or encoding artefact:
dashboardmatches 76 files andrefreshInterval2 files under the same pathspec, and theChinese patterns are answerable there — 「的」 matches 4 files, so a Chinese fixed-string
search inside
content/docscan return non-zero.The single hit is
content/docs/references/ui/dashboard.mdx:36, and it needs no change:It already carries the current English, because that page is auto-generated from
packages/spec/src/ui/dashboard.zod.ts— the other producer objectstack#14586 rewrote — andregenerates with it. The English documentation surface was never stale; only the translation
was. Nothing matched under
content/docs/releases/for any of the patterns above (0 forall four English ones), so nothing in this PR goes near release notes.
Scope
One leaf, deliberately.
columnsis unchanged upstream so 「栅格列数(默认 12)」 staysaccurate, and the other five leaves of this subtree were corrected separately on 2026-09-03
— correctly leaving
gapalone, because at that momentgapwas still accurate. Thesubtree was clean for one day. That is what makes this specimen worth its own card: it is
the first leaf of this class whose exact moment of going stale is known, a dated source edit
against a dated sweep that was right to skip it.
Cross-referenced with #14931 as its live worked example — that card is scoped to 613
legacy-trusted leaves of unknown provenance, and this one arrives by the other route. It is
a reference only: the two cards are not merged, #14931 stays open, and this PR is not
widened into its audit.
Filed separately rather than swept in here: the es-ES and ja-JP
gapleaves carry thesame retired vocabulary from the same source edit.
Verification
node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack→ 47 families. All 47 green at
c93760200, exit codes captured by redirect. Re-derivedafter the changeset landed; the family did not grow.
check:dual-build-cjs-loads,check:published-readme-exports) —PREREQUISITE NOT METon packages with nodist/,none of them touched here. A full
turbo run buildcleared both and they are green in theunion above.
pnpm --filter @objectstack/spec check:react-declaration-parityrefuses locally withMANIFEST is not set; CI supplies that manifest from the objectui build(
lint.yml:5496). Not a reading about this diff, which touches no file inpackages/spec.declaration files byte-identical, with a firing control in the same run (6 published
runtime files did move). Mutation proven on disk and in
dist/before measuring, restoreproven after by blob equality against the HEAD blob plus an empty
git diff HEAD.The published movement is a string literal value inside the emitted
zhCNMetadataFormsdata structure. The leaf is typed as the declared
metadataFormsrecord member ofTranslationData(wrapped in NonNullable), so no literal type carries the text. No exported symbol, signature, oraccept/reject behaviour moves.
Changeset rather than the
skip-changesetlabel:@objectstack/platform-objectsis publicand publishes
dist, and this string reaches a zh Studio author, so the diff does publishsomething.
patch, matching the sibling sweep's own changeset for the same subtree.Authored by Claude Code session
session_01ARYe3yQTQCUFm5qPYNgKaJ— attribution kept inprose because a body edit downgrades the session-scoped footer link to the bare form.
Generated by Claude Code