Repository navigation
objectstack lint does not fail on i18n warnings, so dropping --skip-i18n makes translation debt visible but still unenforced #1083
Description
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 lintexit 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-pagewarnings (theja-JPthird of the debt, deliberately held back for a concurrent claim) andQuality Checkswas 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)
- Make
i18n/missing-pagean error rather than a warning in the lint rule set, soobjectstack lintexits 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. - Add a threshold assertion in CI (e.g.
i18n/missing-pagecount 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. - 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.
Activity