Follow-up to 15ac253b per /simplify review:
- gateway/platforms/discord.py:3638 - move self.resolved = True *after*
the `if interaction.data is None: return` guard. Previously the view
was marked resolved before the None-guard, so a None data payload
silently rejected the user's next click.
- agent/display.py:732 - replace `if self.start_time is None: continue`
with `assert self.start_time is not None`. start() sets start_time
before the animate thread starts, so the None branch was dead; the
`continue` form would have busy-looped (skipping the 0.12s sleep).
- tests/hermes_cli/test_config_shapes.py - drop __total__ dunder
restatement test (it just echoes the class declaration); trim commit
narration from module docstring.
- tests/agent/test_credential_pool.py, tests/tools/test_rl_training_tool.py -
drop "added in commit ..." banners (narrates the change per CLAUDE.md).
The 4 early-return paths in _spawn_training_run (API exit, trainer
exit, env not found, env exit) were doing manual process.terminate()
or returning without cleanup, leaking open log file handles. Now all
paths call _stop_training_run() which handles both process termination
and file handle closure.
Also adds 12 tests for _stop_training_run covering file handle
cleanup, process termination, status transitions, and edge cases.
Inspired by PR #715 (0xbyt4) which identified the early-return issue.
Core file handle fix was already on main via e28dc13 (memosr.eth).