From 1412bcb67bf52874e1d0df30b598bc482fc0e092 Mon Sep 17 00:00:00 2001 From: Claude Date: Sun, 6 Sep 2026 02:44:30 +0000 Subject: [PATCH] docs(spec): translation liveness `_note` names the live/planned boundary, not a total MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The `_note` header claimed "11 of 12 groups live; the twelfth, `datasets`, …", which matches no reading of the file's own `props`: fourteen entries — eleven translation groups plus `locale` and the identity keys `name`/`label` — with exactly one non-`live` row (`flows`), and `datasets` among the groups rather than a twelfth. Second wrong total in the same sentence, so the integers are deleted rather than re-derived, on #7377's precedent: the sentence now names the boundary, which the per-prop rows carry and `state-counts.md` totals. Both former totals survive quoted, as the sentence's correction record. No `status` value moves. Co-Authored-By: Claude Opus 5 Claude-Session: https://claude.ai/code/session_01T6HeZvT9wdSJD1ZxJb5Eno --- .../translation-liveness-group-boundary.md | 28 +++++++++++++++++++ packages/spec/liveness/translation.json | 2 +- 2 files changed, 29 insertions(+), 1 deletion(-) create mode 100644 .changeset/translation-liveness-group-boundary.md diff --git a/.changeset/translation-liveness-group-boundary.md b/.changeset/translation-liveness-group-boundary.md new file mode 100644 index 0000000000..88205381d0 --- /dev/null +++ b/.changeset/translation-liveness-group-boundary.md @@ -0,0 +1,28 @@ +--- +'@objectstack/spec': patch +--- + +liveness ledger: `translation`'s `_note` states the live/planned boundary instead of a hand-maintained total + +The header claimed "11 of 12 groups live; the twelfth, `datasets`, …". No reading of the +file's own `props` produces that pair. Measured on this commit, `props` holds fourteen +entries — the eleven translation groups `translationDataShape()` declares, plus `locale` +and the item-identity keys `name` / `label` — of which exactly one row, `flows`, is not +`live`, and `datasets` is one of the groups rather than a twelfth. Counting all of `props` +gives thirteen live of fourteen; counting groups only gives ten of eleven. Neither is +eleven of twelve. + +This is the second wrong total the same sentence has carried. It previously read "10 of 11 +groups live; the one dead group (`validationMessages`) …", describing a group removed in +17.0.0 (#4667) — prose outliving its subject in the header of the very file whose rows warn +about that. So the integers are deleted rather than re-derived, on the #7377 precedent that +moved this ledger family's other hand-maintained counts out of prose and into a generated +artifact: the sentence now names the BOUNDARY ("every group but `flows` is live"), which the +per-prop rows below it carry and `state-counts.md` totals, and it records why a total taken +over `props` is not a total of groups. Both former totals are kept, quoted, as the +sentence's own correction record. + +Published data, prose only: `liveness/` is in this package's `files` array, so these ledgers +ship in the npm tarball. No `status` value moves, no schema changes and no gate verdict +changes — every non-`live` row in the file, at every nesting level, is `flows` or one of its +children. diff --git a/packages/spec/liveness/translation.json b/packages/spec/liveness/translation.json index a65717f8b2..ceeeb57568 100644 --- a/packages/spec/liveness/translation.json +++ b/packages/spec/liveness/translation.json @@ -1,6 +1,6 @@ { "type": "translation", - "_note": "TranslationItemSchema (#3778 — one locale's translations, the SAME groups the file-authored bundles use). NO LONGER A PIPE: the schema was a z.preprocess wrapping the retired object-first-dialect guard, which the gate's walker could not see through until #4488 fixed unwrap() to take the OUT side of a transform-input pipe — `translation` was literally unwalkable before this ledger. #4001 closed the shape with `.strict()` and folded the guard's ten prescriptions into the unknown-key `guidance`, so the preprocess is gone and the registered schema is a plain strict object. Consumer chain: runtime-authored items sync into the i18n adapter's authored layer (packages/core/src/fallbacks/authored-translation-sync.ts — at kernel:ready, on metadata:reloaded, and on translation mutations; #2591 closed the publish dead-end), file bundles load via service-i18n; both merge into ONE tree read by the spec resolvers (packages/spec/src/system/i18n-resolver.ts), the REST localization layer (translateMetaItem/translateMetaTypes), objectui's client resolvers (useObjectLabel/useSettingsLabel), and plugin-audit's summary localizer. WALK BOUNDARY: every group is a z.record keyed by target names — the drill sees each record's VALUE shape one level; the deeper per-key conventions (objects..fields..label, settings..keys..options., …) are governed by the resolvers cited per row, not by ledger rows. Note also the sync merges the RAW stored payload (authored-translation-sync.ts:155, not a schema re-parse), so the declared groups below are the CONTRACT while undeclared keys technically flow through on rows already stored — the resolvers read only the declared conventions. Since #4001 no NEW row can acquire one: the metadata door rejects an undeclared key instead of stripping it, so that residue is a finite set that only shrinks. 11 of 12 groups live; the twelfth, `datasets`, was seeded LIVE and DRILLED by #14253 with its reader (`translateDataset`) in the same change, and `flows` is the one that is `planned`. ⚠️ This sentence used to read \"10 of 11 groups live; the one dead group (`validationMessages`) is pointed at by #3778's own legacy-key migration table, making it a shipped false signpost\" — describing a group REMOVED in 17.0.0 (#4667), i.e. prose outliving its subject in the header of the very file whose rows warn about that. Corrected 2026-09-02 (#14253). Seeded 2026-08-01 (#4488). 2026-08-28 (#13003): all nine `path:NNN` citations in this file were re-anchored to their consuming symbols; EIGHT of the nine were wrong and every one of those was IN RANGE (the exception is `locale`, whose range still lands inside its reader). This ledger carried the batch's heaviest load of the OTHER silent class as well — nine further positions written as bare `:NNN` suffixes with no path in front of them, which `PATH_RE` never matches, so they degraded to prose that no check has ever resolved, bounded or key-checked.", + "_note": "TranslationItemSchema (#3778 — one locale's translations, the SAME groups the file-authored bundles use). NO LONGER A PIPE: the schema was a z.preprocess wrapping the retired object-first-dialect guard, which the gate's walker could not see through until #4488 fixed unwrap() to take the OUT side of a transform-input pipe — `translation` was literally unwalkable before this ledger. #4001 closed the shape with `.strict()` and folded the guard's ten prescriptions into the unknown-key `guidance`, so the preprocess is gone and the registered schema is a plain strict object. Consumer chain: runtime-authored items sync into the i18n adapter's authored layer (packages/core/src/fallbacks/authored-translation-sync.ts — at kernel:ready, on metadata:reloaded, and on translation mutations; #2591 closed the publish dead-end), file bundles load via service-i18n; both merge into ONE tree read by the spec resolvers (packages/spec/src/system/i18n-resolver.ts), the REST localization layer (translateMetaItem/translateMetaTypes), objectui's client resolvers (useObjectLabel/useSettingsLabel), and plugin-audit's summary localizer. WALK BOUNDARY: every group is a z.record keyed by target names — the drill sees each record's VALUE shape one level; the deeper per-key conventions (objects..fields..label, settings..keys..options., …) are governed by the resolvers cited per row, not by ledger rows. Note also the sync merges the RAW stored payload (authored-translation-sync.ts:155, not a schema re-parse), so the declared groups below are the CONTRACT while undeclared keys technically flow through on rows already stored — the resolvers read only the declared conventions. Since #4001 no NEW row can acquire one: the metadata door rejects an undeclared key instead of stripping it, so that residue is a finite set that only shrinks. Every group but `flows` is live — `flows` is the one that is `planned`, and `datasets` was seeded LIVE and DRILLED by #14253 with its reader (`translateDataset`) in the same change. A BOUNDARY and not a total, deliberately: the per-prop rows below carry the verdicts, the generated `state-counts.md` carries this type's totals (#7377), and `props` holds the groups PLUS `locale` and the item-identity keys `name`/`label` — so no total taken over `props` is a total of groups, which is how both totals this sentence has carried came to be wrong. ⚠️ It first read \"10 of 11 groups live; the one dead group (`validationMessages`) is pointed at by #3778's own legacy-key migration table, making it a shipped false signpost\" — describing a group REMOVED in 17.0.0 (#4667), i.e. prose outliving its subject in the header of the very file whose rows warn about that; corrected 2026-09-02 (#14253) to \"11 of 12 groups live; the twelfth, `datasets`, …\", which matched no reading of `props` at all — `datasets` is one of the groups, never a twelfth. Corrected again 2026-09-06 (#15775) by deleting the integers rather than re-deriving them, on #7377's precedent for this ledger family's other hand-maintained counts. Seeded 2026-08-01 (#4488). 2026-08-28 (#13003): all nine `path:NNN` citations in this file were re-anchored to their consuming symbols; EIGHT of the nine were wrong and every one of those was IN RANGE (the exception is `locale`, whose range still lands inside its reader). This ledger carried the batch's heaviest load of the OTHER silent class as well — nine further positions written as bare `:NNN` suffixes with no path in front of them, which `PATH_RE` never matches, so they degraded to prose that no check has ever resolved, bounded or key-checked.", "props": { "name": { "status": "live",