Review feedback on #611:
1. `Path.match` (used by uvicorn to filter reload candidates) does not
expand `**` on Python < 3.13, so the flat `WareHouse/*` default only
caught direct children — the agent-generated files that actually
triggered #569 live at `WareHouse/<project>/<file>` and deeper.
Expand defaults to multi-depth glob patterns (up to 10 levels) for
each excluded dir.
2. `--reload-exclude` is only honoured by the watchfiles-backed reloader;
without watchfiles uvicorn silently falls back to StatReload and
drops every exclude pattern. Add `watchfiles` to requirements.txt so
the filter works out of the box, and log a WARNING when --reload
runs without watchfiles installed instead of failing silently.
Test coverage:
- `TestExcludePatternDepth` parametrised over 4 WareHouse depths plus
logs/data/node_modules cases; also asserts real source paths like
`server/app.py` are NOT matched (no over-exclusion regression).
- `TestWatchfilesWarning` covers the new `_watchfiles_available` probe
and the WARNING log path.
20/20 tests pass; 8 new.