test(jobs): pin the make-it-part-of-another-job sheet #237

Merged
nalum merged 1 commit from test/job-fixtures-coverage into main 2026-08-26 18:35:39 +00:00
Owner

Closes #180, and with it the jobs bundle.

The three fixtures this ticket still owned — deadline.json, repeat.json and
render-job.json — were already correct. Each had been updated by the ticket
that changed the behaviour, in the same commit as the words, which is what the
rule asks for. Verified rather than assumed, and left alone.

The coverage walk found a surface nobody had listed. Make it part of another job — the §6 entry with its pre-clear and destination chooser — ships on
both surfaces, is reachable from ⋯, and had neither a conformance fixture nor a
golden. It has both now.

The create flow's gap is confirmed and recorded as #234. Its draft lives
entirely in local state with no way to inject a starting point, and it crosses an
async Create boundary no existing fixture does — so the card-shaped fixture
format genuinely does not fit. The issue proposes what one would need to look
like rather than leaving it as folklore.

Two findings that became issues

#235 — the Android golden harness is order-sensitive. Adding one case in the
middle of a fixture moved an untouched golden: ScreenshotTest hosts every
case in one persistent setContent and flips an index, so a shot's stroke
rendering depends on what was hosted before it. Established by A/B — remove the
case and the neighbour is clean; move the case to the end and the neighbour is
clean while the new case's own golden moves instead. The web harness does a full
goto() per case and shows none of it. Worked around here by appending rather
than inserting; the real fix is per-shot isolation.

That failure was first diagnosed as machine antialiasing drift. It was not. The
compare image showed a single bounded box on the ⋯ button, and a bisect with
--rerun-tasks put it on this commit — worth knowing that
verifyRoborazziDebug without --rerun-tasks can return a cached
BUILD SUCCESSFUL that ran no tests at all.

#236 — §4d's plain-panel ladder can never reach its third rung. The chain is
only entered when the job has an owner, which is exactly rung two's condition, so
an owned repeating job with no description shows Who it's for: <you> instead of
its cadence. Neither the fixtures nor the goldens caught it, because no expected
output could ever differ. Code left untouched — it is a design call.

🤖 Generated with Claude Code

Closes #180, and with it the jobs bundle. The three fixtures this ticket still owned — `deadline.json`, `repeat.json` and `render-job.json` — were **already correct**. Each had been updated by the ticket that changed the behaviour, in the same commit as the words, which is what the rule asks for. Verified rather than assumed, and left alone. **The coverage walk found a surface nobody had listed.** `Make it part of another job` — the §6 entry with its pre-clear and destination chooser — ships on both surfaces, is reachable from `⋯`, and had neither a conformance fixture nor a golden. It has both now. **The create flow's gap is confirmed and recorded as #234.** Its draft lives entirely in local state with no way to inject a starting point, and it crosses an async `Create` boundary no existing fixture does — so the card-shaped fixture format genuinely does not fit. The issue proposes what one would need to look like rather than leaving it as folklore. ## Two findings that became issues **#235 — the Android golden harness is order-sensitive.** Adding one case in the middle of a fixture moved an *untouched* golden: `ScreenshotTest` hosts every case in one persistent `setContent` and flips an index, so a shot's stroke rendering depends on what was hosted before it. Established by A/B — remove the case and the neighbour is clean; move the case to the end and the neighbour is clean while the new case's own golden moves instead. The web harness does a full `goto()` per case and shows none of it. Worked around here by appending rather than inserting; the real fix is per-shot isolation. That failure was first diagnosed as machine antialiasing drift. It was not. The compare image showed a single bounded box on the `⋯` button, and a bisect with `--rerun-tasks` put it on this commit — worth knowing that `verifyRoborazziDebug` without `--rerun-tasks` can return a cached BUILD SUCCESSFUL that ran no tests at all. **#236 — §4d's plain-panel ladder can never reach its third rung.** The chain is only entered when the job has an owner, which is exactly rung two's condition, so an owned repeating job with no description shows `Who it's for: <you>` instead of its cadence. Neither the fixtures nor the goldens caught it, because no expected output could ever differ. Code left untouched — it is a design call. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
test(jobs): pin the make-it-part-of-another-job sheet
All checks were successful
check / commits (pull_request) Successful in 8s
check / go (pull_request) Successful in 2m51s
check / report (pull_request) Successful in 5s
check / web (pull_request) Successful in 4m24s
android / build (pull_request) Successful in 6m37s
android / report (pull_request) Successful in 3s
a998ccf5e4
#180's coverage check walked every surface the jobs bundle built and
found one gap: JobOptionsSheet's "Make it part of another job" picker
(the SetParent pre-clear + destination chooser) had neither a
render-parity fixture nor a gallery/Roborazzi golden on either
surface, even though it's fully wired in production on both. Every
other §6/§7 surface already rode render-job-sheet.json's `open`
mechanism (options/repeat/delete/tick); this was a straightforward
fourth entry, not a reason for its own ticket.

Adds `makePart` to both surfaces' OPEN_PATHS/openPath and a new fixture
case exercising the two-clause pre-clear message ("loses its repeat
and its due date") against two destination candidates. Android renders
that message as one Text node (both sentences joined by a literal
space), not two — RenderConformanceTest's assertInOrder walks a list
of discrete semantics-tree items and can't match two needles against
the same list item once the first advances `from` past it, so the
fixture pins the two sentences as one combined needle, matching the
existing convention already used by "delete asks and counts" and
"ticking a repeating job asks" for the same reason.

The new case is appended LAST in the fixture array, not inserted
between "job options" and "repeat sheet" where it narratively belongs.
ScreenshotTest's jobSheetGoldens hosts every case in one persistent,
shared Compose composition (compose.setContent set up once, only the
`current` case index flips) and captures each with captureRoboImage.
Despite each case being wrapped in key(name), inserting a case between
two existing ones measurably changed the next case's rendered pixels —
a few dozen sub-pixel-antialiasing pixels right on the `⋯` button's
stroke, reproduced deterministically with --rerun-tasks (not a caching
fluke) and confirmed by direct A/B: removing the inserted case restored
the old golden exactly; moving it to any other position moved the tiny
diff to whatever it now precedes instead. That is a property of this
shared-composition test harness leaking a little render state between
adjacent shots, not a change in what JobSheetContent/MakePartOfContent
actually draws — web's equivalent gallery test reloads the page fresh
per case and shows no such effect. Appending at the end means the new
case can never perturb an already-recorded golden's preceding-shot
context; only its own two (freshly-recorded, order-stable) goldens
depend on what precedes them.

Test report

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

Coverage: 27.0%

Updated by the check workflow · commit 9d1b80090f

<!-- 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 9d1b80090fbc26e7442b75c10f07901e42882864</sub>

Android test report

Suite Tests Result Skipped
Unit (debug) ❌ 1 failed

Coverage:

Updated by the android workflow · commit 9d1b80090f

<!-- android-test-report --> ## Android test report | Suite | Tests | Result | Skipped | | --- | --: | --- | --: | | Unit (debug) | | ❌ 1 failed | | **Coverage:** <sub>Updated by the android workflow · commit 9d1b80090fbc26e7442b75c10f07901e42882864</sub>
nalum force-pushed test/job-fixtures-coverage from a998ccf5e4
All checks were successful
check / commits (pull_request) Successful in 8s
check / go (pull_request) Successful in 2m51s
check / report (pull_request) Successful in 5s
check / web (pull_request) Successful in 4m24s
android / build (pull_request) Successful in 6m37s
android / report (pull_request) Successful in 3s
to 9d1b80090f
Some checks failed
check / commits (pull_request) Successful in 17s
check / go (pull_request) Successful in 2m44s
android / build (pull_request) Failing after 4m52s
check / web (pull_request) Successful in 4m23s
check / report (pull_request) Successful in 4s
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:04:40 +00:00
Compare
nalum changed target branch from test/word-retirement-goldens to main 2026-08-26 18:35:36 +00:00
nalum merged commit 9d1b80090f into main 2026-08-26 18:35:39 +00:00
nalum deleted branch test/job-fixtures-coverage 2026-08-26 18:35: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!237
No description provided.