Repository navigation
docs(spec): record why element:text's content is not a PageTranslation.components key - #15216
Conversation
…ponent translation face `PageTranslation.components` names its deliberate exclusions with reasons — `help` because no component declares it, `subtitle` because `page:header` is addressed by page name. `content` was neither named nor excluded, so an author looking for a bundle key for the one string `element:text` renders found an absence that reads exactly like an oversight. It is not one. `element:text` declares `content: I18nLabelSchema` (`ui/component.zod.ts`), localizable at its own authoring site, so adding it to this face would be the face widening the `submitLabel` retirement declined for the identical shape (#10926). Written down beside the other two, citing that precedent, and pointing the separate extraction/coverage question at #14749. Comment only: no schema key, no `describe()`, no resolver change. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01H2oQebDDxYKfWZusyd8GXk
`@objectstack/spec` publishes `src/**/*.zod.ts` in its npm `files`, so the edited comment ships in the tarball verbatim (and the text also lands in `dist/browser/**`). The diff therefore publishes from a released package, which is exactly what `skip-changeset` is NOT for. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01H2oQebDDxYKfWZusyd8GXk
📓 Docs Drift Check1 anchor(s) derived from 1 changed package(s); no hand-written page names any of them, so this run has nothing to list — not a clean bill of health. This check sees only pages that NAME a derived anchor: one that documents this change in prose, or enumerates it in an authoring dialect, names none and stays invisible to it on every run. What this run could not see
Coarse fallback — 128 page(s) merely mention a changed package (the pre-#9192 predicate, kept for the deliberately-wide backstop): Which tree this was computed onThis run read A worktree cut from an older # while this PR is open — GitHub drops the merge commit once it closes
git fetch origin 4671943a6c7816a85120819a6912f892420083c6 && git checkout 4671943a6c7816a85120819a6912f892420083c6
# afterwards, rebuild it from the two parents, which stay fetchable
git fetch origin 50d6c924bb7cacbc934e8386d8523f1be40cc040 3bf408ba6eed46fa6bed61dd6d4a40225f76535b && git checkout -B drift-repro 50d6c924bb7cacbc934e8386d8523f1be40cc040 && git merge --no-ff 3bf408ba6eed46fa6bed61dd6d4a40225f76535b
node scripts/docs-audit/affected-docs.mjs --json 50d6c924bb7cacbc934e8386d8523f1be40cc040 |
Fixes #14412
Executes the maintainer ruling recorded on the card by the director seat (comment 5518061415, 2026-09-02, verbatim reply 「同意」 to decision batch #13, item 3). Operative sentences, verbatim:
The premise, re-verified at the branch point before editing
The card is a census, so the census was re-measured against
origin/mainat919becarather than taken from the body. All four faces hold; one line number in the dispatch had drifted and was relocated by content.titledescriptionlabelplaceholderemptyTexttranslation.zod.ts:927-931helpandsubtitle, each with a reason:878-888submitLabelretirement note states the precedent:867-876contentis neither named nor excluded on this facecontenthits in the file are at:486:511:519:550, all prose in the retired-key conversion regionelement:textdeclarescontent: I18nLabelSchemaui/component.zod.ts:1819, insideElementTextPropsSchemaopened at:1802— the dispatch cited:1784, which had driftedSo the card's own second option was the live one: what is missing is the sentence, not the key.
premise_still_valid: true.The change
One bullet added to the exclusion list, in the register of its two neighbours, and the list's lead-in updated from two to three so the count stays true:
contentis not here —element:textdeclarescontent: I18nLabelSchema(ui/component.zod.ts), so it is localizable at its own authoring site, and adding it to this face would be the face widening thesubmitLabelretirement declined for the identical shape (i18n: component-translationsubmitLabelcopy key lost its only declared carrier whenelement:formretired (#9249) — decide retire vs re-anchor #10926).The bullet also records, in one sentence, the thing the card raised that the earlier rulings had not weighed — that inline locale maps are invisible to
os i18n extractandcheck:i18n-coverage— and points it at #14749, where the director seat carried it. That question isdomain:cliand is deliberately untouched here.This satisfies the third facet of the card's own analysis: an author who looks for a bundle key for the one string
element:textrenders now finds a decision with a reason, not an absence that reads like an oversight.Comment only. No key was added to the face, no
describe()changed, no resolver touched —translatePageresolves exactly what it resolved before, and bundles, extractor output and existing page definitions are unaffected.Why a changeset rather than the
skip-changesetlabelThe ruling defers this to the presence gate, and the gate has no path filter — it fails any PR that adds no changeset and carries no label. The label is reserved for a diff that publishes nothing from any released package, and this diff does publish, measured two ways:
packages/specis not private (@objectstack/spec@17.2.0) and itsfilesarray includessrc/**/*.zod.ts.npm pack --dry-run --jsonlistssrc/system/translation.zod.tsamong the 2087 files in the tarball, so the edited comment ships to consumers verbatim.dist/browser/index.js,dist/browser/index.mjs,dist/browser/system/index.jsand others (36 dist files carry it; 0 of them are.d.ts, so the type surface is unchanged).Hence a
patchchangeset for@objectstack/spec. Not breaking, so no ADR-0087 disposition marker is required.Gates
Derived from the actual changed paths after the last commit with
node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack, which read the change set from the merge base itself (2 paths, committed 2 / working tree 0 / untracked 0) and returned 47 families. All results below are pinned to head3bf408ba, with a clean working tree, and every exit code was captured before any pipe.Green (exit 0):
pnpm --filter @objectstack/spec build—check-dts-emitted: 34/34 declared declaration file(s) presentpnpm --filter @objectstack/spec check:generated—✓ All 15 generated artifacts are up to date.Nothing regenerated: this JSDoc block is not copied intocontent/docs/references/, socheck:docsneeded no--fixand the PR carries no generated follower.pnpm --filter @objectstack/spec typecheck— includingcheck:scripts-typecheckandcheck:test-typecheck(54 file(s) / 261 error(s) / 145 pinned signature(s) held, unchanged)pnpm --filter @objectstack/spec test—Test Files 469 passed (469),Tests 12542 passed (12542)check:generateddeliberately does not run:check:browser-reachable-entries,check:dual-source-exports,check:empty-state,check:entry-nameability,check:exported-any,check:llms-txt,check:variant-docs,check:yaml-examplespnpm check:doc-authoring,check:nul-bytes,check:changeset-gate-self-tests,check:cross-package-test-inputs,check:logger-receiver-detach,check:merge-driver,check:objectui-changeset,check:page-declaration-shape,check:pm-half-states,check:published-files,check:slot-lookup,check:spec-parsed-alias,check:test-source-alias,check:type-source-resolutionpnpm --filter @objectstack/lint check:doc-formula-expressionsnode scripts/gates and their self-tests:check-adr-0087-registration,check-changeset-no-major,check-ci-filter-parity,check-comment-mask-adoption,check-dev-prereqs,check-empty-changeset,check-keyed-text-bounds,check-plugin-teardown-shape(47 cases pass),check-system-context-census,check-undeclared-dep-imports,scripts/docs-audit/check-affected-docs,scripts/docs-audit/check-drift-comment,scripts/pm/release-rehearsal-clone --self-testpnpm lint— the repo-wideeslint . --no-inline-config, run whole rather than narrowed, exit 0Not measured, declared rather than counted as passes:
pnpm check:dual-build-cjs-loadsexits 3 —Run pnpm build first. ⛔ This is NOT a pass: nothing was measured.Its prerequisite is a built tree for 76 packages, which no comment-only diff can affect and which CI builds anyway.Two gates needed a prerequisite met before they said anything, and both were met and re-run rather than reported from their first reading:
check:doc-formula-expressionsexited 3 twice (@objectstack/formula, then@objectstack/lint, unbuilt) and passed after both were built;check-plugin-teardown-shape --self-testcould not reach its pinned fixture commit in this shallow checkout, and passed after that one commit was fetched.Scope
Comment plus changeset, nothing else —
git diff --name-onlyagainst the merge base is exactlypackages/spec/src/system/translation.zod.tsand.changeset/spec-text-content-exclusion-recorded.md, matching the claimed file surface with no deviation. Clause-② no: no accept/reject behaviour changes and no public surface widens. The extraction and coverage visibility of inlineI18nLabelmaps stays out of scope here; it is #14749's, in thedomain:clilane, and is referenced but not addressed by this PR.🤖 Generated with Claude Code
https://claude.ai/code/session_01H2oQebDDxYKfWZusyd8GXk
Generated by Claude Code