The archive cleanup plan needs to fit a storage budget while protecting pinned logs. Implement the retention decision so mandatory files and the stated selection order are respected.
Build the implementation in Bash under /app, with /app/run.sh as its entry point. Read one JSON request from standard input and write one JSON result to standard output. Input has nonnegative integer budget and files with unique id, nonnegative integer size, integer time and boolean pinned. Retain all pinned files first, rejecting the request if they exceed budget. Then consider unpinned files by newest time first and ID ascending, retaining each if it fits; skip oversized files and continue. Return sorted keep/delete ID lists and used bytes. Reject invalid sizes, budget or duplicate IDs.
Reject inputs that violate an explicit validation rule with exit status 2, no standard output, and {"error":"invalid_input"} on standard error. For valid input, exit with status 0. Keep the implementation reusable for new inputs; it must work offline and must not depend on the example data being the only data it receives.
Repair or replace the unfinished /app/run.sh and add source files under /app. Malformed JSON must use the same invalid-input response. Do not read /tests or /oracle from the application.