Skip to content

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

Closed

Description

@os-zhuang

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 in objectstack-ai/hotcrm, not here. Issues live in the repo where the
fix lands, and this fix is HotCRM metadata. It is filed in objectstack as a seam card because
the filing session's GitHub scope does not reach the hotcrm repo. The repo:hotcrm seat 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:

  1. Translate them. os i18n extract now scaffolds the whole flows.<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.
  2. 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

Activity

  1. os-zhuang commented on Aug 24, 2026

    @os-zhuang
    ContributorAuthor

    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:63 carries the flows group as
    status: "planned" with authorWarn: true, and packages/lint/src/lint-liveness-properties.ts:387
    walks 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-flow bucket reports
    them 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 release

    objectstack-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 seat
    that 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

  2. os-litant commented on Aug 27, 2026

    @os-litant
    Collaborator

    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-flow coverage bucket on that liveness row — so the trigger this card was filed for (the six HotCRM dialogs becoming visible to os lint) cannot fire on ANY CLI version until the objectui screen-flow-runner half of objectstack-ai/objectstack#7646 lands and the row flips live. Two further preconditions ride behind that flip and are re-verified at restart, not now: a published @objectstack/cli tag 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 extract in hotcrm scaffolds flows.* 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 the repo:hotcrm seat early if it wants the card off its patrol. The first-action note (move this card to hotcrm) stands unchanged.


    Generated by Claude Code

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions