sync: auto-sync from GURU-BEAST-ROG at 2026-05-22 12:49:39

Author: Mike Swanson
Machine: GURU-BEAST-ROG
Timestamp: 2026-05-22 12:49:39
This commit is contained in:
2026-05-22 12:49:40 -07:00
parent eda8420ba6
commit e0017e96c2

View File

@@ -87,3 +87,123 @@ None.
- Edward King — contact ID: 2663827, phone: 602-617-3641 (father-in-law), email: edking2002@aol.com
- Discord thread: #What is Stephen Woodford's cell number?
- Bot alert message ID: 1507454436711203008
---
## Update: 12:48 PT — interactive session (BEAST): Discord bot config, Syncro #bot-alerts, sync.sh, hooks, memory
> Scope note: this is the **interactive coordinator** session on BEAST (Mike, GURU-BEAST-ROG),
> separate from the Discord-bot session logged above. Work spanned 2026-05-20 → 2026-05-22 in
> one continuous conversation. The earliest piece (Discord bot instruction corrections) is also
> recorded in `projects/discord-bot/session-logs/2026-05-20-session.md`.
### Session Summary
Corrected and extended the ClaudeTools Discord bot's operating rules, built out its user-identity
table, wired Syncro into a Discord activity feed, and fixed two infrastructure bugs (the sync
script and a prompt hook) plus reconciled stale memory after a parallel Syncro overhaul.
The Discord bot work began by reversing the bot's "single turn / never ask questions" rule — the
architecture (`bot/claude/client.py`) keeps one persistent `ClaudeSDKClient` per thread, so
back-and-forth is supported. Added a "headless" constraint (no Chrome/credential/GUI prompts at
the unattended BEAST console) and a Task Loop (identify requester → do work → "anything else?" →
offer Syncro → `/save`). Then pinned Discord IDs for Mike, Howard, and Winter (Winter granted full
access and marked Syncro SME), and added Rob. The bot's `DISCORD_CLAUDE.md` is the agent
system_prompt, loaded once at service start, so every change required `nssm restart
ClaudeToolsDiscordBot`. Verified the bot can both DM (to Mike) and post to a channel (#bot-alerts)
using the bot token via the Discord REST API, without disturbing the live gateway session.
Wired Syncro to post a summary + link to #bot-alerts after every write: added a reusable, soft-
failing helper `.claude/scripts/post-bot-alert.sh` (reads the bot token from the vault, `.env`
fallback) and a "Post to #bot-alerts" section in the `/syncro` skill. This landed alongside Mike's
parallel Syncro overhaul (commits `64a0ba7`/`90748d0`/`ce38304`) that replaced the `timer_entry →
charge_timer_entry` workflow with direct `add_line_item`; the two merged without conflict.
Fixed `sync.sh`: added Phase 5b (copy `.claude/commands/*.md``~/.claude/commands/`), which
closed a ~3-week drift where the global command set lagged the repo (e.g. `/syncro` was stale, and
`feature-request`/`forum-post`/`inject-standards`/`shape-spec` were missing globally). Also fixed
the long-standing untracked-only detection bug (switched `git diff-index --quiet HEAD --` to
`[ -n "$(git status --porcelain)" ]` in both the repo and vault blocks) and guarded the change
with a `.gitignore` entry for 54 MB of datto BSOD dumps so the fix wouldn't sweep them into git.
Reconciled the Syncro memory set with the add_line_item switch, fixed the `UserPromptSubmit` hook
(which had been erroring on BEAST and silently swallowing coord messages), and resolved a
contradiction in Rob's Syncro scope (full access granted and revoked simultaneously) — Mike's call:
full Syncro including billing.
### Key Decisions
- **Bot asks questions in plain text, not via AskUserQuestion** — the tool doesn't render in
Discord; a posted question + the persistent thread session is the mechanism.
- **#bot-alerts helper reads the token from the vault first, `.env` fallback** — so it works on any
machine (Howard's, DESKTOP), not just BEAST where the `.env` lives. Soft-fails (exit 0) so a
Discord outage never breaks a Syncro write.
- **Fixed the root cause of command drift in `sync.sh` (Phase 5b)** rather than just re-copying once
— the automated script had skipped the doc's "copy to global" step entirely.
- **Gitignored the datto dumps instead of letting the sync fix commit them** — 54 MB of binary
memory dumps don't belong in a config repo; ignoring keeps them as local working files.
- **Reconciled rather than deleted obsolete timer memories** — followed Mike's keep-and-mark-
SUPERSEDED pattern; `timer_response_shape` retained as HISTORICAL for the rare manual-timer case.
- **Hook now uses `$CLAUDE_PROJECT_DIR`/`$HOME/ClaudeTools` + trailing `true`** — robust on every
machine and never exits non-zero on a missing script.
- **Rob gets full Syncro incl. billing** (Mike's decision) — removed the contradicting CANNOT line.
### Problems Encountered
- **Global slash commands were ~3 weeks stale** (`/syncro` and others). Root cause: `sync.sh` never
ran the doc's Phase-3 copy-to-global step. Fixed by adding Phase 5b; verified it synced 8 commands.
- **`UserPromptSubmit` hook exited 1 on every prompt** — it only probed `D:/claudetools` and
`C:/claudetools`, neither of which exists on BEAST (repo at `C:/Users/guru/ClaudeTools`). The
failing hook had also been **silently skipping coord-message delivery**; fixing it surfaced a
previously-undelivered informational message from `Mikes-MacBook-Air/claude-main` (re: radio show
notes already synced 2026-05-16). Message auto-marked read by `check-messages.sh`.
- **`sync.sh` untracked-only detection bug** — brand-new files with no tracked changes were silently
skipped. Fixed; required gitignoring the datto dumps first to avoid a 54 MB commit.
- **Rob's Syncro scope self-contradicted** — CAN list granted full Syncro incl. billing, CANNOT list
forbade billing actions. Surfaced to Mike; resolved to full access.
- **Two pushes rejected (non-fast-forward)** mid-session as DESKTOP pushed concurrently; resolved
each with `git pull --rebase origin main` then push (clean rebases, no conflicts).
### Configuration Changes
- `projects/discord-bot/DISCORD_CLAUDE.md` — questions-allowed + headless + Task Loop rewrite;
identity table (Mike/Howard/Winter/Rob IDs); Rob Syncro scope contradiction removed.
- `.claude/scripts/post-bot-alert.sh` — NEW. Posts to #bot-alerts via Discord REST; vault/`.env`
token resolution; soft-fail.
- `.claude/commands/syncro.md` — "Post to #bot-alerts" section, Hard Rules pointer, billing step 17
(coexists with Mike's add_line_item overhaul).
- `.claude/scripts/sync.sh` — Phase 5b (commands → global); untracked-only detection fix (repo + vault).
- `.gitignore` — exclude `clients/internal-infrastructure/datto-bsod-case-2026-05-16.zip` + extracted folder.
- `.claude/settings.json``UserPromptSubmit` hook command rewritten (`$CLAUDE_PROJECT_DIR`/`$HOME` + `true`).
- Memory: `MEMORY.md` index + `feedback_syncro_timer_first.md` (already by Mike), `feedback_syncro_timer_response_shape.md` (HISTORICAL), `feedback_syncro_labor_type.md`, `feedback_syncro_warranty_product.md`, `project_sync_script_bug.md` (RESOLVED).
- `clients/valleywide/.../D-drive-folders-2026-05-16.csv`, `D-drive-scan-2026-05-16.csv` — committed as client analysis.
### Credentials & Secrets
- No new credentials created or rotated. The Discord bot token is in the vault at
`projects/discord-bot/bot-token.sops.yaml`, field `credentials.bot_token` (value not reproduced);
`post-bot-alert.sh` reads it at runtime. Bot `.env` (gitignored) holds `DISCORD_TOKEN` as fallback.
### Infrastructure & Servers
- **Bot service:** `ClaudeToolsDiscordBot` (NSSM, Automatic) on BEAST (GURU-BEAST-ROG); nssm at
`C:\Users\guru\AppData\Local\Microsoft\WinGet\Links\nssm.exe`; cwd `C:/Users/guru/ClaudeTools`;
model `claude-sonnet-4-6`; logs `projects/discord-bot/logs/{stdout,stderr}.log`.
- **Discord:** guild Arizona Computer Guru `624663750603046913`; #bot-alerts channel `624710699771232265`.
- **Discord user IDs:** Mike `264814939619721216`, Howard `624667664501178379`,
Winter `624666486362996755` (@Winter), Rob `261978810713505792`.
- **Syncro:** `https://computerguru.syncromsp.com` (links `/tickets/<id>`, `/customers/<id>`, `/invoices/<id>`).
- **Coord API:** `http://172.16.3.30:8001/api/coord` (messages auto-marked read by the hook).
### Commands & Outputs
- `nssm restart ClaudeToolsDiscordBot` — used after each `DISCORD_CLAUDE.md` change (system_prompt loads at start).
- Bot DM/channel test: `POST /users/@me/channels` then `POST /channels/<id>/messages` (HTTP 200).
- `bash .claude/scripts/post-bot-alert.sh "<msg>"``[OK] posted to #bot-alerts (message_id=...)`.
- Hook repro: the old command exited `1` on BEAST; new command exits `0` in all scenarios (verified).
### Pending / Incomplete Tasks
- **`/sync` doc vs `sync.sh` mismatch** — the skill doc says "stage by name, never `git add -A`"
but the script still uses `git add -A` (gated by `.gitignore`). Harmless now; left for Mike to
decide whether to align the script or the doc.
- Optional: clean up legacy "time entry" wording in any remaining Syncro memories not touched here.
### Reference Information
- Commits (this interactive session, post-rebase): `c5474cd`, `8a6695b`, `9fb16a7`, `81eea11`,
`8973229`, `6c47606`, `34a0d73`, `34e61b2`, `a201140`, `0897e5e`, `5facce2`, `8538ddf`, `eda8420`.
- Related DESKTOP commits (Mike, parallel): Syncro overhaul `64a0ba7`/`90748d0`/`ce38304`;
Rob Limited-Operator buildout `67dd7a4`/`063b209`/`8e8a18c`.
- Helper: `.claude/scripts/post-bot-alert.sh`. Bot rules: `projects/discord-bot/DISCORD_CLAUDE.md`.