# NousResearch/hermes-agent · atomic write file permission and umask bugs

## Open now

- 2 issues, 3 PRs open on GitHub.
- #14181: Managed/shared Hermes runtime: atomic writes recreate SKILL.md and .bundled_manifest as 0600, causing permission-denied failures
- #23613: _restore_file_mode no-ops on new files, leaving atomic_json_write outputs at 0o600
- PR #9529: fix: honor umask in atomic_json_write/atomic_yaml_write
- PR #23622: fix(utils): restore default mode for new atomic writes
- PR #23636: fix(utils): support explicit mode for first-time atomic writes

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.

## TL;DR

- 16 member(s): 2 open issue(s), 1 closed issue(s), 3 open PR(s), 2 merged PR(s), 8 PR(s) closed without merging.
- A fix was merged to main in PR #86255. Verify it addresses your case.
- **Recommended:** read PR #86255 (and any competing PRs below) before filing. Confirm the merged change covers your symptom.

## Maintainer resolution verdict

- Internal-tracker verdict over this cluster's issue members: `unresolved`. This is distinct from the fix status above. Weigh it yourself.

## How this cluster was grouped

- Link evidence (`STRUCTURAL_PARTIAL`): some members are connected by structural evidence (shared changed files, or a closing/superseded reference); the rest are joined by an automated relevance judgement over their text.
- Members outside that structural core may belong to a different underlying problem.
- Pairwise link density `0.12`: the share of member pairs that carry a link, counting a structural link in full and a relevance-only link at 0.36. `1.00` means every pair is linked.

## Open related issues

- #14181: Managed/shared Hermes runtime: atomic writes recreate SKILL.md and .bundled_manifest as 0600, causing permission-denied failures
- #23613: _restore_file_mode no-ops on new files, leaving atomic_json_write outputs at 0o600

## Closed / duplicate issues

- #9239: \[Bug\]: Unable to \`/save\` in new conversations with NixOS managed mode

## Prior & competing PRs

- **#86255: fix(skills): preserve document modes during atomic writes**. merged to main · fix tier `verified`
  - maintainer direction: category `merged`; implication `superseded`
  - files: `tests/tools/test_skill_improvements.py`, `tools/skill_manager_tool.py`
- **#89431: fix(skills): manifest file mode survives sync rewrites (completes #14410)**. merged to main · fix tier `verified`
  - maintainer direction: category `merged`; implication `superseded`
  - files: `tests/tools/test_skills_sync.py`, `tools/skills_sync.py`
- **#9279: fix(utils): honor umask in atomic writes (fixes /save in NixOS managed mode)**. closed without merge
  - maintainer direction: category `silent_close`; implication `active`
- **#9529: fix: honor umask in atomic_json_write/atomic_yaml_write**. open
  - maintainer direction: category `uncategorized`; implication `needs_llm`; refs `589cff65d76d`
  - files: `tests/hermes_cli/test_atomic_json_write.py`, `tests/hermes_cli/test_atomic_yaml_write.py`, `utils.py`
- **#14280: fix(skills): preserve file modes across atomic writes**. closed without merge
  - maintainer direction: category `stale_abandoned`; implication `active`
- **#14410: fix(skills): preserve modes during atomic writes**. closed without merge
  - maintainer direction: category `implemented_elsewhere`; implication `superseded`; refs `#86255`, `#89431`, `#89431`
- **#23622: fix(utils): restore default mode for new atomic writes**. open
  - maintainer direction: category `duplicate_of`; implication `duplicate`; refs `#23613`, `#23636`, `#23636`, `#23613`, `#23636`
  - files: `tests/hermes_cli/test_atomic_json_write.py`, `tests/hermes_cli/test_atomic_yaml_write.py`, `utils.py`
- **#23636: fix(utils): support explicit mode for first-time atomic writes**. open
  - maintainer direction: category `uncategorized`; implication `needs_llm`
  - files: `gateway/status.py`, `tests/gateway/test_status.py`, `tests/hermes_cli/test_atomic_json_write.py`, `utils.py`
- **#23692: fix: _restore_file_mode defaults new files to 0o644 instead of no-op**. closed without merge
  - maintainer direction: category `duplicate_of`; implication `duplicate`; refs `#23622`, `#23613`, `#23636`
- **#23711: fix: _restore_file_mode defaults new files to 0o644 instead of no-op**. closed without merge
  - maintainer direction: category `duplicate_of`; implication `duplicate`; refs `#23622`, `#23636`, `#23692`
- **#23714: fix: _restore_file_mode defaults new files to 0o644 instead of no-op**. closed without merge
  - maintainer direction: category `duplicate_of`; implication `duplicate`; refs `#23622`, `#23613`, `#23636`
- **#23716: fix: _restore_file_mode defaults new files to 0o644 instead of no-op**. closed without merge
  - maintainer direction: category `duplicate_of`; implication `duplicate`; refs `#23622`, `#23613`, `#23636`
- **#23719: fix: _restore_file_mode defaults new files to 0o644 instead of no-op**. closed without merge
  - maintainer direction: category `duplicate_of`; implication `duplicate`; refs `#23711`, `#23613`

## Fix status

- Merged to main in PR #86255 (cited above). No release data is tracked. Verify downstream.
- Fix last verified (merged) `2026-08-18`.
- Subsystem: `agent`
