stage-batch10: #3327 model-id normalize + #3334 RFC slice doc + #3341 profile skill counts

#3327 fix(reasoning): normalize custom-provider model ids for fallback heuristics
Co-authored-by: Carry00 <Carry00@users.noreply.github.com>

#3334 docs(rfc): mark run-adapter Slice 4f shipped, define Slice 4g gate
Co-authored-by: Michaelyklam <Michaelyklam@users.noreply.github.com>

#3341 fix(profiles): show enabled vs compatible skill counts
Co-authored-by: b3nw <b3nw@users.noreply.github.com>
This commit is contained in:
nesquena-hermes
2026-06-01 18:23:49 +00:00
parent c5aed7654c
commit de22c607bc
7 changed files with 423 additions and 49 deletions

View File

@@ -956,28 +956,34 @@ Non-goals for Slice 4e:
#### Slice 4f: Supervised local runner client backend gate
Status as of 2026-05-28: client transport proposed in #3073 behind
`HERMES_WEBUI_RUNNER_BASE_URL`; it should be described as under review until a
release PR actually ships it.
`runner-local` still remains default-off and returns the bounded not-configured
path unless that endpoint is explicitly configured. When configured, WebUI uses a
JSON HTTP client boundary for start / observe / status / controls and bridges
observed runner events through the existing SSE stream route rather than adding
main-process runner-owned maps.
Status as of 2026-05-31: shipped in v0.51.188 via #3073 / #3274. The client
transport is now implemented behind `HERMES_WEBUI_RUNNER_BASE_URL` and remains
default-off. With no endpoint configured, `runner-local` still returns the
bounded not-configured path and the live in-process `_run_agent_streaming` path
is unchanged. When configured, WebUI uses a JSON HTTP client boundary for start /
observe / status / controls and bridges observed runner events through the
existing SSE stream route rather than adding main-process runner-owned maps.
The release added two security hardening checks while absorbing #3073:
`HttpRunnerClient` rejects non-`http(s)` base URL schemes and uses an opener that
does not follow redirects, so a misconfigured or compromised runner cannot leak a
Bearer token to a redirected host. The release gate reported full pytest passing
and independent default-off/inert-path review.
This bridge is intentionally a WebUI consumer transport seam: the configured
runner must emit events that are already compatible with the browser SSE event
names/payloads, or a later runner-owned normalization layer must translate
Hermes runtime families such as `token.delta`, `tool.started`, and `done` before
they reach this route.
After the route-selection harness ships, the next reviewable step is not to make
`runner-local` the default. It is to define the first concrete supervised/local
runner client backend that can replace the bounded 501 path under the existing
feature flag and prove execution ownership has moved out of the main WebUI
request process.
After the configured runner-client boundary ships, the next reviewable step is
not to make `runner-local` the default. It is to define the first supervised
runner process harness that can actually own `AIAgent` execution behind that
client boundary and prove restart/reattach with a real local runner, not just a
configured external endpoint or fake-runner fixture.
This slice is a contract gate before backend code lands. The goal is to pin the
minimum runner client behavior so the implementation cannot become a renamed
This slice was the client-boundary implementation gate. The goal was to pin the
minimum runner client behavior so the implementation could not become a renamed
`STREAMS` / `CANCEL_FLAGS` / cached `AIAgent` surrogate inside `api/routes.py`.
Scope:
@@ -1027,6 +1033,59 @@ Non-goals for Slice 4f:
- no permanent WebUI-owned active-run discovery cache that duplicates runner or
future Hermes Runtime API responsibility.
#### Slice 4g: Supervised local runner process harness gate
After #3073 / #3274, WebUI has an explicit configured-runner HTTP client and SSE
consumer bridge, but it still does not ship the supervised runner process itself.
The next gate should define the smallest local runner harness that can own
`AIAgent` execution outside the main WebUI request process while being consumed
through the already-shipped `runner-local` client boundary.
Scope:
- define the local runner process lifecycle: spawn/start, health check, run
ownership, graceful shutdown, crash classification, and cleanup;
- keep WebUI as a client of `HERMES_WEBUI_RUNNER_BASE_URL`, not the owner of
process-local runner execution state;
- persist run/session lookup, ordered events, terminal state, and active controls
in runner-owned or journal-backed state that a restarted WebUI can discover;
- carry explicit profile, workspace, attachments, provider/model, toolset,
source, and metadata payloads into the runner without WebUI process-global
environment mutation;
- prove cancel as the first live control for active runner-owned runs, with
approval, clarify, goal, and queue either mapped to explicit runner
capabilities or returned as bounded unsupported/conflict `ControlResult`
values.
Acceptance tests for Slice 4g:
1. **Process ownership moved.** A local runner process, not `hermes-webui`, owns
`AIAgent` construction/reuse and active run execution for `runner-local` runs.
2. **Restart/reattach with a real runner.** Start a non-trivial `runner-local`
run, restart only `hermes-webui`, reload the session, rediscover the active or
terminal runner-owned run, replay/catch up from cursor without duplicate
transcript/tool/reasoning state, and preserve cancel if still active.
3. **No runtime-surrogate globals in WebUI.** The main WebUI server still does not
gain new module-level maps for runner-owned streams, cancel flags,
approval/clarify callbacks, cached agents, child process run registries, goal
state, or queue schedulers.
4. **Default-off and reversible.** Unset `HERMES_WEBUI_RUNNER_BASE_URL` or switch
the adapter mode back to legacy and the existing in-process path remains
available without session or journal migration.
5. **Runner health and failure are observable.** A missing, unhealthy, or crashed
runner returns bounded diagnostics and terminal/interrupted state rather than
silently falling back to WebUI-owned execution for a runner-selected run.
Non-goals for Slice 4g:
- no default-on runner mode;
- no removal of `legacy-direct` or `legacy-journal`;
- no server-side queue scheduler just for adapter symmetry;
- no broad WebUI product-surface migration;
- no claim that this is the canonical Hermes Agent Runtime API; if Hermes Agent
later ships `/v1/runs`, this local runner remains a replaceable backend behind
the same adapter/client boundary.
## First Meaningful Success Criteria
The first meaningful milestones are deliberately split.