forked from admin/PlantAI-rag-new
- inspect/upload zip then compile project (main-file detection, zip safety, single-slot queue, failed-envelope carries compile_id + log_url) - keep failed project/ scene 24h (failed_project_ttl_s; KEEP_FAILED_PROJECTS=1 forever), success deletes immediately; two-tier compile_jobs sweep - add tectonic --print and persist full engine chatter to output.log so XDV→PDF (xdvipdfmx) errors are visible (MDPI: logo EPS inclusion failure) - EPS fallback: swap X.eps refs for *-eps-converted-to.pdf when present and materialize X.pdf for extension-less graphicx lookup; friendly error when no converted PDF exists - frontend: ReformatPanel zip upload/inspect/run flow; one-off scripts/debug_compile.py (gitignored) - tests: backend 169 passed (22 zip_safety + 34 compile_zip + P3a regression), frontend edu vitest 43 passed