fix(jobs): honor the chain-end reopen refusal on both surfaces #229
No reviewers
Labels
No labels
adr
android
area/calendar
area/design-system
area/i18n
area/jobs
area/offline
area/server
area/testing
bug
ci
duplicate
enhancement
help wanted
invalid
notifications
question
reliability
security
severity/low
severity/medium
tracking
web
wontfix
No milestone
No project
No assignees
2 participants
Notifications
Due date
No due date set.
Dependencies
No dependencies set
Reference
eagraiclainne/app!229
Loading…
Reference in a new issue
No description provided.
Delete branch "fix/chain-end-refusal"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Closes #176.
Most of §6.2 and §6.3 already shipped with the options sheet, so this began as
an audit rather than a build — a requirement-by-requirement pass over both
sections on both surfaces. The dialog's counting question and button, the ticked
call-out, the survivors sentence, the notice-not-a-snackbar, the completed
sheet's struck title and tappable successor: all present, all left alone.
The refusal to reopen was broken in two different ways, and the code for it
existed in both.
On Android,
completeJob()called a generic failure helper instead of thetickFailureformatter sitting beside it — so a household member trying toreopen a repeating job saw the raw
failed_preconditioncode rather than §6.3'swording. Its domain check was also keyed on the bare RPC status, which
ErrSubTasksOpenandErrParentDoneshare withErrChainMovedOn, so anunrelated refusal could have been labelled a chain-end. It now reads the actual
domain code.
On web, the honest wording only appeared when the successor's date could be
resolved locally; otherwise it fell through to a generic message still reading
"delete that one first" — which contradicts §6.2 outright, since deleting the
successor is not what a household member needs to hear. Both paths now name the
successor and offer it.
Also pinned: deleting a completed repeating job leaves its successor alone. That
was already true and structurally guaranteed —
delete.go's cascade followsparentUidand neverspawnedNext— but nothing tested it. The new integrationspec could not be made to fail first, which is stated rather than dressed up;
so does the fact that one of the four UI tests passes against the old code,
because the old bug's failure mode was omission rather than over-matching.
No goldens moved. No affordance widened. The sweep does not apply — this is
error-formatting logic on an already-shipped screen.
🤖 Generated with Claude Code
Test report
Coverage: 27.0%
Updated by the check workflow · commit
5c5718f4aeAndroid test report
Coverage:
Updated by the android workflow · commit
5c5718f4aed8e7890c575c5718f4ae