Hand a chore on, mention one, and note how it's done - #12
Merged
Conversation
Three small features that address the same underlying problem: chores end up unevenly distributed for social reasons, not scheduling ones. Hand it on. One tap moves an open chore to whoever is carrying the least. Deliberately not a negotiation - a 'would you swap?' flow needs a request, a reply, a pending state and a way to decline, and every one of those is somewhere an awkward silence can live. The balance score is what stops it being abused: everything you hand on is work you have not done. Mention it. The most socially dangerous feature in the app, so the rules are strict and live in lib/domain/nudges, pure and tested. Four refusals: nobody assigned, yourself, not due yet, and already mentioned today. That last cap is per chore across the whole household, not per sender - otherwise three housemates each send 'just one' reminder and someone's phone buzzes three times about one bin, which is exactly how an app gets its notifications switched off. The wording is 'Ana mentioned this one', not 'Ana reminded you' - the latter presumes you forgot. A test asserts no message the feature can produce contains forgot, still, hurry, please, remember, overdue or late. Notes on chores. For the practical knowledge that otherwise lives in one person's head: where the hoover bags are, which bin goes out this week. That knowledge is a real reason jobs stay stuck with one person - it is easier to keep doing something yourself than to explain it. The row shows exactly one social action, chosen by context, so it never grows a row of buttons: your own chore can be passed on, someone else's can be mentioned, and only once it is actually due. The nudge is recorded before it is delivered. If delivery fails the cap still holds, which is the safe direction to fail in. 17 new tests, 173 total. Verified both contextual branches render against the running server, and all five routes still serve clean.
|
You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard. |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Three small features that address the same underlying problem: chores end up unevenly distributed for social reasons, not scheduling ones.
Hand it on
One tap moves an open chore to whoever is currently carrying the least.
Deliberately not a negotiation. A "would you swap?" flow needs a request, a reply, a pending state and a way to decline — and every one of those is somewhere an awkward silence can live. Handing it straight to the fairest other person is one tap, and the balance score is what stops it being abused: everything you hand on is work you have not done, and the number says so.
Mention it
This is the most socially dangerous feature in the app — a reminder button is one design decision away from a device for passive aggression. So the rules are strict, and they live in
lib/domain/nudgesas pure tested functions rather than scattered through a route handler.Four refusals: nobody assigned, yourself, not due yet, already mentioned today.
That last cap is per chore across the whole household, not per sender. Otherwise three housemates each send "just one" reminder and someone's phone buzzes three times about a single bin — precisely how an app gets its notifications switched off. There's a test asserting a second sender gets refused.
The wording is "Ana mentioned this one", not "Ana reminded you" — the latter presumes you forgot. A test asserts that no message this feature can produce contains forgot, still, hurry, please, remember, overdue or late.
Notes on chores
For the practical knowledge that otherwise lives in one person's head: where the hoover bags are kept, which bin goes out this week, that the machine needs its door left open.
That knowledge is a genuine reason jobs stay stuck with one person — it is much easier to keep doing something yourself than to explain it, and so someone quietly owns it forever.
Interface
The row shows exactly one social action, chosen by context, so it never grows into a row of buttons: your own chore can be passed on, somebody else's can be mentioned, and only once it's actually due.
Detail worth noting
The nudge is recorded before it is delivered. If delivery throws, the cap still holds — the safe direction to fail in, since a missed mention is much cheaper than a repeated one.
Verified
17 new tests (173 total), lint and typecheck clean. Both contextual branches confirmed rendering against the running server, and all five routes still serve without a single server error.