Close eleven review findings in app code #48

Merged
JMR-dev merged 5 commits from fix/review-app-gaps into main 2026-08-23 04:52:19 +00:00
JMR-dev commented 2026-08-23 04:26:32 +00:00 (Migrated from github.com)

Eleven findings from the overnight review, four commits, 276 JVM tests (was 257), 0 failures. Nothing outside app/src touched.

Finding Issue
R1 #10 D3's decision core was tested; the edge feeding it was not — five mutations passed the whole suite
R2 #11 The FAILED exclusion was only tested with pathless FAILED jobs
R24 #33 A staged file gone by tap time surfaced as a raw ENOENT path
R25 #34 Reattachment's KDoc described as current a defect fixed the commit before
R22 #31 Three Enum.valueOf reads sat above the try — D13's exact escape shape
R10 #19 The retry bound's value was unpinned
R6 #15 publish() left the SAF-created empty document at the user's chosen name
R23 #32 hasSpaceFor overflowed; InputQuery.total overflowed negative straight past it
R8 #17 The join half of D8 had no test
R9 #18 The process-start sweep — the reason LibreMediaConverterApp exists — had no test
R11 #20 The backup/device-transfer exclusions had no gate

Every fix is pinned by a mutation that was applied and reverted individually

Not "the tests pass" — each new test was proven to bite:

jobsnapshots-no-empty-check  -> only a file with bytes in it is a result … empty.mp4=true
reattach-no-race-guard       -> the user's pick must survive a late reattachment, got Converted(…)
d3-failed-like-succeeded     -> expected null, but was Certain(… state=FAILED, outputExists=true)
d8-concat-constant-name      -> each join must stage under a name of its own, got [joined.mp4, joined.mp4]
app-no-sweep-on-start        -> process start left abandoned.mp4 in staging; nothing swept it
retry-bound-value-2          -> the retry budget must outlast a night; it spans 0.025 hours
R23 unclamped sums           -> expected 9223372036854775807 but was -6446744073709551616

Two choices worth calling out. R10 is asserted as a derived property — that the summed default backoff outlasts a night (10 attempts ≈ 8.525 h) — rather than assertEquals(10, …), so the test survives a deliberate re-tuning and only fails when the guarantee breaks. And R1's race is made deterministic by a holdable WorkManager task executor, with an assertion that the brake actually gripped — so "reattachment was refused" can never be confused with "reattachment never arrived".

R23 is the separable half of the parked D1 branch — it fixes a live overflow on main without waiting on the near-full-disk measurement D1 is blocked on.

Held, not decided

  • R24 has two sub-decisions left open. The review's fix said "report a sentence and return to Idle"; the sentence shipped, the Idle variant did not, nor did "should the check also run on Converted-entry". Both change what the user sees with no user action.
  • The parked fix/allocatable-space branch will now conflict on hasSpaceFor — that expression was rewritten here. Take neither side blindly on rebase.
  • R23's coerceAtLeast(0L) clamp has no assertion. It only changes the answer when free space is below the headroom, which a test reading the host's real volume cannot arrange. An in-code comment says so — the assertion first written was dropped rather than shipped unable to fail.
  • R11's test pins the rules' content, not the android:dataExtractionRules attribute pointing at them; removing that attribute would still pass. Recorded in the test's KDoc.
  • R6 was decided, not held: the "provider would not open it" case is cleaned, on the grounds that the two existing bounds (document URI, positively empty) already authorise exactly that. Reversible in the KDoc if you disagree.
  • Minor: ReattachGuardsTest's ambiguity fixture gives both jobs the same size, so the size half of that assertion is weaker than its comment implies; the display-name half is what bites.

🤖 Generated with Claude Code

Eleven findings from the overnight review, four commits, **276 JVM tests (was 257), 0 failures**. Nothing outside `app/src` touched. | Finding | Issue | | |---|---|---| | R1 | #10 | D3's decision core was tested; **the edge feeding it was not** — five mutations passed the whole suite | | R2 | #11 | The FAILED exclusion was only tested with *pathless* FAILED jobs | | R24 | #33 | A staged file gone by tap time surfaced as a raw ENOENT path | | R25 | #34 | `Reattachment`'s KDoc described as current a defect fixed the commit before | | R22 | #31 | Three `Enum.valueOf` reads sat above the `try` — D13's exact escape shape | | R10 | #19 | The retry bound's value was unpinned | | R6 | #15 | `publish()` left the SAF-created empty document at the user's chosen name | | R23 | #32 | `hasSpaceFor` overflowed; `InputQuery.total` overflowed negative straight past it | | R8 | #17 | The join half of D8 had no test | | R9 | #18 | The process-start sweep — the reason `LibreMediaConverterApp` exists — had no test | | R11 | #20 | The backup/device-transfer exclusions had no gate | ## Every fix is pinned by a mutation that was applied and reverted individually Not "the tests pass" — each new test was proven to *bite*: ``` jobsnapshots-no-empty-check -> only a file with bytes in it is a result … empty.mp4=true reattach-no-race-guard -> the user's pick must survive a late reattachment, got Converted(…) d3-failed-like-succeeded -> expected null, but was Certain(… state=FAILED, outputExists=true) d8-concat-constant-name -> each join must stage under a name of its own, got [joined.mp4, joined.mp4] app-no-sweep-on-start -> process start left abandoned.mp4 in staging; nothing swept it retry-bound-value-2 -> the retry budget must outlast a night; it spans 0.025 hours R23 unclamped sums -> expected 9223372036854775807 but was -6446744073709551616 ``` Two choices worth calling out. **R10 is asserted as a derived property** — that the summed default backoff outlasts a night (10 attempts ≈ 8.525 h) — rather than `assertEquals(10, …)`, so the test survives a deliberate re-tuning and only fails when the *guarantee* breaks. And **R1's race is made deterministic** by a holdable WorkManager task executor, with an assertion that the brake actually gripped — so "reattachment was refused" can never be confused with "reattachment never arrived". **R23 is the separable half of the parked D1 branch** — it fixes a live overflow on `main` without waiting on the near-full-disk measurement D1 is blocked on. ## Held, not decided - **R24 has two sub-decisions left open.** The review's fix said "report a sentence **and return to Idle**"; the sentence shipped, the Idle variant did not, nor did "should the check also run on `Converted`-entry". Both change what the user sees with no user action. - **The parked `fix/allocatable-space` branch will now conflict on `hasSpaceFor`** — that expression was rewritten here. Take neither side blindly on rebase. - **R23's `coerceAtLeast(0L)` clamp has no assertion.** It only changes the answer when free space is below the headroom, which a test reading the host's real volume cannot arrange. An in-code comment says so — the assertion first written was **dropped rather than shipped unable to fail**. - **R11's test pins the rules' content, not the `android:dataExtractionRules` attribute** pointing at them; removing that attribute would still pass. Recorded in the test's KDoc. - **R6 was decided, not held**: the "provider would not open it" case is cleaned, on the grounds that the two existing bounds (document URI, positively empty) already authorise exactly that. Reversible in the KDoc if you disagree. - **Minor:** `ReattachGuardsTest`'s ambiguity fixture gives both jobs the same size, so the size half of that assertion is weaker than its comment implies; the display-name half is what bites. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
Sign in to join this conversation.