• .claude/skills/javascript/SKILL.md ctrl/chat_llm.ini exec/chat_llm.js

    From Rob Swindell (on Debian Linux)@1:103/705 to Git commit to main/sbbs/master on Sun May 31 19:06:06 2026
    https://gitlab.synchro.net/main/sbbs/-/commit/8e4089207c7f521c8f2fdec0
    Modified Files:
    .claude/skills/javascript/SKILL.md ctrl/chat_llm.ini exec/chat_llm.js chat_llm_irc.js llm_index.js exec/llm_tools/relay_message.js
    Log Message:
    chat_llm: relay opt-out + caps, deterministic relay reply, ini root-section defaults

    Relay (IRC):
    - Recipients can opt out of relays ("don't relay messages to me" and
    variants; "relay me" opts back in). State in
    data/chat/<bot>_norelay.json; the relay_message tool refuses to queue
    for an opted-out nick and deliver_pending() drops anything already
    queued if the recipient opts out later.
    - Cap pending relays per recipient AND per sender (anti-flood),
    configurable via relay_max_pending (default 5), passed to the tool
    via env.
    - Deterministic relay reply: the pre-classifier now speaks the
    relay_message tool's own result text verbatim (.error / .note) and
    skips the model turn. qwen2.5:7b was observed discarding a refusal
    and fabricating a delivery promise ("I'll make sure X knows") for a
    relay it actually refused (e.g. to an opted-out recipient); the
    short-circuit removes any chance of misreporting whether the relay
    happened. Scoped to relay_message only.
    - De-hardcode the tool's queue/opt-out paths: chat_llm_irc.js passes
    relay_path/norelay_path through ctx -> env so the tool and bot share
    the same persona-derived files.
    - Move bot state (relay/mute/seen/norelay) under data/chat/.

    Config / persona:
    - chat_llm.ini defaults now live in the root (unnamed) section; a named
    [<persona>] section overrides. "default" is the reserved fallback
    persona (the root defaults) and must not be a section or a guru code.
    - ctx_from_user() canonicalizes the persona code to lowercase and maps
    blank/missing -> "default"; PERSONA in chat_llm_irc.js is lowercased
    at the source.
    - Sanitize code-derived filenames: load_index key and BOT_FILE_BASE
    parts run through safe_id() so an unfortunate code can't escape
    data/chat/ or collide via path characters.

    Docs:
    - javascript SKILL.md: document the root (unnamed) section as global
    defaults (iniGetObject(null)) and the case-fold caveat.

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