/manager season-simulate and /world season-simulate now use the same real Continue mechanic the website has - a quiet day shows your squad's real condition/injury status, a day that reaches a matchday resolves it. /world season-start and /world season also dropped the "X/Y clubs eligible" math - Club Mode's clubs are AI-run, there was nothing to actually wait on.
/world now has claim and release subcommands - claim any unclaimed real-world club (no captaincy needed) and manage it directly from Discord, or release it back to AI control any time.
World Challenge's opponent naming and match recaps could show blank club names after the real-Team retie - fixed by reading the name through the real Team relation everywhere it's needed.
/world now follows this server's own real Teams instead of a fictional 78-club list - claim removed entirely, any current captain or vice-captain manages their Team's Club Mode side automatically. season-start/season's league option is now autocomplete, matching this guild's own real Leagues.
/manager news now shares the same varied phrasing engine as the website's News feed - each result/season event picks from several real variants instead of one fixed template, consistent between Discord and the website.
World Mode moved out of /manager into its own /world command (browse, claim, team, lineup, gameplan, quickfill, challenge, season, season-start, halloffame, youth). A claimed club can now set its gameplan too - set-piece takers, target man, tactical style, the 9 Tactics dials - closing the last real gap between managing your own squad and managing a claimed club.
Your claimed club's own Youth Academy - overall, potential, and training progress for every prospect in its squad.
World Mode's own Hall of Fame - World club titles only, separate from /manager halloffame's Career-only view.
Every title-winning squad this server has ever produced - champion, competition, season, and points. Full squad snapshots on the website.
Career Mode custom leagues - list/join/leave a named competition among friends (create it on the website, costs Sparks). Signing now respects a transfer window: closed while your league's season is active, matching real FM's own window shape.
A real auto-generated news feed - recent results and season events for this server, narrated in one embed.
A dedicated Youth Academy overview - aggregate stats across every prospect in your squad (count, avg current/potential OVR, high-potential count) plus a per-prospect list.
A real Managers directory subcommand - every manager in this server, sorted by reputation score, with record, win rate, and title count.
An incomplete lineup used to just tell you to run /manager lineup. Now it names the actual slots nobody in your squad can cover (e.g. "missing: RB, ST"), on both /manager team and /manager world team, so you know what to go sign instead of guessing.
AI squad-building now allows a real, sensible substitution (a center-back covering right-back, say) instead of requiring an exact position match - unlocks far more of the real player pool. Every league gets the same, even number of clubs now, and /manager world season-start basically isn't needed anymore - a league's season starts itself the moment enough clubs are ready, and a new one begins automatically once the last one ends.
Most World clubs were quietly coming up short a starting spot (missing a right-back especially - real registered players skew heavily away from that position) despite holding a full squad. Club generation is now bounded by the real supply of the scarcest position, and /manager lineup auto:true (and club generation) fills the rarest position first instead of a fixed order - every club generated from here on has a genuine, complete, ready starting XI. Every server's World was cleared (claims/clubs only) and regenerates correctly next time it's viewed.
A real Inbox - welcome, match results, and season news. filter: all/unread, sort: newest/oldest, markallread:/clearread: to clean it up. A claimed World club's results reach your inbox too.
/manager world season-start league: and /manager world season league: - each of the 4 real leagues can now run its own genuine season, a full round-robin among that league's own clubs, resolving automatically with a real table and a real champion.
With World Mode fully separated and a real bug in claimed-club squads fixed this round, every squad, club, and manager profile was reset again so everyone starts clean on the corrected systems - real registered players are completely untouched. Run /manager join whenever you're ready.
The card-choice list was offering Captain Cards as an option - a separate, unrelated card-game special type that never made sense here. Removed.
A real person registered on more than one server (sometimes as a different position entirely) used to only ever show up as whichever registration rolled the best overall - the others were invisible. Every real match now lists, tagged with its server name when someone has more than one.
/manager world browse and /manager world claim (moved from the old flat /manager world and /manager claim) are joined by 3 new subcommands giving World Mode real parity with your own squad for the first time: /manager world team (view your claimed club's squad/lineup/record - claiming used to leave you with no way to see any of it), /manager world lineup (set its formation, slots, and tactical roles), and /manager world quickfill. /manager world challenge replaces the old club: option on /manager challenge (now real-manager-only, opponent: required) - always played as your own claimed club.
With attributes, playstyles, roles, and World all reworked this round, every squad, club, season, and auction was reset so the new systems start on a level field - real registered players are completely untouched. Run /manager join whenever you're ready to jump back in.
New staff-only subcommand to wipe a server's Manager Mode data (squads, auctions, fixtures, seasons, loans, watchlists, World clubs, and manager profiles) without touching that server's real card game or league data. Requires typing an exact confirmation phrase.
/manager quickfill instantly signs cheap, real Unranked players into whatever lineup spots are still empty, position-matched to each slot - no auction needed. Handy early on, or on a quiet server where auctions haven't been getting bids.
/editmyprofile gained a playstyle: option - autocomplete only offers the ones that actually fit your position (a Poacher or Target Man for a forward, a Sweeper Keeper for a keeper, and so on). It reshapes your Scout Report attributes to match - a Poacher leans into Finishing and Positioning over Passing and Dribbling - still built on your position's own profile, not a separate rating. clearplaystyle: true removes it.
/manager world browses this server's real World (Premier League/La Liga/Bundesliga/Serie A, 78 clubs, auto-populated from real registered players). /manager claim takes an unclaimed one to manage. /manager challenge gained a club: option - challenge any World club, AI-controlled or claimed, as a real second game mode alongside challenging other managers directly.
/manager lineup gained a role: option (autocomplete shows every real role for whichever slot: you've already picked) - a genuine match-sim bonus, not flavor text. Roles are tied to the tactical slot itself, so replacing who plays there keeps the role you set.
A player's Traits now genuinely affect matches, not just flavor text - specialist traits sharpen shooting, tackling, and goalkeeping, a few affect fouls conceded or how often a chance turns into an assist. No new command - it's automatic on every squad player.
/manager gameplan gained nine new tactical dials - Build-Up Style, Width, Tempo, Defensive Line, Pressing Intensity, Defensive Shape, Marking Style, Counter-Press, and Break Speed - each with a real, single effect on match simulation, all defaulting to neutral until set. View them alongside your existing set-piece takers and tactical style, same command.
A tired starter now has a real (small) chance of getting injured, sidelining them for a few days - more likely the more exhausted they are. /manager lineup won't let you select an injured player, and /manager team shows their real status in place of a fitness percentage while they're out.
/manager team now shows each squad player's condition% inline. Starting a resolved season fixture or exhibition challenge costs your XI some fitness; it recovers a little every real day they're not playing. A tired player's effective attributes take a small, real hit until they've rested.
/manager training now has a mentor: option - assign any ranked squad-mate to mentor a Youth Prospect and speed up their development. 'none' clears an existing mentor. Their training status now shows who's mentoring them, if anyone.
The auto-posted matchday recap now tags each result with a Man of the Match and rating, computed from the same full match report the website's Portal and Match Day pages now show. Free Kick/Corner routines set via gameplan also have a real effect on set-piece chances now, not just a label.
New freekickroutine (Direct shot, Approach play) and cornerroutine (Near post, Far post, Short) options - a flavor tag shown next to your taker in the gameplan reply. Opposition Instructions were also added to the website's Portal Scout Report (a counter suggestion based on the opponent's own tactical styles) - no bot-side equivalent yet.
List a squad player for loan at a fee/duration you set (loan list), browse other managers' open listings (loan browse), take one (loan take), withdraw your own before it's taken (loan cancel), or check your own loan status (loan mine). The fee pays out immediately, and the player returns to you automatically when the loan ends.
New inpossession and outofpossession options on /manager gameplan - set a separate attacking style and defending style instead of one Style dial. Leave either unset to keep following Style. Both feed the real match engine on challenges and season matchdays.
Shortlist a player to track before you have the budget to bid - /manager watchlist player: toggles them on/off, no options lists your current shortlist. Same shortlist the website's Player Pool star button uses.
/manager lineup gained an auto option - fills every still-empty slot with your best-fitting available squad player, leaving anything you've already set alone. /manager gameplan gained captain and vicecaptain options (a flavor tag, must be a current squad member), shown as (C)/(VC) on /manager team.
Same follow-up as the website's Player Pool: a listed player's row now gets a (Card) tag if their overall comes from a card they chose via /manager mycard, not the plain auto-roll.
New subcommand: set which of your own owned cards (an upgraded copy, Shiny, Icon, TOTW, etc.) decides your Manager Mode overall and attributes, autocomplete-listed alongside "Auto" for the plain rolled base card. Same choice as the website's new Player Pool picker - either one sets the same thing.
New /manager training - set a Youth Prospect's training focus (or leave it Balanced) and watch their overall grow toward their existing Potential range over time via daily training ticks. Ranked players are untouched - their card overall already is the platform's real, proven number.
/manager pool, /manager team, /manager standings, /manager season, and sign autocomplete now show a player's real Roblox display name instead of just their registered platform name - the same real identity now shown on the website.
/manager challenge was unlimited free-pick exhibition duels with no schedule and no guarantee anyone ever played anyone. /manager season-start now kicks off a real round-robin among every manager with a complete starting XI (needs 3+) - one matchday resolves automatically per day, with results posted if you've configured a channel for it. /manager season shows the live table and this matchday's fixtures. Recruitment (/manager sign) stays open all season. Unranked players in /manager pool are now flagged as Youth Prospects instead of just showing a confusing low rating.
A real person can have a separate Player row per Discord server. /manager pool and sign autocomplete used to keep whichever row came back first, which could show someone's unranked stray row instead of their real, ranked one - now always keeps the person's best-rated row.
/manager sign now starts or raises a real 1-hour auction instead of buying instantly - the opening bid must meet real market value, every later bid must beat the current one by 5%+, and a bid in the final minute extends the auction by a minute. New /manager auctions shows what's currently up for bid. Your budget only reserves a bid until the auction actually resolves, so you can run several at once without overspending. You'll get a DM when you win (or lose one you were leading).
Thrown away and rebuilt: player ratings and match simulation now reuse the exact same systems the card game's Arena mode runs, not a bespoke formula. A player's overall is the same number already on their trading card. Set a real formation with /manager lineup, assign set-piece takers and a tactical style with /manager gameplan, and /manager challenge now runs a genuine sequence-by-sequence match with a live play-by-play reveal - real goals, real assists, real saves - instead of one dice-rolled scoreline. Sign prices are now real transfer fees (the same market values /transfer uses), and budgets/squad sizes were rescaled to match (16-player squads, an 11-man starting XI required to play).
Once a player is signed, they were locked to your squad forever with no way back - a mis-sign or a squad you wanted to rebuild was permanent. /manager release <player> frees up the slot, refunds 50% of what you paid, and puts the player straight back into the open pool for anyone else to sign.
Strength came entirely from recent match stats, so a 3-star player on a hot streak could show up stronger than a genuinely higher-ranked player. It's now based mainly on the staff-set star rating, with recent form applying only a capped boost or penalty on top - form can move you within your tier, but can't out-rank someone actually higher-ranked.
/manager sign and /manager pool now draw from every registered player across every server, not just the one you're in - more real people to actually manage. Once someone signs a player, that player is off the market for every other manager in that server's game - a real player is only ever on one squad at a time, same as real football. Standings/squads/challenges stay separate per server.
Strength used to come from whichever single guild's Player row you looked someone up in - since real match stats are only ever measured against opponents in that one server, a small, low-competition server could inflate someone's numbers. It now uses that person's single best profile across every server they're registered in with at least 300 real members, and falls back to the same neutral baseline as a brand new player if they don't have one - a small-server-only profile now gains nothing.
/manager - draft real registered players (yourself, friends, anyone in the server) into a personal squad within a budget, then challenge other managers with /manager challenge. Each player's strength is computed live from their own recent real match performance, so an actual hot streak makes them stronger here too - separate from real team rosters. v1: simple simulated scorelines with weighted goalscorer credit; standings and Kon rewards included, tactics and a deeper match engine to come.
Companion fix to the shared library's wallet race: draft entrant seeding and the card-game welcome-bonus check both had the same empty-update upsert non-atomicity gotcha. The welcome check now goes through the already-fixed shared wallet lookup, and entrant seeding swaps to create-then-catch-duplicate.
Mirrors the website: keeping your /daily claim streak alive now pays off beyond the Kon bonus - every 7-day milestone grants a free Silver Pack, and every 30-day milestone grants a free Legendary Pack, on top of your usual reward.
An extensive audit found and fixed the same root shape repeated across the platform - a status/balance check read once, then a write that didn't re-confirm it, letting a duplicate click, page reload, or two near-simultaneous actions both go through. Closed in match results reporting, forfeits, transfer releases/force-releases, loan expiry, Higher/Lower, Trivia, card draft, Arena, card duels, team/1v1 friendlies, directory badges, SBC, weekly challenges, and giveaways, plus a tournament-bracket race fixed with a real database constraint. The bot also now logs and recovers from unexpected crashes instead of going silent.
A shared outcome-text lookup evaluated every branch's message eagerly, including ones that reference values (like a stolen amount) that don't exist for a warning/prison outcome - crashing instead of showing the message. Fixed by only evaluating the branch that's actually needed.
When the parent club cancels a loan, they're the one who should pay the remaining fee and get the player back - it was charging the loaning club instead. Fixed, plus every historical loan-cancel transaction that had this backwards was found and corrected, with the balancing entries logged to #budget-logs.
Each team's vote square is nearest-color-matched to its Discord role color - the away team's square is now picked excluding whatever the home team's own match landed on, so two teams can no longer render identical color squares.
A label mismatch between the website's result-entry wizard and the shared formation definitions meant every CDM/CF performance was silently uncategorized, so those two slots never had a qualifying player to show. Fixed going forward, plus a one-time backfill that corrected every already-reported fixture's stored stats and regenerated the affected TOTW posts.
TOTW posts no longer render a plain formation/pitch diagram - each qualifying performance now gets its own real player card, laid out in a genuine 4-3-3 shape using the exact position that player was selected for (not their profile position), club badge included.
Browse used to dump every league's listings into one undifferentiated list, always newest-first, hard-capped at 25 with no way to see more. Now takes an optional league filter, a Newest/Highest Price sort, and Prev/Next paging past the cap - each row is labeled with its league when browsing isn't already scoped to one.
Closes the gap with the website's own player page: /profile now shows a recent-form arrow (last 5 rated games), nationality, milestone badges (10/25/50/100+ Appearances/Goals/Assists), and a Career Highs section on the Stats tab (best single-match Goals/Assists/Rating/Points).
Transfer, Loan, and Release Clause offers all posted a vague "leak" to the news channel the moment they were created - Trades never did. Now they do too, naming only the proposing team, never the players involved or the other side.
Every leak used to render the exact same sentence every time, for every player, forever. Now pulls from a real pool of differently-worded "insider" phrasings instead, so the news channel doesn't read as one hardcoded string on repeat.
Appointing a free agent straight into a leadership role (e.g. Head Coach on a captain-less team) auto-rosters them - but skipped roster cap enforcement entirely, unlike every other move path (force-sign, transfer, the website's own set-team-roster). Could silently push a team over its star-tier, position, or size cap. Fixed - same enforcement every other path already has.
A release clause skips captain negotiation by design (the selling club can't block it) - but that meant nobody on the selling side got notified at all when it happened, only the player. Now DMs your Team Manager/Transfer Manager immediately, with a real @-mention in the transaction channel as a fallback if DMs are off.
A team's vote-bar square is nearest-color-matched to its real Discord role color - if that color was light/white, it could land on the exact same white square already reserved for Draw, making the two indistinguishable at a glance. That square is now off-limits for team matching, so a team always gets a visibly different color from Draw.
A transfer/loan offer that gets declined, ignored until expiry, or fails a check no longer leaves the original market listing stuck dead - it now reopens the same listing message with working buttons again, as long as the player's still at the selling club. Fixed going forward for every offer type, plus a one-time backfill that reopened 11 listings already stuck this way.
10 new just-for-fun commands: /roast, /compliment, /beef, /ship, /vibecheck, /chant, /excuse, /penalty, /worldcupdraw, and /wouldyourather. Also new: an opt-in quiet-member nudge (/configmisc quietnudge) that DMs a small Kon comeback bonus to members who've gone quiet in chat, on a cooldown so nobody gets spammed - off by default per server.
/standings and /leaderboard now render in your league's own accent color and the site's real Oswald font instead of a fixed blue/purple and a generic font. /leaderboard also gained 4 stats it was missing - Points, Average Rating, MOTM Awards, and Appearances - plus a mingames qualifier filter and Prev/Next paging past the old 25-entry cap.
/results forfeit can now record "Both teams" for a genuine double no-show - scored as a 0-0 draw for both sides (draws + the normal draw payment), blocked for knockout fixtures since a draw has nowhere to advance. Also fixed a real bug where the results message always blamed the home team as the forfeiting side, regardless of which team actually lost by forfeit. /standings now uses your league's real point values (win/draw points) instead of a hardcoded 3/1, matching the auto-updating standings message and the website.
Every bulk-DM command (giveaways, announcements, etc.) now shares one real anti-spam safeguard instead of each having its own copy - consistent cooldowns and abuse limits everywhere DMs go out in bulk.
New /recruit command - DM a free agent directly to scout them for your team. Position-role linking (matching the website's own version) lets you tie a Discord role to a player position.
/requestfixturetime is its own command again, not a /results subcommand - real feedback that it's a regular team-manager action (proposing a kickoff time), not a staff results action, so it didn't belong bundled in there.
/editprofile was throwing "targetUser is not defined" on every real use since the user option was never actually read into a variable - staff couldn't edit anyone's market value or star rating through the command at all. Fixed.
Consolidated related commands into hubs to free real headroom under Discord's 100-command cap: /stats (add/edit/remove/parse), /results (report/forfeit/requesttime/preview), /season (generate/advancegroups/new/recap), /roster (view/appoint/dismiss), /staffutils (DM and maintenance tools), plus /spin, /sell, and /compare folded into /draft, /transfer, and /card. /deleteleague removed outright (duplicated /league delete). Also fixed a dormant bug where /deletetournament's autocomplete never actually matched what the command looked up.
Found and closed a real exploit: the current card's exact overall was shown before every guess, and the tier bands (Unranked-5★) never overlap - so an obvious guess paid the same flat 1.5x as a genuine coin flip, letting one player wager up to 1.7B Kon in a session. Payout is now priced off the real probability of your guess being right (an obvious guess barely pays over 1x, a real toss-up pays close to 2x, shown before you pick) - plus a 10,000 Kon max wager and 15 games/day.
/configchannels spectators and the website's Spectator Voice Channel picker now also accept Stage channels, not just regular voice - a better fit for a broadcast-style spectator experience.
Match threads are now real private threads (both team rosters auto-added) instead of public - a role mention in a public thread wasn't real access control. New /configchannels spectators - a public voice channel mentioned on every match announcement for people to watch/listen along.
The Ranker role (/configroles ranker) was gating Power Rankings by mistake - it now correctly lets holders set player star ratings via /editprofile and the website Rankings page instead. Market value edits stay staff-only.
/help rulebook posts the rulebook as a real Discord message with a dropdown to switch sections. New /configchannels matchannouncements + predictions and /configroles matchping - the 30-min-before and kickoff announcements now use their own configurable channel (previously unreachable) instead of the fixture channel, with a Join Match Thread button.
New /arena mode:trial option - a fixed scripted opponent requiring your squad to be set to today's rotating required formation. Real Kon reward, one attempt every 24 hours.
New /gemshop bundle subcommand - spend Gems on a bundle of Kon plus a guaranteed pack pull, priced as real value against the pack's own Kon cost. 3 tiers: Starter, Value, and Mega.
/newseason now also archives the current rulebook (all sections, frozen) alongside team standings before starting the new season - the live rulebook carries forward unchanged, only the archived copy is frozen for history.
When a gameweek's fixtures are published (via /postfixtures or the automatic weekly announcement), each fixture now gets its own Discord thread pinging both teams - a shared place to coordinate, instead of only DMs. Created once per fixture.
/newseason now archives every team's current record (wins/draws/losses/goals, name/icon frozen) as history before resetting for the new season - previously it only relabeled the season with no reset at all. Preview first with confirm left unset, then run again with confirm:true. Also new: /configroles ranker - a role that can edit Power Rankings on the website.
New /gemshop trivia subcommand - 5 knowledge questions, no wager, 40 Kon per correct answer plus a 10-Gem bonus for a perfect run. One attempt every 24 hours.
New /gemshop insurestreak subcommand - spend 8 Gems to protect your /daily streak once. The next time you'd miss the claim window, your streak is saved instead of resetting to 1.
Higher/Lower leaderboard - biggest single-game wins.
Wager Kon, guess higher or lower on the next player's overall, each correct guess multiplies your pot ×1.5 (up to 8 rounds). Cash out anytime with a button.
Icon and TOTW summon pulls no longer mint fresh cards - only succeed as an exact copy of an already-existing card for that player, falling back to Showtime otherwise.
One free spin every 24 hours for Kon or Gems, real 0.5% jackpot chance.
Training Ground/Scout Network/Stadium bonuses now also apply to the website's Claim/Daily - previously bot-only.
Matches now run 16 attacking sequences instead of 10 - applies to every match type (Arena, Legacy, Challenges, Friendlies).
Icon/Showtime/TOTW hits are now restricted to 3 randomly-chosen Featured players (rotates daily, see /gemshop view). Every other card in the pool is always regular now. Also fixed a real bug: a second TOTW pull hitting the same league could previously crash mid-summon with gems already spent.
/arenachallenge team send/accept/decline/ready/list/cancel - challenge another duo, either opponent can accept, any of the 4 can ready up. Same match engine as Direct Arena Challenges, run twice and scored on aggregate.
Was goals-only. Now shows Top Assists (same season-scoped tracking as goals) and Top Team alongside Top Scorers.
New /cardmarket direct offer|list|accept|decline|cancel - propose trading one of your cards for one of someone else's, either side optionally adding Kon on top. Distinct from /cardmarket traded (fixed-price, anyone-can-buy listings) - this targets one specific person.
Accepting an Arena Challenge no longer instantly runs the match - both sides get an I'm Ready button once accepted, and the match runs the moment both have clicked it. A Rematch button also shows up on the finished-match result.
/card sbc list shows Squad Building Challenges and your completion status (submit them from the website - a real card picker fits better than a wall of options). /arenachallenge leaderboard shows the top 25 by Arena points plus your own rank. 4-1-2-3 joins /formation and /11's formation choices.
Roblox's thumbnail API doesn't always have an image ready on the first request - a fresh or recently-changed avatar can come back "Pending," and every avatar lookup used to just accept that and give up, which is very likely why profiles didn't always render. Now retries briefly before giving up for real. Also fixed a real, previously-silent bug: /cardmarket traded watch|unwatch|pricecheck's player-name autocomplete has done nothing since the command was renamed from /tradedmarket - it was still checking the old name.
/sign's Accept/Decline buttons run through the same core the website's inbox now uses for the exact same offer (see the website changelog) - only the ranked-player random-team spin animation stays Discord-specific, everything else (roster caps, role assignment, transaction log, initiator DM) is identical either way.
Two confirmed live bugs, found in the error log after a direct "he clicks the button but the bot doesn't respond" report. The preview's Confirm & Send button never acknowledged the click before doing real work, so Discord's 3-second interaction window regularly expired first, leaving the clicker with nothing even though the offer itself had usually already gone through. Separately, the preview posted publicly in the channel with no check on who clicked it - anyone could confirm-send someone else's offer. Both fixed: an immediate acknowledgment, and the preview (plus /sell's own confirmation) is private to whoever ran the command now.
checkTeamDebt only ever DMed the Team Manager and Transfer Manager when a team's budget went negative - Head Coach was silently left out, even though they have identical day-to-day team authority to Team Manager everywhere else. Fixed on both the bot and the matching website inbox notice.
/legacy itself is unchanged - same commands, same behavior, verified live. Its logic moved to a shared module the new website Legacy hub also uses, so a season started on Discord and one started on the website are genuinely the same league, not two separate implementations that could drift apart.
Direct report, confirmed real: granting a player as a 5-star Icon showed 5 stars, but the actual attributes (and the overall averaged from them) still sat down around whatever tier that player naturally was - a small flat bonus was never enough to bridge the gap. /icon grant now rolls fresh attributes AT the chosen rarity first, matching how every other special card (TOTW, Showtime, Captain Cards, Gem Shop's summon) has always worked, then applies Icon's own bonus on top of numbers that actually belong to that tier. Verified live: a real 2-star player granted as a 5-star Icon now averages 94-95, not the high-70s it would have before.
Found in the error log, not reported directly: the bot was regularly timing out waiting for a free database connection (across GuildConfig, Fixture, Gameweek, Giveaway, and more) - its connection pool was sized off a default formula that came out far too small for its real concurrent load. Raised, with plenty of headroom confirmed against the database's own actual connection cap.
Found while auditing the bot and website's trade-market logic for drift: the bot's own listing path let a special/non-tradeable card be listed via /cardmarket list, a check the website's version already enforced. Both now share the exact same core logic, so this can't happen from either side again.
When a transfer offer or player-consent DM can't be delivered, the failure message now links straight to the Career Portal inbox, which has the exact same Accept/Decline the DM's buttons would - a real fallback, not just a "sorry, couldn't reach you" notice.
A second release-clause or standard transfer offer could be created for a player who already had one PENDING or awaiting their own consent - confirmed live on a real duplicate case. Both entry points now check for an existing offer first and point at it instead of creating a second one.
A Team Manager/Head Coach/Transfer Manager can now Accept or Decline a standard transfer offer sitting on their own roster straight from the website's existing inbox - previously that only ever arrived as a Discord DM. Runs the exact same PENDING re-check and player-consent handoff the Discord Accept/Decline buttons do; Counter still requires Discord's negotiation modal.
Every rostered player's profile page on the site can now start a real standard transfer offer - same market-value floor, transfer-window allowance, and captain-protection checks /transfer offer runs, same Discord DM the responding team gets either way. Loans, trades, and release-clause offers still stay Discord-only for now.
/team create's validation and Discord-role/log setup is now shared with a new internal endpoint, so Manage > Teams on the website can create a real team - its own Discord role, budget, optional Team Manager - without a second, weaker implementation of any of it.
Updated undici to clear 3 known vulnerabilities (1 high, 2 moderate) flagged in it.
Transfer window length, the market bid raise percentage, and loan/transfer offer expiry hours are all real per-server settings now instead of hardcoded values. Also fixed loans silently assuming every gameweek is the same length, and a Loan Price Floor display that didn't match what was actually being charged.
An invalid IconCard relation filter meant filtering the gem shop by icon flavor crashed every single time. Fixed.
/budget revert and adjust-confirm could both be double-clicked into firing twice - now guarded. /sell was able to go through even while transactions were paused for the server, the only stat/transfer command that could; closed, and Results Reporter's permissions extended to cover the stat commands too.
The Results Reporter permission previously only existed as a website concept with no Discord-side equivalent. /configroles resultsreporter gives it a real role, matching every other permission the bot already models both places.
Every other real roster-move path (transfer, loan, draft, trade) already rejected a move that would bust a league's roster size/position/star caps - the website's own roster manager was the one path that didn't. Closed.
Player cards were rebuilt against a real FUT-style reference: real per-tier backgrounds and text colors, a full-body Roblox avatar in a portrait frame instead of a cropped bust, and a real 6-stat row. Went through several rounds of avatar framing/crop tuning per tier before going live as the card everywhere /card and the shop render one.
Real Referee/Cameraman/Commentator roles with Discord-native claim/release buttons, a dedicated kickoff channel, and scheduled match announcements. Predictions got rebuilt as a real free 3-button vote widget (no currency involved) posted alongside the reminder at the 30-minute mark, sent via webhook for its own branded identity.
A staff-only, confirmed, fully-audited manual budget credit/debit command - and every other budget-touching path (not just releases/transfers) now logs through the same audit trail, not just some of them.
Suspensions, forfeits, releases, roster moves, and schedule generation all got a shared "core" function extracted from their slash command, plus a matching internal API endpoint - the foundation that let the website start triggering these with full Discord parity (role changes, DMs, channel posts) instead of a second, DB-only implementation. Team creation and transfer offers (v8.0/v9.0/v10.0) build on the exact same pattern.