Severity: High/Med · Proposed priority: P2 · Audit IDs: C2, C15, C29, C40
bash is a second-class shell relative to zsh; several features silently do not work in it.
C2 — all bash aliases are dead. setup-linux.sh:148 writes the generated alias file to $HOME/.bash/bash_aliases, but the deployed .bashrc:129-130 sources ~/.bash_aliases (a different path). The whole alias payload (gs/gd/gl/gp/k/kc/dch/tx/oclog/qq/qf…) never loads in bash. The final check (setup-linux.sh:1430) only asserts the file exists, so it passes. (Compounding: had it loaded, alias qq='noglob _qq_call …' — zsh noglob — would error in bash and shadow the bash qq() function.)
C15 — bash hard-resets PATH; zsh does not. .bashrc:105 export PATH="/usr/local/bin:/usr/bin:/bin:…" while .zshrc:83 has that line commented out. Any nested interactive bash (tmux pane, IDE terminal) wipes inherited PATH (nvm node, /snap/bin, ~/bin).
C29 — bash never gets nvm; setup re-deploys .bashrc wiping installer init. nvm loads only via .zshrc:136; .bashrc has no nvm block, and setup-linux.sh:174 overwrites ~/.bashrc each run, deleting the lines installers appended — while setup-linux.sh:1426 calls that drift "expected".
C40 — OPENCODE_VERSION unguarded under set -u. setup-linux.sh:654/666/674 reference it bare; a checkout missing versions.conf aborts setup, contradicting the adjacent "fall back to latest" comment. Sibling vars are guarded. Fix: ${OPENCODE_VERSION:-}.
Fix: point .bashrc at ~/.bash/bash_aliases (or write to ~/.bash_aliases); align bash PATH policy with zsh; load nvm in bash; guard OPENCODE_VERSION. Consider a dotf doctor check that a known alias resolves in a non-interactive bash.
Source: docs/audits/codebase-audit-2026-07-06.md (C2, C15, C29, C40).
Severity: High/Med · Proposed priority: P2 · Audit IDs: C2, C15, C29, C40
bash is a second-class shell relative to zsh; several features silently do not work in it.
C2 — all bash aliases are dead.
setup-linux.sh:148writes the generated alias file to$HOME/.bash/bash_aliases, but the deployed.bashrc:129-130sources~/.bash_aliases(a different path). The whole alias payload (gs/gd/gl/gp/k/kc/dch/tx/oclog/qq/qf…) never loads in bash. The final check (setup-linux.sh:1430) only asserts the file exists, so it passes. (Compounding: had it loaded,alias qq='noglob _qq_call …'— zshnoglob— would error in bash and shadow the bashqq()function.)C15 — bash hard-resets PATH; zsh does not.
.bashrc:105export PATH="/usr/local/bin:/usr/bin:/bin:…"while.zshrc:83has that line commented out. Any nested interactive bash (tmux pane, IDE terminal) wipes inherited PATH (nvm node,/snap/bin,~/bin).C29 — bash never gets nvm; setup re-deploys
.bashrcwiping installer init. nvm loads only via.zshrc:136;.bashrchas no nvm block, andsetup-linux.sh:174overwrites~/.bashrceach run, deleting the lines installers appended — whilesetup-linux.sh:1426calls that drift "expected".C40 —
OPENCODE_VERSIONunguarded underset -u.setup-linux.sh:654/666/674reference it bare; a checkout missingversions.confaborts setup, contradicting the adjacent "fall back to latest" comment. Sibling vars are guarded. Fix:${OPENCODE_VERSION:-}.Fix: point
.bashrcat~/.bash/bash_aliases(or write to~/.bash_aliases); align bash PATH policy with zsh; load nvm in bash; guardOPENCODE_VERSION. Consider adotf doctorcheck that a known alias resolves in a non-interactive bash.Source:
docs/audits/codebase-audit-2026-07-06.md(C2, C15, C29, C40).