Skip to content

feat(upstream): reconcile Hermes v0.21.1 with Ares runtime ownership - #35

Draft
RecursiveIntell wants to merge 6981 commits into
mainfrom
hermes-ares-recon
Draft

feat(upstream): reconcile Hermes v0.21.1 with Ares runtime ownership#35
RecursiveIntell wants to merge 6981 commits into
mainfrom
hermes-ares-recon

Conversation

@RecursiveIntell

@RecursiveIntell RecursiveIntell commented Sep 8, 2026

Copy link
Copy Markdown
Owner

Scope

Full pinned Hermes v0.21.1 reconciliation into Ares with Ares-owned runtime, authority, provenance, context-governor, goal-lifecycle, effect-settlement and profile-isolation semantics preserved.

Source pins

  • Hermes v0.21.1 source: 2237be355906fbe6065ce1815711eee52b2d646e
  • Live Ares main reconciliation target is re-verified before each durable sync.

Execution policy

Work is committed and pushed incrementally on hermes-ares-recon; no force-push/re-rooting. Every repair is fail-closed in CI. If safer, remaining work may be split into stacked/successive PRs, each with incremental commits/pushes and its own validation receipt. Broken intermediate states will not be merged to main.

Current verified state

The deterministic current-main reconciliation transform now applies cleanly against Ares main 0451a66cbb765a3ede359660e37b1b2fbe857525. Context Governor restore (59 passed, 3 deselected) and Ares managed calls (4 passed) are green. Goal lifecycle/regression witnesses are 64/65 green; the sole remaining failure is preserving the historical user-visible unachievable wording on a correctly paused BLOCKED verdict.

Desktop remains an ownership reconstruction, not a shim exercise. Ares retains weighted local-capacity semantics and 0 = unlimited; compatible Hermes spawn coordination/logging/live pool controls are adapted to that owner, including specialist dispatch.

Required gates

  • git diff --check
  • locked Python environment and focused Ares reconciliation suites
  • goal lifecycle + delegation regression witnesses
  • Context Governor ownership/protocol/runtime-closure suites
  • SessionDB/TUI gateway witnesses
  • Desktop typecheck/lint/targeted lifecycle tests/build
  • repository-required CI/static/generated/lockfile checks
  • final sync against live main
  • temporary repair scaffolding removed before readiness

No completion claim is valid until the relevant stage has passing evidence.

teknium1 and others added 30 commits September 7, 2026 08:09
Port the exact submitted-wire-text ownership boundary from NousResearch#93546 onto
current topical runtime code. Do not add the candidate's mocked-result
fallback or storage-level content deduplication. Preserve later distinct
and identical user events, separate identical accepted turns, and keyless
inputs. Add two regression invariants and offline subprocess-wire A/B.

Local wire A/B: 4/8 control matrix passing on base, 8/8 after.
Broader tests queued behind campaign lock; not ready for merge.

Refs NousResearch#104653
Original diagnosis: @gitszabolcs (NousResearch#38254)
Original implementation: NousResearch#43127, submitted by @vashkartik
Focused salvage and wire-text correction: @fancyboi999 (NousResearch#93546)
Current-main carry-forward considered: NousResearch#104698

Co-authored-by: Xinmin Zeng <135568692+fancyboi999@users.noreply.github.com>
Co-authored-by: VECTOR <vector.hq@outlook.com>
…veClient

fallback_providers entries using the "google" alias for the gemini
profile were falling through to the generic OpenAI-SDK client because
the native-client gate only matched the literal string "gemini". That
client posts straight to the raw REST endpoint, sending thinking_config
as an unnested top-level field, which Gemini rejects with:

  Invalid JSON payload received. Unknown name "thinking_config": Cannot find field.

Broaden the check to the same alias set the gemini profile itself
registers (mirrors _GEMINI_NATIVE_PROVIDER_NAMES already used for this
in auxiliary_client.py).

Fixes NousResearch#104583
`git diff --check origin/main..HEAD` reported
`tests/honcho_plugin/test_recall_sync.py:130: new blank line at EOF.`
Whitespace-only; no test logic changed.
Two tests still encoded the pre-PR behaviour that the PR removes:

- tests/test_tui_gateway_server.py: the mirrored fixture carries no
  `context_estimated` flag, so under the PR's rule it is provider-reported
  usage and must render without `~`. The old expectation asserted the
  unconditional tilde main used to emit. Assert the flag-less case is
  unmarked and, in the same test, flip `context_estimated` both ways to
  pin that only the estimate carries `~` in the count and the percent.

- ui-tui appChromeStatusRule.test.tsx: `text.includes('~')` matched the
  `~/repo` cwd label, so the "not estimated" arm was always true. Extract
  the rendered context token and assert the tilde on that token only.
Recover legacy stringified lists with a warning. Reject malformed shapes and nonstring members without admitting approvals or rewriting user config on read.

Fixes NousResearch#104779
Co-authored-by: liuhao1024 <sunsky.lau@gmail.com>
Use successful applied result records rather than requested operations, and keep staged writes silent. Include legacy delete/write messages.

Fixes NousResearch#104506
Co-authored-by: Konstantin Khlopkov <konstantin.khlopkov93@gmail.com>
Normalize boolean required only at schema positions; lift true property flags into parent arrays. Preserve literal default/const/extension data.

Fixes NousResearch#104796
Inspired by NousResearch#104831 and the lifting proposal by @AdJIa.
Emit the one-shot reason marker outside the CLI facade; parse whole codes before falling back to legacy prose. Explicit coordination and unknown codes cannot be labeled target_busy.

Fixes NousResearch#104784
Co-authored-by: William Echo <2054936695@qq.com>
Slim redo of NousResearch#104546 and NousResearch#104551: scan newest-first, match suppression only before payload separators, and keep error context. Covers wake gates and empty outputs without reading every historical file twice.

Co-authored-by: PRATHAMESH75 <prathamesh290504@gmail.com>

Co-authored-by: Konstantin Khlopkov <konstantin.khlopkov93@gmail.com>
Persist a redacted chained traceback in the private run output and expose
redacted last_error in tool and slash listings, including historical errors.
Keep the run_job concise error return unchanged for delivery classification.

Slim redo of liuhao1024's earliest NousResearch#104545; adds forced redaction and keeps
formatting in a topical sibling. Local SDK/socket A/B verifies diagnosis
visibility plus healthy-script, clearing, and private-file controls.
Canonical tests queued under the campaign lock at commit time.

Co-authored-by: liuhao1024 <sunsky.lau@gmail.com>
Salvage the unit-budget implementation from NousResearch#104745, replacing its test
matrix with two invariant tests and covering the sibling graceful start.
Keep unprivileged property reads, finite fallbacks, real manager errors,
and post-restart health verification.

Native disposable user unit: old client timed out after 15.03 seconds;
new client completed the same 16-second stop transaction in 16.13 seconds.
The unit stayed active with a new PID; missing-unit errors stayed errors.

Co-authored-by: Teknium <127238744+teknium1@users.noreply.github.com>
Main now snapshots systemd unit listings before stopping old processes
and passes them into _restart_systemd_gateway_units_best_effort; the
catch-up budget test and eval call the new two-argument shape while
still asserting the unit's stop+start budget reaches the client timeout.
Reconcile receipt-only restart obligations at the shared warning/catch-up
predicate, requiring every historical runtime/profile identity to have a
current live gateway successor. Preserve missing and unknown obligations,
non-gateway identities, and independently authoritative pending markers.

Keep failed receipts unchanged instead of recording an unverified success.
Live isolated two-process A/B reproduces the warning on base and settles
it after the fix; stale, unknown, and missing-profile controls still warn.

Reported-by: duanzhiwei0315
Inspired-by: zengzheqing (NousResearch#104295), RootZ3n (NousResearch#100249)
…t env

The startup update check resolved `git remote get-url origin` with the
user's global config in scope while the subsequent fetch runs under
noninteractive_git_env (GIT_CONFIG_GLOBAL=/dev/null). A global
url.<https>.insteadOf rewrite therefore made an SSH origin masquerade as
HTTPS, the SSH-avoiding fast path was skipped, and the fetch dialed the
raw SSH origin — whose host-key prompt opens /dev/tty directly and
steals the CLI's keystrokes (NousResearch#104591).

Probe the origin URL under the same isolated env so both sides observe
the URL the fetch will actually dial.
…git env

ssh bypasses stdin=DEVNULL and GIT_TERMINAL_PROMPT: when a git child
dials an SSH remote whose host key is unknown, ssh opens /dev/tty
directly and its yes/no prompt steals the caller's terminal — exactly
what noninteractive_git_env exists to prevent. Pin core.sshCommand to
"ssh -o BatchMode=yes" at the config-injection layer so the ssh child
fails instead of prompting; an agent-authenticated ssh still succeeds,
and an explicit user GIT_SSH_COMMAND env var still takes precedence
(NousResearch#104591).
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.