docs(cli): say why the flows translation group stays author-warned - #20383
Conversation
The authorWarnedTranslationGroups docblock and the i18n-flow-liveness-gate test header said no shipped runner reads the flows group. The liveness ledger now carries flows.screens as live (the console's screen-flow runner reads it); only the flow's own label is still read by nothing, and the warn is group-level. Comment text only: the comment-stripped AST of both files is unchanged, and no gating, assertion or fixture moves. Claude-Session: https://claude.ai/code/session_01UYBdGBzWSrAMzpW8ah3GbP Co-authored-by: Claude <noreply@anthropic.com>
📓 Docs Drift Check
What this run could not see
Coarse fallback — 25 page(s) merely mention a changed package (the pre-#9192 predicate, kept for the deliberately-wide backstop): |
Contract reviewServed-tier: ① Derived judgments
② Semver level
③ Boundary flags
Implemented-by: Independence: INDEPENDENT AGENT (fed the card, the triage direction and the PR only; not the dispatch order or the seat's conclusions) VERDICT: FAIL
Generated by Claude Code |
The header of i18n-flow-screen-coverage.test.ts said the flow bucket turns itself back on the day an objectui screen-flow runner lands and the row flips. That runner has shipped and the row did not flip: the flows row keeps its group-level authorWarn until the flow label has a reader. Restate it in the wording the authorWarnedTranslationGroups docblock now uses, so packages/cli states one trigger. Comment text only: the comment-stripped AST print of the file is unchanged. Claude-Session: https://claude.ai/code/session_01UYBdGBzWSrAMzpW8ah3GbP Co-authored-by: Claude <noreply@anthropic.com>
Contract review (delta, patch round 1)Served-tier: ① Derived judgments
② Semver level
③ Boundary flags
Implemented-by: Independence: INDEPENDENT AGENT (fed the card, the triage direction and the PR only; not the dispatch order or the seat's conclusions) VERDICT: PASS Generated by Claude Code |
Fixes #20339
Clause-②: no
What this changes
Comment text only, in
packages/cli. Four sentences there said nothing reads theflowstranslation group, and two named an objectui runner's landing as the flip trigger. Since PR #20328, the shipped liveness ledger'sflowsrow (packages/spec/liveness/translation.json) says otherwise:children.screensislive, because the console's screen-flow runner reads it, and onlychildren.labelis still read by nothing (#20318). The container keepsplanned+authorWarn: true, and that warn bit is group-level. So the gating these comments describe is unchanged and still correct. Only the reason they gave was stale.packages/cli/src/utils/i18n-extract.ts, theauthorWarnedTranslationGroupsdocblock (site 2)screens, but the flow's ownlabelis read by nothing yet (#20318), so a translated flow label really is stored and never shown. The warn is group-level, so it still covers the whole group."live"live(dropping itsauthorWarn; forflowsthat waits on #20318)"packages/cli/test/i18n-flow-liveness-gate.test.ts, the header's ledger sentence (site 3)screens, but the flow's ownlabelis read by nothing yet (#20318)"labelis read by nothing yet (#20318), so a translated flow label really is stored and never shown [...] The warn is group-level, so it still covers the whole group."never lets both rules speak about the same keyslabelis read by nothing yet, so its translated copy is stored and never shown"packages/cli/test/i18n-flow-screen-coverage.test.ts, the header's flip-trigger sentence (patch round 1)live(dropping itsauthorWarn; forflowsthat waits on #20318)"The "Shape" sentence is changed because it sits in the same docblock and named the wrong trigger. The screen-flow runner has already shipped (objectui at the
.objectui-shapinf8a9d0fb), and the row did not flip. The ledger'sscreensnote says the container bit drops when #20318 lands. The in-cell comment is changed because the claim's file surface names everypackages/clisentence that gives this reason. Only its comment lines move, and the cell's code is unchanged (proof below). The header ofi18n-flow-screen-coverage.test.tsnamed the same wrong trigger under the same rule, so patch round 1 gives it the Shape clause's wording.packages/clinow states one trigger. The file is the one the gate header points readers to, and the claim names it.Evidence
5a6267f48, and unchanged through the merge of862b6ce86. Theflowsrow isstatus: plannedandauthorWarn: true;children.labelisplanned;children.screensislive(verifiedAt: 2026-09-27). ItsauthorHintreads: "Only part of this group is read. The console's screen-flow runner readsscreens[...] The flow's ownlabelis read by nothing yet, so a translated flow label is stored and never shown". The new sentences follow that row.removeComments: true. The print at base and the print at HEAD are identical: 48261 of 48261 characters fori18n-extract.ts, 5544 of 5544 for the gate test, and 18534 of 18534 fori18n-flow-screen-coverage.test.ts(patch round 1; measured against bothbd7b473e2and merge basec577e6663). Control legs: the same instrument detects a one-identifier rename of the exported function, and a one-identifier rename of the screen-coverage file's mockedauthorWarnedProperties. No assertion, fixture or behaviour moves.pnpm --filter @objectstack/cli build, bothdist/utils/i18n-extract.d.tsanddist/utils/i18n-extract.jscarry the new sentence (1 hit each) and not the old one (0 hits each). Positive control: theauthorWarnedTranslationGroupsexport line gets 1 hit in each.files: ["dist"]ships both files, so this PR carries an@objectstack/clipatchchangeset.Local verification (HEAD
bd7b473e2; patch round 1 atdbff132d7)Patch round 1, at
dbff132d7, after mergingorigin/mainc577e6663:pnpm lintexit 0;node scripts/check-issue-citations.mjs --base origin/mainexit 0: 2 added citations judged, both live;vitest run --project unit --maxWorkers=2overi18n-flow-screen-coverage.test.tsandi18n-flow-liveness-gate.test.ts: 2 files and 29 tests passed;The bullets below are the first round, at
bd7b473e2.pnpm --workspace-concurrency=2 --filter '@objectstack/cli^...' buildexit 0.pnpm --filter @objectstack/cli buildexit 0.Targeted unit run (
vitest run --project unit --maxWorkers=2) over the 18 test files that importi18n-extract: 18 files and 250 tests passed. The gate file on its own, verbose: 8 of 8 cells passed.The full
unitlayer of@objectstack/cli: 231 files and 3309 tests passed. Theintegrationlayer is left to CI, because no spawn entry or integration-tier file is touched.pnpm --filter @objectstack/cli run typecheckexit 0 (tsc --noEmit, thencheck:test-typecheckOK).pnpm --filter @objectstack/spec run check:livenessexit 0.pnpm lint(the fulleslint . --no-inline-config) exit 0, no findings.node scripts/check-issue-citations.mjs --base origin/mainexit 0. It judged the 2 added citations (i18n: the flow launcher and runner header readtranslation.flows.<flow>.label(1 key) #20318, text: three sentences still say onSuccess / flows.screens have no reader after #20296's ledger flips (reconciliation-test omit reason, cli i18n-extract docblock, flow-liveness-gate header) #20339), and both are live issue numbers.node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack --commandsderived 63 commands, and all 63 ended at exit 0. The--ranreconciliation found 63 run, 0 NOT-MEASURED and 0 UNRUN. Three first attempts measured nothing and were re-run green after their prerequisites were built:check:dual-build-cjs-loads(exit 3, PREREQUISITE NOT MET): 104 entry points load.check:i18n-coverage(exit 3, PREREQUISITE NOT MET): 13 configs, none new.check:type-check-debt(hit a 300 s per-command cap): 4 entries, none above its record.The roster gates whose roster directory holds one of these paths all exit 0:
check-changeset-fixed,check:authz-resolver,check:error-code-casing,check:filter-alias-parity. So doescheck:nul-bytes.Acceptance notes
packages/spec/src/system/metadata-form-zod-reconciliation.test.ts, thewhyof theonSuccessomit entry. Triage routed it to the spec lane. It is still stale onorigin/mainc577e6663. test(spec): record why eleven top-level keys are never offered by a metadata form #20362 was a spec-lane PR that touched that file after triage, and it did not carry the fix.packages/cli/CHANGELOG.md, the same entry inpackages/lint/CHANGELOG.md, andpackages/spec/CHANGELOG.md. These are release-owned, and each sentence was true when it was released.flowsbullet incontent/docs/ui/translations.mdx. This customer-facing page still says "no shipped screen-flow runner reads the group yet, so a wizard still renders the strings authored on the flow". It is outsidepackages/cli, so it goes to the seat.livewith the objectui runner" stays byte-identical, as the dispatch directs. It holds under i18n: the flow launcher and runner header readtranslation.flows.<flow>.label(1 key) #20318's ENFORCE proposal, whose reader surface is objectuiFlowRunner.tsxplus the launcher. i18n: the flow launcher and runner header readtranslation.flows.<flow>.label(1 key) #20318 still waits for the maintainer's ENFORCE-or-RETIRE decision.Generated by Claude Code