preload_from_hub bakes the HF cache into the image owned by the build
user, so any runtime download of a file it missed dies with EACCES
(xet_get, os error 13) — first in the GPU worker, then at startup once
the module-level load landed. app.py now points HF_HOME/HF_XET_CACHE/
TMPDIR at an app-local writable cache before anything imports
huggingface_hub, and models download at startup (Nemotron 4B, ~8GB,
inside the 45min startup window) or first use (Mellum/MiniCPM in-task,
the path v1 proved).
Also renames the app to “Ready to Submit?” across the hero, page title,
README and reviewer persona.
The 4B (3.97B params, ~8GB bf16) keeps the sponsor:nvidia story without
the 30B's 63GB footprint. It loads at module level on the Space — the
fine-tuner-proven ZeroGPU pattern; in-task loading made the worker
re-download weights onto a read-only fs (the Permission denied) — via
the native nemotron_h class. Mellum/MiniCPM stay as lazy in-task loads;
all three fit the default slice, so the xlarge request goes away.
Startup gets a 45min timeout for the first cold boot.
Bring Nemotron 3 Nano back as the default reviewer
Loads through transformers' native nemotron_h class (>=5.4) instead of
the repo custom code, which hard-requires the mamba-ssm pip package;
the kernels package fetches prebuilt mamba/conv kernels from the Hub
at runtime with a torch fallback. eos ids are now the union of the
tokenizer, generation_config and <|im_end|> so each model stops at its
own turn end (Nemotron needs [2, 11]). GPU window widened to 420s for
the 63GB first load; weights preloaded at build. README re-claims
sponsor:nvidia.
Render markdown tables and stop truncating reviews
Reviews that used pipe tables showed raw pipes (python-markdown needs
the tables extension) and longer reviews hit the 1200-token cap
mid-sentence. Enable the extension with matching pastel table styles,
raise the cap to 2048, and ask the reviewer to stay under ~450 words
so it concludes cleanly.
Fix space dropdown swap target, add next-step arrow cue
The space select inherited the form's hx-target=#results, so the org
options fragment rendered into the results area instead of the select;
hx-target=this scopes the swap correctly.
After step 1 lands, a floating bouncing arrow now points the user to
the review block — click scrolls to it, and an IntersectionObserver
removes the cue once step 2 is in view.
Custom gr.Server shell instead of stock Gradio: vendored htmx +
gradio-client (from vivamais), self-hosted Archivo and Spline Sans
Mono, and a calm pastel re-skin of the Build Small woodblock-press
language (paper grain, mono eyebrows, dashed-ring stamps, soft press
shadows). bridge.js opens the Gradio-queue stream for the review block
and swaps chunks via htmx; the htmx indicator drives the spinner.