Every ts/tsx fence in packages/i18n/README.md now compiles --strict against
the built dist/*.d.ts, so its UNGATED_DOCS entry in
scripts/check-doc-snippet-types.mjs is removed (22 -> 21 entries; removals
only, nothing else in that file changed).
The 11 measured diagnostics decomposed into 7 TS2304 fragment-shape names and
4 real API drift. The formatting block documented a positional signature the
package has never shipped: formatDate/formatCurrency/formatNumber take an
options object second (DateFormatOptions / CurrencyFormatOptions /
NumberFormatOptions), and formatRelativeTime takes (date, locale) and derives
the unit itself -- so formatCurrency(99.99, 'USD', 'en') and
formatRelativeTime(-3, 'days', 'en') were both uncopyable as written. Every
replacement call was executed against the built package and its output comment
is the real string.
The three fragment blocks gain real imports plus `declare const` placeholders
typed to the shipped surface, matching the existing spelling in
packages/app-shell/README.md; the useObjectTranslation block now shows the
hook inside a component rather than at module top level. No packages/**
source is touched, no public type widened, no gate loosened, and no new
FRAGMENT_MARKER declared -- all 8 blocks earn coverage by compiling.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MM7kaS4dPpYHV5BsMyu4tQ
Part of #5174 — batch 16 of the
UNGATED_DOCSburn-down. The card stays open.packages/i18n/README.mdleaves the ledger: every ts/tsx fence in it now compiles--strictagainst the packages' builtdist/*.d.ts, so its entry inscripts/check-doc-snippet-types.mjsis deleted. Removals only inside that object literal; nothing else in the gate file changed.Ledger arithmetic
9de3141a0707d692UNGATED_DOCSentriesProgrammatic diff of the two
UNGATED_DOCSliterals, both imported and compared as objects:removed = ['packages/i18n/README.md'],added = [],reason-changed = [], key order preserved for all 21 survivors.Fragments went 158 to 158: zero new
FRAGMENT_MARKERdeclarations. All eight blocks earned coverage by compiling, not by being excused.Strictness region unchanged. From the
Fence scanningbanner to EOF, sha256f46b5662ba336f026bca3a0003e0b7979789d48d0291fa5760be7d23c8ed0160on the base and the same value on the branch — 1178 lines on both sides, the banner moving 758 to 756 because the two-line entry above it is gone. Identical to the value batch 15 measured, as it should be with nothing landing in the region since.The census that picked this document
Re-taken on this branch's own base with the gate's own exports, over all 22 entries minus the five that are off-limits (root
README.mdis not apackages/*README;packages/auth/README.mdis held by draft PR #7685;packages/plugin-gantt/README.mdandpackages/plugin-kanban/README.mdbelong to PR #7985;packages/plugin-chatbot/README.mdis deferred):packages/i18n/README.mdis the uniquely largest remaining debt at 8 blocks / 11 diagnostics — the next five candidates all sit at 7 blocks (plugin-detail 21 diagnostics, collaboration 18, permissions 18, types 6, layout 2). The fixed tie-break (larger measured debt first) never had to be applied: nothing ties it on block count.What the 11 diagnostics were, and what was done about them
Seven
TS2304were fragment shape — three blocks that usedI18nProvider,App,PreviewanduseObjectTranslationwithout ever importing or defining them. Each now carries the real import plus adeclare constplaceholder typed to the shipped surface, in the spellingpackages/app-shell/README.mdalready uses.The other four were real API drift, and they are the reason this page mattered. The formatting block documented a positional signature the package has never shipped:
formatDate(new Date(), 'en')— the second parameter isDateFormatOptions, so the locale is{ locale: 'en' }(TS2559).formatCurrency(99.99, 'USD', 'en')— takes(value, options?: CurrencyFormatOptions), two parameters, not three (TS2554).formatNumber(1234567, 'de')— second parameter isNumberFormatOptions(TS2559).formatRelativeTime(-3, 'days', 'en')— takes(date, locale?)and derives the unit from the distance to now; there is no unit parameter (TS2554).A reader copying any of those four lines got code that did not compile. Each replacement was executed against the built package and its trailing comment is the string that actually came back:
"Jan 1, 2025","$99.99","1.234.567","3 days ago". The date example moved fromnew Date()to a fixednew Date(2025, 0, 1)so the documented output is reproducible rather than wrong on every day but one, and the prose above the block now states the calling convention: value first, options object second, withformatRelativeTimethe one exception.The
useObjectTranslationblock moved from a bare top-level destructure to the same call inside a component, so the page no longer shows a hook called outside a component while teaching the hook.No
packages/**source was touched, no public type widened, no lenient alias added, no gate loosened, and nothing was invented: every name the page now teaches is exported by@object-ui/i18n's builtdist/index.d.ts.Probes — six, each predicted in writing before it ran
Every leg proved its mutation on disk (occurrence counts of the injected and the deleted text, plus
git hash-objectagainst theHEADblob) and proved its restore by an emptygit diff HEAD; every script carried atrap ... EXIT INT TERMwith absolute paths. No rebuild is owed on any leg: the gate reads the mutated bytes straight from the working tree, so no built artifact sits between a mutation and its reading.22 ungated,Covered blocks: 653 — 495 to compile,495 of 495 judged, 0 failed. The entry is what suppresses the verificationTS2339(directiontodirectionTypo) in the repairedLanguageBarblockTS2339,503 of 503 judged, 1 failed503 of 503 judged, 1 failed,TS2339: Property 'directionTypo' does not exist on type .... Two diagnostics, not the one predicted: a consequentialTS2304on the now-undefineddirectionin the JSX below. Same direction, one more diagnostic than written downTS2304x7,TS2559x2,TS2554x2, across 4 failed blocks^18.0.0to^18.1.0scripts/__tests__/doc-version-claims.test.tsredKNOWN_CLAIMSinventory, and the peer-line assertion against the manifest). Its control leg ran first and was green on the committed bytes, so the pin is non-vacuousdeclare const App: () => ReactNoderetyped tonumberTS2604: JSX element type 'App' does not have any construct or call signaturesandTS2786: 'App' cannot be used as a JSX component. The annotations are judged, not silently widenedcheck:readme-exportsjudges import NAMES —I18nProvidertoI18nProviderNope441 real, 0 wrong-path, 1 fabricated, naming the line. Its control leg was green at442 real, 0 fabricatedSix of six in the predicted direction. The one deviation is P2's count, recorded above rather than smoothed over.
Gates, at
707d692Exit codes captured by redirect-then-capture, never through a pipe; each row quotes the gate's own verdict line.
pnpm check:doc-snippetsScanned 227 document(s): 206 covered (104 of them hold a ts/tsx block), 21 ungated·503 of 503 block(s) judged, 0 failedpnpm check:doc-fencesevery TypeScript block in 227 document(s) is fenced ts/tsx/typescriptpnpm check:readme-exports442 of them self-imports judged (442 real, 0 wrong-path, 0 fabricated)pnpm check:doc-typesEvery documented component type is registered.node scripts/check-doc-links.mjsLinks are valid across 17 scan roots.pnpm check:doc-example-readersOK 80 documented symbol(s), 3947 call site(s)pnpm check:control-bytesOK (scanned 6428 tracked text file(s); skipped 85 binary)node scripts/check-node-esm-load.mjsERR_UNKNOWN_FILE_EXTENSIONlines are declaredby designpnpm type-check:scriptstsc -p tsconfig.scripts.json, no diagnosticsnode scripts/check-changeset-presence.mjs2 file(s) changed, 0 of them published source of a package the release covers·no changeset is owednode scripts/check-governed-queue-guard.mjs --test(both paths)NOT GOVERNED — 2 path(s) checked against 5 governed surface(s); none matchedTests — every file that reads either changed path, in one run:
scripts/__tests__/× 8 (check-doc-snippet-types,check-doc-component-types,check-doc-expression-carriage,check-doc-fence-languages,check-links-workflow,check-readme-exports,check-skill-examples,doc-version-claims),packages/types/src/__tests__/× 4,packages/plugin-gantt/src/readme-navigation-example.test.ts,packages/react/src/__tests__/LazyPluginLoader.jsdocExample.test.ts,examples/schema-catalog/test/component-fixture-declared-keys.test.ts, andpackages/app-shell/src/views/metadata-admin/ResourceEditPage.referencesErrorState.test.tsx— 16 files, 598 tests, all passing. The owning package:pnpm exec vitest run packages/i18n/— 62 files, 1031 tests passing — pluspnpm --filter @object-ui/i18n type-checkexit 0.Declared narrowing.
turbo ls --affectedagainst the base names 35 packages, which is package granularity reacting to a root-level script edit, not 35 readers: the only readers of either changed path are the 16 test files above. Those 35 suites are a declared narrowing to CI, not a skipped run. Lint here isturbo run lintper package, so the repository-wide sweep is CI's; the narrowed run over exactly this diff iseslint --no-inline-config --format jsonon both paths — 2 entries, 0 errors, and eslint's own answer for the README isFile ignored because no matching configuration was supplied, so the real lint surface of this diff is the one.mjsfile at 0 errors 0 warnings.eslint.config.jsdeclares noproject/projectService/parserOptions.project, so type-aware linting is off and this diff cannot move the verdict on any file it does not touch.Readers of the changed document
scripts/__tests__/doc-version-claims.test.tsKNOWN_CLAIMSrestatement row pinning the peer line`react` ^18.0.0at line 23 against the package manifest. Lines 22–23 are byte-identical across this diff (sha256 of the two-line slice compared on both refs); P4 mutated the line and the pin went red on 3 assertionspackages/app-shell/src/views/metadata-admin/i18n.tsengine.*carve-out section (a header comment)packages/app-shell/src/views/metadata-admin/metadata-form-i18n.tspackages/app-shell/src/views/metadata-admin/ResourceEditPage.referencesErrorState.test.tsxscripts/check-doc-snippet-types.mjsThe
engine.*carve-out section those three cite is untouched by this diff — every hunk lands between lines 57 and 146 of the old file, all inside the API examples.Concurrency
No other batch of this seat is in flight, so this is the sole removal on the
UNGATED_DOCSliteral right now — the base9de3141a0already carries batches 14 and 15 (LANDED notes5557265479and5557366292). Of the 12 open pull requests at branch time, none touchespackages/i18n/README.mdorscripts/check-doc-snippet-types.mjs; file lists were read for all 12, including all 1048 paths of the release pull request #5400. Draft PR #7685 does touchpackages/i18n/src/locales/*.ts(10 files) but neither of this branch's two paths, and the examples here are judged against the shipped types onorigin/main, not against that branch.🤖 Generated with Claude Code
https://claude.ai/code/session_01MM7kaS4dPpYHV5BsMyu4tQ
Generated by Claude Code