Skip to content

chore(lint): drop --skip-i18n from the lint script — i18n debt is zero, coverage should enter the gate (successor to #494) #1060

Closed

Description

@huangyiirene

Successor to #494, which is closed as premise-expired: app-side i18n warnings are 0 on main since #679/#697 (verified 2026-08-05 at 0899b4f, two consistent runs).

Blocked-by: #1059

Task

Remove --skip-i18n from the lint script in package.json so i18n coverage is continuously enforced by the lint gate. One-line change, plus:

Why blocked

package.json is also edited by #1059 (rc.6 upgrade). Same-file edits serialize across rounds; this card dispatches after #1059 merges.

Activity

  1. huangyiirene commented on Aug 11, 2026

    @huangyiirene
    CollaboratorAuthor

    Unblocked: #1059 merged (e9c4996), so the package.json serialization this card was waiting on is released. pm:blocked → pm:queue.

    Premise re-verified at the merged ref, not from the filing: package.json:19 on current origin/main still reads "lint": "objectstack lint --skip-i18n", and all 12 @objectstack/* pins are now 17.0.0-rc.6. So the card stands as written, with one thing sharpened by the platform bump — the "confirm the app-side i18n warning count is still 0 at the current pin" step is now load-bearing rather than a formality: the last 0-warning measurement was taken on rc.2, and rc.6 has already been shown to move author-time behavior in this repo (a new filter-empty-node error, a retired $regex, a relabelled approvals view). Measure on rc.6 before removing the flag; if new debt appears, fix the named keys in the same PR rather than keeping the flag.

    Not dispatched yet — dispatch is paused until 09:10Z by maintainer instruction.


    Generated by Claude Code

  2. added
    pm:dispatchedDispatched to a dev agent by /pm-dispatch
    and removed
    pm:queueReady for the PM dispatch loop
    on Aug 11, 2026
  3. self-assigned this
    on Aug 11, 2026
  4. huangyiirene commented on Aug 11, 2026

    @huangyiirene
    CollaboratorAuthor

    Claim: PM loop round 5

    Session: session_01NM6o28jmBgsyTRQHutn7LC
    Branch: claude/issue-1060-lint-i18n-gate
    Worktree: hotcrm-issue-1060
    File surface: package.json (the lint script) — plus src/translations/** only if lint reports new debt, and excluding src/translations/ja-JP.ts (see the boundary below). Stop on breach; explain in the report.
    Container & model: S-grade mechanical (one-line script change; correctness is decided by the gate itself), mode:subagent, model: sonnet
    Serial constraints cleared: Blocked-by: #1059 — verified now, not remembered: #1059 is closed (state_reason: completed), its PR #1066 is MERGED. package.json is free.

    ⛔ Cross-claim boundary for this round: src/translations/ja-JP.ts is claimed by #858, in flight in this same batch. If dropping --skip-i18n surfaces new debt whose fix lands in that file, stop and report it — do not edit it. Debt in the other three packs is in scope as the card describes.


    Generated by Claude Code

  5. huangyiirene commented on Aug 11, 2026

    @huangyiirene
    CollaboratorAuthor

    os-dev-report

    {
      "issue": 1060,
      "status": "rework",
      "branch": "claude/issue-1060-lint-i18n-gate",
      "pr": "https://github.com/objectstack-ai/hotcrm/pull/1080",
      "premise_still_valid": false,
      "summary": "Premise re-measured at rc.6 on origin/main and did NOT hold: lint without --skip-i18n reports 228 warnings vs 153 with the flag, a 75-warning delta that is exactly the i18n/missing-page rule (confirmed by rule-id count) -- 25 identical page-component label/title/description keys x 3 locales (es-ES/ja-JP/zh-CN), never mirrored from src/pages/*.page.ts into the locale bundles. Filled the 50 es-ES+zh-CN keys and dropped --skip-i18n from package.json's lint script. Left the 25 ja-JP keys untouched per the cross-claim boundary (ja-JP.ts is #858's file in this batch) -- enumerated below for the next round. Because ja-JP debt remains, lint on this branch is NOT fully green (25 residual i18n/missing-page warnings, all ja-JP) -- PR body opens with 'Part of #1060' rather than 'Fixes #1060' for that reason. lint's exit code is 0 with or without the flag (it doesn't fail on warnings alone), so dropping it is mechanically safe and simply makes the residual debt visible in the gate output.",
      "tests": "pnpm typecheck: pass. pnpm validate: pass (pre-existing unrelated author-time warnings only, none i18n). pnpm build: pass, dist/objectstack.json produced (1888.0 KB). npx vitest run test/i18n-references.test.ts: 20/20 pass. npx vitest run --maxWorkers=2 (full scoped suite): 86 files, 2086 passed / 1 skipped, exit 0. node scripts/check-source-hygiene.mjs: clean. grep -naP control-byte self-scan on both edited translation files: clean. npx objectstack lint (no flag, post-fix): 178 warnings (down from 228), all 25 remaining i18n/missing-page hits are ja-JP only -- es-ES and zh-CN show zero i18n/missing-page warnings.",
      "open_questions": [],
      "out_of_scope_findings": [],
      "ja_jp_missing_keys_for_next_round": [
        "pages.app_launcher_page.components.app_search.label",
        "pages.app_launcher_page.components.app_grid.label",
        "pages.case_detail_page.components.case_highlights.label",
        "pages.case_detail_page.components.case_status_path.label",
        "pages.lead_detail_page.components.lead_highlights.label",
        "pages.lead_detail_page.components.lead_path.label",
        "pages.lead_detail_page.components.main_tabs.label",
        "pages.opportunity_detail_page.components.opp_highlights.label",
        "pages.opportunity_detail_page.components.opp_stage_path.label",
        "pages.sales_home_page.components.quick_create.title",
        "pages.sales_home_page.components.quick_create.label",
        "pages.sales_home_page.components.my_recent_items.title",
        "pages.sales_home_page.components.my_recent_items.label",
        "pages.sales_home_page.components.key_metrics.title",
        "pages.sales_home_page.components.key_metrics.label",
        "pages.sales_home_page.components.home_tabs.label",
        "pages.sales_home_page.components.ai_briefing.title",
        "pages.sales_home_page.components.ai_briefing.description",
        "pages.sales_home_page.components.ai_briefing.label",
        "pages.sales_home_page.components.upcoming_events.title",
        "pages.sales_home_page.components.upcoming_events.label",
        "pages.utility_bar_page.components.notifications_panel.label",
        "pages.utility_bar_page.components.quick_notes.title",
        "pages.utility_bar_page.components.quick_notes.label",
        "pages.utility_bar_page.components.quick_search.label"
      ]
    }

    Generated by Claude Code

  6. huangyiirene commented on Aug 11, 2026

    @huangyiirene
    CollaboratorAuthor

    ACCEPT (partial — this card stays open) — PR #1080 (claude/issue-1060-lint-i18n-gate), reviewed against the PR rather than the report.

    The premise was falsified, and that is the valuable part of this run. This card asserted "i18n debt is zero" on the strength of a 2026-08-05 measurement at 0899b4f (rc.5). Re-measured at the rc.6 pin: objectstack lint without --skip-i18n reports 228 warnings vs 153 with it — a 75-warning delta, all i18n/missing-page: 25 page-component label/title/description keys defined in src/pages/*.page.ts and never mirrored into the locale bundles, across three locales. The flag was not hiding zero debt; it was hiding 75 warnings. This is exactly why the card was made to wait for #1059 rather than trusting the older reading.

    Verified by the PM:

    One finding this run surfaced that the card did not anticipate, recorded here and filed separately: this branch has the flag dropped and 25 residual ja-JP warnings, and Quality Checks is still green. So lint does not fail on i18n warnings — dropping --skip-i18n makes the debt visible, it does not make it enforced. The card's goal ("coverage should enter the gate") is therefore only half-delivered by this change, through no fault of the implementation.

    Remaining on this card: the 25 ja-JP page-component keys, blocked on #858 landing. Filed as a follow-up and linked below; this card closes when that lands.


    Generated by Claude Code

  7. added
    pm:queueReady for the PM dispatch loop
    and removed
    pm:dispatchedDispatched to a dev agent by /pm-dispatch
    on Aug 11, 2026
  8. removed their assignment
    on Aug 11, 2026
  9. huangyiirene commented on Aug 11, 2026

    @huangyiirene
    CollaboratorAuthor

    Returned to the queue — claim released, pm:dispatched → pm:queue. PR #1080 merged (2026-08-11T14:37Z); this card is not closed because that PR was Part of, not Fixes.

    Remaining scope: the 25 ja-JP page-component keys. They were held out of #1080 by a cross-claim boundary against #858 — and that boundary is now gone: #858's PR #1079 merged in the same batch, so src/translations/ja-JP.ts is free. This card is immediately dispatchable, not blocked.

    Keys to add (same paths already filled for es-ES and zh-CN in #1080, values to match each page's English source in src/pages/*.page.ts):

    pages.app_launcher_page.components.app_search.label
    pages.app_launcher_page.components.app_grid.label
    pages.case_detail_page.components.case_highlights.label
    pages.case_detail_page.components.case_status_path.label
    pages.lead_detail_page.components.lead_highlights.label
    pages.lead_detail_page.components.lead_path.label
    pages.lead_detail_page.components.main_tabs.label
    pages.opportunity_detail_page.components.opp_highlights.label
    pages.opportunity_detail_page.components.opp_stage_path.label
    pages.sales_home_page.components.quick_create.title
    pages.sales_home_page.components.quick_create.label
    pages.sales_home_page.components.my_recent_items.title
    pages.sales_home_page.components.my_recent_items.label
    pages.sales_home_page.components.key_metrics.title
    pages.sales_home_page.components.key_metrics.label
    pages.sales_home_page.components.home_tabs.label
    pages.sales_home_page.components.ai_briefing.title
    pages.sales_home_page.components.ai_briefing.description
    pages.sales_home_page.components.ai_briefing.label
    pages.sales_home_page.components.upcoming_events.title
    pages.sales_home_page.components.upcoming_events.label
    pages.utility_bar_page.components.notifications_panel.label
    pages.utility_bar_page.components.quick_notes.title
    pages.utility_bar_page.components.quick_notes.label
    pages.utility_bar_page.components.quick_search.label
    

    Acceptance: objectstack lint reports zero i18n/missing-page warnings — that is the reading that closes this card, and it is now a meaningful one because --skip-i18n is gone from the script as of #1080.

    Note for whoever takes it: #858 rewrote four convert-verb values in ja-JP.ts, so branch off origin/main at or after #1079's merge — a branch cut earlier carries a stale copy of that file.

    Two things this card can no longer claim, now that they have been measured:

    1. Its title's premise ("i18n debt is zero") was false at rc.6 — the flag was hiding 75 warnings, not zero.
    2. Its goal ("coverage should enter the gate") is only half-achievable by this card, because objectstack lint does not fail on warnings. Filed separately as a finding; that half is not this card's work.

    Generated by Claude Code

  10. added
    pm:dispatchedDispatched to a dev agent by /pm-dispatch
    and removed
    pm:queueReady for the PM dispatch loop
    on Aug 11, 2026
  11. self-assigned this
    on Aug 11, 2026
  12. huangyiirene commented on Aug 11, 2026

    @huangyiirene
    CollaboratorAuthor

    Claim: PM loop round 6 (second dispatch of this card — the ja-JP remainder)

    Session: session_01NM6o28jmBgsyTRQHutn7LC
    Branch: claude/issue-1060-ja-jp-page-keys
    Worktree: hotcrm-issue-1060-jajp
    File surface: src/translations/ja-JP.ts only (stop on breach; explain in the report)
    Container & model: S-grade mechanical (25 keys mirroring an existing English source, correctness decided by the lint rule itself), mode:subagent, model: sonnet
    Serial constraints cleared: src/translations/ja-JP.ts was held by #858 — verified merged, PR #1079, commit 83a8dbdb on origin/main. package.json is not in this dispatch's surface at all (its half landed in #1080). #1061 remains held behind this card for the same file.


    Generated by Claude Code

  13. huangyiirene commented on Aug 11, 2026

    @huangyiirene
    CollaboratorAuthor

    os-dev-report

    {
      "issue": 1060,
      "status": "done",
      "branch": "claude/issue-1060-ja-jp-page-keys",
      "pr": "https://github.com/objectstack-ai/hotcrm/pull/1084",
      "premise_still_valid": true,
      "summary": "Filled the remaining 25 ja-JP page-component translation keys that #1080 deliberately left out (cross-claim boundary against #858, now merged as 83a8dbdb). Branch cut from origin/main f71b5350 (carries both 83a8dbdb and f71b5350). Re-ran npx objectstack lint fresh before editing: it reported exactly 25 i18n/missing-page warnings, all ja-JP, matching the PM's enumerated key list exactly; es-ES/zh-CN showed zero. Translated each string against its English source in src/pages/*.page.ts, matching the nesting shape #1080 established for es-ES/zh-CN. File surface stayed strictly to src/translations/ja-JP.ts, additions only -- no existing lines reordered, to avoid a needless conflict for #1061 which is queued behind this file. Since this fully closes the debt (0 i18n/missing-page warnings remain across all three locales), PR opens with 'Fixes #1060' per the card's own instruction.",
      "tests": "npx objectstack lint (no flag): i18n/missing-page count 25 -> 0 (rule-hit count, not exit code, since lint always exits 0 per #1083); total warnings 178 -> 153. pnpm typecheck (tsc --noEmit): clean. pnpm validate: exit 0, remaining warnings are pre-existing unrelated author-time issues (missing section names, deprecated component props, colSpan usage), none i18n, none touching ja-JP.ts. pnpm build: exit 0, dist/objectstack.json produced (1890.1 KB), 157 pre-existing author-time warnings, none i18n. npx vitest run test/i18n-references.test.ts --maxWorkers=2: 20/20 passed. npx vitest run --maxWorkers=2 (full scoped suite): 86 files, 2086 passed / 1 skipped, exit 0. node scripts/check-source-hygiene.mjs: clean. Control-byte self-scan on the edited file: clean.",
      "open_questions": [],
      "out_of_scope_findings": []
    }

    Generated by Claude Code


    Generated by Claude Code

  14. huangyiirene commented on Aug 11, 2026

    @huangyiirene
    CollaboratorAuthor

    ACCEPT — PR #1084 (claude/issue-1060-ja-jp-page-keys), the ja-JP third of this card.

    Verified by the PM:

    The acceptance criterion is met on the reading that actually means something: i18n/missing-page rule hits 25 → 0, quoted as a rule-hit count rather than an exit code — correctly, because per #1083 objectstack lint exits 0 regardless and the exit code proves nothing here. Total warnings 178 → 153.

    Worth recording: 153 is exactly what --skip-i18n was reporting before any of this work. The flag now makes no difference to the output, which is the honest end state of the card — the gate runs, and it has nothing to hide.

    Taken with #1080, the three-locale debt this card uncovered (75 warnings, against a card title that asserted zero) is closed.

    CI at review time: Quality Checks, Check Changeset, link-check, Label Pull Request, Vercel green; Build and Test (22.x), Playwright, Analyze Code still running. ⛔ Not flipped to ready yet — waiting on those jobs' conclusions.


    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

Labels

configurationBuild and app configuration filespm:dispatchedDispatched to a dev agent by /pm-dispatch

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions