Skip to content

fix(platform-objects): the es-ES and ja-JP dashboard gap help text says what its source now says - #16190

Merged
zhuangjianguo merged 1 commit into
mainfrom
claude/issue-16165-es-ja-gap-helptext
Sep 6, 2026
Merged

fix(platform-objects): the es-ES and ja-JP dashboard gap help text says what its source now says#16190
zhuangjianguo merged 1 commit into
mainfrom
claude/issue-16165-es-ja-gap-helptext

Conversation

@claude

@claude claude Bot commented Sep 6, 2026

Copy link
Copy Markdown
Contributor

Fixes #16165

Two leaves. metadataForms.dashboard.fields.gap.helpText in the es-ES and ja-JP
metadata-form bundles were faithful translations of a source sentence that no longer
exists.

string
source, before objectstack#14586 Grid gap (Tailwind units)
source, now (packages/spec/src/ui/dashboard.form.ts:25) Space between widgets, in steps of 0.25rem (4 = 1rem)
es-ES leaf, before this PR (:943) Separación de cuadrícula (unidades Tailwind)
es-ES leaf, after this PR (:943) Espacio entre widgets, en incrementos de 0.25rem (4 = 1rem)
ja-JP leaf, before this PR (:943) 「グリッド間隔(Tailwind 単位)」
ja-JP leaf, after this PR (:943) 「ウィジェット間の間隔、0.25rem 刻み(4 = 1rem)」

All three strings were re-located by text, not by the line numbers the card recorded.
On this branch's base 4e090ecde the card's quotes and its line numbers both still hold:
es-ES:943, ja-JP:943, English unmoved at dashboard.form.ts:25. The zh-CN round found
its line number eight rows stale, so this was checked rather than assumed; here it was not.

Why the wording

The new English does two things on purpose, and each replacement has to do both: drop the
CSS framework unit an app author never chose and cannot act on, and carry the magnitude
that lets the author size a dashboard. Every register call below was measured against the
bundle it lands in, not picked.

es-ES — Espacio entre widgets, en incrementos de 0.25rem (4 = 1rem)

  • The grid framing goes. The English stopped saying "Grid gap", so de cuadrícula
    goes with unidades Tailwind. The author is spacing widgets, not addressing a grid.
  • widgets, not componentes. The loanword is what this bundle uses for dashboard
    widgets — 7 occurrences (Widgets del panel, Tarjetas y gráficos colocados en la cuadrícula., Filtros aplicados a todos los widgets, Widgets del panel con posición y tamaño). componente also appears in this file, 4 times, and every one of them is the
    page-layout component concept (Regiones de diseño … con componentes, Componente (por id) que escribe esta variable, the Componente label at :1133). Using it here
    would collide with a different noun in the same bundle.
  • 0.25rem keeps the ASCII decimal point. It is a CSS length literal the author types,
    not a quantity in prose. Measured in this file: the only decimal numbers are dot-form
    (Decimales (p. ej., 2 para $10.50) at :409) and there are zero comma-decimals, so
    a Spanish decimal comma would be new to this bundle as well as wrong as CSS.
  • en incrementos de over en pasos de. This bundle has no precedent for either — 0
    hits for paso, 0 for incremento — so the choice is general technical Spanish register
    rather than a house style. en incrementos de is the standard rendering for a quantised
    scale; en pasos de reads as a calque of the English words.
  • (4 = 1rem) in half-width parens. 140 half-width parens in this file against 0
    full-width. The =-inside-a-parenthetical shape is already the bundle's own way of
    mapping an input value to its meaning: (empty = forever) at :314, (one entry = locked) at :829, (blank = all object fields) at :837. Keeping = also preserves
    the source's equation exactly, which is what a numeric conversion needs.

ja-JP — 「ウィジェット間の間隔、0.25rem 刻み(4 = 1rem)」

  • The grid framing goes, same reason: 「グリッド」 is dropped and the head clause becomes
    「ウィジェット間の間隔」. 「ウィジェット」 is this bundle's word throughout
    (「グリッドに配置するカードとチャート。」, 「全ウィジェットに適用するフィルター」,
    「位置とサイズを持つダッシュボードウィジェット」), and 「間隔」 is its word for spacing —
    4 occurrences, including this field's own label 「間隔」. 「余白」 appears 0 times.
  • 「刻み」, deliberately not 「単位」. 「単位」 is precisely the noun the stale string used
    (「Tailwind 単位」); reusing it would read as swapping the framework name while keeping the
    "unit" framing the English retired. It also means something else in this bundle — the
    per-X granularity sense at :988 「アプリ単位」, :1471 「オブジェクト単位」, :1514
    「フラットな単位」. 「刻み」 is the ordinary Japanese for a quantised step and carries no
    such collision. It appears 0 times in this file today, so it introduces nothing that
    contradicts an established choice.
  • 「、」 as the reading comma, mirroring the English comma and keeping the source's
    three-part shape (head clause, step clause, parenthetical equation). 57 occurrences in
    this file, including inside help text: 「一意識別子(snake_case、作成後は変更不可)」 at
    :345, 「snake_case、environment ごとに一意」 at :647.
  • Full-width 「()」. 82 full-width against 59 half-width across the file, and the
    half-width ones sit in code-ish or untranslated strings. Inside the dashboard subtree
    the split is unanimous: 「(既定 12)」, 「(秒)」, 「(title, subtitle, actions)」 are all
    full-width, so the immediate siblings decide it.
  • The space in 0.25rem 刻み follows the bundle's ASCII/Japanese boundary spacing:
    「snake_case の一意識別子」, 「グリッド列(既定 12)」, 「BCP-47 タグ」, 「1 つの」.
  • No trailing 「。」: helpText entries in this bundle do not carry one (「グリッド列(既定
    12)」, 「自動更新(秒)」), while description entries do.

The register model these two were matched against

The zh-CN sweep of this same subtree (9f57f1e31, 2026-09-03) states in its own commit
message that its replacements "mirror es-ES / ja-JP, both of which are correct at all five
leaves". So for this subtree es-ES and ja-JP are the reference register, not the followers,
and the job here was to keep them that way rather than to import a Chinese solution.

Verified independently rather than taken on that commit's word: all 13 other source-derived
prose leaves of metadataForms.dashboard — 5 section descriptions and 8 further field help
texts — were read against the current English in both locales and every one tracks it.
gap is the only stale leaf. The English inventory the comparison used is
en.metadata-forms.generated.ts:901..966, 14 prose leaves in total.

No objectui overlay exists for either locale. Read at objectui origin/main 859de84:
metadata-form-i18n.ts resolves bundleLocale() to 'zh-CN' for zh and undefined for
everything else, and its own header says the metadata designer ships en and zh and
"the other eight shipped locales render the producer's English", so "this bundle carries
zh-CN only". The zh-CN round matched that overlay's opening deliberately; here there is
nothing to match, and this bundle is the only translated surface these two locales have for
this field. No objectui card is touched.

Four instruments are blind to this defect, and their green is not evidence

Re-run in this branch's worktree, exit codes captured by redirect-then-read, never through
a pipe. BEFORE is the same tree with both leaves reverted to the base, with the mutation
proven on disk by whole-line anchors and the restore proven afterwards by blob equality
against the HEAD blob plus an empty git diff HEAD, all in one shell:

                             BEFORE (stale leaves)     AFTER (this PR)
pnpm check:i18n                  exit 0                    exit 0
  platform-objects               in sync (11 bundle(s))    in sync (11 bundle(s))
  OK (9 package(s) - all bundles in sync, no undeclared authoring keys)

pnpm check:i18n-stale-fill       exit 0                    exit 0
  scanned 10 bundle set(s), 0 stale-fill leaf/leaves, 0 baselined
  OK (10 bundle set(s) - no new stale fills, 0 baselined)

The numbers are identical either side of the change, to the byte. That is the durable
half of this card: a green gate here is not evidence the change was needed, and not
evidence it worked.

  1. check:i18n fills gaps only. It compares committed bundles against a fresh
    extraction, and merge fills gaps — a present-but-stale leaf is not a gap, so --write
    rewrites the en leaf and leaves es-ES and ja-JP alone. Regeneration is structurally
    incapable of fixing this.

  2. check:i18n-stale-fill infers a stale fill from cross-locale agreement. It catches a
    leaf that is a copy of the English wearing a translation's name. Separación de cuadrícula (unidades Tailwind) and 「グリッド間隔(Tailwind 単位)」 are real
    translations, written by translators, agreeing with no other locale. Invisible to that
    predicate by construction, not by accident.

  3. There is no provenance to fall back on, verified per locale. Neither
    es-ES.source-hashes.generated.ts nor ja-JP.source-hashes.generated.ts carries a
    dashboard entry — case-insensitive, real exit code 1, zero matching lines. The control
    fires in the same files: object matches 463 lines in the es-ES table and 454 in the
    ja-JP one. And the miss is not that the table ignores this bundle: both tables do carry
    metadataForms.* paths, 190 each
    , across 14 sibling subtrees (action, api, book,
    capability, dataset, doc, field, hook, mapping, object, page, report,
    seed, view). dashboard is simply not one of them, and per that file's own header
    "a path with no entry is LEGACY-TRUSTED and never reported stale".

  4. The Docs Drift Check cannot anchor the changed symbol. Re-run locally against the
    base, reading the JSON fields rather than the rendered comment
    (node scripts/docs-audit/affected-docs.mjs --json 4e090ecde):

    docs:                []
    anchors:             []
    anchorlessChanges:   []
    overbroadAnchors:    []
    weakAnchorsDropped:  ["dashboard (symbol)"]
    

    The name it could not anchor is dashboard, not gap — the same reading the zh-CN
    round measured. dashboard was derived as an anchor candidate and dropped as a single
    lowercase word; gap was never derived as a candidate at all, since anchors is empty
    and weakAnchorsDropped has exactly one entry. No page documenting this leaf can surface
    in that work list by either route.

Four independent instruments, none of them broken — each answers a different question
correctly, and this defect falls between all four.

The hand pass the drift check could not do

Searched content/docs by hand, plain directory pathspec, fixed strings:

pattern files
Space between widgets 1
in steps of 0.25rem 1
0.25rem 1
Grid gap 0
Tailwind units 0
unidades Tailwind 0
Separación de cuadrícula 0
「グリッド間隔」 0
「Tailwind 単位」 0

⚠️ The es and ja zeros are honest but they are not backed by a same-language firing
control, and the difference matters. Measured under the same pathspec: dashboard matches
76 files and refreshInterval 2, so the pathspec works; but no Spanish or Japanese text
exists in content/docs at all
ción, á and ñ each match 0 files, and so do ,
日本, ダッシュボード, する and , while the Chinese control matches 4. So the
right statement is the inventory one: there is no Spanish or Japanese documentation prose
in this tree for either stale string to be sitting in, rather than "a search that could have
found it found nothing".

The single English hit is content/docs/references/ui/dashboard.mdx:36 and needs no
change
:

| **gap** | `integer` | optional | Space between widgets, in steps of 0.25rem (4 = 1rem) |

It already carries the current English, because that page is generated from
packages/spec/src/ui/dashboard.zod.ts and regenerates with it. The English documentation
surface was never stale; only the translations were. Nothing matched under
content/docs/releases/
for any of the four English patterns, so nothing here goes near
release notes.

Scope

Two leaves, deliberately. columns is unchanged upstream, so Columnas de cuadrícula (predeterminado 12) and 「グリッド列(既定 12)」 stay accurate. The general sweep of this
subtree is objectstack#14931's and is not started here.

On the state of the zh-CN half: PR #16163 was open and unmerged when this branch was
cut and when this body was written, so on main three leaves of this family are stale, not
two — the correction triage posted on the card. This PR still fixes exactly the two it was
dispatched for; the zh-CN leaf belongs to #15511 and is untouched here. There is no
collision to coordinate: #16163's diff is zh-CN.metadata-forms.generated.ts plus its own
changeset, and this branch touches neither file, so the two merge independently even though
all three leaves sit at :943 of their respective files.

Verification

  • Gate family derived from the diff, not judged:
    node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack → 47 families, 55
    runnable commands, derived from the tree at f54d139d3 with the change set taken from the
    merge base 4e090ecde (three-dot, including the changeset file). 54 of 55 green, exit
    codes captured by redirect before any pipe. Re-derived after the changeset landed; the
    family did not grow.
  • The one non-green is pnpm --filter @objectstack/spec run check:react-declaration-parity,
    exit 1 with MANIFEST is not set — there is no registry side to compare against and its
    own words "This gate did NOT run. That is a failure, not a skip". That is a prerequisite
    refusal, NOT MEASURED locally
    , not a red about this diff — the manifest comes from an
    objectui browser build that CI supplies, and this diff touches no file in packages/spec.
  • Full pnpm run build first: 72 of 72 turbo tasks successful. It matters for what the
    sweeping gates then measured — check:dts-closure reports 72 built packages swept,
    164/164 declared declaration files present
    , so its green is a statement about a
    population that includes this package rather than about other packages.
  • pnpm --filter @objectstack/platform-objects test — 35 files, 528 tests passed.
  • pnpm --filter @objectstack/platform-objects typecheck — clean, and the program was
    proven to include the edited files rather than assumed to: tsc --noEmit --listFiles
    lists 419 files and both es-ES.metadata-forms.generated.ts and
    ja-JP.metadata-forms.generated.ts are among them.
  • Contract surface, ablated against the base with the package rebuilt on every leg:
    all 22 published declaration files byte-identical, while 12 of the 66 files dist
    publishes did move
    in the same run — index, metadata-translations/index and plugin
    in both .js and .mjs, plus their six sourcemaps. That firing control is what makes the
    negative a measurement rather than a blind spot. The rebuild is proven to have re-run by
    mtimes advancing on all three legs, and pnpm run build was invoked per package so no
    turbo cache sat on the path. Mutation proven on disk by whole-line anchors and proven to
    have reached dist (the retired unidades Tailwind appears in 12 dist files while
    mutated, in 0 after restore); restore proven by blob equality against the HEAD blob, an
    empty git diff HEAD, and a byte-for-byte re-comparison of all 66 dist files against the
    pre-ablation snapshot.
  • Clause-②: no. The published movement is a string-literal value inside the emitted
    esESMetadataForms / jaJPMetadataForms data structures. The declaration side cannot
    move for it by construction: the published subpath declares
    declare const MetadataFormsTranslations: TranslationBundle;, an opaque bundle type, so
    no literal type carries any leaf text — neither locale constant is even named by symbol in
    any of the 22 declaration files. No exported symbol, signature, or accept/reject behaviour
    moves. That reading is declared in the card's claim comment, which is the carrier the
    enqueue gate reads.
  • pnpm check:partof-closing-keyword passed in the sweep on an empty PR_BODY, which is
    a vacuous pass by that gate's design — it reads the body from the environment and never
    from the API. It was re-run against this posted body afterwards; that run is the reading.

Changeset rather than the skip-changeset label, re-derived rather than carried over:
@objectstack/platform-objects declares no private flag and publishes dist, and these
strings reach Spanish- and Japanese-reading Studio authors, so the diff does publish
something. patch, matching the sibling sweeps for the same subtree.

Authored by Claude Code session session_01ARYe3yQTQCUFm5qPYNgKaJ — attribution kept in
prose because a body edit downgrades the session-scoped footer link to the bare form.


Generated by Claude Code

…says what its source now says

`metadataForms.dashboard.fields.gap.helpText` read `Separación de cuadrícula (unidades
Tailwind)` in es-ES and 「グリッド間隔(Tailwind 単位)」 in ja-JP — faithful translations of
`Grid gap (Tailwind units)`, a source sentence that no longer exists. The source now reads
`Space between widgets, in steps of 0.25rem (4 = 1rem)`: it drops the CSS framework unit an
app author never chose, and adds the magnitude the author needs to size a dashboard.

Bundle merge fills gaps only, so a present-but-stale leaf is never corrected by
re-extraction. Both leaves are rewritten by hand against the current English.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01ARYe3yQTQCUFm5qPYNgKaJ
@github-actions github-actions Bot added the size/s label Sep 6, 2026
@github-actions

github-actions Bot commented Sep 6, 2026

Copy link
Copy Markdown
Contributor

📓 Docs Drift Check

Nothing 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
  • 1 name(s) were too generic to anchor anything (single lowercase words)
  • a page that states a rule by its inputs shares no identifier with the emitter that implements the rule, so an emitter-only diff cannot list it — not on this run and not on any run. Measured on fix(driver-sql): emit varchar(maxLength) for a text field a declared index keys on #11430: content/docs/protocol/objectql/types.mdx documents the text-family column mapping by the ObjectQL type names it maps FROM (text / textarea / html) while the diff changed createColumn; it went unlisted, and it was the page that diff falsified, in four places. No shared token exists to detect this on, so a rule your change carries has to be re-read by hand in the pages that restate it.

Coarse fallback — 2 page(s) merely mention a changed package (the pre-#9192 predicate, kept for the deliberately-wide backstop): node scripts/docs-audit/affected-docs.mjs --json 53cf263eb66526474813d623bdcde7fd1de957a7packageMentionDocs.

@claude

claude Bot commented Sep 6, 2026

Copy link
Copy Markdown
Contributor Author

Ready to release — held only by a tooling channel, not by anything in this PR

Recording this once rather than leaving the draft state unexplained. All three landing
pre-checks are measured and hold:

condition reading
① in-seat contract review N/A — the card declares Clause-②: no in the fixed spelling
check-clause2-carriers --pair REAL_EXIT=0, run from a worktree at current origin/main, checker blob 751b4a6e
③ every check green 0 failing, 0 running, and the legacy combined status is success (⛔ not a required-checks subset)

⛔ The one remaining step — marking the PR ready for review — is only reachable through the
GitHub MCP channel, which is currently answering "API rate limit already exceeded" for its
own token. That limit is separate from this seat's REST budget (measured: REST core
15000/15000 at the same moment), and PATCH /pulls/{n} {draft:false} over REST is a
silent no-op — it returns 200 with draft still true, verified twice tonight — so
there is no REST substitute and none will be attempted.

⇒ Nothing is wrong with this branch. The PM seat will retry on each check-in until it goes
through. A maintainer who wants it sooner can mark it ready for review directly; the release
conditions above are already satisfied.


Generated by Claude Code

@zhuangjianguo
zhuangjianguo marked this pull request as ready for review September 6, 2026 06:04
@zhuangjianguo
zhuangjianguo added this pull request to the merge queue Sep 6, 2026
Merged via the queue into main with commit cbca47d Sep 6, 2026
35 checks passed
@zhuangjianguo
zhuangjianguo deleted the claude/issue-16165-es-ja-gap-helptext branch September 6, 2026 06:36
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentation Improvements or additions to documentation size/s tooling

Projects

None yet

2 participants