{"repo":"NousResearch/hermes-agent","public_id":"68369","display_label":"UTF-8 encoding fixes for hub JSON file I/O","summary":"A bug report and two related fixes addressing hub lock/taps/cache JSON read and write operations that fail on Chinese Windows due to missing explicit UTF-8 encoding, causing GBK misinterpretation.","subsystem":"skills","counts":{"members":4,"open_issues":0,"open_issues_distinct":0,"open_prs":0,"closed_issues":1,"merged_prs":1,"attempt_prs":2},"landed_fix":{"status":"merged_to_main","basis":"structural","pr":71078,"merged_at":"2026-07-25T00:10:40+00:00"},"resolution":{"state":"unresolved","by":null},"freshness":{"state":"verified","last_verified_at":"2026-07-25T00:10:40+00:00","is_stale":false},"grouping":{"backbone":"STRUCTURAL_SPANNING","link_density":0.5},"fix_edges":[{"issue_number":49508,"pr_number":71078,"tier":"verified","basis":"superseded_ref","confidence":0.9,"recoverable_from_timeline":false,"pr_merged_at":"2026-07-25T00:10:40+00:00"},{"issue_number":53833,"pr_number":71078,"tier":"verified","basis":"superseded_ref","confidence":0.9,"recoverable_from_timeline":false,"pr_merged_at":"2026-07-25T00:10:40+00:00"},{"issue_number":68053,"pr_number":71078,"tier":"verified","basis":"superseded_ref","confidence":0.9,"recoverable_from_timeline":false,"pr_merged_at":"2026-07-25T00:10:40+00:00"},{"issue_number":68369,"pr_number":71078,"tier":"verified","basis":"superseded_ref","confidence":0.9,"recoverable_from_timeline":false,"pr_merged_at":"2026-07-25T00:10:40+00:00"},{"issue_number":69706,"pr_number":71078,"tier":"verified","basis":"superseded_ref","confidence":0.9,"recoverable_from_timeline":false,"pr_merged_at":"2026-07-25T00:10:40+00:00"}],"members":[{"kind":"issue","number":68369,"title":"[Bug]: hermes skills check crashes on Chinese Windows — HubLockFile.load() bare read_text() decodes UTF-8 lock.json as GBK","url":null,"state":"closed"},{"kind":"pr","number":68399,"title":"fix(skills): add explicit encoding=utf-8 to all hub JSON read/write calls","url":null,"state":"closed","close_reason":{"refs":[{"kind":"pr","value":"#47489","number":47489}],"category":"duplicate_of","implication":"duplicate"},"merged":false},{"kind":"pr","number":68674,"title":"fix(skills): force UTF-8 on hub lock/taps/cache JSON I/O","url":null,"state":"closed","close_reason":{"refs":[{"kind":"commit","value":"d372fda6f0","number":0},{"kind":"pr","value":"#71078","number":71078}],"category":"superseded_by_pr","implication":"superseded"},"merged":false},{"kind":"pr","number":71078,"title":"fix(windows): retire the bare read_text/write_text class — salvage 11 contributor PRs + sweep + linter","url":null,"state":"merged","close_reason":{"category":"merged"},"merged":true,"is_fix_pr":true,"fix_tier":"verified","files_changed":["agent/auxiliary_client.py","agent/copilot_acp_client.py","agent/credential_sources.py","agent/nous_rate_guard.py","agent/shell_hooks.py","cli.py","contributors/emails/[redacted:email]","contributors/emails/chancelu@users.noreply.github.com","contributors/emails/[redacted:email]","hermes_cli/auth.py","hermes_cli/banner.py","hermes_cli/container_boot.py","hermes_cli/doctor.py","hermes_cli/gateway.py","hermes_cli/main.py","hermes_cli/plugins.py","hermes_cli/profiles.py","hermes_cli/service_manager.py","hermes_cli/uninstall.py","hermes_constants.py","optional-skills/creative/kanban-video-orchestrator/scripts/bootstrap_pipeline.py","optional-skills/migration/openclaw-migration/scripts/openclaw_to_hermes.py","optional-skills/research/osint-investigation/scripts/build_findings.py","optional-skills/research/osint-investigation/scripts/timing_analysis.py","plugins/cron_providers/__init__.py","plugins/disk-cleanup/disk_cleanup.py","plugins/google_meet/realtime/openai_client.py","plugins/hermes-achievements/dashboard/plugin_api.py","plugins/memory/__init__.py","plugins/memory/hindsight/__init__.py","plugins/memory/honcho/__init__.py","plugins/memory/mem0/__init__.py","plugins/memory/mem0/_setup.py","scripts/check-windows-footguns.py","scripts/check_subprocess_stdin.py","scripts/ci/assemble_review_comment.py","scripts/install.ps1","scripts/lint_diff.py","scripts/profile-tui.py","scripts/release.py","scripts/run_tests_parallel.py","skills/creative/comfyui/scripts/auto_fix_deps.py","skills/creative/comfyui/scripts/extract_schema.py","skills/creative/comfyui/scripts/run_workflow.py","skills/creative/comfyui/tests/conftest.py","skills/creative/comfyui/tests/test_common.py","skills/creative/comfyui/tests/test_run_workflow.py","skills/productivity/docx/scripts/accept_changes.py","skills/productivity/docx/scripts/office/soffice.py","skills/productivity/docx/scripts/office/validators/base.py","skills/productivity/google-workspace/scripts/google_api.py","skills/productivity/google-workspace/scripts/gws_bridge.py","skills/productivity/google-workspace/scripts/setup.py","skills/productivity/pdf/scripts/check_bounding_boxes.py","skills/productivity/pdf/scripts/create_validation_image.py","skills/productivity/pdf/scripts/fill_fillable_fields.py","skills/productivity/pdf/scripts/fill_pdf_form_with_annotations.py","skills/productivity/powerpoint/scripts/office/soffice.py","skills/productivity/powerpoint/scripts/office/validators/base.py","skills/productivity/xlsx/scripts/office/soffice.py","skills/productivity/xlsx/scripts/recalc.py","tests/agent/test_copilot_acp_client.py","tests/agent/test_nous_rate_guard.py","tests/cli/test_worktree_security.py","tests/hermes_cli/test_doctor.py","tests/hermes_cli/test_profile_install_env_encoding.py","tests/plugins/memory/test_hindsight_provider.py","tests/plugins/memory/test_mem0_setup.py","tests/skills/test_office_document_skills.py","tests/skills/test_openclaw_migration.py","tests/test_hermes_bootstrap.py","tests/tools/test_hub_lock_non_utf8_68053.py","tools/managed_tool_gateway.py","tools/skill_usage.py","tools/skills_hub.py","tools/skills_sync.py","tools/web_tools.py","tools/xai_http.py"]}],"trust":{"default_tier":"verified","includes_suggested":false}}