Repository navigation
ci(hermes-compat): port upstream's redesigned gate, unpin from v2026.9.21 (BLO-47316) - #33
Conversation
…26.9.21 (BLO-47316) Hermes main moved the hindsight provider out of its tree and gated every core dependency on Python 3.14, so #32 pinned the gate to v2026.9.21. Upstream (vectorize-io/hindsight) already redesigned the gate for exactly this and it passes against Hermes main (e.g. run job 117087267621, hermes-agent@848fc0ad, 2026-10-16). Port it rather than re-derive it: - scripts/test-hermes-compat.sh from vectorize-io main (vectorize-io#4575, vectorize-io#4769, vectorize-io#4838): 3.14 venv, default ref main, installs THIS checkout's hindsight-integrations/hermes as an external plugin, runs `hermes plugins validate`, asserts the loaded provider is ours, asserts the four Hindsight distributions are the locally built wheels, and drives the MemoryProvider contract (step 7; skipped with an explicit message when no LLM key is present). - hindsight-embed _http_probe fix from vectorize-io#4575: 0.10.0's probe cleared the caller's event loop, breaking local_embedded between two client calls. - test.yml job changes from vectorize-io#4575 (integrations-hermes trigger, 60m timeout, LLM key env). No PM-runtime redesign is needed: the plugin is loaded from $HERMES_HOME/plugins inside a venv where Hermes and this checkout's wheels were co-resolved, which is the compatibility property the gate exists for. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Signed-off-by: PlatformSREEngineer <platformsreengineer@paperclip.blockcast.net>
There was a problem hiding this comment.
Ally — Consolidated PR Review
Lenses: pr-review-toolkit (code, tests, comments, errors, types) + gstack/review + native-codex (applied directly; no nested CLI in the k8s runtime).
Reviewed head: 0695977
Looks good. scripts/test-hermes-compat.sh at this head is byte-identical to upstream vectorize-io/hindsight main (checked by diff), so the port is faithful. The provider surface step 7 calls matches what's actually there: sync_turn/prefetch/recall_status/handle_tool_call/shutdown in hindsight-integrations/hermes/__init__.py (L1357, L1224, L1237, L1460, L1554), and on_session_end comes from Hermes' MemoryProvider base (agent/memory_provider.py L183). The integrations-hermes filter output it now triggers on exists (test.yml L56/L229).
Critical Issues (0)
Important Issues (0)
Suggestions (2)
- [pr-review-toolkit/tests]
hindsight-embed/tests/test_http_probe.py:70— the new regression test for the_http_probeloop-state fix doesn't run on this PR.test-embedis gated onhas_secrets == 'true'(test.ymlL4651) and came backskippedat this head. The only CI coverage of the fix is indirect, through step 7 oftest-hermes-compat, and only when an LLM key is present. Worth runningpytest hindsight-embed/tests/test_http_probe.pylocally or on a secrets-bearing run before relying on it. - [gstack/review]
.github/workflows/test.yml:4963—HERMES_COMPAT_LLM_API_KEY: ${{ secrets.OPENAI_API_KEY }}now gives steps 6–7 a real key on same-repo PRs, so this job makes paid OpenAI calls (gpt-4o-mini, one short extraction, polled for up to 180s) wheneverci/embed/core/integrations-hermeschanges. That's small and intended. Just noting that the job is no longer zero-cost on same-repo PRs.
Strengths
_http_probe.probe_getnow always runs the probe on its own loop in a helper thread. That's the right fix:asyncio.runon the caller's thread leaves it with no current event loop, which broke hindsight-client's sync_run_async(the session stayed bound to the old loop). The test pins exactly that invariant.- Step 3 removes Hermes' bundled copy and asserts
find_provider_dirresolves to the external plugin. Without that, every later step would silently test Hermes' code instead of this branch. - The
direct_url.jsonfile://assertion makes sure all four distributions are the locally built wheels, not PyPI. It guards the gate's own premise against the plugin's self-install path. - Exit code 3 for a key-less partial run, with its own closing line, so a fork PR never claims a round-trip that didn't happen.
Recommended Action
- No blocking changes requested.
- Merge once the remaining required CI checks finish green.
Unpins
scripts/test-hermes-compat.shfrom Hermesv2026.9.21(pinned in #32 / BLO-47312) by porting the gate that upstream vectorize-io/hindsight already redesigned for Hermes main.Why a port, not a new design: upstream's gate passes against Hermes main today — job
117087267621(2026-10-16,hermes-agent @ 848fc0ad):Hermes no longer bundles a hindsight provider→provider resolves to the external plugin→Status: available ✓→PASS. The fork had zero local changes inhindsight-integrations/hermes,hindsight-embed, or the clients, so the port is conflict-free.What it brings (upstream vectorize-io#4575, vectorize-io#4769, vectorize-io#4838):
HERMES_REFdefaults tomain.hindsight-integrations/hermesas an external plugin, runshermes plugins validate, asserts the loaded provider is ours.hindsight-embed_http_probefix: 0.10.0's probe cleared the caller's event loop and broke local_embedded.PM runtime: not needed. The plugin is loaded from
$HERMES_HOME/pluginsinside a venv where Hermes and this checkout's wheels are co-resolved — the compatibility property the gate exists for.Verifying signal
test-hermes-compatgreen on this PR with Hermesmain, log showing local wheel versions.🤖 Generated with Claude Code