A password-protected addendum used to fail a whole set whose other documents were fine. The set now opens on the documents that finished, and the one that failed is named with a reason. A file that is not a PDF is turned away before it uploads. A PDF that can never import fails on the first try instead of three identical crashes. Waiting for a worker no longer spends that crash budget. Export › Excel stays open when you click it, and a sheet that fitted before the outline panels arrived refits on reload.
When at least one document finishes, the import is ready. Each failed document keeps its own failure, so the project opens on everything else. The setup note leads with how many documents are ready, names the one that failed when there is only one, and says Retry touches only the failed documents. Documents & processing is one click from that note. A set where every document fails is still failed. (#842, ENG-348)
Adding files reads the start of each one. A Word file, or anything else whose first kilobyte is not a PDF, is named and left out; the PDFs in the same drop still go in. A PDF whose name does not end in .pdf asks you to rename it. A file that cannot be read asks you to add it again. The size limit is unchanged, and it is judged per file too. (#842, ENG-348)
A password required to open the file, a PDF with no pages, a damaged PDF, a file that is not a PDF, a package with no PDFs inside, or text the database refuses: the first try records a sentence and stops. You see "This PDF is password-protected. Remove the password and upload it again.", "This PDF has no pages.", "This PDF is damaged and couldn't be read.", "This file isn't a PDF.", "This package has no PDFs inside.", or "This PDF has text Layr couldn't save. We've been alerted." A drawing that only failed because its text contained a NUL now imports; that character is dropped before it is saved. An owner password that only restricts printing or editing still opens. (#841, #842, ENG-348)
The crash cap used to count every time the queue handed the job out again, including while a delivery was still waiting for a container. A short document that waited several minutes could fail as "Processing this file kept crashing" on its first real start. The cap now counts a delivery that has started the import, including one that crashes while downloading or reading the PDF. A retry, or Restart setup, starts that count over, so it gets the same three starts as a first import. (#843, ENG-348)
111_import_partial_ready.sql decides an import from all of its runs: at least one success and none still running is ready, even when some documents failed; every run failed is failed. fail_document_import_run marks only that document. finalize_project_import no longer treats a ready import with a failed run as nothing to do, so Retry can re-queue those documents. layrbuild.dev applied it in the prepare job of deploy 39289839192 (the rest of that run was cancelled after the migration committed). The next dev deploy, 39289875328, found the database already up to date. Production applies this same file when this release merges, through deploy.yml, before the new code. Do not apply it by hand, and do not edit the file.112_import_started_attempts.sql adds start_document_import_attempt (service role only). It counts a delivery that starts the run, moves a pending run to processing, and restarts the count at 1 when Retry queues the run again. initialize_document_import_ranges no longer increments attempts. layrbuild.dev applied it on the deploy for #843 (deploy 39303533909). Production applies this same file on merge, the same way. Do not apply it by hand, and do not edit the file..pdf.