Conversation
What broke:
Running `hermes skills update` crashed with AttributeError: 'bytes'
object has no attribute 'encode' when skill bundles contained binary
files (e.g. audio assets from official skills).
Root cause:
SkillBundle.files is defined as Dict[str, Union[str, bytes]], but
bundle_content_hash() assumed all file content was str and called
.encode("utf-8") on every value. When the value was already bytes,
this caused a crash.
Why this fix is minimal:
Single function fix - detect type and route bytes directly to
hash.update(), encode strings as before. No broader changes to
SkillBundle, file handling, or any other hash computation paths.
What I tested:
Added regression test verifying bytes content is handled correctly
and produces deterministic hashes.
What I intentionally did not change:
- No changes to SkillBundle class or file loading logic
- No changes to other hash computation functions
- No changes to quarantine/installation logic
Collaborator
|
Thanks for the contribution, @Linux2010! Closing this as a duplicate of #2740 (by @Mibayy), which targets the same fix/feature. We're consolidating on that PR for review. If you want to help push it over the line, please jump in there — or if you think your approach is better for a specific reason that isn't covered in the other PR, let us know and we can reopen. |
This was referenced May 3, 2026
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.
What broke
Running
hermes skills updatecrashed withAttributeError: 'bytes' object has no attribute 'encode'when skill bundles contained binary files (e.g. audio assets from official skills like neutts).Root cause
SkillBundle.filesis defined asDict[str, Union[str, bytes]], butbundle_content_hash()assumed all file content wasstrand called.encode("utf-8")on every value. When the value was alreadybytes, this caused a crash.Traceback:
Why this fix is minimal
Single function fix - detect type and route
bytesdirectly tohash.update(), encode strings as before. No broader changes to:Patch (4 lines added):
What I tested
Added regression test verifying:
bytescontent is handled without crashstr+bytesbundles work correctlyWhat I intentionally did not change
SkillBundleclass definitioncontent_hash()inskills_guard.pyFixes #2739