io.setMtime over a new abc/FILE utimensat leaf
The one native primitive the write verbs need: restamp a worktree file's mtime so a later be reads it clean (native SNIFFAtStampPath, sniff/AT.c:761, calls utimensat raw, no abc wrapper). Add a FILE wrapper in libabc, bind io.setMtime(path, ron60). Pure libabc — no keeper/dog. Blocks the write verbs. Part of JS-046. Method: Issues.
js/io.cpp, JS-042) but NO
mtime setter; abc/FILE.h has no utimens wrapper either (grep confirms none).
be
re-stages the whole tree (the failure put_visit_tracked guards, PUT.c:64).
abc/FILE.h/.c: a FILESetMtime(path8b, ron60) wrapper over
utimensat(AT_FDCWD, …, AT_SYMLINK_NOFOLLOW), error-propagating (ok64).
js/io.cpp: io.setMtime(path, ron60BigInt) leaf over it; update API.md +INDEX.md (the io.cpp module section).
sniff/AT.c:688. ASAN + ctestgreen. NOFOLLOW so a symlink stamps the link, not its target (matches native).
timespec. Reuse the AT.c conversion math rather than reinventing it.
JABCstat or add JABCmtime): setMtime(path, r)
then io.lstat(path).mtime round-trips r exactly. (test/stat.js:71-78.)
(ea9de45b leaf + 4fd1d639 binding/docs.)