Skip to content

fix(contract): make the contract lanes pass on Hermes v0.22.5 - #42

Merged
offendingcommit merged 5 commits into
fix/truthful-contract-lanesfrom
fix/hermes-v0225-compat
Oct 24, 2026
Merged

offendingcommit merged 5 commits into
fix/truthful-contract-lanesfrom
fix/hermes-v0225-compat

Conversation

@offendingcommit

@offendingcommit offendingcommit commented Oct 24, 2026 •

Copy link
Copy Markdown
Owner

Kit compatibility with Hermes v0.22.5 (bf0203a7). Stacked on #41 (fix/truthful-contract-lanes).

Changes

  • fix(contract): read SCHEMA_VERSION from hermes_state_common. v0.22.5 removed the PLUGIN-COMPAT pointer layer (upstream #126164), so hermes_state no longer re-exports SCHEMA_VERSION. tests/test_hermes_contract.py imports it from hermes_state_common first and falls back to hermes_state. SessionDB still comes from hermes_state.
  • fix(contract): install the kit with its declared deps in the lanes. This changes a recipe from fix(contract): make the contract lanes report what they ran #41. provision-hermes-host installed the kit with --no-deps (added in 042c0c3). The runtime image installs the kit with its dependencies (Dockerfile, the shared_requirement install, and init/plugin-refresh.sh install_shared_deps; neither uses --no-deps). The pinned host locks pyyaml==6.0.3, so the gap was invisible there. v0.22.5 dropped PyYAML for ruamel, so plugin_skill failed with No module named 'yaml'. A uv pip install --dry-run against the v0.22.5 env shows the only addition is pyyaml==6.0.3; no host-locked package changes.

Correction to the plan's probe: the plan says moving the SCHEMA_VERSION import alone made v0.22.5 pass 17 contract tests. On this branch, with #41's --no-deps provisioning, that change alone gave Ran 17, FAILED (errors=1) (the yaml import in test_lifecycle_registration_invokes_hook_and_resolves_qualified_skill). The probe most likely ran in an env that had PyYAML installed. That is unverified.

Evidence (local, macOS, mise-locked toolchain)

Lane Host State Result
upstream bf0203a7 #41 head, unchanged import error on SCHEMA_VERSION, Ran 4, FAILED (errors=1); classifier: 2 new drift, exit 1
upstream bf0203a7 first commit only Ran 17, FAILED (errors=1) (yaml); classifier: 1 new drift
upstream bf0203a7 this head, fresh venv Ran 17, OK, EXIT=0; classifier: "No contract failures against upstream.", exit 0
pinned 939e45c9 this head, fresh venv Ran 17, OK, EXIT=0 (Python 3.13.14)
unit (just test) none this head Ran 267, OK (skipped=17)

I grepped every host symbol the kit and its contract tests import (hermes_cli.plugins, hermes_cli.config, gateway.*, model_tools._run_async, agent.context_engine, tools.registry, tools.interrupt) and imported each one in the v0.22.5 env. All resolve except hermes_state.SCHEMA_VERSION. tests/test_context_engine_contract.py and hermes_plugin_kit/testing.py do not import SCHEMA_VERSION, so they are unchanged.

Considered, not built

  • Making _read_skill_frontmatter fall back to hermes_yaml when PyYAML is absent. Production installs the kit with PyYAML, so this would guard against a state production never reaches. It would also change parsing semantics (ruamel vs PyYAML SafeLoader).

Release (KTD7)

DEPLOYED_HERMES_REVISION stays 939e45c9. No release was cut. The kit's release flow runs on main after merge. The head of this branch is the candidate combined U4+U5 kit release for U8: b961ec81dbbac35cbb26f10e01e642e9a947022c.

https://claude.ai/code/session_01VDtQ1pDTJksqAcSdrGePVb

Hermes v0.22.5 removed the PLUGIN-COMPAT pointer layer (upstream
#126164), so hermes_state no longer re-exports SCHEMA_VERSION and the
contract module failed to import against bf0203a7. Import it from
hermes_state_common first and fall back to hermes_state for older
hosts. SessionDB still comes from hermes_state.

Claude-Session: https://claude.ai/code/session_01VDtQ1pDTJksqAcSdrGePVb
The lanes installed the kit into the host env with --no-deps, on the
theory that the env should stay exactly the host's lock. The runtime
image does not install the kit that way: its Dockerfile and
plugin-refresh install it with its dependencies. The pinned host
(939e45c9) happened to lock pyyaml, so the gap was invisible there.
v0.22.5 dropped PyYAML for ruamel, so plugin_skill raised
"No module named 'yaml'" and the upstream lane reported one error.

Install the kit with its deps. Packages the host lock already satisfies
are left alone; on v0.22.5 the only addition is pyyaml 6.0.3.

Claude-Session: https://claude.ai/code/session_01VDtQ1pDTJksqAcSdrGePVb
…comments

provision-hermes-host read requires-python with whatever python3 was first
on PATH; it now goes through the same uv indirection as every other recipe.
Comments that narrated the change, restated code, or carried a plan label
from another repository are gone; the ones recording an external
constraint stay.

Claude-Session: https://claude.ai/code/session_01VDtQ1pDTJksqAcSdrGePVb
A lane whose unittest summary reads OK (skipped=N) exits 0 inside the suite;
the lane recipe then fails on its own skip guard, but the drift workflow
never appends the outer EXIT line, so the classifier saw a clean run.
Cross-model code review (adversarial lens) found the path; it is not
reachable today because the contract modules skip only at class level
under HERMES_CONTRACT_REQUIRED.

Claude-Session: https://claude.ai/code/session_01VDtQ1pDTJksqAcSdrGePVb
Without a version input the action installs the newest mise at least a day
old, so two runs of one commit, release jobs holding
PRIVATE_ARTIFACTS_TOKEN included, could use different installers. The
action keeps verifying the download against mise's signed checksums; a
sha256 input would replace that signature check with a plain hash, so only
the version is pinned. min_version follows the pin.

Claude-Session: https://claude.ai/code/session_01VDtQ1pDTJksqAcSdrGePVb
@offendingcommit
offendingcommit marked this pull request as ready for review October 24, 2026 22:29
@offendingcommit
offendingcommit merged commit fbf0899 into fix/truthful-contract-lanes Oct 24, 2026
6 checks passed
offendingcommit added a commit to offendingcommit/hermes-plugin-discord-tools that referenced this pull request Oct 24, 2026
Move the hermes-plugin-kit pin from the unmerged branch commit b961ec81
to 90da8eb4, the merged kit main that carries the Hermes v0.22.5
compatibility work, and refresh uv.lock.

Refs: offendingcommit/hermes-plugin-kit#42

Claude-Session: https://claude.ai/code/session_01VDtQ1pDTJksqAcSdrGePVb
offendingcommit added a commit to offendingcommit/hermes-plugin-discord-tools that referenced this pull request Oct 26, 2026
* chore(deps): pin hermes-plugin-kit to b961ec8

Move the hermes-plugin-kit pin from bd3a31b5 to b961ec81, the kit's
Hermes v0.22.5 compatibility commit, and refresh uv.lock. This pins an
unmerged kit branch commit for validation; re-pin to the merged kit
commit before this change merges.

Refs: offendingcommit/hermes-plugin-kit#42

Claude-Session: https://claude.ai/code/session_01VDtQ1pDTJksqAcSdrGePVb

* chore(deps): pin hermes-plugin-kit to 90da8eb

Move the hermes-plugin-kit pin from the unmerged branch commit b961ec81
to 90da8eb4, the merged kit main that carries the Hermes v0.22.5
compatibility work, and refresh uv.lock.

Refs: offendingcommit/hermes-plugin-kit#42

Claude-Session: https://claude.ai/code/session_01VDtQ1pDTJksqAcSdrGePVb
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.

1 participant