• .claude/skills/javascript/SKILL.md

    From Rob Swindell (on Windows 11)@1:103/705 to Git commit to main/sbbs/master on Fri May 29 15:31:38 2026
    https://gitlab.synchro.net/main/sbbs/-/commit/30e601ade1688cc1a957bb92
    Modified Files:
    .claude/skills/javascript/SKILL.md
    Log Message:
    skills/javascript: note the chat_llm LLM-Guru module family

    Add the chat_llm engine, chat_llm_irc adapter, llm_tools, and llm_index to
    the stock exec/*.js inventory, plus wiki links to the new module/config/
    howto pages now published on wiki.synchro.net.

    Co-Authored-By: Claude Opus 4.8 (1M context) <[email protected]>
    --- SBBSecho 3.37-Linux
    * Origin: Vertrauen - [vert/cvs/bbs].synchro.net (1:103/705)
  • From Rob Swindell (on Debian Linux)@1:103/705 to Git commit to main/sbbs/master on Fri May 29 23:59:56 2026
    https://gitlab.synchro.net/main/sbbs/-/commit/d4613a65265ef3fe028b36a7
    Modified Files:
    .claude/skills/javascript/SKILL.md
    Log Message:
    javascript skill: how to syntax-check/test a side-effecting module

    Document the guard-and-load() idiom: gate a module's load-time entry
    point (server loop, socket connect, greeting) behind a NO_MAIN-style
    sentinel so it can be load()ed under jsexec for syntax-checking and unit-testing its helpers without running the side effect. Cites the
    stock CHAT_LLM_NO_STANDALONE / CHAT_LLM_IRC_NO_MAIN guards. Notes that syncjslint.js is a style linter (jslint) with false positives on valid SpiderMonkey regex, not a reliable syntax gate.

    Co-Authored-By: Claude Opus 4.8 <[email protected]>
    --- SBBSecho 3.37-Linux
    * Origin: Vertrauen - [vert/cvs/bbs].synchro.net (1:103/705)
  • From Rob Swindell (on Debian Linux)@1:103/705 to Git commit to main/sbbs/master on Fri May 29 23:59:57 2026
    https://gitlab.synchro.net/main/sbbs/-/commit/a923481d60d196ea331efafd
    Modified Files:
    .claude/skills/javascript/SKILL.md
    Log Message:
    skills/javascript: document INI trailing-comment type-dependency

    Synchronet .ini value parsing strips a trailing "; comment" only for single-token value types (boolean via isTrue, enum via parseEnum, and integer/float/datetime via the numeric parse). STRING values keep the
    whole post-'=' text (truncsp only), so an inline comment after a
    string-valued key becomes part of the value -- the trap that corrupts URL/path/name settings. File.iniGetObject() reads every value as a raw
    string and thus never strips inline comments.

    Add a "Reading INI files (and the trailing-comment trap)" section with
    the per-type table, the rationale (single-token values have no
    delimiter ambiguity; strings do), and the history behind the
    single-token support (cceb1fbb8 isTrue after FozzTexx's sexpots.ini
    report; 7346893d6 enum-after-comment).

    Co-Authored-By: Claude Opus 4.8 <[email protected]>
    --- SBBSecho 3.37-Linux
    * Origin: Vertrauen - [vert/cvs/bbs].synchro.net (1:103/705)
  • From Rob Swindell (on Debian Linux)@1:103/705 to Git commit to main/sbbs/master on Thu Jun 4 19:01:13 2026
    https://gitlab.synchro.net/main/sbbs/-/commit/ee6689ca9a399aa3c5ad1cc6
    Modified Files:
    .claude/skills/javascript/SKILL.md
    Log Message:
    javascript skill: document js.on_exit() scope + forced-termination semantics

    js.on_exit() evaluates its handler string in the script's GLOBAL scope (it compiles the string against the global object), so a handler function nested in another function is unreachable and throws silently at exit. It also fires on forced termination (operator-terminate / SIGTERM), which -- unlike a thrown exception -- does NOT run catch/finally (verified empirically via SIGTERM + file markers). New 'Script lifecycle: exit handlers' section covers the global-scope requirement, the finally-vs-on_exit distinction, and the out-of-process testing caveat.

    Co-Authored-By: Claude Opus 4.8 <[email protected]>
    --- SBBSecho 3.37-Linux
    * Origin: Vertrauen - [vert/cvs/bbs].synchro.net (1:103/705)
  • From Rob Swindell (on Debian Linux)@1:103/705 to Git commit to main/sbbs/master on Thu Jun 4 19:01:13 2026
    https://gitlab.synchro.net/main/sbbs/-/commit/a915d2d944ed7b316e36e030
    Modified Files:
    .claude/skills/javascript/SKILL.md
    Log Message:
    javascript skill: correct js.on_exit scope (door child-scope vs jsexec)

    The earlier note said on_exit evaluates "in the GLOBAL scope" -- true only for jsexec/login/timed-event modules (host evaluates against js_glob and recurses child scopes). Doors and most bbs.exec/;exec/js.exec invocations run in a fresh child js_scope (exec.cpp:595) and the host evaluates on_exit against THAT scope (exec.cpp:701) with no recursion. Registration captures the scope where js.on_exit is called -- top level = js_scope, inside a function = that function's call object -- so a handler registered inside main() is filed where a
    door's EvalOnExit(js_scope) never looks and silently never runs, even though the
    same code passes under jsexec (which recurses). This shipped as a live bug.

    Rewrite: register on_exit at top level (not inside a function); prefer try/finally for clean-unwind cleanup (a door disconnect is a clean unwind) and use on_exit only as the forced-terminate backstop; note that a jsexec wrapper does not reproduce a door's on_exit scope, so finally is the dependable path.

    Co-Authored-By: Claude Opus 4.8 <[email protected]>
    --- SBBSecho 3.37-Linux
    * Origin: Vertrauen - [vert/cvs/bbs].synchro.net (1:103/705)