chore: upgrade carried Hermes runtime to v2026.7.30 - #4
Conversation
…026.7.20 upgrade - agent/conversation_loop.py: prioritise structured reasoning fields over inline-think content for tool_progress_callback relay - ui-tui appLayout.tsx: drop stale inputHeight box sizing (auto-size from rendered content instead) - ui-tui textInput.tsx: cancel pending fast-echo parent update on submit
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 2ad344803f
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
| target_path = ( | ||
| global_path | ||
| if provider_id == "openai-codex" and global_path is not None | ||
| else _auth_file_path() |
There was a problem hiding this comment.
Keep Codex removal state in the same auth store
When a named profile runs hermes auth remove openai-codex ..., pool.remove_index() now removes the shared root pool row here, but _remove_codex_device_code() still clears and suppresses the source in the profile-local auth.json. The root singleton therefore remains available and another profile or the default profile can reseed the shared row; the originating profile then reads that row again and the removed credential reappears, while the initial removal also transiently affects every other profile. Persist the pool, singleton cleanup, and suppression in one owning store, or keep the pool profile-scoped.
AGENTS.md reference: AGENTS.md:L147-L154
Useful? React with 👍 / 👎.
| global_path = _global_auth_file_path() | ||
| target_path = ( | ||
| global_path | ||
| if provider_id == "openai-codex" and global_path is not None | ||
| else _auth_file_path() |
There was a problem hiding this comment.
Guard the global auth path before writing Codex pools
Under pytest, a profile context beneath the real ~/.hermes/profiles/... makes _global_auth_file_path() return the real ~/.hermes/auth.json; that helper explicitly has no pytest seat belt because it was previously read-only. Selecting it as target_path here bypasses the guard in _auth_file_path(), so any Codex pool mutation in such a test can overwrite the developer's real credentials. Apply the same real-auth-store refusal before using this path as a write target.
Useful? React with 👍 / 👎.
| try: | ||
| if profile_home.resolve() == root_home.resolve(): | ||
| return None |
There was a problem hiding this comment.
Apply the universal policy to the default profile
When the active profile is the default profile, this unconditional return prevents ~/.hermes/AGENTS.md from entering the new universal-policy slot. The ordinary AGENTS loader only examines the conversation cwd, and CLI/TUI sessions normally start in the user's project rather than ~/.hermes, so the purported universal policy applies to named profiles but silently disappears from the default profile. Load it for the default profile as well and let the existing context-body deduplication handle the uncommon root-cwd case.
Useful? React with 👍 / 👎.
Merged after independent verification: 54 focused lifecycle/tool/core tests passed, compileall and git diff --check passed, and the PR is limited to the upstream-compatible Hermes baseline.
* fix(kanban): allow requeued review workers past PR guard * fix(kanban): preserve review routing after crash requeue * fix(kanban): preserve native review lane on crash * fix(kanban): apply retry guards to native reviews * fix(kanban): guard native review respawns during cooldown --------- Co-authored-by: SoLo <solo@SoLoBot>
Co-authored-by: SoLo <solo@SoLoBot>
* fix(kanban): restore native GitHub PR ingest * fix(kanban): restore GitHub PR lifecycle safeguards --------- Co-authored-by: SoLo <solo@SoLoBot>
…e-review #4) The compression heartbeat's terminal 'context compression completed' stamp force-persists against the PARENT session id (agent.session_id at stamp time). After the out-of-place rotation the parent is archived but kept advertising a fresh last_activity_at + terminal label forever. Clear the parent row's activity labels best-effort after a committed rotation (keeps last_activity_at so idle clocks stay continuous; the child carries live labels). Regression asserts the archived parent's labels are cleared while the child's lineage is intact (sabotage-verified).
refactor(relay): centralize protocol descriptors
Summary
Verification
Deployment
This PR is the review artifact for local runtime promotion tracked by Kanban t_16bbffad.