Nik Afiq 634d77d9d2 feat(clean_scratchpad): implement script for safe deletion of temporary files in scratchpad directory
fix(arena): resolve consecutive-invocation navigation issue by ensuring return to home before opening Tactical Challenge
docs(mapping): update Arena task description with navigation bug fix details
2026-07-11 00:20:04 +09:00

92 lines
4.1 KiB
Markdown

---
name: clean-scratchpad
description: Delete this session's temporary probe scripts, debug screenshots, and logs from scratchpad/ (locally and on nik-gpu) via clean_scratchpad.sh, avoiding Claude Code's permission prompts on destructive commands. Use when asked to clean up scratchpad, or proactively per CLAUDE.md's workflow step 13 once temporary investigation files from the current session are no longer useful.
---
# /clean-scratchpad
Removes this session's disposable files from `scratchpad/` — locally and,
when relevant, on `nik-gpu` — using `clean_scratchpad.sh` at the repo root.
## Why a script, and why it's still safe
Claude Code's permission engine blocks any destructive command (`rm`,
`mv`, `cp`) where the deletion target is computed dynamically in the
visible command text — confirmed live across a raw shell glob, a
`find`-piped `while IFS= read` loop, and `find -exec {} +`. All three were
flagged. But a command that just invokes an external script
(`bash clean_scratchpad.sh 'PATTERN'`) is not itself a write operation in
the command text — the actual `rm` lives inside the script file, which the
permission engine does not parse. Confirmed live, with the user watching
for a prompt: zero prompts, both locally and over `ssh` to nik-gpu, for a
real wildcard pattern that actually deleted matching files.
This does mean the runtime guard no longer applies once the script exists
`clean_scratchpad.sh`'s own logic is the only safety net. It is written
defensively for exactly that reason:
- The target directory is derived from the script's own location
(`dirname "${BASH_SOURCE[0]}"/scratchpad`), never from the caller's
current directory or an argument.
- It refuses to run if that resolved path's basename isn't literally
`scratchpad`, if the directory doesn't exist, or if it resolves (via
`pwd -P`, so symlinks can't hide this) anywhere other than exactly
`<script's own dir>/scratchpad`.
- Every pattern argument is rejected if it contains `/` or `..` — a
pattern can only ever match plain filenames directly inside
`scratchpad/`, never traverse into a parent or subdirectory.
- It only ever deletes files (`-type f`, `-maxdepth 1`) — never
directories, never recursively.
Do not add a way to override the target directory (no `$1` used as a
path, no `--force`/`-r` type flags). If you need to widen what it can
touch, that is a deliberate design change to discuss, not a quick patch.
## Steps
1. **List what's actually in scratchpad first**:
```bash
ls -la scratchpad/
```
Decide what's disposable (this session's probe screenshots, debug
`.png`/`.log` output, one-off `probe_*.py` scripts) versus anything that
looks like a reusable calibration asset worth keeping across sessions
(e.g. named probes referenced from `plan.md` or `CLAUDE.md`, like past
`probe_arena_*`/`probe_badge_ocr*`/`probe_find_best*` scripts). If
unsure whether something is reusable, ask rather than deleting it.
2. **Delete locally**, passing one or more filename patterns (exact names
or globs — both are fine, the script resolves them internally via
`find -name`, never via shell expansion):
```bash
bash clean_scratchpad.sh '*.png' '*.log' 'probe_ocr_now.py'
```
It prints each file it deletes and a final count. Nothing else in
`scratchpad/` is touched.
3. **Delete remotely on nik-gpu**, only if this session also pushed probe
files there (e.g. via `scp`/`rsync` during live testing). First confirm
`clean_scratchpad.sh` on nik-gpu is up to date — if you've edited it
locally since the last deploy, `scp clean_scratchpad.sh
nik-gpu:~/repo/ba-auto-daily/clean_scratchpad.sh` (or a full
`/deploy-gpu`) before relying on it remotely. Then:
```bash
ssh nik-gpu 'bash ~/repo/ba-auto-daily/clean_scratchpad.sh "*.png" "*.log"'
```
4. **Confirm the result**:
```bash
ls -la scratchpad/
```
Report what was deleted and what was intentionally kept, rather than
just reporting exit code 0. If a permission prompt appears at any
point, say so explicitly rather than assuming success from a clean
exit code — a silently-approved prompt still means something is off.