Blocked-by: #1874
⏸️ Moved pm:queue → pm:blocked by the repo:hotcrm seat (#1353), R60, 2026-09-10T09:2xZ. ⛔ Nothing about the finding has changed.
⚠️ The card's own reason for staying pm:queue — "precisely so it stays visible in ordinary take order" — no longer holds, and this is the correction. Its declared scope is test/i18n-references.test.ts, which is inside epic #1579's test/** fence; the fence is live and is itself now a maintainer question in #1874. A card that cannot be taken is not made takeable by a label, and leaving it in take order was inflating this lane's dispatchable count. It returns to pm:queue when #1874 closes.
⚠️⚠️ A conflict that must be read before this card is ever dispatched, and which the card could not have known when it was filed: epic #1585 is "Retire the local i18n reference test and the severity-promoting i18n gate, once strict covers the i18n/missing-* and translation-target rules." ⇒ This card asks to EXTEND the very file that #1585 asks to DELETE. Both cannot be right. Whoever re-prices this after #1874 must resolve that against #1585 first — ⛔ extending a file scheduled for retirement is work with a negative expected value, and neither card currently cites the other.
⭐ Note also that the card's own supersession clause may fire before any of this matters: if objectstack#16310 lands in a pinned release, this closes as superseded with no argument needed. That condition is unchanged and still un-watched — ⚠️ per the card's own standing note, nothing evaluates a Restart-when: on its own, and the seat re-scans after each platform pin bump.
Filed by the repo:hotcrm PM seat (R66) as the ruled follow-up to #1262 — question 2 of PR #1726's report. ⛔ Recorded as a card rather than left as an intention, because an intention that lives only in a dev report is one nobody re-reads.
What #1262 shipped, and what it deliberately did not
PR #1726 added the orphan direction to test/i18n-references.test.ts for one keyspace: apps.*.navigation. That was the 2026-08-25 grading's own instruction — start where the keyspace is flat and the app tree sits beside it, generalise once the shape is agreed.
The shape is now agreed and shipped, so the remaining keyspaces are the open half: objects.*, actions.*, dashboards.* and whatever else the bundles carry.
Why this is not hypothetical
The orphan risk in objects.* has been demonstrated twice, both times by a near-miss rather than an outage:
| when |
what |
| PR #1261 (#1259) |
deleted four navigation entries; their five apps.*.navigation keys in three locale packs were removed by hand. Had they not been, pnpm verify would have been green with 15 dead keys. This is the near-miss #1262 was filed about. |
| PR #1718 (#1707), this week |
deleted a form view; its four objects.crm_lead._sections.lead_details keys were removed by hand, on the same reasoning. Measured there: with the keys left in, lint reports four warnings and pnpm verify is still green. |
⇒ Both times the cleanup happened because the author noticed. That is exactly the property #1262 exists to remove, and it is currently removed for one keyspace out of several.
⚠️ This card may be superseded, and that is a normal outcome
objectstack#16310 asks the platform to make translation-target-unknown failable — it already reports every keyspace and every app, in every locale; what it lacks is a severity or a namespace a gate can reach. A platform answer covers all of this at once and makes a repo-side sweep redundant.
⇒ If objectstack#16310 lands in a pinned release before this card is dispatched, close this as superseded. No argument needed, and ⛔ nobody should re-litigate it.
Restart-when: either (a) a pinned @objectstack/* release makes translation-target-unknown fail a run — then close as superseded; or (b) a maintainer decides not to wait for it.
⚠️ Per the standing lane rule, nothing evaluates a Restart-when: on its own — the PM seat re-scans blocked and deferred predicates after every platform pin bump.
Scope when taken
Refs: #1262 · PR #1726 · PR #1718 (#1707) · PR #1261 (#1259) · objectstack#16310 · ⚠️ #1585 (the epic card that would delete this file) · #1874 (the fence ruling this waits on)
Blocked-by: #1874
⏸️ Moved
pm:queue→pm:blockedby therepo:hotcrmseat (#1353), R60, 2026-09-10T09:2xZ. ⛔ Nothing about the finding has changed.pm:queue— "precisely so it stays visible in ordinary take order" — no longer holds, and this is the correction. Its declared scope istest/i18n-references.test.ts, which is inside epic #1579'stest/**fence; the fence is live and is itself now a maintainer question in #1874. A card that cannot be taken is not made takeable by a label, and leaving it in take order was inflating this lane's dispatchable count. It returns topm:queuewhen #1874 closes.i18n/missing-*and translation-target rules." ⇒ This card asks to EXTEND the very file that #1585 asks to DELETE. Both cannot be right. Whoever re-prices this after #1874 must resolve that against #1585 first — ⛔ extending a file scheduled for retirement is work with a negative expected value, and neither card currently cites the other.⭐ Note also that the card's own supersession clause may fire before any of this matters: if objectstack#16310 lands in a pinned release, this closes as superseded with no argument needed. That condition is unchanged and still un-watched —⚠️ per the card's own standing note, nothing evaluates a
Restart-when:on its own, and the seat re-scans after each platform pin bump.Filed by the
repo:hotcrmPM seat (R66) as the ruled follow-up to #1262 — question 2 of PR #1726's report. ⛔ Recorded as a card rather than left as an intention, because an intention that lives only in a dev report is one nobody re-reads.What #1262 shipped, and what it deliberately did not
PR #1726 added the orphan direction to
test/i18n-references.test.tsfor one keyspace:apps.*.navigation. That was the 2026-08-25 grading's own instruction — start where the keyspace is flat and the app tree sits beside it, generalise once the shape is agreed.The shape is now agreed and shipped, so the remaining keyspaces are the open half:
objects.*,actions.*,dashboards.*and whatever else the bundles carry.Why this is not hypothetical
The orphan risk in
objects.*has been demonstrated twice, both times by a near-miss rather than an outage:apps.*.navigationkeys in three locale packs were removed by hand. Had they not been,pnpm verifywould have been green with 15 dead keys. This is the near-miss #1262 was filed about.objects.crm_lead._sections.lead_detailskeys were removed by hand, on the same reasoning. Measured there: with the keys left in, lint reports four warnings andpnpm verifyis still green.⇒ Both times the cleanup happened because the author noticed. That is exactly the property #1262 exists to remove, and it is currently removed for one keyspace out of several.
objectstack#16310 asks the platform to make
translation-target-unknownfailable — it already reports every keyspace and every app, in every locale; what it lacks is a severity or a namespace a gate can reach. A platform answer covers all of this at once and makes a repo-side sweep redundant.⇒ If objectstack#16310 lands in a pinned release before this card is dispatched, close this as superseded. No argument needed, and ⛔ nobody should re-litigate it.
Restart-when: either (a) a pinned
@objectstack/*release makestranslation-target-unknownfail a run — then close as superseded; or (b) a maintainer decides not to wait for it.Restart-when:on its own — the PM seat re-scans blocked and deferred predicates after every platform pin bump.Scope when taken
test/i18n-references.test.ts— extend the same walk, one keyspace at a time, each with the anti-vacuity half PR test(i18n): fail on an orphaned apps.*.navigation locale key #1726 established (pin that the walk and the per-locale tables were really non-empty).scripts/check-lint-i18n-gate.mjs. Measured on Orphaned locale keys are invisible to every i18n check — the gate only looks surface→translation #1262: the platform rule id is a baretranslation-target-unknownwith noi18n/namespace, so a prefix gate cannot express it without becoming an exact-id allowlist. The 2026-08-25 ruling against editing that script stands.pnpm verifyexit 1, restore by hash-verifiedgit checkout HEAD -- <absolute path>. ⛔ Nevergit stash.Refs: #1262 · PR #1726 · PR #1718 (#1707) · PR #1261 (#1259) · objectstack#16310 ·⚠️ #1585 (the epic card that would delete this file) · #1874 (the fence ruling this waits on)