• .claude/skills/jsexec/SKILL.md

    From Rob Swindell (on Windows 11)@VERT to Git commit to main/sbbs/master on Fri May 29 00:55:34 2026
    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) <noreply@anthropic.com>

    ---
    þ Synchronet þ Vertrauen þ Home of Synchronet þ [vert/cvs/bbs].synchro.net