MSX ship log: public opportunities, social images, and steadier investigations

May 24 was about turning MSX output into something public, shareable, and easier to operate. Market signals can now become public opportunity pages, daily publishing can attach generated social images, and investigations got a reliability pass so agents report progress and failure states more honestly.

The day closed with 26 commits, 16 merged pull requests, and 11 closed issues. The largest user-facing change is simple: investigation output is no longer trapped inside the dashboard. It can become a crawlable opportunity page with an image that carries the idea into social channels.

Market signals became public pages

MSX now has public opportunity routes for selected market signals. These pages are built for crawlers and humans: they get stable URLs, static prerendering, route metadata, and direct serving rules so an exact opportunity URL loads as the intended page instead of bouncing through redirects or a blank app shell.

That matters for distribution. If MSX finds a useful market opportunity, the product can now point to a public artifact instead of forcing every reader into an authenticated dashboard context.

#598 and follow-up routing commits: added public opportunity pages and exact URL serving.

#605: fixed route transitions and opportunity-page styling so public pages no longer lose CSS.

#602: fixed the opportunity hydration flicker path so pages are more crawler-friendly.

Social publishing got an image layer

The daily signal publisher now has a single publication pipeline with adapters for channels. Discord posting can attach generated MSX-style images, and the same publication model is ready for Reddit image posts once the production Reddit posting OAuth configuration is complete.

The image work uses the same signal data as the text post, so the social visual is not a separate hand-written asset. It is another representation of the opportunity: short, readable, and tied to the public URL.

#592: added the daily social signal publisher.

#601 and #603: added daily signal image generation and Discord image attachments.

#604 remains open for production Reddit posting OAuth; the Reddit adapter exists, but we are not claiming unattended Reddit posting until that live OAuth path is configured and tested.

Investigations became more reliable

The investigation runtime got several fixes after real production failures. Runtime output schema issues were fixed, provider configuration was rolled back and restored after smoke tests, cold starts got more margin, and Codex startup rollout failures now retry instead of failing the user too early.

Progress reporting also became more useful. Agents and dashboards can now show scanned-source counts during and after a run, which makes failure states less mysterious and successful runs easier to trust.

#584, #589: fixed runtime output schema and restored the APIYI runtime provider after verification.

#587, #588: improved cold-start handling and startup retry behavior.

#586 and #590: report scanned sources in investigation progress and final state.

The dashboard stopped hiding failed work

Failed investigations now show up instead of disappearing from the dashboard. That is important because a failed run is still user-visible work: the customer needs to know whether the agent is waiting, failed, done, or worth retrying.

Investigation cards also gained a delete action, and pagination received another polish pass. The dashboard now gives users a cleaner way to manage old or failed runs without pretending the history is immutable.

#599 and #600: show failed investigations in the dashboard.

#607 and #608: added delete support for dashboard investigation entries.

b2103e8: polished investigation pagination.

The website got less jumpy

Several small website issues made the product feel rough: landing colors regressed, terminal presentation needed polish, pricing anchor styling was reverted, and route changes could flicker between app states. Those pieces were cleaned up before this ship log went out.

The result is not a new visual direction. It is the same MSX interface with fewer distracting transitions and more stable public pages.

9e6e67d, 751f183, 2c38706: landing and terminal presentation polish.

f24d3b5: fixed route flicker and opportunity prerender styling.

6801120: improved social preview cache busting and SEO routes.

Billing stayed stricter

A small backend billing fix prevents repeat Stripe trials. It is not the loudest product change of the day, but it keeps billing behavior aligned with the Pro trial promise and reduces the chance of accidental abuse.

#610: prevent repeat Stripe trials.