Follow-ups on the #53969 salvage:
- hermes_cli/side_question.py: shared compose_side_prompt() used by all
three surfaces; treats the parent history as read-only by construction.
- gateway: /side now uses the shared composer and registers its task in
_background_tasks with a done-callback (same lifecycle as /background,
addressing the sweeper review note); dropped the unused
_SIDE_BOUNDARY_PROMPT and the dead /sidereturn no-op command (with its
/return and /closeside alias squatting).
- CLI: /side snapshots self.conversation_history into a side prompt and
reuses the /background daemon-thread runner (new prompt_override /
display_prompt / task_label parameters); dispatch wired in cli.py.
- TUI: new prompt.side RPC (history snapshot under history_lock, throwaway
AIAgent, background.complete delivery) + /side slash command in ui-tui.
- No /btw alias: /btw is a long-standing alias of /background
(hermes_cli/commands.py) — /side ships alias-free and a registry test
pins /btw -> background.
- tests: tests/gateway/test_side_command.py (19) covering the byte-identical
main-history invariant, empty-history, no-session-entry, task lifecycle
tracking, prompt composition, and registry; tests/cli/test_cli_side_command.py
(7) covering the CLI surface and dispatch.
- docs: /side rows in the CLI and messaging tables of
website/docs/reference/slash-commands.md + cross-surface list.