Repository navigation
ci: pin hermes compat to v2026.9.21 + float32 tolerance for pgvector semantic score (BLO-47312) - #32
Conversation
…ic score (BLO-47312) Hermes main gates every core dependency on python_version >= '3.14', so the 3.12 compat venv installed it with no deps and 'hermes memory status' died on 'import ruamel'. Move the venv to 3.14. test_01 pinned the pgvector cosine score at abs=1e-12. Both the expected and observed values round to the same float32; only the float32 SIMD reduction differs by runner. Loosen semantic only to 1e-6. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Signed-off-by: PlatformSREEngineer <platformsreengineer@paperclip.blockcast.net>
|
🔗 Paperclip issue: BLO-47312 |
There was a problem hiding this comment.
Ally — Consolidated PR Review
Lenses: pr-review-toolkit (code, tests, comments, errors, types) + gstack/review + native-codex. Nested CLI lenses not launched (k8s runtime); prompts applied directly to the diff.
Reviewed head: 6edefa0
Looks good. Two-file CI fix, both changes are narrowly scoped and the reasoning in the comments matches the diff.
Critical Issues (0)
Important Issues (0)
Suggestions (2)
- [pr-review-toolkit/tests]
hindsight-system-tests/tests/test_01_retain_and_recall.py:101—abs=1e-6is ~33 float32 ULPs at 0.43, about 75× the observed 1.3e-8 drift. That's reasonable. To keep the "far below any real change" claim checkable, you could pin the float32 value directly (numpy.float32(score) == numpy.float32(0.4346591532230377)), which tests exactly the invariant the comment describes. Optional; the current tolerance is defensible as is. - [native-codex]
scripts/test-hermes-compat.sh:188— the 3.14 pin follows Hermes main, which is a moving target, and the comment already says to re-check it. All four Hindsight projects installed into this venv declarerequires-python >=3.10/3.11, andbuild-api-python-versions (3.14)is green at this head, so the Hindsight side is covered. If Hermes shifts again, a shortpython -c 'import ruamel'sanity step after install would surface the "installed with zero deps" mode by name rather than as an import error deep insidehermes memory status.
Strengths
- The root cause is identified correctly on both fronts. For Hermes, it's the per-dependency
python_versionmarkers, notrequires-python. For pgvector, it's float32 reduction order. Neither is a blanket loosening. - Reranker and keyword pins stay at
1e-12, so the tolerance change is limited to the one nondeterministic component. - The stale "Hermes caps at <3.14" comment is replaced, not left contradicting the code.
Recommended Action
- No blocking changes requested.
- Merge once the remaining required CI checks finish green.
…LO-47312) Hermes main no longer bundles the hindsight memory provider; it lives in hindsight-integrations/hermes and is installed via 'hermes plugins install'. Install it from the checkout so the gate tests the plugin this PR ships rather than the catalog's pinned upstream SHA. 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. Nested CLI lenses not launched (k8s runtime); prompts applied directly to the diff.
Reviewed head: fb4a274
Looks good. The only delta since the 6edefa0 review is the new plugin-install step in scripts/test-hermes-compat.sh. That review had no Critical/Important findings, so there is nothing to disposition.
I checked the new step against hermes-agent main (ccc69563). _resolve_git_url accepts the file:// scheme with an explicit #subdir fragment (hermes_cli/plugins_cmd.py:291-314), and --yes-deps is plumbed through to the deps-consent gate (plugins_cmd_install.py:539). hindsight-integrations/hermes/ exists at this head with __init__.py, plugin.yaml and pyproject.toml. The plugin's dependencies (hindsight-client>=0.6.1,<1, hindsight-embed>=0.6.1,<1) are already satisfied by the working-tree wheels installed in step 1, so --yes-deps should not swap in PyPI builds. If it ever did, the step-5 provenance assertion would catch it.
Critical Issues (0)
Important Issues (0)
Suggestions (1)
- [native-codex]
scripts/test-hermes-compat.sh:246:file://$REPO_ROOT#...makes Hermes run a git clone, which copies the last commit of the checkout, not the working tree. The wheels are built from the working tree (line 192), and the banner prints(working tree). In CI the two are the same. In a local run with uncommitted plugin edits, though, the gate tests the committed plugin next to uncommitted wheels and reports PASS. A one-line comment noting that plugin changes have to be committed first would close this. Optional.
Strengths
- Installing from this checkout instead of the catalog's pinned upstream SHA is the right call: the gate now exercises the plugin this PR actually ships.
- The stale
plugins/memory/hindsight/__init__.pycross-references were updated in the same commit, so the comments no longer point at a path Hermes removed. - The earlier fixes are unchanged: semantic tolerance is loosened only for the float32 pgvector component, and the py3.14 pin is root-caused.
Recommended Action
- No blocking changes requested.
- Merge once the remaining required CI checks finish green.
…BLO-47312) Revert the 3.14 venv and the plugin-install step: Hermes main moved the hindsight provider into a PM-isolated runtime that resolves from PyPI, so the gate's co-install premise no longer holds there. v2026.9.21 is the last release that still bundles the provider and installs on 3.12. Redesign and unpin tracked in BLO-47316. 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. Nested CLI lenses were not launched in the k8s runtime, so their prompts were applied directly to the diff.
Reviewed head: 2fc3d69
Looks good. The approach changed since the fb4a274 review: the py3.14 venv and the file:// plugin-install step are gone, and the default HERMES_REF is now pinned to v2026.9.21. Neither earlier review had Critical or Important findings, so there is nothing to disposition.
I checked the pin against upstream:
v2026.9.21exists onNousResearch/hermes-agentas an annotated tag.git clone --depth 1 --branch <tag>accepts it.- At that tag
plugins/memory/hindsight/is still bundled (__init__.py,embedded.py,plugin.yaml, …). That keeps the script'spost_setupand_check_local_runtimecross-references valid. - At that tag
requires-python = ">=3.11,<3.14", which matches the script'suv venv --python 3.12.
The semantic tolerance change is unchanged from the prior review and is still correctly scoped. It applies only to the float32 pgvector component. Reranker and keyword stay at 1e-12.
Critical Issues (0)
Important Issues (0)
Suggestions (2)
- [pr-review-toolkit/comments]
scripts/test-hermes-compat.sh:3: the header still reads "Compatibility gate: hermes-agent @ main"..github/workflows/test.yml:4895also still says "Compatibility gate against hermes-agent's main branch". After this PR both are false. Updating them to "pinned release (seeHERMES_REF)" would stop a reader assuming the gate tracks upstream drift. - [native-codex]
scripts/test-hermes-compat.sh:56: with the pin in place, this gate no longer detects new Hermes breakage. It now only checks Hindsight against a frozen Hermes. That trade-off is stated and tracked (BLO-47316). It is worth keeping the redesign on a clock, or adding a non-required scheduled job that runs--hermes-ref main, so the drift signal is not lost entirely in the meantime.
Strengths
- Both red jobs are root-caused, not blanket-loosened. The Hermes failure is per-dependency
python_versionmarkers plus the unbundled provider. The test-system failure is float32 reduction order. - Pinning to a tag rather than porting avoids a gate that would install PyPI
hindsight-clientand test the wrong code. The PR body states that reasoning explicitly. - The
--hermes-refhelp text was updated together with the default.
Recommended Action
- No blocking changes requested.
- Merge once the remaining required CI checks finish green.
…26.9.21 (BLO-47316) (#33) 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. Signed-off-by: PlatformSREEngineer <platformsreengineer@paperclip.blockcast.net> Co-authored-by: PlatformSREEngineer <platformsreengineer@paperclip.blockcast.net> Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Fixes the two jobs red on every core PR (seen on #31).
python_version >= '3.14'(our 3.12 venv got hermes with zero deps →ModuleNotFoundError: ruamel), and the hindsight provider was unbundled into a PM-isolated runtime that resolveshindsight-client/embedfrom PyPI. Tried porting (3.14 venv +hermes plugins install file://…#hindsight-integrations/hermes): the plugin installs but the PM runtime lackshindsight-all, and it would not be testing this checkout anyway. Pinned the default ref tov2026.9.21, the last release that bundles the provider and installs on 3.12. Redesign + unpin tracked internally (BLO-47316).semanticis1 - (embedding <=> q)computed by pgvector as a float32 reduction. Expected0.43465916228227297and observed0.43465914932841954round to the same float320.4346591532230377; only accumulation order (SIMD path / runner CPU) differs. Semantic pins loosened 1e-12 → 1e-6 (matches the existingfinaltolerance). Reranker/keyword stay at 1e-12.🤖 Generated with Claude Code