Summary
codex_app_server currently appears to bypass Hermes' assembled prompt context for the main turn. In a profile/gateway session with a custom SOUL.md, the Codex subprocess receives the raw user input, but not the Hermes system prompt, persona, injected memory/context files, or current Hermes messages list.
That makes the runtime risky for persona-sensitive gateway profiles: storage/tools may still be profile-scoped via HERMES_HOME, but the model identity/voice is generic Codex rather than the configured Hermes profile.
Repro shape
-
Create/use a Hermes profile with a custom SOUL.md identity.
-
Enable:
model:
provider: openai-codex
openai_runtime: codex_app_server
-
Run the profile through a gateway or CLI session.
-
Ask an identity/role question or short health check.
Expected
The Codex app-server turn should receive enough Hermes context to preserve the profile identity and normal Hermes behavior, or Hermes should clearly document/guard that this runtime is not persona-equivalent to the default runtime.
At minimum, one of these should be true:
SOUL.md / assembled system prompt / memory/context files are seeded into the Codex thread.
- The current Hermes conversation history is projected into the Codex thread.
- The runtime is explicitly blocked or warned for gateway/persona-sensitive profiles.
Actual
The profile/gateway process is correctly scoped, and Codex can still access profile-local tools/storage through the Hermes MCP callback. However, the direct model behavior is generic Codex because the turn only sends the current user text.
This can create a split state:
- profile storage/tools: correct profile
- model identity/persona: generic Codex app-server context
Code path observed
-
AIAgent.run_conversation() early-returns to _run_codex_app_server_turn() when api_mode == "codex_app_server".
-
_run_codex_app_server_turn() accepts messages, but calls self._codex_session.run_turn(user_input=user_message).
-
CodexAppServerSession.run_turn() sends:
"input": [{"type": "text", "text": user_input}]
I did not see Hermes' assembled system_prompt, SOUL.md, injected memory/context, or messages being sent into the Codex thread on this path.
Impact
This is a UX regression for long-running messaging assistants whose core value is a stable profile identity and memory behavior. Users may think the wrong profile is attached even though HERMES_HOME and storage are correct.
Workaround
Use the default Hermes runtime for persona-sensitive profiles:
Keep codex_app_server for code-heavy sessions or experimental profiles where Codex's native shell/apply_patch/sandbox/plugin runtime is more important than Hermes persona continuity.
Summary
codex_app_servercurrently appears to bypass Hermes' assembled prompt context for the main turn. In a profile/gateway session with a customSOUL.md, the Codex subprocess receives the raw user input, but not the Hermes system prompt, persona, injected memory/context files, or current Hermesmessageslist.That makes the runtime risky for persona-sensitive gateway profiles: storage/tools may still be profile-scoped via
HERMES_HOME, but the model identity/voice is generic Codex rather than the configured Hermes profile.Repro shape
Create/use a Hermes profile with a custom
SOUL.mdidentity.Enable:
Run the profile through a gateway or CLI session.
Ask an identity/role question or short health check.
Expected
The Codex app-server turn should receive enough Hermes context to preserve the profile identity and normal Hermes behavior, or Hermes should clearly document/guard that this runtime is not persona-equivalent to the default runtime.
At minimum, one of these should be true:
SOUL.md/ assembled system prompt / memory/context files are seeded into the Codex thread.Actual
The profile/gateway process is correctly scoped, and Codex can still access profile-local tools/storage through the Hermes MCP callback. However, the direct model behavior is generic Codex because the turn only sends the current user text.
This can create a split state:
Code path observed
AIAgent.run_conversation()early-returns to_run_codex_app_server_turn()whenapi_mode == "codex_app_server"._run_codex_app_server_turn()acceptsmessages, but callsself._codex_session.run_turn(user_input=user_message).CodexAppServerSession.run_turn()sends:I did not see Hermes' assembled
system_prompt,SOUL.md, injected memory/context, ormessagesbeing sent into the Codex thread on this path.Impact
This is a UX regression for long-running messaging assistants whose core value is a stable profile identity and memory behavior. Users may think the wrong profile is attached even though
HERMES_HOMEand storage are correct.Workaround
Use the default Hermes runtime for persona-sensitive profiles:
Keep
codex_app_serverfor code-heavy sessions or experimental profiles where Codex's native shell/apply_patch/sandbox/plugin runtime is more important than Hermes persona continuity.