**Refined Implementation Plan: Zip Service 100% Failure Rate** Based on the investigation findings, the complete three‑part fix (try/except in `_export_node` and `export_to_dir`, `_unlink_blob` in `delete_node`, `_guard_writable` removal from `export_to_dir`) plus the edge‑case test `test_zip_with_missing_blob_succeeds` are already committed on local `master` at commit `024edb5`. The fix has **not** been pushed to `origin/master`. The only remaining action is to push the commit and verify the fix works correctly in the deployed environment. ### Steps 1. **Confirm local `master` contains the correct fix** - `git log --oneline -1 master` should show `024edb5` (or a descendant that includes all three changes). - Verify the changes exist: - `grep -n "except (FileNotFoundError, OSError):" devplacepy/project_files.py` → lines 586‑589 and 717‑720. - `grep -n "_unlink_blob" devplacepy/project_files.py` → line 327‑337 (definition) and lines 472‑474 (call in `delete_node`). - `grep -n "_guard_writable" devplacepy/project_files.py` → only in write operations, **not** in `export_to_dir` (line ~693). 2. **Push `master` to `origin`** - `git push origin master` - Verify the remote now contains the fix: `git ls-remote origin master | head -1` should match the local commit hash. 3. **Run project verification commands** - Create a Python ≥3.12 virtual environment (consistent with `pyproject.toml`). - `pip install -e '.[dev]' -q` - `make test-unit` - `pip install -q ruff && ruff check .` 4. **Confirm test coverage** - `grep -q test_zip_with_missing_blob_succeeds tests/unit/services/jobs/zip_service.py` → should exit 0 (test exists). 5. **Finalise** - Ensure the working tree is clean (`git status` shows no uncommitted changes). - Optionally tag the release or create a GitHub release with notes. ### Definition of Done - [ ] `git log --oneline -1 master` shows commit hash `024edb5` or a direct descendant that includes the three‑part fix. - [ ] `git diff origin/master..master` shows **no diff** after push (i.e., `origin/master` now contains the same commit). - [ ] The three fix locations are present: - `_export_node` line 586–589 contains `except (FileNotFoundError, OSError)`. - `export_to_dir` line 717–720 contains `except (FileNotFoundError, OSError)`. - `delete_node` lines 472–474 call `_unlink_blob` inside an `is_binary`‑guarded loop. - `export_to_dir` line 693 does **not** call `_guard_writable`. - [ ] The edge‑case test exists: `grep -q test_zip_with_missing_blob_succeeds tests/unit/services/jobs/zip_service.py` returns 0. - [ ] `pip install -e '.[dev]' -q && make test-unit` exits with exit code 0; all tests pass including the new missing‑blob test. - [ ] `pip install -q ruff && ruff check .` exits with exit code 0; no new lint errors introduced. - [ ] Working tree is clean (`git status` shows no uncommitted changes).