feat(jobs): finish the job card against the household's review #221

Merged
nalum merged 1 commit from feat/job-card-review into main 2026-08-26 18:34:28 +00:00
Owner

Everything in build-review-01.md that the server can support, plus §4g.

The panel is keyed on the reader, not the owner. That was the defect the
review started from: a card on My jobs for someone else's job, where you hold an
open sub-job, fell through to a bare progress bar with nothing to do on it.
ONE TO DO now fires first and names the sub-job, WAITING ON second when you
hold none and own the job, WHAT TO DO when there are no sub-jobs at all.

Every card has an action row, which none had. A filled primary plus the 48px
⋯ — and the ⋯ was missing entirely, so a job with sub-jobs had no route into
its own list. It opens the same options sheet the detail sheet's does, through
one shared rule both surfaces read, and it is absent only when the matrix leaves
that menu empty.

ONE TO DO takes Tick this sub-job: Done completes the job and is the
owner's act, but its absence never meant no action.

The waiting card carries ⋯ alone. The review asks for Nudge everyone,
and the server has no nudge — no RPC, no notification kind, nothing (#217). A
button that cannot do what it says is the 2 steps left mistake again, so it is
not here.

312px, not 280. At the review's own spacing plus the mandatory action row,
the tallest state overflowed at 280 — not visibly, it silently dropped a sub-job
title out of the panel. The rule that every state shares one height is kept and
the number moved; measured 312 / 358.8 / 415 across the three text scales, with
the panel as the slot that gives way. This changes a number §4 states, and is
flagged for the household's ruling.

Also: No date · 234 points where a job has no deadline; Android's waiting
panel gains the per-person breakdown it never had; and the breakdown's last row
is now keyed to the reader on both surfaces — on the Everyone board a viewer had
been seeing the owner marked done.

hasMyStep became hasMyOpenStep, so a job held only by ticked sub-jobs leaves
My jobs, per §4g's "My jobs drops the card on your last tick".

The rail is untouched — markColorVar(ownerUid) stands. The one clause removed
was the one withholding it from the waiting card, which spec-rail-colour.md
retires along with the accent reading it came from.

Two gaps reported rather than papered over, both needing a design answer:
an owner whose sub-jobs are all ticked has no panel filler, and on the Everyone
board a non-owner watching other people's open sub-jobs no longer sees the
waiting panel. §4g's ladder has no rung for either.

🤖 Generated with Claude Code

Everything in `build-review-01.md` that the server can support, plus §4g. **The panel is keyed on the reader, not the owner.** That was the defect the review started from: a card on My jobs for someone else's job, where you hold an open sub-job, fell through to a bare progress bar with nothing to do on it. `ONE TO DO` now fires first and names the sub-job, `WAITING ON` second when you hold none and own the job, `WHAT TO DO` when there are no sub-jobs at all. **Every card has an action row, which none had.** A filled primary plus the 48px `⋯` — and the `⋯` was missing entirely, so a job with sub-jobs had no route into its own list. It opens the same options sheet the detail sheet's does, through one shared rule both surfaces read, and it is absent only when the matrix leaves that menu empty. `ONE TO DO` takes `Tick this sub-job`: `Done` completes the *job* and is the owner's act, but its absence never meant no action. **The waiting card carries `⋯` alone.** The review asks for `Nudge everyone`, and the server has no nudge — no RPC, no notification kind, nothing (#217). A button that cannot do what it says is the `2 steps left` mistake again, so it is not here. **312px, not 280.** At the review's own spacing plus the mandatory action row, the tallest state overflowed at 280 — not visibly, it silently dropped a sub-job title out of the panel. The rule that every state shares one height is kept and the number moved; measured 312 / 358.8 / 415 across the three text scales, with the panel as the slot that gives way. **This changes a number §4 states, and is flagged for the household's ruling.** Also: `No date · 234 points` where a job has no deadline; Android's waiting panel gains the per-person breakdown it never had; and the breakdown's last row is now keyed to the reader on both surfaces — on the Everyone board a viewer had been seeing the *owner* marked done. `hasMyStep` became `hasMyOpenStep`, so a job held only by ticked sub-jobs leaves My jobs, per §4g's "My jobs drops the card on your last tick". The rail is untouched — `markColorVar(ownerUid)` stands. The one clause removed was the one *withholding* it from the waiting card, which `spec-rail-colour.md` retires along with the accent reading it came from. **Two gaps reported rather than papered over**, both needing a design answer: an owner whose sub-jobs are all ticked has no panel filler, and on the Everyone board a non-owner watching other people's open sub-jobs no longer sees the waiting panel. §4g's ladder has no rung for either. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
feat(jobs): finish the job card against the household's review
Some checks failed
check / commits (pull_request) Successful in 14s
check / go (pull_request) Successful in 2m54s
check / web (pull_request) Failing after 4m10s
android / build (pull_request) Failing after 9m44s
check / report (pull_request) Successful in 4s
android / report (pull_request) Successful in 4s
c08441712c
build-review-01 read the deployed board against the locked card and found
five slots, of which the build was rendering three. Everything here is
that list.

The panel is keyed on the READER, not the owner
(spec-4g-others-job-your-subjob.md, README §4g). Gating it on ownership is
what left a card on My jobs — someone else's job carrying an open sub-job
of yours — as a bare progress bar with nothing to do on it. The ladder is
read in one order: ONE TO DO when the reader holds an open sub-job,
whoever owns the job; WAITING ON when they hold none and own it; WHAT TO
DO (§4d's own fallback ladder) when the job has no sub-jobs.

The action row was missing entirely. Every card has one now: a primary at
flex: 1 beside the 48px `⋯`, which is a board's only route into Job
options and opens the SAME sheet the detail sheet's `⋯` opens — one menu,
reached from either place, with one rule (`jobOptions`, exported and read
from both) for when there is nothing behind it. The primary follows the
panel: `Tick this sub-job` completes a SUB-JOB and belongs to whoever
holds it, `Done ✓` completes the JOB and is the owner's act. "No `Done`"
never meant "no primary action".

The waiting card carries `⋯` alone. `Nudge everyone` has no RPC behind it
— no notification kind, no send verb (issue #217) — and a button that
cannot do what it says is worse than the glyph on its own; the footer law
settles it. spec-rail-colour.md's option (2), until the RPC exists.

Two smaller ones from the same list. A half of the meta row is not a row:
points with no deadline read `No date · 234 points`, never a bare figure.
And Android's waiting panel had no per-person breakdown at all where the
web has had a tooltip since §4 was built — long-press now gives it, and
the last row is keyed on the READER (§4: "the reader's own row ticked at
the bottom"), where both surfaces had the owner, and appears only when the
reader actually holds a sub-job here.

The rail is untouched: `markColorVar(ownerUid)`, the owner's mark colour.
The one line that moved is the `!waiting` clause that withheld it from the
waiting card — a fragment of the accent-or-muted reading that
spec-rail-colour.md retires ("the waiting card keeps its rail, in the
owner's colour, like every other state").

The spacing is the design's own again — card 1.1rem 1.2rem, header to
progress 0.5rem, progress to panel 0.75rem, panel to meta 0.8rem, meta to
actions 0.9rem — where the build was running about 1.5x on all of it. Equal
height is structural (the grid has no masonry, so an odd card out reflows
the board on every reorder), so it is now floored AND capped, and measured
rather than asserted: tests/gallery/heights.spec.ts photographs nothing and
measures every state at 1x, 1.15x and 1.33x.

That measurement moved one number. With this spacing and the mandatory 48px
action row, the tallest state — header, progress, ONE TO DO panel, meta,
actions — needs 312px at the 18px base, not §4's 280; at 280 it does not
fail loudly, it silently clips the sub-job's title out of the panel. §4's
rule is "one height for every state" and the 280 was the prototype's
measurement in the prototype's own type, so the number moves and the rule
holds — the spec asserts both the shared height and that nothing clips into
it. The panel keeps the design's 107.2px budget (84.8 plus its padding) as a
floor on the states that stand in for the indicator, and no floor on ONE TO
DO, which stands under the indicator rather than in place of it.

My jobs now drops a card on the reader's last tick, which §4g states and
the board did not do: the selection unions in jobs carrying an OPEN step
of the reader's, not any step of theirs. Without that, a card whose panel
cannot be filled sits on the board, and the invariant §4g closes with —
"if a card's panel cannot be filled, the card does not belong on My jobs"
— is false on the board rather than in the card.

Form-fragment sweep, over every file this change touches:
- raw `<input>` in JobSheet.tsx and BasicTextField in JobSheet.kt: the
  sub-job quick-add ROW, in the row grammar's own dress — right as it is.
- raw fields in Jobs.tsx / Jobs.kt: the New job form (§8), where law 4
  says a form with one commit button is the grammar — right as it is.
- `type="number"` (Jobs.tsx, the New job form's reward value): a real hit
  — the spinner is chrome nothing else on the screen has, and the sheet's
  own points input already avoids it (`inputMode="numeric"`). NOT fixed:
  §8's create form is not this review's subject, and it is recorded here
  rather than fixed in passing.
- `(optional)` labels in the New job form: same verdict, same reason.
- `link-btn`/`TextButton` "Put it back" in the Done list: a verb inside a
  list of rows is a row. NOT fixed — the finished-jobs list is outside §4
  and needs its own pass; recorded, not silently left.
- `btn`/`btn-quiet`: page-heading actions and a dialog's second answer —
  right as they are.
- Save on a blur-committing surface: only the New job form's `Add job`
  (law 4) — right as it is.
- disabled-and-grey: none. `Take this job` dims only while its write is
  in flight; every other control is absent when it does not apply.
- a record's title as a field row's label: none.
- form fragments inside a rows-only sheet: `form-actions` is the New job
  sheet's own footer (law 4) — right as it is.
- a delete with no question: none; `⋯` reaches §6.2's dialog unchanged.

Test report

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

Coverage: 27.0%

Updated by the check workflow · commit fefc38e49c

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

Android test report

Suite Tests Result Skipped
Unit (debug) ❌ 1 failed

Coverage:

Updated by the android workflow · commit fefc38e49c

<!-- android-test-report --> ## Android test report | Suite | Tests | Result | Skipped | | --- | --: | --- | --: | | Unit (debug) | | ❌ 1 failed | | **Coverage:** <sub>Updated by the android workflow · commit fefc38e49c0211a15d38da60fcd86120ed12ed1e</sub>
nalum force-pushed feat/job-card-review from c08441712c
Some checks failed
check / commits (pull_request) Successful in 14s
check / go (pull_request) Successful in 2m54s
check / web (pull_request) Failing after 4m10s
android / build (pull_request) Failing after 9m44s
check / report (pull_request) Successful in 4s
android / report (pull_request) Successful in 4s
to fefc38e49c
Some checks failed
check / commits (pull_request) Successful in 19s
check / web (pull_request) Failing after 2m47s
check / go (pull_request) Successful in 2m58s
android / build (pull_request) Failing after 4m34s
check / report (pull_request) Successful in 3s
android / report (pull_request) Successful in 4s
android / build (push) Has been cancelled
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
2026-08-26 07:03:36 +00:00
Compare
nalum changed target branch from test/job-card-meta-goldens to main 2026-08-26 18:34:25 +00:00
nalum merged commit fefc38e49c into main 2026-08-26 18:34:28 +00:00
nalum deleted branch feat/job-card-review 2026-08-26 18:34:30 +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!221
No description provided.