Every chapter REPL treated an empty line as a quit command and exited with
status 0 without a word, while the banner only promises "Type q to quit".
Under VS Code's debugger the Python extension's environment-activation line
is often injected into stdin after the program started, so the first thing
the REPL read was a blank line and the chapter vanished right after its
banner.
An empty line is now ignored and the prompt comes back; q and exit still
quit, and EOF/Ctrl-C still end the loop. s17 already behaved this way. A
static test keeps every chapter's quit check free of the empty string.
Fixes#567
- Delete safe_path entirely (following PR #483 approach) — no dead code
- Update all 3 READMEs per module to reflect read_file in Gate 2
- s04: also update permission_hook snippet in READMEs
- s20: remove safe_path (already replaced with inline resolution)
Closes#482
safe_path hard-raised on out-of-workspace paths while Gate 2 asked about the same condition, so approving an out-of-workspace write never took effect. Make the permission pipeline the sole boundary authority: drop safe_path, resolve paths directly in the file tools, and extend the Gate 2 rule to read_file. Sync all three READMEs.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>