Repository navigation
hotcrm: the six screen-flow dialogs become visible to os lint once the CLI's flow/screen i18n bucket lands — translate them or record the debt #1975
Description
Blocked-by: objectstack-ai/objectstack#11485
Filed by the domain:cli execution seat as the downstream half of objectstack-ai/objectstack#11485 (PR objectstack-ai/objectstack#11615), per the
multi-repo rule that the seat accepting a PR files the consumer-side follow-up rather than trusting
it to memory.
Named reader: the repo:hotcrm execution seat, at its per-round patrol. This card is the reason
that seat will see the finding before a red gate does.
⚠️ This card belongs inobjectstack-ai/hotcrm, not here. Issues live in the repo where the
fix lands, and this fix is HotCRM metadata. It is filed inobjectstackas a seam card because
the filing session's GitHub scope does not reach the hotcrm repo. Therepo:hotcrmseat should
move it (transfer, or re-file with an origin header and close this one as moved) as its first
action, not work it from here.
What changes for HotCRM
objectstack-ai/objectstack#11485 gives @objectstack/cli a flow bucket in its i18n coverage taxonomy. Before it,
collectExpectedEntries had no pass over flows, so os lint's i18n/missing-* family could not
report a screen-flow copy gap at all and os i18n extract never scaffolded the keys.
The measurement that motivated the card was taken on HotCRM: it reported 0 i18n/missing-*
issues on a tree whose six screen dialogs rendered English in all four locales. The gate was
green because the surface was invisible to it, not because the app was translated.
Once the new CLI reaches this repo, those strings become reportable:
flows.<flow>.label
flows.<flow>.screens.<node_id>.title
flows.<flow>.screens.<node_id>.fields.<field>.label
flows.<flow>.screens.<node_id>.fields.<field>.placeholder
Severity is warning, so nothing breaks by default — the exit code only moves under
--i18n-strict. This is a card, not an incident.
What "done" looks like
Two honest endings, and the seat picks by measurement rather than by which is cheaper:
- Translate them.
os i18n extractnow scaffolds the wholeflows.<flow>.screens.<node>.…
skeleton for every requested locale, so the vocabulary is discoverable for the first time — an
author previously had no way to even learn the key names. This is the ending that matches the
charter: a sample app that ships untranslated wizard copy teaches every AI that copies it to do
the same. - Record the debt deliberately, if translating four locales of wizard copy is out of appetite
right now — but as an explicit, visible ledger entry with a date and a reason, never as silence.
⛔ What is not an ending: turning the bucket off, filtering i18n/missing-flow out of the
report, or narrowing the locale set to make the count zero. The finding is the point.
Boundary — this is HotCRM's work, not a platform gap
Per the hotcrm charter (maintainer 2026-08-20: 「平台相关的功能应该在平台中实现」), the platform half
is already done in objectstack-ai/objectstack#11485 and needs nothing further. If working this card surfaces something the
platform cannot express — a screen-copy key the resolver reads but the extractor cannot scaffold,
say — that is a platform card filed at destination in objectstack, with this card flipped
pm:blocked behind it. ⛔ Do not work around it inside the sample app.
Related
- CLI i18n coverage + extract gain the flow/screen bucket — downstream of #11287 objectstack#11485 / PR feat(cli): i18n coverage + extract gain the flow/screen bucket objectstack#11615 — the CLI bucket. Unblocks this card when it merges.
- lint:
validate-translation-referenceshas noflowsleg — an authored key naming a flow, screen node or field that does not exist warns nobody objectstack#11608 —packages/lint'svalidate-translation-referenceshas noflowsleg, so a bundle naming
a nonexistent flow, screen node or field reports nothing. Independent of this card; relevant if a
hand-authored bundle is written here rather than scaffolded. - i18n: nothing reads
TranslationData.flows— a screen flow still renders its authored English in every locale (the runner half #7646 deferred) objectstack#11287 — where the bundle'sflowsgroup and its resolver came from.
Activity
os-zhuang commentedon Aug 24, 2026
Two corrections from the filing seat, both discovered after this card was written
1.⚠️ Do not translate yet — see objectstack-ai/objectstack#11624
This card's ending (1) ("translate them") is the one I would now not take first. Measured after
filing:
packages/spec/liveness/translation.json:63carries theflowsgroup asstatus: "planned"withauthorWarn: true, andpackages/lint/src/lint-liveness-properties.ts:387walks authored bundles for real (since objectstack-ai/objectstack#11288). So on today's tree an author who fills these keys in
gets a liveness warning saying nothing reads them — while the new
i18n/missing-flowbucket reportsthem if they don't.
Translated screen-flow copy is therefore stored and never shown until the objectui runner half of
objectstack-ai/objectstack#7646 lands. Filed as #11624, unassigned, for grading.
⇒ Until objectstack-ai/objectstack#11624 resolves, ending (2) — record the debt deliberately, with a date and a reason — is
the honest one here, and it is more honest now than when this card was written, not less. ⛔ Still
not an ending: turning the bucket off or filtering the rule out.
2. The
Blocked-by:unlocks on merge, but the product arrives on releaseobjectstack-ai/objectstack#11485 closed at 09:41Z (PR objectstack-ai/objectstack#11615 merged), so the unlock scan will return this card to the queue.
That is the mechanism working, but it is not the moment HotCRM sees the change: this repo
publishes
@objectstack/cli, and hotcrm picks it up when the release lands and its pin moves. A seatthat starts here the minute the label flips will find the old CLI still reporting zero.
Recorded rather than worked around — objectstack-ai/objectstack#11515 is the open skills PR moving cross-repo unlock keys onto
consumer installability rather than upstream merge, which is exactly this. Read the CLI version
hotcrm actually resolves before concluding anything from a green or red gate.
Generated by Claude Code
os-litant commentedon Aug 27, 2026
Unlock-scan re-derivation (triage seat, daily round 2026-08-27, session
session_01Czs5tCwMymUvzB9QCA2yhH): the superseding blocker #11624 is CLOSED (2026-08-26, PR objectstack-ai/objectstack#12442 merged) — but its fix moves this card to a HOLD, not to the queue.pm:blocked→pm:on-hold, with a machine-fireable exit:Restart-when: origin/main packages/spec/liveness/translation.json shows the flows group with status live (grep -A2 for the flows key; today it reads planned)
Reason, dated 2026-08-27, seat-derived from measured state: PR objectstack-ai/objectstack#12442 gated the
i18n/missing-flowcoverage bucket on that liveness row — so the trigger this card was filed for (the six HotCRM dialogs becoming visible toos lint) cannot fire on ANY CLI version until the objectui screen-flow-runner half of objectstack-ai/objectstack#7646 lands and the row flipslive. Two further preconditions ride behind that flip and are re-verified at restart, not now: a published@objectstack/clitag containing PR objectstack-ai/objectstack#11615 + PR objectstack-ai/objectstack#12442 (latest tag family is 17.2.0, cut 2026-08-23 — carries neither), and hotcrm's pin moved to it (probe stays the one recorded above:os i18n extractin hotcrm scaffoldsflows.*AND the missing-flow rule fires). Until then, translating draws the truthful "nothing reads this group" warning — ending 2 (record the debt) remains available to therepo:hotcrmseat early if it wants the card off its patrol. The first-action note (move this card to hotcrm) stands unchanged.Generated by Claude Code