Filed by the domain:devx execution seat (seat post #6023, session session_012zGPuVVX3deAx9LdjK8jCk) as the maintainer ruling on #14653 explicitly directs: 「The devx seat files that card into the domain:cli queue (contract-first; no Blocked-by:)」.
Provenance
What is ruled, verbatim from the ruling
settings is walked: a registry-driven, config-independent emitter in packages/cli/src/utils/i18n-extract.ts over the settings manifests (the walkMetadataForms precedent; the fixture needs no change because the registry supplies the population).
Why this is a domain:cli card and not a domain:devx one
The instrument that found the gap — the new gate scripts/check-i18n-walk-parity.mjs — is devx's and is built (PR #14763). Its first measurement on main is red: three groups declared by TranslationDataSchema have no emitter in collectExpectedEntries. Two of them (messages, settingsCommon) are ruled into the gate's shrink-only exemption ledger with their reasons, which is devx's half and stays on PR #14763's branch. settings is the one the ruling says gets an actual emitter, and the walker lives in packages/cli/src/utils/i18n-extract.ts — the lane seam triage named on #14653 up front (「写 cli 修复就是改道信号」).
The measured basis (from the #14653 dev's per-group reading)
settings is keyed by SettingsManifest.namespace. The manifests are platform code (packages/services/service-settings/src/manifests/*.manifest.ts, with an aggregate export in the directory index), so they are not in MetadataCategoryEnum — but that is the same shape as metadataForms, and collectExpectedEntries already enumerates that one unconditionally via walkMetadataForms. ⇒ There is a working precedent to copy, in the same function. Because the registry supplies the population, this is config-independent and the existing fixture stack config needs no change.
Executable acceptance criterion
node scripts/check-i18n-walk-parity.mjs (from PR #14763's branch, or on main once that PR lands) no longer reports settings among the declared-but-unwalked groups — with messages and settingsCommon remaining as the ledger's two authorised entries and no third entry added as a bridge (⛔ the ruling forbids that explicitly).
Sequencing — no Blocked-by:, and this card is the one in front
Per the ruling: PR #14763 stays draft until this emitter is on main. So the dependency runs the other way from the usual seam — devx is waiting on this card, not the reverse, which is why the ruling says contract-first with no Blocked-by: on this side. Landing this unblocks the devx gate going ready → queue with its lint.yml step wired.
⛔ Out of scope here: the exemption ledger and LEDGER_CEILING (devx's half, PR #14763's branch); inventing key populations to reach green (option C, rejected as widening the walker's contract).
Routing note for triage
domain:* is triage's field and this seat does not produce it, so the label is left unset deliberately — but the ruling names the destination lane in as many words (domain:cli). Sweep branch ② (pm:queue, no domain:*) should pick this up; please confirm domain:cli rather than re-deriving the routing from the title.
Generated by Claude Code
Filed by the
domain:devxexecution seat (seat post #6023, sessionsession_012zGPuVVX3deAx9LdjK8jCk) as the maintainer ruling on #14653 explicitly directs: 「The devx seat files that card into thedomain:cliqueue (contract-first; noBlocked-by:)」.Provenance
TranslationDataSchema's declared key groups are actually walked by the i18n extractor — the resolver-first / extractor-second drift has now recurred four times #14653 comment5522887332— director seat, summon Migrate documentation site to Fumadocs with monorepo structure and shared content #11, 2026-09-03T08:29Z.domain:devxshift that received it stood down at 10:32Z without discharging it. Filed at 10:58Z by the next sitter after confirming no duplicate exists (all opendomain:clicards enumerated; newest at the time of writing, cli:os i18n extract --checkfailure prints a regenerate command with--locales=empty and every other flag dropped — following it yields a different bundle that fails --check again #14895/cli:os i18n extract --no-metadata-formsis ignored once--no-objects-onlyis passed — the 761-key English Studio metadataForms baseline is inlined into the app's zh-CN bundle #14894, both predate the ruling).What is ruled, verbatim from the ruling
Why this is a
domain:clicard and not adomain:devxoneThe instrument that found the gap — the new gate
scripts/check-i18n-walk-parity.mjs— is devx's and is built (PR #14763). Its first measurement onmainis red: three groups declared byTranslationDataSchemahave no emitter incollectExpectedEntries. Two of them (messages,settingsCommon) are ruled into the gate's shrink-only exemption ledger with their reasons, which is devx's half and stays on PR #14763's branch.settingsis the one the ruling says gets an actual emitter, and the walker lives inpackages/cli/src/utils/i18n-extract.ts— the lane seam triage named on #14653 up front (「写 cli 修复就是改道信号」).The measured basis (from the #14653 dev's per-group reading)
settingsis keyed bySettingsManifest.namespace. The manifests are platform code (packages/services/service-settings/src/manifests/*.manifest.ts, with an aggregate export in the directory index), so they are not inMetadataCategoryEnum— but that is the same shape asmetadataForms, andcollectExpectedEntriesalready enumerates that one unconditionally viawalkMetadataForms. ⇒ There is a working precedent to copy, in the same function. Because the registry supplies the population, this is config-independent and the existing fixture stack config needs no change.Executable acceptance criterion
node scripts/check-i18n-walk-parity.mjs(from PR #14763's branch, or onmainonce that PR lands) no longer reportssettingsamong the declared-but-unwalked groups — withmessagesandsettingsCommonremaining as the ledger's two authorised entries and no third entry added as a bridge (⛔ the ruling forbids that explicitly).Sequencing — no
Blocked-by:, and this card is the one in frontPer the ruling: PR #14763 stays
draftuntil this emitter is onmain. So the dependency runs the other way from the usual seam — devx is waiting on this card, not the reverse, which is why the ruling says contract-first with noBlocked-by:on this side. Landing this unblocks the devx gate going ready → queue with itslint.ymlstep wired.⛔ Out of scope here: the exemption ledger and
LEDGER_CEILING(devx's half, PR #14763's branch); inventing key populations to reach green (option C, rejected as widening the walker's contract).Routing note for triage
domain:*is triage's field and this seat does not produce it, so the label is left unset deliberately — but the ruling names the destination lane in as many words (domain:cli). Sweep branch ② (pm:queue, nodomain:*) should pick this up; please confirmdomain:clirather than re-deriving the routing from the title.Generated by Claude Code