{"repo":"NousResearch/hermes-agent","public_id":"9239","display_label":"atomic write file permission and umask bugs","summary":"These issues and fixes concern atomic write functions creating files with incorrect permissions—either ignoring umask, defaulting to 0600, or failing to restore expected modes for new and existing files. Multiple related fixes address the same underlying file mode handling problems.","subsystem":"agent","counts":{"members":16,"open_issues":2,"open_issues_distinct":2,"open_prs":3,"closed_issues":1,"merged_prs":2,"attempt_prs":11},"landed_fix":{"status":"merged_to_main","basis":"structural","pr":86255},"resolution":{"state":"unresolved","by":null},"freshness":{"state":"verified","last_verified_at":"2026-08-18T20:18:56+00:00","is_stale":false},"grouping":{"backbone":"STRUCTURAL_PARTIAL","link_density":0.11733333333333333},"fix_edges":[{"issue_number":14181,"pr_number":86255,"tier":"verified","basis":"superseded_ref","confidence":0.9,"recoverable_from_timeline":false},{"issue_number":14181,"pr_number":89431,"tier":"verified","basis":"superseded_ref","confidence":0.9,"recoverable_from_timeline":false}],"members":[{"kind":"issue","number":9239,"title":"[Bug]: Unable to `/save` in new conversations with NixOS managed mode","url":null,"state":"closed"},{"kind":"issue","number":14181,"title":"Managed/shared Hermes runtime: atomic writes recreate SKILL.md and .bundled_manifest as 0600, causing permission-denied failures","url":null,"state":"open"},{"kind":"issue","number":23613,"title":"_restore_file_mode no-ops on new files, leaving atomic_json_write outputs at 0o600","url":null,"state":"open"},{"kind":"pr","number":9279,"title":"fix(utils): honor umask in atomic writes (fixes /save in NixOS managed mode)","url":null,"state":"closed","close_reason":{"category":"silent_close","implication":"active"},"merged":false},{"kind":"pr","number":9529,"title":"fix: honor umask in atomic_json_write/atomic_yaml_write","url":null,"state":"open","close_reason":{"refs":[{"kind":"commit","value":"589cff65d76d","number":0}],"category":"uncategorized","implication":"needs_llm"},"merged":false},{"kind":"pr","number":14280,"title":"fix(skills): preserve file modes across atomic writes","url":null,"state":"closed","close_reason":{"category":"stale_abandoned","implication":"active"},"merged":false},{"kind":"pr","number":14410,"title":"fix(skills): preserve modes during atomic writes","url":null,"state":"closed","close_reason":{"refs":[{"kind":"pr","value":"#86255","number":86255},{"kind":"pr","value":"#89431","number":89431},{"kind":"pr","value":"#89431","number":89431}],"category":"implemented_elsewhere","implication":"superseded"},"merged":false},{"kind":"pr","number":23622,"title":"fix(utils): restore default mode for new atomic writes","url":null,"state":"open","close_reason":{"refs":[{"kind":"pr","value":"#23613","number":23613},{"kind":"pr","value":"#23636","number":23636},{"kind":"pr","value":"#23636","number":23636},{"kind":"pr","value":"#23613","number":23613},{"kind":"pr","value":"#23636","number":23636}],"category":"duplicate_of","implication":"duplicate"},"merged":false},{"kind":"pr","number":23636,"title":"fix(utils): support explicit mode for first-time atomic writes","url":null,"state":"open","close_reason":{"category":"uncategorized","implication":"needs_llm"},"merged":false},{"kind":"pr","number":23692,"title":"fix: _restore_file_mode defaults new files to 0o644 instead of no-op","url":null,"state":"closed","close_reason":{"refs":[{"kind":"pr","value":"#23622","number":23622},{"kind":"pr","value":"#23613","number":23613},{"kind":"pr","value":"#23636","number":23636}],"category":"duplicate_of","implication":"duplicate"},"merged":false},{"kind":"pr","number":23711,"title":"fix: _restore_file_mode defaults new files to 0o644 instead of no-op","url":null,"state":"closed","close_reason":{"refs":[{"kind":"pr","value":"#23622","number":23622},{"kind":"pr","value":"#23636","number":23636},{"kind":"pr","value":"#23692","number":23692}],"category":"duplicate_of","implication":"duplicate"},"merged":false},{"kind":"pr","number":23714,"title":"fix: _restore_file_mode defaults new files to 0o644 instead of no-op","url":null,"state":"closed","close_reason":{"refs":[{"kind":"pr","value":"#23622","number":23622},{"kind":"pr","value":"#23613","number":23613},{"kind":"pr","value":"#23636","number":23636}],"category":"duplicate_of","implication":"duplicate"},"merged":false},{"kind":"pr","number":23716,"title":"fix: _restore_file_mode defaults new files to 0o644 instead of no-op","url":null,"state":"closed","close_reason":{"refs":[{"kind":"pr","value":"#23622","number":23622},{"kind":"pr","value":"#23613","number":23613},{"kind":"pr","value":"#23636","number":23636}],"category":"duplicate_of","implication":"duplicate"},"merged":false},{"kind":"pr","number":23719,"title":"fix: _restore_file_mode defaults new files to 0o644 instead of no-op","url":null,"state":"closed","close_reason":{"refs":[{"kind":"pr","value":"#23711","number":23711},{"kind":"pr","value":"#23613","number":23613}],"category":"duplicate_of","implication":"duplicate"},"merged":false},{"kind":"pr","number":86255,"title":"fix(skills): preserve document modes during atomic writes","url":null,"state":"merged","close_reason":{"category":"merged","implication":"superseded"},"merged":true,"is_fix_pr":true,"fix_tier":"verified","files_changed":["tests/tools/test_skill_improvements.py","tools/skill_manager_tool.py"]},{"kind":"pr","number":89431,"title":"fix(skills): manifest file mode survives sync rewrites (completes #14410)","url":null,"state":"merged","close_reason":{"category":"merged","implication":"superseded"},"merged":true,"is_fix_pr":true,"fix_tier":"verified","files_changed":["tests/tools/test_skills_sync.py","tools/skills_sync.py"]}],"trust":{"default_tier":"verified","includes_suggested":false}}