Skip to content

ci: pin hermes compat to v2026.9.21 + float32 tolerance for pgvector semantic score (BLO-47312) - #32

Merged
allyblockcast[bot] merged 3 commits into
mainfrom
fix/ci-hermes-py314-and-semantic-tolerance
Oct 18, 2026
Merged

allyblockcast[bot] merged 3 commits into
mainfrom
fix/ci-hermes-py314-and-semantic-tolerance

Conversation

@allyblockcast

@allyblockcast allyblockcast Bot commented Oct 18, 2026 •

Copy link
Copy Markdown

Fixes the two jobs red on every core PR (seen on #31).

  1. test-hermes-compat — Hermes main changed under the gate's design: every core dep is now gated on 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 resolves hindsight-client/embed from PyPI. Tried porting (3.14 venv + hermes plugins install file://…#hindsight-integrations/hermes): the plugin installs but the PM runtime lacks hindsight-all, and it would not be testing this checkout anyway. Pinned the default ref to v2026.9.21, the last release that bundles the provider and installs on 3.12. Redesign + unpin tracked internally (BLO-47316).
  2. test-system (blackbox) — semantic is 1 - (embedding <=> q) computed by pgvector as a float32 reduction. Expected 0.43465916228227297 and observed 0.43465914932841954 round to the same float32 0.4346591532230377; only accumulation order (SIMD path / runner CPU) differs. Semantic pins loosened 1e-12 → 1e-6 (matches the existing final tolerance). Reranker/keyword stay at 1e-12.

🤖 Generated with Claude Code

…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>
@allyblockcast

allyblockcast Bot commented Oct 18, 2026

Copy link
Copy Markdown
Author

🔗 Paperclip issue: BLO-47312

@allyblockcast allyblockcast Bot left a comment

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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-6 is ~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 declare requires-python >=3.10/3.11, and build-api-python-versions (3.14) is green at this head, so the Hindsight side is covered. If Hermes shifts again, a short python -c 'import ruamel' sanity step after install would surface the "installed with zero deps" mode by name rather than as an import error deep inside hermes memory status.

Strengths

  • The root cause is identified correctly on both fronts. For Hermes, it's the per-dependency python_version markers, not requires-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

  1. No blocking changes requested.
  2. 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>

@allyblockcast allyblockcast Bot left a comment

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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__.py cross-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

  1. No blocking changes requested.
  2. 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>
@allyblockcast allyblockcast Bot changed the title ci: hermes compat on py3.14 + float32 tolerance for pgvector semantic score (BLO-47312) ci: pin hermes compat to v2026.9.21 + float32 tolerance for pgvector semantic score (BLO-47312) Oct 18, 2026

@allyblockcast allyblockcast Bot left a comment

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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.21 exists on NousResearch/hermes-agent as 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's post_setup and _check_local_runtime cross-references valid.
  • At that tag requires-python = ">=3.11,<3.14", which matches the script's uv 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:4895 also still says "Compatibility gate against hermes-agent's main branch". After this PR both are false. Updating them to "pinned release (see HERMES_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_version markers 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-client and test the wrong code. The PR body states that reasoning explicitly.
  • The --hermes-ref help text was updated together with the default.

Recommended Action

  1. No blocking changes requested.
  2. Merge once the remaining required CI checks finish green.

@allyblockcast
allyblockcast Bot merged commit 64f62bc into main Oct 18, 2026
allyblockcast Bot added a commit that referenced this pull request Oct 18, 2026
…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>
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.

0 participants