1.0.0
Manager Core 1.0.0
The Foundation Release. First stable Manager Core. Every plugin in the MattFalahe SeAT suite can now route through one shared infrastructure layer: cross-plugin events, centralized market pricing across 5 providers, ESI fast-poll for ~2 minute notification detection, capability registry for plugin-to-plugin calls, REST API, Watchdog meta-monitoring, and a 10-tab diagnostics dashboard.
Mental model: Plugins work standalone. Manager Core gives extras.
Mining Manager calculates tax with or without Manager Core. Structure Manager alerts on fuel with or without Manager Core. Install Manager Core alongside, and Structure Manager's fuel-critical events reach Mining Manager (warning miners their extraction sits at a fuel-starved structure), and both plugins read prices from the same citadel market your alliance trades at instead of Jita.
🎉 What's New
💰 Pricing Orchestrator
Per-market provider routing across 5 sources. Operators pick which upstream powers each market.
| Provider | Covers | Auth |
|---|---|---|
| MCPraisal (ESI) | Public hubs (Jita / Amarr / Dodixie / Hek / Rens) | None |
| Goonpraisal | 7 Imperium nullsec hubs (C-J6MT, GB-6X5, UALX-3, HY-RWO, O4T-Z5, R-ARKN, GM-0K7) | None |
| Janice | Jita + Amarr | API key |
| Fuzzwork | 5 hub regions, default for hubs | None |
| SeAT Price Provider | Whatever seat-prices-core sub-provider you have installed |
None |
4-layer resolution chain:
- Per-appraisal override (Appraisal form dropdown)
- Per-plugin
provider_overrideonmanager_core_pricing_preferences(lets Mining Manager route Jita through Janice while Structure Manager keeps Jita on Fuzzwork) - Per-market
providerfield onmanager_core_markets - Hardcoded
fuzzworkfail-safe
12 markets ship pre-seeded (5 hubs enabled by default, 7 Goonpraisal-tracked nullsec hubs disabled by default for operator opt-in).
📡 EventBus + Topics
Pub/sub event router with idempotency dedup, visibility scoping, Discord-injection sanitization, queued or synchronous delivery, wildcard subscription patterns. One-line cross-plugin publishing via the \ManagerCore\Topics::publish() facade.
25 ecosystem events registered across 4 plugin families:
mining.*(13 topics) Mining Managerstructure.alert.*(9 topics) Structure Manager (reinforcement timer ladder, fuel state transitions, tactical planning)wallet.transaction_detectedCorp Wallet Managerbuyback.completedBuyback Managerpricing.preference_changedManager Core itself (cache invalidation for subscribers)
Subscribers honor visibility hints (corporation_id, role_id) baked into every payload.
🔌 Plugin Bridge
Capability registry with runtime registration. Plugins advertise functions, others discover and call them. Worker-registry snapshots for queue-worker debugging (the registry is a per-process singleton so HTTP-context and worker-context state can diverge).
Visual ecosystem map with version badges showing each plugin's state at a glance:
- ✓ Current (green)
- ⚠ Outdated (amber, with current to latest arrow)
- 🚀 Pre-release (info blue)
- 🌱 Dev branch (grey)
- 🚀 Coming soon (purple) for plugins not yet released on Packagist
- — Unable to check (grey) when Packagist is unreachable
Refresh Versions button flushes the 6h Packagist cache on demand.
⚡ ESI Fast-Poll
Shared key-holder pool for character_notifications polling. About 2 minute detection per corp vs SeAT's native 20 to 30 minute sweep cadence. Adaptive per-corp fair LRU rotation, cascade retry on CCP 5xx bursts, auto-recovery on transient token failures, 10-minute SeAT-native sweep as belt-and-braces safety net.
🛡️ Watchdog (meta-monitoring)
New self-monitoring layer. Deliberately decoupled from EventBus (when the bus is broken, the bus can't reliably alert about its own failure), so Watchdog uses a direct HTTP path to a Discord or Slack webhook (auto-detected from URL pattern).
| Check | Fires when |
|---|---|
eventbus_failures |
10+ EventBus deliveries failed in the last 60 minutes |
price_cron_overdue |
Newest cached price older than 2x the scheduled cron interval |
esi_fast_poll_failing |
80%+ of enabled ESI key holders have a non-success last_poll_status |
provider_unavailable |
Any price provider routing an enabled market reports isAvailable=false |
Cron-driven (every 5 min), 1-hour per-check dedup, configurable exclusion windows (default 11:00-11:10 UTC for EVE daily downtime). Disabled by default. Opt in at Settings → Watchdog.
🩺 10-tab Diagnostics
Web dashboard at /manager-core/diagnostic:
Overview · Master Test · Plugin Connections · Price Providers · Subscriptions · Event Bus · Event Trace · Capabilities · API Status · Cache · Settings · Notification Testing
The last tab is dedicated to previewing every Watchdog alert format directly in your Discord/Slack channel. Bypasses dedup and exclusion windows so you can iterate through all four sample alerts back-to-back without manufacturing real failures. One generic Test alert button at the top, one Send Sample button per check.
🔑 REST API
Token-authenticated endpoints for Discord bots, dashboards, spreadsheets. Per-token rate limits, append-only audit log, pepper-rotation support via hash_version.
⚠️ Breaking Changes
None. First stable release.
🚀 Upgrade Instructions
# Add mattfalahe/manager-core to the SEAT_PLUGINS list in your SeAT-Docker .env
# Then from /opt/seat-docker, take the stack down + back up:
docker compose -f docker-compose.yml -f docker-compose.mariadb.yml -f docker-compose.traefik.yml down
docker compose -f docker-compose.yml -f docker-compose.mariadb.yml -f docker-compose.traefik.yml up -dContainer boot pulls the plugin via composer, runs all 17 migrations, and re-seeds schedules automatically.
Recommended after first install
- Manager Core → Diagnostics → Master Test to confirm everything's healthy
- Manager Core → Markets to enable any nullsec citadel markets your alliance trades at
- Manager Core → Pricing Preferences to point each consumer plugin at its preferred market
- Manager Core → Settings → Watchdog (optional) to enable infrastructure alerts to Discord or Slack
📦 New Commands
| Command | Schedule | Purpose |
|---|---|---|
manager-core:update-prices |
Every 4 hours | Refresh market prices via configured per-market providers |
manager-core:poll-esi-notifications |
Every 2 minutes | ESI fast-poll for shared notification pool |
manager-core:sweep-seat-notifications |
Every minute | Fallback sweep of SeAT's character_notifications table |
manager-core:cleanup |
Daily 03:00 | Old appraisals + price history retention |
manager-core:cleanup-events |
Daily 04:00 | Forensic event-log retention |
manager-core:cleanup-stale-subscriptions |
Daily 05:00 | Prune type subscriptions for absent plugins |
manager-core:watchdog |
Every 5 minutes | Meta-monitoring infrastructure health checks |
manager-core:diagnose-bridge |
Manual | Per-plugin integration breakdown for CLI debugging |
📊 Statistics
- 135 files in the release
- ~28,400 insertions, ~1,000 deletions
- 17 database tables with forward-only migrations
- 25 ecosystem events registered in Topics
- 23 PluginBridge capabilities for cross-plugin calls
- 10 diagnostic tabs in the web UI
- 5 price providers + per-appraisal override
- 12 pre-seeded markets (5 hubs + 7 Goonpraisal citadels)
- 4 Watchdog checks (EventBus failures, price cron overdue, ESI fast-poll failing, provider unavailable)
- 8 compatible plugins detected at boot
- 80+ dev commits squashed into one release commit
⚠️ Known Limitations
- English only. UI strings and help docs live in
src/Resources/lang/en/help.php. PRs adding other locales welcome. - Custom markets disabled in 1.0.0. Operators with hubs Goonpraisal does not track currently have no automatic pricing path. Janice slug expansion and Adam4EVE integration are on the roadmap.
- Janice provider needs an API key from janice.e-351.com. Without it, the provider stays dormant.
- Goonpraisal asks for an identifying User-Agent. Defaults to the plugin maintainer's email; operators are encouraged to override with their own contact via Settings so Goonpraisal can reach the actual person if their queries cause issues.
- Watchdog supports Discord and Slack only (auto-detected from webhook URL pattern). Custom webhooks (Mattermost, generic JSON receivers) not supported in 1.0.0.
- Help editor is filesystem-only. Admins who want to customize help text need filesystem access and a container rebuild.
🆘 Support
- Issues: github.com/MattFalahe/Manager-Core/issues
- SeAT Discord: SeAT community Discord
- License: GPL-2.0-or-later
- Author: Matt Falahe (
mattfalahe@gmail.com)
Full Changelog: https://github.com/MattFalahe/Manager-Core/blob/main/CHANGELOG.MD