Repository navigation
fix(contract): make the contract lanes pass on Hermes v0.22.5 - #42
Merged
offendingcommit merged 5 commits intoOct 24, 2026
Merged
Conversation
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
3 tasks done
…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
marked this pull request as ready for review
October 24, 2026 22:29
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
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
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), sohermes_stateno longer re-exportsSCHEMA_VERSION.tests/test_hermes_contract.pyimports it fromhermes_state_commonfirst and falls back tohermes_state.SessionDBstill comes fromhermes_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-hostinstalled the kit with--no-deps(added in 042c0c3). The runtime image installs the kit with its dependencies (Dockerfile, theshared_requirementinstall, andinit/plugin-refresh.shinstall_shared_deps; neither uses--no-deps). The pinned host lockspyyaml==6.0.3, so the gap was invisible there. v0.22.5 dropped PyYAML for ruamel, soplugin_skillfailed withNo module named 'yaml'. Auv pip install --dry-runagainst the v0.22.5 env shows the only addition ispyyaml==6.0.3; no host-locked package changes.Correction to the plan's probe: the plan says moving the
SCHEMA_VERSIONimport alone made v0.22.5 pass 17 contract tests. On this branch, with #41's--no-depsprovisioning, that change alone gaveRan 17,FAILED (errors=1)(theyamlimport intest_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)
bf0203a7SCHEMA_VERSION,Ran 4,FAILED (errors=1); classifier: 2 new drift, exit 1bf0203a7Ran 17,FAILED (errors=1)(yaml); classifier: 1 new driftbf0203a7Ran 17,OK,EXIT=0; classifier: "No contract failures against upstream.", exit 0939e45c9Ran 17,OK,EXIT=0(Python 3.13.14)just test)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 excepthermes_state.SCHEMA_VERSION.tests/test_context_engine_contract.pyandhermes_plugin_kit/testing.pydo not importSCHEMA_VERSION, so they are unchanged.Considered, not built
_read_skill_frontmatterfall back tohermes_yamlwhen 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_REVISIONstays939e45c9. No release was cut. The kit's release flow runs onmainafter merge. The head of this branch is the candidate combined U4+U5 kit release for U8:b961ec81dbbac35cbb26f10e01e642e9a947022c.https://claude.ai/code/session_01VDtQ1pDTJksqAcSdrGePVb