# Discord Bot — Instruction Corrections — 2026-05-20

## User
- **User:** Mike Swanson (mike)
- **Machine:** GURU-BEAST-ROG
- **Role:** admin

## Session Summary
The session began with a repository sync, pulling 41 commits initially and 9 additional
commits mid-session, including the Cascades-Tucson migration phase 2.6 work, M365
offboarding for britney.thompson, a new `/forum-post` command, and a fix to the
`check-messages.sh` hook path. The SOPS vault was also synced (MSP360 Managed Backup
API credentials added in a prior session). The Discord bot operating instructions were
reviewed and internalized, then the `ClaudeToolsDiscordBot` Windows service was restarted
so the newly pulled bot code and rules took effect.

Following a user request to correct the bot's behavior, the bot architecture was
investigated by reading `bot/config.py`, `bot/claude/client.py`, and
`bot/handlers/message_handler.py`. This revealed that `DISCORD_CLAUDE.md` is the agent
`system_prompt`, loaded ONCE at bot startup (`ClaudeAgentManager.__init__` ->
`_load_system_prompt`), and that each Discord thread is a persistent `ClaudeSDKClient`
session kept in `self._agents[thread_id]`. Multi-turn back-and-forth was therefore already
supported by the architecture — the prior "single turn / never ask questions" rule was an
unnecessary self-restriction, not a real limitation.

Three edits were made to `DISCORD_CLAUDE.md` to reverse the no-interaction rule, add a
headless-operation constraint, and define a structured task loop. Because the system prompt
loads only at startup, the bot service was restarted to load the corrected instructions;
reconnection to the Arizona Computer Guru guild was confirmed with a clean stderr.

## Key Decisions
- **Reversed the no-interaction rule.** The bot may and should ask clarifying questions in
  plain text. Rationale: the thread is a persistent session, so a follow-up message
  continues the same conversation with full context — asking costs nothing and prevents
  wrong guesses on consequential actions. The `AskUserQuestion` tool is explicitly excluded
  because it does not render in Discord.
- **Added a "You Are Headless" constraint.** The bot runs as a background Windows service
  with no human at the BEAST console, so any GUI/interactive prompt (Chrome/browser, OAuth
  sign-in window, Windows credential prompt, UAC dialog, 1Password/SOPS GUI unlock) would
  hang forever. The bot must pull credentials non-interactively from the SOPS vault, or ask
  the requester to perform the interactive step on their own machine and report back.
- **Introduced a Task Loop.** Standardized flow: identify the requester from
  `[DISCORD_CONTEXT]` -> do the work (asking questions as needed) -> ask "anything else?"
  -> offer to log in Syncro (`/syncro`) -> `/save`. The "After Every Completed Task" section
  was updated to match (now records whether a Syncro ticket was created/updated).

## Problems Encountered
- None. Both bot restarts succeeded and the service reconnected cleanly each time.

## Configuration Changes
Files modified:
- `projects/discord-bot/DISCORD_CLAUDE.md` — 3 edits (+52 / -17):
  1. Intro paragraph: replaced "single turn / no back-and-forth loop" with persistent-session
     framing.
  2. Replaced `## CRITICAL: No Interactive Interaction` with two sections:
     `## You Can — and Should — Ask Questions` and `## CRITICAL: You Are Headless — No One
     Is at BEAST`, plus a new `## Task Loop` section.
  3. Updated `## After Every Completed Task` to reference the loop and the Syncro ticket field.

No code files were changed. No vault files or `.claude/identity.json` touched.

## Commands & Outputs
- `nssm restart ClaudeToolsDiscordBot` — run twice (first after the start-of-session sync to
  load pulled bot code; second after editing the instructions). Both: STOP + START succeeded,
  service `Running`.
- Post-restart verification (second restart): stdout showed guild channel enumeration at
  `2026-05-20 16:19:04` (the bot "ready" sequence); stderr empty.

## Infrastructure & Services
- **Machine:** GURU-BEAST-ROG (BEAST) — Windows 11 Pro
- **Service:** `ClaudeToolsDiscordBot` (NSSM, StartType Automatic), runs the Discord bot
- **nssm:** `C:\Users\guru\AppData\Local\Microsoft\WinGet\Links\nssm.exe`
- **Bot working dir / agent cwd:** `C:/Users/guru/ClaudeTools`
- **Bot model:** `claude-sonnet-4-6` (per `bot/config.py`)
- **Bot logs:** `projects/discord-bot/logs/stdout.log`, `stderr.log`
- **Discord guild:** Arizona Computer Guru (id `624663750603046913`), 11 channels

## Credentials
- None used, discovered, or changed this session. The bot authenticates via its Discord
  token (in `projects/discord-bot/.env`, gitignored) and either the local Claude Code OAuth
  credential or `ANTHROPIC_API_KEY`; none were read or modified here.

## Reference Information
- Bot architecture (verified this session):
  - System prompt source: `projects/discord-bot/DISCORD_CLAUDE.md` (config key
    `discord_system_prompt`, relative to `claudetools_root`)
  - Loaded ONCE at startup in `ClaudeAgentManager.__init__` -> `client.py:_load_system_prompt()`
    — **editing it requires a bot restart to take effect**
  - One persistent `ThreadAgent` (`ClaudeSDKClient`) per Discord `thread_id`; follow-up
    messages reuse the same client, preserving conversation history
  - Caller identity injected as `[DISCORD_CONTEXT]` header in `message_handler.py`
- Restart command: `nssm restart ClaudeToolsDiscordBot`

## Pending / Next Steps
- None outstanding for the bot. New rules are live as of the 16:19 restart.
- Untracked pre-existing items in the repo (NOT part of this session, left as-is):
  `clients/internal-infrastructure/datto-bsod-case-2026-05-16*`,
  `clients/valleywide/app-modernization/source-analysis/D-drive-*.csv`.
