The remeasure dialog worked locally. In production, it loaded a 404. Same code, different answer — the tell of an environment-specific bug.

The dialog renders an iframe pointing to the measurement tool. Locally, the app and the measurement widget share a domain. In production, they live on different subdomains — the app on app.mylawntool.com, the widget on the marketing domain. The iframe URL was constructed from the app domain, but the /embed/{tenant_id} route only exists on the marketing domain. A marketingUrl added to Inertia's shared props, referenced in the dialog, fixed the URL construction.

A stale Embed.vue page from the Vue 2 to Vue 3 migration — redirecting to a nonexistent /vue2/embed/ path — got deleted. A dead API route with mismatched parameters got removed. Both had been harmless artifacts sitting in the codebase, but dead code is a lie the codebase tells about itself.

The session made all domain references environment-driven. OAuth redirect URIs for six integrations, CORS origins, the embed.js fallback URL, email template links — all now derive from environment variables instead of hardcoded strings. A forge-production.yml deploy config was created for the live domain, and a production git remote pointed at the production repository.

The remeasure 404 was a cross-domain issue that only manifests when subdomains are enabled. The kind of bug that's invisible in development, invisible in beta, and immediately visible to the first customer who tries to re-measure their lawn.