Skip to content

objectstack lint does not fail on i18n warnings, so dropping --skip-i18n makes translation debt visible but still unenforced #1083

Closed as duplicate

Description

@huangyiirene

Surfaced while implementing #1060 (PR #1080, merged 2026-08-11). Filed separately because it is a different defect from the one that card describes, and #1060 cannot fix it.

What was measured

#1060's goal is stated as "coverage should enter the gate". PR #1080 dropped --skip-i18n from package.json's lint script — and the measurement taken on that branch shows the gate does not actually gate:

  • objectstack lint exit code is 0 both before and after the flag was dropped; it does not fail the process on warnings alone.
  • PR chore(lint): drop --skip-i18n from lint script; fill es-ES/zh-CN page-component i18n keys #1080's own branch merged with 25 residual i18n/missing-page warnings (the ja-JP third of the debt, deliberately held back for a concurrent claim) and Quality Checks was green. That is the direct evidence: a branch with known, enumerated translation debt passes the lint job.

So the effect of dropping the flag is that the debt is now printed, not that it is blocked. Anyone reading #1060's title ("coverage should enter the gate") would reasonably conclude a regression can no longer land; it can.

Why this is worth a card rather than a shrug

This is the repo's recurring declared ≠ enforced shape, one level up: the gate itself declares a check it does not enforce. A warning that never fails anything degrades into output nobody reads — which is how the 75 warnings #1060 uncovered accumulated in the first place, entirely behind a flag whose stated justification ("debt is zero") had already expired.

Adjacent, same family: #802 records that no gate checks vocabulary consistency within a language pack at all; #1075 records that no business refusal in this app carries an error envelope. All three are "we said it, nothing enforces it".

Options (for triage — deliberately not chosen here)

  1. Make i18n/missing-page an error rather than a warning in the lint rule set, so objectstack lint exits non-zero. Cleanest reading of "coverage enters the gate", but it fails the build the moment any locale falls behind — which is either the point or an unacceptable tax, depending on how the team wants translation debt to behave. Requires chore(lint): drop --skip-i18n from the lint script — i18n debt is zero, coverage should enter the gate (successor to #494) #1060's remaining ja-JP keys to land first, or CI goes red immediately.
  2. Add a threshold assertion in CI (e.g. i18n/missing-page count must be 0) as a separate step, leaving lint's own severity model alone. Keeps the platform rule advisory while making this repo's policy enforcing.
  3. Accept advisory and say so — change chore(lint): drop --skip-i18n from the lint script — i18n debt is zero, coverage should enter the gate (successor to #494) #1060's framing from "enters the gate" to "becomes visible", and drop the expectation that lint blocks translation regressions.

Option 1 is a platform-side severity change (packages/lint, upstream), options 2–3 are app-side. That split matters for routing: only 2 and 3 can be done in this repo.

Not blocking anything today

No user-facing defect; the app ships either way. Recorded as a finding rather than queued, per the filing discipline — grading belongs to the findings triage round, not to the dev who tripped over it.

Refs #1060 #494 #802 #1075

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions