All checks were successful
Reindex Knowledge Base / reindex (push) Successful in 2s
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
107 lines
5.0 KiB
Markdown
107 lines
5.0 KiB
Markdown
---
|
|
title: Major Domo v2 Release — 2026.3.17
|
|
description: Release notes for Major Domo v2 Discord bot deployment on 2026-03-17.
|
|
type: reference
|
|
domain: server-configs
|
|
tags: [discord, major-domo, deployment, release-notes]
|
|
---
|
|
|
|
# Major Domo v2 Release — 2026.3.17
|
|
|
|
**Date:** 2026-03-17
|
|
**Branch:** next-release → main (PR #81, 33 commits)
|
|
**Image:** `manticorum67/major-domo-discordapp:latest`
|
|
**Server:** akamai (`/root/container-data/major-domo`)
|
|
**Deploy script:** `/mnt/NV2/Development/major-domo/discord-app-v2/.scripts/deploy.sh`
|
|
|
|
## Release Summary
|
|
|
|
Merged 33 commits from `next-release` into `main`. This was the first release cut since the next-release branch workflow was adopted. A merge conflict in `views/trade_embed.py` required manual resolution.
|
|
|
|
## Merge Conflict Resolution
|
|
|
|
**File:** `views/trade_embed.py`
|
|
**Cause:** Two divergent changes since the branch point:
|
|
- **main hotfix** (`e98a658`): Stripped all emoji from trade embed UI, added inline validation error details to Quick Status
|
|
- **next-release refactor** (`858663c`): Moved 42 lazy imports to top-level, which also touched this file and had emoji additions
|
|
|
|
**Resolution:** Kept main's hotfix (no emoji, detailed validation errors) as the authoritative version, then applied only the import refactor from next-release (hoisted lazy imports to top-level). Merged main into next-release first to resolve, then PR #81 merged cleanly.
|
|
|
|
## Key Changes in This Release
|
|
|
|
### Trades & Transactions
|
|
- Trade validation now checks projected rosters (next week + pending transactions)
|
|
- Player roster auto-detection in `/trade add-player` and `/trade supplementary` (was hardcoded to Major League, caused cascading validation errors)
|
|
- Team-prefixed validation errors: `[BSG] Too many ML players`
|
|
- Stale transaction cache fixed — TransactionBuilder re-fetches on each validation
|
|
- Stale roster cache fixed — refreshed before validation, invalidated after submission
|
|
|
|
### Scorecard Submission
|
|
- All spreadsheet data read before any DB writes (prevents partial state on formula errors)
|
|
- Detailed error messages shown to users instead of generic failure
|
|
|
|
### Commands & Permissions
|
|
- `/injury set-new` and `/injury clear` verify team ownership (admins bypass)
|
|
- `/admin-maintenance` maintenance mode flag implemented (but see Post-Deploy Issues below)
|
|
- Roster labels updated: Active Roster / Minor League / Injured List sections
|
|
|
|
### Bug Fixes
|
|
- Key plays score text: tied scores now show correctly
|
|
- `is_admin()` helper prevents AttributeError in DM contexts
|
|
|
|
### Performance & Code Quality
|
|
- Persistent aiohttp session for Giphy (eliminates per-call TCP/DNS overhead)
|
|
- 42 lazy imports moved to top-level across codebase
|
|
- Deduplicated command hash logic
|
|
|
|
### CI/CD
|
|
- `next-release` branch now triggers Docker builds via shared `docker-tags` composite action
|
|
|
|
## Post-Deploy Issues
|
|
|
|
### 1. Maintenance mode interaction_check was broken (FIXED)
|
|
|
|
**Discovered immediately after deploy.** RuntimeWarning in logs:
|
|
```
|
|
RuntimeWarning: coroutine 'CommandTree.interaction_check' was never awaited
|
|
```
|
|
|
|
**Root cause:** `@self.tree.interaction_check` is not a decorator — it's an async method meant to be overridden via subclassing. The check was never registered; maintenance mode was a complete no-op.
|
|
|
|
**Fix:** PR #83 — Created `MaintenanceAwareTree(CommandTree)` subclass, passed via `tree_cls=` to Bot constructor. Merged and redeployed same session.
|
|
|
|
**Issue:** #82 (closed)
|
|
|
|
### 2. Stale scorecards causing repeated channel updates (MITIGATED)
|
|
|
|
**Discovered after deploy.** The `#live-sba-scores` channel kept being cleared/hidden every 3 minutes despite no active games.
|
|
|
|
**Root cause:** `scorecards.json` on akamai contained 16 stale entries from March 9-17. The `data/` volume is mounted `:ro` in docker-compose (to protect Google Sheets credentials), which silently prevents `ScorecardTracker.save_data()` from persisting scorecard removals. Completed games accumulate indefinitely.
|
|
|
|
**Immediate fix:** Cleared the file on akamai:
|
|
```bash
|
|
ssh akamai
|
|
echo '{"scorecards": {}}' > /root/container-data/major-domo/storage/scorecards.json
|
|
```
|
|
|
|
**Permanent fix needed:** Split volume mount — credentials read-only, state files writable. Also add logging to the bare `except` in `save_data()`.
|
|
|
|
**Issue:** #85 (open)
|
|
|
|
## Rollback
|
|
|
|
Previous image digest (pre-release):
|
|
```
|
|
manticorum67/major-domo-discordapp@sha256:8e01dd6ee78442c1bbf06f3c291c7e8694e472683defb403b70f6d1e1a5facf1
|
|
```
|
|
|
|
Rollback command:
|
|
```bash
|
|
ssh akamai "cd /root/container-data/major-domo && \
|
|
docker pull manticorum67/major-domo-discordapp@sha256:8e01dd6ee78442c1bbf06f3c291c7e8694e472683defb403b70f6d1e1a5facf1 && \
|
|
docker tag manticorum67/major-domo-discordapp@sha256:8e01dd6ee78442c1bbf06f3c291c7e8694e472683defb403b70f6d1e1a5facf1 manticorum67/major-domo-discordapp:latest && \
|
|
docker compose up -d discord-app"
|
|
```
|
|
|
|
**Note:** Rolling back would reintroduce the broken `@self.tree.interaction_check` (no-op, not harmful) but would also lose all the trade validation fixes which are actively used by league GMs.
|