utils-fix-permissions
SkillFiles & storageFix file permissions on a directory tree on an HPC cluster (Leonardo, Jupiter, TACC, etc.) so other users can read your shared data, conda envs, or work directories. Runs `scripts/permissions/fix_permissions.sh <dir>` over SSH on the target cluster — sets directories to 755, files to 644, then restores execute bits on bin/ entries, ELF binaries, and shebang scripts, and ensures all ancestor directories are traversable (o+x). Use when another user reports "Permission denied" reading your files, after creating a new conda env or shared data dir, or when a cross-user pipeline can't access your checkpoint/ eval/trace outputs.
Available today. Use it from your connected AI after setup.
No other account needed.
Connect ahel once, and every AI you use reads what you have installed.
Then ask your AI: use the utils-fix-permissions skill
What this skill tells your AI
The instructions your AI receives, as published by open-thoughts/openthoughts-agent in .agents/skills/utils-fix-permissions/SKILL.md and read by ahel’s review.
Set shared-readable permissions on an HPC directory tree.
When to use
- Another user reports "Permission denied".
- A shared conda env or data directory needs read access.
- A cross-user pipeline cannot read checkpoint, eval, or trace output.
rsyncorscppreserved 600/700 permissions.
What it does
scripts/permissions/fix_permissions.sh <dir> performs these passes:
| Pass | Action |
|---|---|
| 0 | Ensure all ancestor directories up to / are traversable (o+x) — only touches dirs you own |
| 1 | Set all directories to 755 (rwxr-xr-x) |
| 2 | Set all files to 644 (rw-r--r--) |
| 3 | Restore 755 on executables in bin/ directories |
| 4 | Restore 755 on ELF binaries (detected by \x7f ELF magic header) |
| 5 | Restore 755 on shell scripts with shebang (#!) |
Files remain owner-writable; collaborators receive read and execute.
How to invoke
SSH to the target cluster and run the script from the repo root:
# Leonardo example
ssh Leonardo 'cd $WORK/OpenThoughts-Agent && bash scripts/permissions/fix_permissions.sh /leonardo_work/AIFAC_5C0_290/bfeuer00'
# TACC example (large tree — run on a compute node if login node is loaded)
ssh TACCVista 'cd $SCRATCH/OpenThoughts-Agent && bash scripts/permissions/fix_permissions.sh $SCRATCH/eval_jobs'
# Jupiter example
ssh Jupiter 'cd $DCFT && bash scripts/permissions/fix_permissions.sh /p/home/../../public'
Large directories
For big trees, use an interactive compute node:
# TACC
ssh TACCVista 'srun -p gh-dev -N 1 -n 1 -t 08:00:00 --account=CCR24067 bash -c "cd $SCRATCH/OpenThoughts-Agent && bash scripts/permissions/fix_permissions.sh $SCRATCH/miniconda3"'
# Leonardo (idev or sbatch)
ssh Leonardo 'srun -p boost --account=AIFAC_5C0_290 --time=08:00:00 -N 1 bash -c "cd $WORK/OpenThoughts-Agent && bash scripts/permissions/fix_permissions.sh $WORK"'
Gotchas
- Use
chmod -R g+w <dir>when shared editing is required. - Rerun after
pip installfor a shared conda environment. - Pass 0 changes only owned NFS directories.
- Safe to rerun; it is idempotent.
Signals
- GitHub stars
- 291
- Forks
- 41
- Last commit
- Sep 2026
Advanced
- Catalog kind
- skill
- Gateway key
utils-fix-permissions- Source
- github.com/open-thoughts/openthoughts-agent