Bolt
is Team 581's Slack agent for project management, robot-code questions, and WPILOG analysis.
Junior owns Slack ingestion, durable conversations, scheduled tasks, attachments, queues, and persistent Vercel Sandboxes. Bolt adds only its own instructions, skills, and a local sandbox-preparation plugin. It does not register Junior's GitHub, memory, or other provider plugins.
- Install Docker and the mise tools with
mise install. - Run
vp install. - Copy
.env.exampleto.env.localand fill in the required Slack, Junior, Google OAuth, GitHub App, GCS, and AI Gateway values. - Run
mise run dev. Pitchfork starts local Postgres and Redis, Junior applies its SQL migrations, and Nitro starts in the background on the first available port from 3000 through 3010. Usepitchfork logs dev --tailto follow logs andpitchfork stop devto stop it. - Enable Socket Mode on the test Slack app and create an app-level token with
connections:write. - In a second terminal, run
mise run slack:socket. The listener forwards Slack events to Junior atJUNIOR_BASE_URL, which defaults tohttp://localhost:3000.
Production continues to use Junior's HTTP webhook at /api/webhooks/slack; the Socket Mode listener is only a local development process.
Useful checks:
vp run check:junior
vp check
vp test
vp run buildThe production release build additionally creates the cached Vercel Sandbox snapshot:
vp run build:release- Agent instructions:
app/SOUL.mdandapp/WORLD.md - Custom skills:
app/skills - Sandbox setup:
app/plugins/bolt-runtime.ts - Production rollout:
DEPLOYMENT.md
The sandbox plugin installs Java 21, GitHub CLI, jq, Cloud Storage FUSE, and wpilog-parser (including its wpilog CLI) into Junior's snapshot. It maintains /workspace/offseason-2026, mounts fetch_storage read-only at /workspace/fetch, and injects a fresh GitHub App installation token into each Bash command. That token retains code and project permissions but has read-only membership access. Student team additions and removals use the server-side github-membership plugin, which keeps its membership-write token outside the sandbox and only operates on team581/students. Coach and organization-wide membership changes are manual.
The server-side google-groups plugin lists, adds, and removes membership in students@team581.com using personal Google emails. It shares GOOGLE_SERVICE_ACCOUNT_KEY with the read-only Workspace plugins, using separate token scopes for each integration. The account owns only the student group, stays outside the sandbox, and does not use domain-wide delegation. The sandbox's read-only Fetch credential remains separate in GCS_SERVICE_ACCOUNT_KEY. Coach group changes are manual. See deployment setup and the Google Groups skill.