fix(jobs): apply §4h's rulings to the job card #224

Merged
nalum merged 1 commit from fix/job-card-4h into main 2026-08-26 18:34:38 +00:00
Owner

Closes what §4h settled, and the four defects it recorded without needing a
ruling.

The ladder has four rungs and rung three widened. ALL TICKED fills the gap
for a job whose sub-jobs are all done, reader-keyed: the owner reads Nothing left but finishing it. with a filled Done ✓, everyone else reads
<Owner> can finish it now. with no primary. Dropping the ownership clause from
WAITING ON gives a non-owner on the Everyone board the waiting panel back.

That widening had a consequence worth naming: waitingGroups keyed on the
owner, so a non-owner card would have counted people the line then refused
to name. It keys on the reader now.

The panel stops stretching. A floor and no ceiling, with the card's surplus
in a spacer between panel and meta row. Measured across 15 fixture cases: the
card holds 312 / 359 / 415 at the three text scales while the panel varies from
75 to 163 — which is the ruling working.

The waiting card's ⋯ is a 48px square again, not a full-width bar. Its
primary slot takes an unfilled, non-button Nothing for you to do yet, holding
the row's height so nothing shifts when #217 turns that line into
Nudge everyone.

The meta row truncates instead of wrapping. This reverses the earlier fix's
choice to degrade by stacking — the review said "truncates before it wraps" and
§4h ruled the row is one line, never split. The guarantees that survived: a
phrase still never breaks mid-word and the separator still cannot orphan.

Only the due half goes amber on a late card; the points stay muted.

Names drop whole and count the rest — 4 to do with Ali, Sam +1, never
Iseult Dal…. §4h's example shows one name plus a count; this ships two, to
match the avatar stack's own cap so the line and the faces name the same people.
Flagged as a judgment call rather than buried.

One contradiction found and reported rather than guessed at: README §4c says
the waiting panel replaces the progress block, while reference panels 3b and
9b show both. §4h rules on neither, so nothing changed — but the widened rung
three now puts non-owner cards into that state, and under §4c's reading they
lose their progress bar.

One honest gap: item 3.3 (points staying muted) has no code-level Android test —
colour is not in the semantics tree and the capture paths do not work under that
Robolectric rule. It is carried by Roborazzi goldens that do fail first, and the
reasoning sits in the test file where the test would have gone.

🤖 Generated with Claude Code

Closes what §4h settled, and the four defects it recorded without needing a ruling. **The ladder has four rungs and rung three widened.** `ALL TICKED` fills the gap for a job whose sub-jobs are all done, reader-keyed: the owner reads `Nothing left but finishing it.` with a filled `Done ✓`, everyone else reads `<Owner> can finish it now.` with no primary. Dropping the ownership clause from `WAITING ON` gives a non-owner on the Everyone board the waiting panel back. That widening had a consequence worth naming: `waitingGroups` keyed on the **owner**, so a non-owner card would have counted people the line then refused to name. It keys on the reader now. **The panel stops stretching.** A floor and no ceiling, with the card's surplus in a spacer between panel and meta row. Measured across 15 fixture cases: the card holds 312 / 359 / 415 at the three text scales while the panel varies from 75 to 163 — which is the ruling working. **The waiting card's `⋯` is a 48px square again**, not a full-width bar. Its primary slot takes an unfilled, non-button `Nothing for you to do yet`, holding the row's height so nothing shifts when #217 turns that line into `Nudge everyone`. **The meta row truncates instead of wrapping.** This reverses the earlier fix's choice to degrade by stacking — the review said "truncates before it wraps" and §4h ruled the row is one line, never split. The guarantees that survived: a phrase still never breaks mid-word and the separator still cannot orphan. **Only the due half goes amber** on a late card; the points stay muted. **Names drop whole and count the rest** — `4 to do with Ali, Sam +1`, never `Iseult Dal…`. §4h's example shows one name plus a count; this ships two, to match the avatar stack's own cap so the line and the faces name the same people. Flagged as a judgment call rather than buried. **One contradiction found and reported rather than guessed at**: README §4c says the waiting panel *replaces* the progress block, while reference panels `3b` and `9b` show both. §4h rules on neither, so nothing changed — but the widened rung three now puts non-owner cards into that state, and under §4c's reading they lose their progress bar. One honest gap: item 3.3 (points staying muted) has no code-level Android test — colour is not in the semantics tree and the capture paths do not work under that Robolectric rule. It is carried by Roborazzi goldens that do fail first, and the reasoning sits in the test file where the test would have gone. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
fix(jobs): apply §4h's rulings to the job card
Some checks failed
check / commits (pull_request) Successful in 11s
check / go (pull_request) Successful in 2m45s
android / build (pull_request) Failing after 5m51s
check / web (pull_request) Failing after 3m11s
check / report (pull_request) Successful in 4s
android / report (pull_request) Successful in 5s
89309e5b19
The board asked for rulings and §4h gave them; six of them land here,
across both surfaces and one shared fixture.

The panel ladder gains a fourth rung. A job whose sub-jobs are all
ticked had no filler at all, so the slot came up empty on the one state
the caption most needs explaining — ALL TICKED now says what is left to
DO rather than repeating the "3 of 3 done" above it, and says it to the
reader: the owner reads "Nothing left but finishing it." beside a filled
Done ✓, anyone else reads "<Owner> can finish it now." beside no primary.

WIDENING (AGENTS.md "Widening cites the design"): rung three drops "and
the reader owns the job", cited to spec-4h-rulings.md §1 — the clause
was describing the owner's case, not restricting the filler — and to
README §4g's table, which carries the rung with no ownership condition.
A non-owner on Everyone watching other people's open sub-jobs gets the
waiting panel back. waitingGroups follows the panel and keys on the
READER rather than the owner: on someone else's job the owner may hold
an open sub-job, and the old key would have left the count naming people
it refused to name.

The panel stops stretching. It is content-height with the design's floor
and never grows to fill the card; the surplus goes to a flexible spacer
between the panel and the meta row (panel 9c), which is why the panels
no longer carry the 0.8rem gap themselves — that number is now the
spacer's floor. A one-line description can no longer inflate its panel
into a cavern, and a card with no progress block gets a taller spacer
rather than a bigger panel. 312px stays the shared height at all three
text scales.

Four defects with no ruling needed. The ⋯ stopped stretching to full
width — it is a 48px square everywhere, because a full-width one reads
as the primary with its label missing — and the empty primary slot takes
an unfilled, non-button line ("Nothing for you to do yet"), the pattern
§5's detail footer already uses and the shape #217 will fill with the
outline Nudge everyone without moving anything else. The meta row stops
splitting onto two lines: this overturns the earlier fix, which degraded
by STACKING the two phrases, in favour of TRUNCATING the due half, per
build-review-01 — the phrase-grouping that keeps the separator with its
points and forbids a mid-word break survives untouched, only the
degradation changed. Late recolours the due half alone; the points are
what the job is still worth in full, and the product does not dock for
lateness. And the waiting panel's names drop WHOLE with the rest
counted, at the avatar stack's own cap of two, so the line and the faces
above it name the same people — never "Iseult Dal…".

Sweep (form fragments, both surfaces, files touched): no bare input /
OutlinedTextField / BasicTextField, no type="number", no (optional)
label, no Save on a blur-committing surface, no form fragment, no
delete — right as they are, a card is not a list of rows. btn-done /
AppButton / AppSaveButton are the card's mandated primary (§4,
build-review-01), not a verb loose among rows — right as it is. The one
disabled control is Take this job while the write is in flight, which
the rule allows explicitly — right as it is. The two label= hits are an
icon's and a button's accessible names, not field-row labels — right as
it is. New this change: the empty primary slot is deliberately NOT a
button.

Goldens: the three new fixture cases ride with the code; every
re-recorded existing case follows in its own commit.

Test report

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

Coverage: 27.0%

Updated by the check workflow · commit 385107afb0

<!-- 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 385107afb07bbfdf8203f75e7422a30fc09c5c6f</sub>

Android test report

Suite Tests Result Skipped
Unit (debug) ❌ 1 failed

Coverage:

Updated by the android workflow · commit 385107afb0

<!-- android-test-report --> ## Android test report | Suite | Tests | Result | Skipped | | --- | --: | --- | --: | | Unit (debug) | | ❌ 1 failed | | **Coverage:** <sub>Updated by the android workflow · commit 385107afb07bbfdf8203f75e7422a30fc09c5c6f</sub>
nalum force-pushed fix/job-card-4h from 89309e5b19
Some checks failed
check / commits (pull_request) Successful in 11s
check / go (pull_request) Successful in 2m45s
android / build (pull_request) Failing after 5m51s
check / web (pull_request) Failing after 3m11s
check / report (pull_request) Successful in 4s
android / report (pull_request) Successful in 5s
to 385107afb0
Some checks failed
check / commits (pull_request) Successful in 15s
check / web (pull_request) Failing after 2m34s
android / build (pull_request) Failing after 4m56s
check / go (pull_request) Successful in 2m47s
android / report (pull_request) Successful in 4s
check / 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:02 +00:00
Compare
nalum changed target branch from docs/handoff-4h-rulings to main 2026-08-26 18:34:36 +00:00
nalum merged commit 385107afb0 into main 2026-08-26 18:34:38 +00:00
nalum deleted branch fix/job-card-4h 2026-08-26 18:34:39 +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!224
No description provided.