Subj : .claude/skills/jsexec/SKILL.md To : Git commit to main/sbbs/master From : Rob Swindell (on Windows 11) Date : Fri May 29 2026 00:55:34 https://gitlab.synchro.net/main/sbbs/-/commit/3302985c18d7e05422f1249d Modified Files: .claude/skills/jsexec/SKILL.md Log Message: ..claude/skills/jsexec: per-user ARS check pattern + stdout buffering gotcha Two findings from chat-index work and regression-suite debugging: 1. Checking access against a specific user under jsexec. The natural-looking accessors (sub.can_read, dir.can_download) evaluate against the implicit session user -- which under jsexec doesn't exist, so they return true for everything. Document the reliable pattern: instantiate User(N) and walk the ownership chain calling u.compare_ars() on each ARS string conjunctively. Also note that the global "user" lowercase = useron in C++ -- it is undefined under jsexec, distinct from the User constructor. 2. stdout / stderr / stdin are global File instances. They have a .flush() method that fflushes the underlying FILE*. The gotcha: print() goes through C stdio, which block-buffers (~4KB) when stdout is redirected to a file or pipe. A long-running script looks stalled under tail -f even though it's progressing. Route output through stdout.writeln() + stdout.flush() to make it line-buffered against the redirected FD. Co-Authored-By: Claude Opus 4.7 (1M context) --- þ Synchronet þ Vertrauen þ Home of Synchronet þ [vert/cvs/bbs].synchro.net .