Summary
Hermes Gate now defines itself as a temporary local client, not a continuously resident local manager.
Under that model, attached-state behavior must be especially clear: once the local client suspends and attaches into tmux, users need to know which interaction semantics belong to Hermes Gate, which belong to tmux, and which ultimately belong to Hermes.
Right now that boundary is still not clear enough for a stable release.
Current behavior
The current implementation:
- suspends Textual and performs native tmux attach
- still applies some Gate-owned attach-time behavior around tmux configuration
- still presents some product language that reads more like a viewer/control layer than a thin reconnect client
This leaves attached-state control ownership underspecified.
Why this matters
This is a release blocker because unclear control ownership in normal attached use leads directly to user confusion and misoperation.
Examples of the ambiguity users need resolved:
- what does
Ctrl+B mean before attach vs after attach?
- which keys are truly Gate-owned once attached?
- are interrupt/escape semantics native attached behavior or Gate features?
- is attached input mediated by Gate or simply passed through to tmux/Hermes?
A temporary client must be honest about these boundaries. If the attached state is mostly native tmux behavior, the docs and UX must say so plainly.
Evidence
Observed across:
hermes_gate/app.py
- especially
_enter_viewer() and attach-time tmux config behavior
hermes_gate/session.py:attach_cmd()
- README feature and control descriptions
Expected behavior
Hermes Gate should clearly describe attached-state interaction ownership.
Users should be able to predict:
- what the local client owns before attach
- what happens during native attach
- which controls remain Gate-defined
- which controls are just native tmux/Hermes behavior
Suggested direction
A release-safe direction would be to:
- minimize Gate-specific semantics in attached mode
- describe attached mode in docs as native tmux attach unless the implementation truly owns more than that
- align keybinding/help text with the real ownership boundary
Acceptance criteria
Testing requirements
Automated tests
- regression tests for any changed attach/help/keybinding behavior
- doc regression tests for attached-state wording if updated
Manual / integration validation
- attach to a real remote session and verify the documented input/control model matches reality
- explicitly validate
Ctrl+B and any other advertised attached-state control keys
- verify user expectations after attach align with what the product claims
Non-goals
- redesigning the entire attach architecture in this issue unless necessary
- adding a large new viewer abstraction just to avoid clarifying the current boundary
Summary
Hermes Gate now defines itself as a temporary local client, not a continuously resident local manager.
Under that model, attached-state behavior must be especially clear: once the local client suspends and attaches into tmux, users need to know which interaction semantics belong to Hermes Gate, which belong to tmux, and which ultimately belong to Hermes.
Right now that boundary is still not clear enough for a stable release.
Current behavior
The current implementation:
This leaves attached-state control ownership underspecified.
Why this matters
This is a release blocker because unclear control ownership in normal attached use leads directly to user confusion and misoperation.
Examples of the ambiguity users need resolved:
Ctrl+Bmean before attach vs after attach?A temporary client must be honest about these boundaries. If the attached state is mostly native tmux behavior, the docs and UX must say so plainly.
Evidence
Observed across:
hermes_gate/app.py_enter_viewer()and attach-time tmux config behaviorhermes_gate/session.py:attach_cmd()Expected behavior
Hermes Gate should clearly describe attached-state interaction ownership.
Users should be able to predict:
Suggested direction
A release-safe direction would be to:
Acceptance criteria
Testing requirements
Automated tests
Manual / integration validation
Ctrl+Band any other advertised attached-state control keysNon-goals