access(2) (and faccessat) return failure for files that DO exist, while stat(2) and open(2) on the same path succeed. Unconditional — not a permission/uid check.
Originally reported as site ticket brintos.io/tickets/11; moved here to the owning repo.
Repro
Booted linux-6.12-musl distro (cloud/virtiofs rootfs), in tclsh:
% file exists /usr/lib/tcl8.6/init.tcl -> 0 (Tcl_FSAccess -> access(F_OK))
% file readable /usr/lib/tcl8.6/init.tcl -> 0 (access(R_OK))
% file size /usr/lib/tcl8.6/init.tcl -> 24826 (stat) OK
% source /usr/lib/tcl8.6/init.tcl -> ok (open) OK
ls -l shows the file present (-rw-r--r-- 24826). chmod 0777 + chown 0:0 does not change the result — access() fails even for a world-rwx, root-owned file, including F_OK.
Impact
Tcl's library search uses file exists / file readable (access), so it rejects every candidate directory: encoding names yields only the 4 built-in C encodings (no .enc autoload), and Tcl_Init fails with "Can't find a usable init.tcl". This blocks Expect (spawn/expect) entirely, and anything that uses access() or test -e/-r.
Likely location
The VFS / virtiofs access (permission) handler, or the musl access/faccessat syscall wiring on wasm32 — stat and open take a different path and work correctly.
Found while validating Tcl+Expect after the ticket #8 fix (Tcl itself now runs).