fix(i18n): retire "step" and "Overdue" from user-facing copy #232

Merged
nalum merged 1 commit from fix/retire-step-and-overdue into main 2026-08-26 18:35:27 +00:00
Owner

Closes #179.

The interface names a sub-job with no noun at all — headings and counts carry
it: To do, 7 left, Add another, Delete this and the 12 under it?.
Engineering keeps saying sub-task and step in code and ADRs; only the copy
changes. And Overdue becomes Late, which is six letters, legible in a dense
row, and what a family says out loud.

What did not move, deliberately: NOTIFICATION_KIND_JOB_OVERDUE,
NOTIFICATION_KIND_STEP_ADDED, and the notify.* message keys. Those are wire
identifiers stored in User.push_disabled_kinds and on notification rows, and
ADR-0035 forbids renaming an enum value — a strict unmarshal would silently
orphan every household's stored preferences.

Server strings were the surprising half. Seven domain-error sentinels in
internal/domain/item.go reach the client verbatim as the wire message with no
client-side override, so they are failure-honesty text rather than logs — all
reworded, along with three wrapped suffixes in setparent.go and one denial in
create.go.

Two corrections to the ticket's own numbers: there is no six-locale set of
server strings — internal/notify/locales/ holds en and ga — and
notify.job_overdue's value was already compliant in both, so only its key
carried the word. Not assigned yet had eight call sites, not nine; the
redesign stack had already fixed the picker.

Three things found in passing:

  • A string that could never be localized: the Android literal used {0}
    against a catalog key of {failed}. Pre-existing, fixed.
  • The full late sentence overflows a phone row. Today's dense up-for-grabs
    row needed §4f's row-scale band rather than the sentence — measured, the live
    page golden grew 2424 → 2511px before the fix. That is the ladder's fifth band
    earning its place.
  • Its own first pass treated "sub-job" as safe engineering jargon and missed
    seven fixture strings; a failing test caught it.

Translations: de, es, fr and pl lost nothing — none had translations
for any retired string. Irish lost seven fuzzy machine translations, none
human-reviewed. One Irish notification string was hand-adjusted using the
existing cuir le idiom rather than guess-translated; the rest are left
untranslated, per §4f's instruction that Irish needs its own pass.

Noted and not fixed, for ticketing: nine (optional) labels across Rewards and
Calendar. The Save changes buttons on those pages were checked and are
legitimate multi-field forms, not commit-on-blur surfaces.

🤖 Generated with Claude Code

Closes #179. The interface names a sub-job with no noun at all — headings and counts carry it: `To do`, `7 left`, `Add another`, `Delete this and the 12 under it?`. Engineering keeps saying sub-task and step in code and ADRs; only the copy changes. And `Overdue` becomes `Late`, which is six letters, legible in a dense row, and what a family says out loud. **What did not move, deliberately**: `NOTIFICATION_KIND_JOB_OVERDUE`, `NOTIFICATION_KIND_STEP_ADDED`, and the `notify.*` message keys. Those are wire identifiers stored in `User.push_disabled_kinds` and on notification rows, and ADR-0035 forbids renaming an enum value — a strict unmarshal would silently orphan every household's stored preferences. **Server strings were the surprising half.** Seven domain-error sentinels in `internal/domain/item.go` reach the client verbatim as the wire message with no client-side override, so they are failure-honesty text rather than logs — all reworded, along with three wrapped suffixes in `setparent.go` and one denial in `create.go`. Two corrections to the ticket's own numbers: there is no six-locale set of server strings — `internal/notify/locales/` holds `en` and `ga` — and `notify.job_overdue`'s **value** was already compliant in both, so only its key carried the word. `Not assigned yet` had eight call sites, not nine; the redesign stack had already fixed the picker. Three things found in passing: - **A string that could never be localized**: the Android literal used `{0}` against a catalog key of `{failed}`. Pre-existing, fixed. - **The full late sentence overflows a phone row.** Today's dense up-for-grabs row needed §4f's row-scale band rather than the sentence — measured, the live page golden grew 2424 → 2511px before the fix. That is the ladder's fifth band earning its place. - Its own first pass treated "sub-job" as safe engineering jargon and missed seven fixture strings; a failing test caught it. **Translations**: `de`, `es`, `fr` and `pl` lost nothing — none had translations for any retired string. Irish lost seven fuzzy machine translations, none human-reviewed. One Irish notification string was hand-adjusted using the existing `cuir le` idiom rather than guess-translated; the rest are left untranslated, per §4f's instruction that Irish needs its own pass. Noted and not fixed, for ticketing: nine `(optional)` labels across Rewards and Calendar. The `Save changes` buttons on those pages were checked and are legitimate multi-field forms, not commit-on-blur surfaces. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
fix(i18n): retire "step" and "Overdue" from user-facing copy
Some checks failed
check / commits (pull_request) Successful in 9s
check / web (pull_request) Failing after 2m41s
check / go (pull_request) Successful in 3m1s
android / build (pull_request) Failing after 4m59s
check / report (pull_request) Successful in 4s
android / report (pull_request) Successful in 5s
bf8a0c22c0
Issue #179: two words leaked past the design review that decided
against them. "Step" named a sub-job noun the vocabulary spec
explicitly rejected (§1 "Vocabulary — important") — it survived in
error toasts, an offline-queue label, a card tooltip and button, and
three Go domain-error sentinels that reach the client verbatim as the
wire message's English fallback. "Overdue" was retired for "Late" by
§4f's wording ladder everywhere except two stragglers the card
redesign never touched: Today's up-for-grabs row (still the old red
pill) and the Settings colour-spec preview swatch.

Also finishes the §8 "Not assigned yet" retirement the card redesign
started: Jobs' and Rewards' group headings and the Calendar/Rewards
"whose" field values used it beside "Anyone" and "Up for grabs" already
live elsewhere, giving the app two names for one state.

New row-scale ladder form (lateLabelRow/deadlineLabel's sibling) for
Today's dense list: the full lateLabel sentence overflowed a phone-width
row (measured against the live e2e goldens), so the row drops the
"Late — was due" preamble instead of the date/time, matching §4f's
"amber time plus the word late" rule for dense lists exactly.

A changed string is a new lingui msgid, so this sheds the old strings'
translations. None of the 14 retired en msgids carried a real (non-fuzzy)
translation in de/es/fr/pl; ga had 7 fuzzy machine translations pending
review, now gone with them — acceptable since they were never reviewed.
The 15 new msgids are left untranslated rather than guessed, except
notify.step_added's ga value, hand-adjusted to drop "céim" using the
same "cuir le" restructuring as the English fix. Server enum names
(NOTIFICATION_KIND_JOB_OVERDUE/STEP_ADDED) and notify.*'s JSON keys are
untouched per ADR-0035 — copy changes, wire names don't.

CLI and MCP keep "step" as engineering/API terminology: neither is a
lingui surface, and the issue scopes the sweep to the two i18n client
surfaces plus the server's notification strings.

Test report

Suite Tests Result Skipped
Unit 1435 ✅ pass 1
Integration 131 ✅ pass —

Coverage: 27.0%

Updated by the check workflow · commit 39ead4c236

<!-- ci-test-report --> ## Test report | Suite | Tests | Result | Skipped | | --- | --: | --- | --: | | Unit | 1435 | ✅ pass | 1 | | Integration | 131 | ✅ pass | — | **Coverage:** 27.0% <sub>Updated by the check workflow · commit 39ead4c2368232f324e25c8c321289312c470efe</sub>

Android test report

Suite Tests Result Skipped
Unit (debug) ❌ 1 failed

Coverage:

Updated by the android workflow · commit 39ead4c236

<!-- android-test-report --> ## Android test report | Suite | Tests | Result | Skipped | | --- | --: | --- | --: | | Unit (debug) | | ❌ 1 failed | | **Coverage:** <sub>Updated by the android workflow · commit 39ead4c2368232f324e25c8c321289312c470efe</sub>
nalum force-pushed fix/retire-step-and-overdue from bf8a0c22c0
Some checks failed
check / commits (pull_request) Successful in 9s
check / web (pull_request) Failing after 2m41s
check / go (pull_request) Successful in 3m1s
android / build (pull_request) Failing after 4m59s
check / report (pull_request) Successful in 4s
android / report (pull_request) Successful in 5s
to 39ead4c236
Some checks failed
check / commits (pull_request) Successful in 15s
check / go (pull_request) Successful in 2m43s
check / web (pull_request) Failing after 2m34s
android / build (pull_request) Failing after 4m53s
check / report (pull_request) Successful in 4s
android / report (pull_request) Successful in 4s
android / report (push) Has been cancelled
check / commits (push) Has been cancelled
check / go (push) Has been cancelled
check / report (push) Has been cancelled
check / web (push) Has been cancelled
tag / tag (push) Has been cancelled
android / build (push) Has been cancelled
2026-08-26 07:04:17 +00:00
Compare
nalum changed target branch from feat/restricted-job-sheets to main 2026-08-26 18:35:23 +00:00
nalum merged commit 39ead4c236 into main 2026-08-26 18:35:27 +00:00
nalum deleted branch fix/retire-step-and-overdue 2026-08-26 18:35:28 +00:00
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
2 participants
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
eagraiclainne/app!232
No description provided.