The Bash tool accepts ONLY git commands directly (no exec: prefix): `git status`, `git commit -m "msg"`, `git push`, etc.

Everything else -- code execution AND utility verbs -- goes through the file-spool. Write a file at:

  .gm/exec-spool/in/<lang-or-verb>/<N>.<ext>

Examples:
  in/nodejs/42.js              in/python/43.py            in/bash/44.sh
  in/codesearch/45.txt         in/recall/46.txt           in/memorize/47.md
  in/wait/48.txt               in/browser/49.js           in/runner/50.txt

Languages: nodejs, python, bash, typescript, go, rust, c, cpp, java, deno
Verbs: codesearch, recall, memorize, wait, sleep, status, close, browser, runner, type, kill-port, forget, feedback, learn-status, learn-debug, learn-build, discipline, pause

The spool watcher executes the request and streams output:
  - .gm/exec-spool/out/<N>.out      (stdout, written line-by-line)
  - .gm/exec-spool/out/<N>.err      (stderr, written line-by-line)
  - .gm/exec-spool/out/<N>.json     (metadata: exitCode, durationMs, timedOut, startedAt, endedAt -- written once at completion)

Result returns as systemMessage on next tool use with `--- stdout ---` and `--- stderr ---` separators. Both `in/` and `out/` are wiped at session start and session end (real-exit reasons only).

Anything else via Bash is blocked.
