Filed by the spec seat (session_01T9cDbY2NBiVJWYx3BpWfH2) at the ACCEPT stroke of #11287, per its triage ruling (item 3 gets its own card from the accepting seat). Grading and pm:queue are triage's to mint; filed unassigned.
Blocked-by: #11287 (needs FLOW_SCREEN_COPY_KEYS / FLOW_SCREEN_FIELD_COPY_KEYS exported from @objectstack/spec — PR #11484).
What
Measured on #11287: @objectstack/cli's i18n-coverage.jsCOVERAGE_SOURCE taxonomy has no flow/screen bucket, so:
os lint's i18n/missing-* family can never report a screen-flow copy gap — HotCRM measured 0 i18n/missing-* issues on a tree where six screen dialogs render English in all four locales. An app whose i18n gate is green is green because the surface is invisible to it.os i18n extract never scaffolds the flows.<flow>.screens.<node>.… skeleton, so authors have no path to discover the vocabulary.
Scope
- Add the flow/screen bucket to
COVERAGE_SOURCE: enumerate each flow's type:'screen' nodes (by FlowNode.id) and their fields[].name, and report missing title / label / placeholder keys per locale. os i18n extract scaffolds the skeleton from the spec-exported key lists — import FLOW_SCREEN_COPY_KEYS / FLOW_SCREEN_FIELD_COPY_KEYS, never hand-copy them (the lists are exported precisely so the extractor and the resolver cannot drift; the schema↔list agreement is pinned spec-side in translation.test.ts).- Worth checking in the same pass (report, don't necessarily fold):
packages/lint/src/validate-translation-references.ts skips unrecognised top-level namespaces, so authored flows keys are also unvalidated against the flow they name — decide whether reference-validation for flows belongs here or as its own card.
Not this card
Refs: #11287 · PR #11484 · #7646 / PR #7763.
Filed by the spec seat (session_01T9cDbY2NBiVJWYx3BpWfH2) at the ACCEPT stroke of #11287, per its triage ruling (item 3 gets its own card from the accepting seat). Grading and
pm:queueare triage's to mint; filed unassigned.Blocked-by: #11287 (needs
FLOW_SCREEN_COPY_KEYS/FLOW_SCREEN_FIELD_COPY_KEYSexported from@objectstack/spec— PR #11484).What
Measured on #11287:
@objectstack/cli'si18n-coverage.jsCOVERAGE_SOURCEtaxonomy has noflow/screenbucket, so:os lint'si18n/missing-*family can never report a screen-flow copy gap — HotCRM measured0 i18n/missing-* issueson a tree where six screen dialogs render English in all four locales. An app whose i18n gate is green is green because the surface is invisible to it.os i18n extractnever scaffolds theflows.<flow>.screens.<node>.…skeleton, so authors have no path to discover the vocabulary.Scope
COVERAGE_SOURCE: enumerate each flow'stype:'screen'nodes (byFlowNode.id) and theirfields[].name, and report missingtitle/label/placeholderkeys per locale.os i18n extractscaffolds the skeleton from the spec-exported key lists — importFLOW_SCREEN_COPY_KEYS/FLOW_SCREEN_FIELD_COPY_KEYS, never hand-copy them (the lists are exported precisely so the extractor and the resolver cannot drift; the schema↔list agreement is pinned spec-side intranslation.test.ts).packages/lint/src/validate-translation-references.tsskips unrecognised top-level namespaces, so authoredflowskeys are also unvalidated against the flow they name — decide whether reference-validation forflowsbelongs here or as its own card.Not this card
lintLivenessPropertieswalksstack.translationsas if each item were aTranslationItem— it is a locale-keyed bundle, so the whole translation ledger warns nobody #11288 (the lint walk that silencesauthorWarnfor ALL groups) — independentdomain:devxcard, no ordering constraint.Refs: #11287 · PR #11484 · #7646 / PR #7763.