MSX ship log: dashboard cleanup, team quotas, and readable Scout results

May 21 was a cleanup-and-trust day. The work was less about adding another large surface and more about making the product feel honest when a customer clicks around: the dashboard got quieter, quotas moved to the team where they belong, API key creation stopped pretending unavailable actions were available, and investigation results became easier to read.

The day closed with 38 commits, 30 merged pull requests, and 27 closed issues. The most important product change was simple: an authenticated user can now run one free Scout before paying, while paid quota and plan copy are rendered as team-scoped instead of personal-account scoped.

The dashboard got quieter

Several dashboard pages had accumulated developer-facing details: duplicate quota numbers, internal token costs, repeated status text, raw progress bars, awkward Team copy, and API key controls that could be clicked even when the backend could not create another key. Today we tightened those pages around what the customer is likely trying to do.

Agents now focuses on connecting an agent and managing API keys. Usage now exposes customer-facing quota and runtime totals without internal token or cost accounting. Profile is personal again instead of mixing team plan data into account settings. The investigation list cards dropped redundant subtitles, duplicated status text, and progress bars that did not help a completed result.

#482, #486, #488, #496, #499, #501: Team switcher, invite dialog, mobile copy, and sidebar layout cleanup.

#503, #504, #516, #518, #521: Agents API key UI simplified and creation availability exposed honestly.

#511, #512, #523, #525: Investigation list cards and Usage metrics reduced to customer-facing information.

#513, #515: Profile kept personal-only after quota and plan ownership moved to Team.

Teams became the product boundary

Team ownership became the source of truth for shared work. Ghost invites no longer consume seats, invite acceptance notifies the inviter, billing checkout has a configured dashboard test path, and plan/quota rendering now follows the active team instead of a user's personal profile.

That matters because MSX work is collaborative by default: API keys, usage, agent results, and teammate seats all belong to a team context. The UI now reflects that product model instead of leaking account-level leftovers into every page.

#483, #484: accepted or stale invites no longer keep consuming seats.

#490, #493: inviters get notified when a teammate accepts.

#514, #529, #530, #532, #534: plan and quota are rendered as active-team scoped.

#531: dashboard billing checkout has a backend test path.

Marketing and Conversations stayed honest

Marketing moved to a minimal beta page instead of implying that a managed ad system was already complete. The prompt/copy UI was normalized, stale MCP contract language was removed, and the sidebar labels now describe what exists today.

Conversations also received a positioning pass. ReplyGuy is the right mental model, but the page should not read like generic agent output. The latest work restored that positioning so the feature is framed around finding relevant conversations and reply opportunities.

#491, #492: Marketing prompt UI and page copy normalized.

#526, #527: minimal Marketing beta page shipped.

75c6ee9: stale Marketing MCP contract removed.

8823f22: ReplyGuy positioning restored for Conversations.

Scout results became more readable

Investigation results are the product. The result page should help a customer understand the opportunity, the buyer, the evidence, and the next useful action. Today, Markdown links started rendering correctly in result bodies instead of showing raw bracket syntax, and raw API output stayed available behind disclosure rather than becoming the default reading experience.

We also made the agent-facing docs sharper: the default prompt is now a quick Scout path, public SEO and AI crawler files were updated, transactional emails were branded with the MSX tokens, and a temporary x402 clarification was reverted so the product does not teach an integration path it does not use.

#535, #537: investigation result Markdown renders correctly.

#519, #524: transactional emails use the MSX visual system.

131787a: public SEO and AI crawler surfaces optimized.

6080098: agent docs cleaned up and defaulted to quick Scout.

#536, #538: authenticated users get one free Scout.

API keys stopped overpromising

One small but important UX correction was API key creation. The UI used to show a Create key action even when the account had hit an API-key limit or the backend could not create one. The backend now exposes creation availability, and the frontend uses that state instead of leaving the customer to discover failure through a dead button.

That same principle drove most of the day's cleanup: if the product cannot honestly support a flow yet, the UI should either hide it, mark it as coming soon, or explain the limitation directly.