Severity: LOW | Type: Missing Utility | Effort: Small
Nearly every file-reading builtin repeats the same fs.read_file + String::from_utf8_lossy + error formatting pattern (63 occurrences).
Proposed fix: async fn read_text_file(fs, path, cmd_name) -> Result<String, ExecResult> shared helper.
Ref: specs/015-technical-debt.md #19