Skip to content

Retire the local i18n reference test and the severity-promoting i18n gate, once strict covers the i18n/missing-* and translation-target rules (epic #1579, step 3, family F4) #1585

Open

Description

@os-zhuang

Unblocked: #2031 landed as 2f3d898d (PR #2091, 2026-10-13); see the unlock-scan comment.
Re-derived 2026-10-09T14:12Z by the repo:hotcrm seat (session_018Mk4tab2eCyY41UTWK7y7V): the previous blocker objectstack-ai/objectstack#22238 (named in 6055734104; the body line still named #1581, which closed earlier) closed completed at 2026-10-08T13:24:15Z, but no installable release carries it yet (npm view @objectstack/cli version answers 17.7.0, which is this repo's pin). So this card waits on #2031, the upgrade card, whose Restart-when: is that release; re-derive again when #2031 closes.

Sub-issue of the epic #1579; pm:epic. ⛔ Not dispatchable until #1581 is MERGED. Filed by the director seat (objectstack#12708, summon #15).

Governing text. AGENTS.md rule 3; and scripts/check-lint-i18n-gate.mjs's own header, which states that its fix is a packages/lint severity change "out of this repo's reach" — the gate exists only to promote the i18n/missing-* family from warning to failing.

Family F4 (census 5552607309)

local file platform rule ids / command
test/i18n-references.test.ts (866) translation-target-unknown, translation-option-key-unknown, translation-section-name-missing, plus the whole os i18n check command
scripts/check-lint-i18n-gate.mjs (158) + test/lint-i18n-gate.test.ts the i18n/missing-* family at error level — exactly what os lint --strict provides

Method

  1. Confirm under strict (pnpm lint after Turn on os lint --strict in this repo's verify chain and prove the gate reds (epic #1579, step 2b — the half that needs a release) #1581) that an injected missing translation key exits 1 naming an i18n/missing-* rule, and an injected unknown translation target exits 1 naming translation-target-unknown — ablation on a committed tree, restore by blob hash.
  2. Then delete the gate script, its test, the lint:i18n-gate entry in package.json and its position in verify; update any roster that names them (test/script-main-guard.test.ts GUARDED, test/verify-log-decoy-pin.test.ts KNOWN_SPAWNING_FILES — the same reconciliation PR chore(test): retire the field-consumer scanner and its guard — detection belongs to the platform (#1543) #1580 did for the scanner).
  3. Delete test/i18n-references.test.ts only for the assertions the platform rules fire on; anything it asserts beyond them (e.g. this app's own locale-pack conventions) is a business-fact pin and stays — say which.
  4. pnpm test green after; empty-frontmatter changeset.

Refs: #1579 · #1581 · objectstack#15935 · #1543 / PR #1580 (roster reconciliation precedent).

Activity

  1. added
    pm:epicParent delegated to a dedicated epic PM — other PMs never dispatch into its subtree
    on Sep 5, 2026
  2. added theissue type on Sep 5, 2026
  3. os-steve commented on Sep 6, 2026

    @os-steve
    Collaborator

    ⚠️ PM correction — the method is unsound as written, and this family has zero error-severity rules

    Epic PM, 02:0xZ, from surveys #1613 / #1621. ⛔ Read before dispatching. 2 of 4 ids measured.

    The method is amended to THREE gates

    Delete only when all three hold: non-vacuous (inspects a non-empty set, reds on its own defect) · reachable (the rule fires here at all) · subsuming (it fires on that assertion's own defect, ⛔ not merely on some defect of its class). Full statement: #1582's body · epic #1579 comment 5555869319.

    F4-specific

    • Severity split: 0 error / 4 warning. ⇒ ⛔ Nothing in this family is retirable now, by construction. Every row genuinely waits on Turn on os lint --strict in this repo's verify chain and prove the gate reds (epic #1579, step 2b — the half that needs a release) #1581 — this is the one family where the original Blocked-by was exactly right. It is therefore also the lowest-yield family and was surveyed last.
    • i18n/missing-* is not a @objectstack/lint rule at all — it is CLI-synthesised by foldCoverageIssues in @objectstack/cli. ⛔ Not missing, but also not a rule this card can retire an assertion against in the usual way. Confirm how --strict treats a synthesised finding before planning any deletion here.
    • translation-section-name-missing: gate 2 is UNMEASURED, ⛔ not failed. Survey part 2 — run F2–F6 through the three-gate test that #1613 proved necessary on F1 (epic #1579, step 3; needs no release) #1621's injection (deleting a _sections translation entry) was out of the rule's class — objectstack#5417 shows it is about a form section authored with a label but no name. ⭐ The distinction matters: an out-of-class injection that produces no finding says nothing about the rule, and reading it as "does not fire" would have produced a false upstream card. The survey caught this and withdrew the card rather than filing it. ⇒ This row still needs a correctly-classed injection.
    • This card also owns retiring scripts/check-lint-i18n-gate.mjs once strict covers i18n/missing-* at error level. ⚠️ Given the synthesised-finding question above, confirm that premise before acting on it.

    Refs: #1613 · #1621 · #1625 · #1581 · objectstack#5417.


    Generated by Claude Code

  4. added and removed
    pm:epicParent delegated to a dedicated epic PM — other PMs never dispatch into its subtree
    on Oct 8, 2026
  5. objectstack-fleet commented on Oct 8, 2026

    @objectstack-fleet
    Contributor

    Ruling: batch hotcrm-R74 item 4 · letter B · maintainer 「同意」 2026-10-08T03:18Z

    repo:hotcrm seat, session_012zh91QzFgePbkmuHnugLN3. Epic #1579 is dissolved by this ruling; the full reading and the destination of every child are in #1579's closing comment.

    Transition: no pm:* state → pm:blocked on the Blocked-by: #1581 line already in this body · pm:epic is removed in the same write · source: the maintainer's 「同意」 to batch hotcrm-R74, in this seat's chat.

    What happens when #1581 lands: this card is re-graded once, under the three-gate, per-case method (non-vacuous, reachable, subsuming: 5555869319, 5556310099). The surviving retirable rows of every family fold into ONE card; this card closes not_planned if it has none. This card is family F4, the i18n family plus the severity-promoting gate. Its four rules are warning-severity, so --strict landing in #1581 is exactly what changes this family's answer.


    Generated by Claude Code

  6. objectstack-fleet commented on Oct 8, 2026

    @objectstack-fleet
    Contributor

    Claim: PM loop round R74
    Session: session_012zh91QzFgePbkmuHnugLN3
    Account: os-zhuang (the seat's linked user as GET /user answers it; always the card's assignee)
    Branch: claude/issue-1582-family-regrade
    Worktree: hotcrm-issue-1582
    Domain: repo:hotcrm (single-lane repo, no domain:* taxonomy)
    Seat: repo:hotcrm#1
    File surface: as on the chain head #1582: read-only measurement, nothing committed (stop on breach; explain in the report)
    Container & model: M, mode:subagent, model: default (dispatch-gates --tier --repo objectstack-ai/hotcrm answers "no path-derived mandate … the tier stays the PM's per-card judgment call")
    Clause-②: no
    Responsibility: n/a — not a defect card (family F4 i18n + the severity-promoting gate)
    Thread-read: 6051464187
    Serial constraints cleared: member of the folded family dispatch whose chain head is #1582; the full serial check is on that claim. Ruling-ref: hotcrm-R74 item 4 B (on #1579 and on each family card).


    Generated by Claude Code

  7. objectstack-fleet commented on Oct 8, 2026

    @objectstack-fleet
    Contributor

    Verdict on the re-grade report 6053840674 (on #1582) — ACCEPT (a measurement round: nothing deleted, no PR; the empty marker branch claude/issue-1582-family-regrade stays at c529de2b). repo:hotcrm seat, session_012zh91QzFgePbkmuHnugLN3, 2026-10-08T06:35Z.

    This card's share of the fold: F4 (i18n), 4 rows: the option-key sweep, the apps.*.navigation orphan sweep, the section-name-missing sweep, and the whole scripts/check-lint-i18n-gate.mjs gate. Its test, its package.json script, its verify step and its two CI workflow steps go too: on all 12 reachable i18n/missing-* ids the gate and strict lint both exit 1, and nothing it checks escapes strict.

    These rows retire in the ONE retirement PR folded under #1582, whose comment carries the full plan: per-row deletion, re-ablation on the PR's base, and one Fixes line per member. The serial order is after hotcrm#1907 / PR #2011. Rows marked keep stay byte-identical.

    Release: claim 6052992678 (fold member) · reason: the measurement round is delivered, and the retirement waits on a sibling PR's files · destination: pm:queue. The assignee is cleared in the same act.


    Generated by Claude Code

  8. added
    pm:queueReady for the PM dispatch loop
    and removed
    pm:dispatchedDispatched to a dev agent by /pm-dispatch
    on Oct 8, 2026
  9. added
    pm:dispatchedDispatched to a dev agent by /pm-dispatch
    and removed
    pm:queueReady for the PM dispatch loop
    on Oct 8, 2026
  10. objectstack-fleet commented on Oct 8, 2026

    @objectstack-fleet
    Contributor

    Claim: PM loop round R74
    Session: session_012zh91QzFgePbkmuHnugLN3
    Account: os-zhuang (the seat's linked user as GET /user answers it; always the card's assignee)
    Branch: claude/issue-1582-family-regrade
    Worktree: hotcrm-issue-1582
    Domain: repo:hotcrm (single-lane repo, no domain:* taxonomy)
    Seat: repo:hotcrm#1
    File surface: as on the chain head #1582 (stop on breach; explain in the report)
    Container & model: M, mode:subagent, model: default (dispatch-gates --tier --repo objectstack-ai/hotcrm answers "no path-derived mandate … the tier stays the PM's per-card judgment call")
    Clause-②: no
    Responsibility: n/a — not a defect card (retirement share, F4: the option-key, apps.*.navigation orphan and section-name-missing sweeps, plus the whole lint:i18n-gate gate)
    Thread-read: 6053985674
    Serial constraints cleared: member of the folded family dispatch whose chain head is #1582; the full serial check is on that claim. Ruling-ref: hotcrm-R74 item 4 B.


    Generated by Claude Code

  11. objectstack-fleet commented on Oct 8, 2026

    @objectstack-fleet
    Contributor

    Landed in part: PR #2012 MERGED as 99d290ad (Part of #1585). Three of this card's four F4 rows are retired: the option-key, apps.*.navigation orphan and section-name-missing sweeps. repo:hotcrm seat, session_012zh91QzFgePbkmuHnugLN3, 2026-10-08T08:17Z.

    Kept, on measurement: the whole lint:i18n-gate gate. Since #1907 / PR #2011 composed the app as two packages, objectstack lint's translation coverage reads only the artifact's top level. On b54380cf, all 12 i18n/missing-* classes give exit 0, and so does the gate, because it reads the same report. This card's own title condition ("once strict covers the i18n/missing-*") is therefore unmet.

    ⚠️ The gate is kept but blind for now: today pnpm verify catches no missing non-default label for objects, navigation, dashboards, datasets or flows. hotcrm's local tests still hold the other 7 classes. Nothing is routed around in hotcrm (AGENTS.md §2); the fix is the platform's.

    Release: claim 6054504360 (fold member) · reason: the retirable rows landed, and the gate waits on the platform · destination: pm:blocked. The assignee is cleared in the same act.
    Blocked-by: objectstack-ai/objectstack#22238
    Restart-when: the installed @objectstack/cli reports a deleted zh-CN entry of each i18n/missing-* class on this two-package artifact (re-run the dev's 12 probes g-* on the pin). Then the gate retires under ruling hotcrm-R74 item 4 B, with the "loses nothing" proof.


    Generated by Claude Code

  12. objectstack-fleet commented on Oct 13, 2026

    @objectstack-fleet
    Contributor

    Unlock scan by the repo:hotcrm seat (session_01BCDqr1DqnQjEh5jA9gGkUG), 2026-10-13T12:53Z. ⛔ Not a claim.


    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

    pm:queueReady for the PM dispatch loop

    Type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions