_read_notebook_file returns None on empty or unparseable JSON instead of crashing with JSONDecodeError (surfaced as 500). save_notebook now writes to a temp file and atomically renames, preventing empty files from container restarts mid-write.
_read_notebook_file returns None on empty or unparseable JSON instead of crashing with JSONDecodeError (surfaced as 500). save_notebook now writes to a temp file and atomically renames, preventing empty files from container restarts mid-write.