R24 — A staged file that disappears between reattach and Save surfaces as a raw ENOENT path in the UI #33

Closed
opened 2026-08-23 03:44:51 +00:00 by JMR-dev · 1 comment
JMR-dev commented 2026-08-23 03:44:51 +00:00 (Migrated from github.com)

Finding R24 from the overnight max-effort review (Fable lead, Opus sub-agents). Full report: scratchpad/overnight/REVIEW.md.

R24 — A staged file that disappears between reattach and Save surfaces as a raw ENOENT path in the UI

severity: low
verdict: CONFIRMED
where: Reattachment.kt:172 (existence decided once); OutputPublisher.kt:174; ConversionViewModel.kt:421; JoinViewModel.kt:241
scenario: Yesterday's unsaved result is offered on launch; the file then goes away before the tap (OS cache eviction — the reason the app stages in cacheDir — or the 24h sweep collects it). save() opens the destination, staged.inputStream() throws, and the user sees "/data/user/0/.../4b4882….mp4: open failed: ENOENT ..." as the failure message. Destination cleanup does fire; only the message is wrong. (The reviewer deliberately did not claim the sweep-vs-reattach race as trigger — sweep almost certainly wins, and winning is the safe order; OS eviction alone reaches it.)
evidence: All four sites read. e.message flows unfiltered into Failed.
fix: Re-check staged.isFile at the top of save(); report a written sentence and return to Idle. Decide whether a missing staged file is a failure at all, and whether the check also belongs on Converted-entry in observe().
risk: Low; narrows what reaches Failed. JVM-testable with the existing RecordingPublisher/installTestWorkManager setup.


Cut: above — worked autonomously overnight.

🤖 Generated with Claude Code

_Finding **R24** from the overnight max-effort review (Fable lead, Opus sub-agents). Full report: `scratchpad/overnight/REVIEW.md`._ ### R24 — A staged file that disappears between reattach and Save surfaces as a raw ENOENT path in the UI severity: low verdict: CONFIRMED where: Reattachment.kt:172 (existence decided once); OutputPublisher.kt:174; ConversionViewModel.kt:421; JoinViewModel.kt:241 scenario: Yesterday's unsaved result is offered on launch; the file then goes away before the tap (OS cache eviction — the reason the app stages in cacheDir — or the 24h sweep collects it). save() opens the destination, staged.inputStream() throws, and the user sees "/data/user/0/.../4b4882….mp4: open failed: ENOENT ..." as the failure message. Destination cleanup does fire; only the message is wrong. (The reviewer deliberately did not claim the sweep-vs-reattach race as trigger — sweep almost certainly wins, and winning is the safe order; OS eviction alone reaches it.) evidence: All four sites read. e.message flows unfiltered into Failed. fix: Re-check staged.isFile at the top of save(); report a written sentence and return to Idle. Decide whether a missing staged file is a failure at all, and whether the check also belongs on Converted-entry in observe(). risk: Low; narrows what reaches Failed. JVM-testable with the existing RecordingPublisher/installTestWorkManager setup. --- **Cut:** `above` — worked autonomously overnight. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
JMR-dev commented 2026-08-23 04:52:54 +00:00 (Migrated from github.com)

Fixed in #48 (merged). Each fix is pinned by a mutation that was applied and reverted individually — the failure text is in the PR body. Suite 257 -> 276, 0 failures.

Fixed in #48 (merged). Each fix is pinned by a mutation that was applied and reverted individually — the failure text is in the PR body. Suite 257 -> 276, 0 failures.
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: JMR-dev/LibreMediaConverter#33