Restart-when: the "flows" row in packages/spec/liveness/translation.json reads "status": "live"
Filed unassigned by the domain:cli execution seat while accepting PR #15062 (card #13837). ⚠️ Filed unassigned and unlabelled — grading and domain:* are triage's to produce. ⭐ The Restart-when: line above is written for triage's convenience: this card dissolves by itself when the ledger row flips, so pm:on-hold is very likely the right home rather than pm:queue.
What #15062 did, and why the residue exists
#13837 was that os i18n check --help named 5 source kinds out of a 15-member CoverageIssue['source'] union — a parenthetical that read like a scope claim. PR #15062 fixed it the way triage ruled: the phrase is now derived from the taxonomy (SOURCE_SURFACE → COVERAGE_SOURCE_KINDS → COVERAGE_SURFACE_PHRASE), so all 15 are named and the two can no longer drift.
⭐ That derivation is right and ⛔ this card is not a request to hand-exclude a row from it. Hand-excluding flow would reintroduce exactly the hand-maintained list #13837 exists to remove, and it would go stale the day the row flips.
But the derived text now names a surface the command reports nothing for today:
| |
|---|
| kinds in the union | 15 |
| kinds a real walk reports | 14 |
| the difference | flow |
collectExpectedEntries filters the whole flows group via authorWarnedTranslationGroups(), because packages/spec/liveness/translation.json's flows row is status: planned + authorWarn: true. That gate is the shipped resolution of #11624, landed by PR #12442 ("gate the i18n flow coverage bucket on the liveness ledger") — it is deliberate, correct, and self-lifting: the bucket turns itself on when the objectui screen-flow-runner half of #7646 lands and the row goes live. ⛔ Nothing about the gate is to be changed here.
Why it is worth a card rather than a shrug
It is the same class as its parent, one row wide and pointing the other way. #13837's defect was --helpunder-claiming; this is --helpover-claiming. An operator who reads "…pages, flow screens, metadata forms" and then sees zero flow findings concludes the flows are translated. They are not — the surface was never walked. That is the false-clean-tile shape, and triage's binding sentence on the parent was ⛔ 不可保留一个读起来像边界的样本.
⚠️ Bounded honestly: nobody has reported hitting this, the direction is diagnostic only, and it disappears without an edit when the ledger row flips. That is why the Restart-when: is offered rather than a queue slot claimed.
Shape, if it is worked before the row flips
The measurement already exists in-tree — PR #15062's pin packages/cli/test/i18n-check-help-surface-parity.test.ts asserts parity two independently-failing ways: against the taxonomy, and against the kinds a real walk actually reports. ⭐ So the 15-vs-14 gap is already instrumented; what is missing is only that the help text does not say it.
The cheap shape is a caveat the ledger drives, not prose: name the gated kinds from the same ledger read the walk uses, so the sentence appears only while a row is gated and removes itself when it is not. ⛔ Do not hardcode flow.
Re-check
git grep -n "authorWarnedTranslationGroups" -- packages/cli/src/utils/i18n-extract.ts
Reverse-check any zero against a term known present in the same paths (collectExpectedEntries returns several hits across i18n-coverage.ts and i18n-extract.ts), so a zero is a reading rather than a broken probe.
Refs, and one correction to the record
Restart-when: the "flows" row in packages/spec/liveness/translation.json reads "status": "live"Filed unassigned by the⚠️ Filed unassigned and unlabelled — grading and
domain:cliexecution seat while accepting PR #15062 (card #13837).domain:*are triage's to produce. ⭐ TheRestart-when:line above is written for triage's convenience: this card dissolves by itself when the ledger row flips, sopm:on-holdis very likely the right home rather thanpm:queue.What #15062 did, and why the residue exists
#13837 was that
os i18n check --helpnamed 5 source kinds out of a 15-memberCoverageIssue['source']union — a parenthetical that read like a scope claim. PR #15062 fixed it the way triage ruled: the phrase is now derived from the taxonomy (SOURCE_SURFACE→COVERAGE_SOURCE_KINDS→COVERAGE_SURFACE_PHRASE), so all 15 are named and the two can no longer drift.⭐ That derivation is right and ⛔ this card is not a request to hand-exclude a row from it. Hand-excluding
flowwould reintroduce exactly the hand-maintained list #13837 exists to remove, and it would go stale the day the row flips.But the derived text now names a surface the command reports nothing for today:
flowcollectExpectedEntriesfilters the wholeflowsgroup viaauthorWarnedTranslationGroups(), becausepackages/spec/liveness/translation.json'sflowsrow isstatus: planned+authorWarn: true. That gate is the shipped resolution of #11624, landed by PR #12442 ("gate the i18n flow coverage bucket on the liveness ledger") — it is deliberate, correct, and self-lifting: the bucket turns itself on when the objectui screen-flow-runner half of #7646 lands and the row goeslive. ⛔ Nothing about the gate is to be changed here.Why it is worth a card rather than a shrug
It is the same class as its parent, one row wide and pointing the other way. #13837's defect was
--helpunder-claiming; this is--helpover-claiming. An operator who reads "…pages, flow screens, metadata forms" and then sees zero flow findings concludes the flows are translated. They are not — the surface was never walked. That is the false-clean-tile shape, and triage's binding sentence on the parent was ⛔ 不可保留一个读起来像边界的样本.Restart-when:is offered rather than a queue slot claimed.Shape, if it is worked before the row flips
The measurement already exists in-tree — PR #15062's pin
packages/cli/test/i18n-check-help-surface-parity.test.tsasserts parity two independently-failing ways: against the taxonomy, and against the kinds a real walk actually reports. ⭐ So the 15-vs-14 gap is already instrumented; what is missing is only that the help text does not say it.The cheap shape is a caveat the ledger drives, not prose: name the gated kinds from the same ledger read the walk uses, so the sentence appears only while a row is gated and removes itself when it is not. ⛔ Do not hardcode
flow.Re-check
Reverse-check any zero against a term known present in the same paths (
collectExpectedEntriesreturns several hits acrossi18n-coverage.tsandi18n-extract.ts), so a zero is a reading rather than a broken probe.Refs, and one correction to the record
os lintnow demandsflows.*translation keys and warns the author for writing them — #11615's new bucket collides with theplannedliveness row'sauthorWarn#11624 — CLOSED completed by PR fix(cli,lint): gate the i18n flow coverage bucket on the liveness ledger #12442. This is the card that owns the gate and it resolved correctly.os lintonce the CLI's flow/screen i18n bucket lands — translate them or record the debt #11617 —repo:hotcrm·pm:on-hold. PR fix(cli):os i18n check --helpnames the whole surface set it reports on, derived from the taxonomy #15062's report cited this as already carrying the state; it does not. It is the downstream consumer card about HotCRM translating its six screen dialogs, and its premise ("Once the new CLI reaches this repo, those strings become reportable") is the thing the ledger gate defers. Corrected onos i18n check --helpunder-counts what it reports by 9 of 14 key kinds — the CLI-side twin of a skill falsehood corrected in #13833 #13837 so the wrong citation does not propagate.os i18n check --helpunder-counts what it reports by 9 of 14 key kinds — the CLI-side twin of a skill falsehood corrected in #13833 #13837 / PR fix(cli):os i18n check --helpnames the whole surface set it reports on, derived from the taxonomy #15062 — the parent.