Hybrid AI / live production / family travel

SproutRoute

A hybrid AI travel planner that separates what AI should generate from what must be verified, deterministic, or cached. The product decision was to make AI write connective tissue, not facts. I defined the product, designed the system architecture, and operate the web app in production.

Live production productMCP path implemented
Stack
Railway + Supabase
AI
Gemini + Places
Quality
350+ tests
Core choice
Facts before prose
Decision
Let verified APIs and deterministic rules own facts; use models for planning and connective prose.
Why
Weather, places, safety, and family packing require provenance and predictable failure handling.
Result
A production web product with 350+ tests and an additive four-agent MCP path with handoff traces.
What this provesAI boundaries

Trustworthy AI planning starts with product boundaries.

This case shows product judgment under AI uncertainty: which user promises need deterministic control, which experiences can be generative, and how latency, cost, provenance, and trust shape the product architecture.

ComplexityBoundaries

The hard parts were in the boundaries.

Users type fuzzy travel intent. The system has to extract constraints, route across external APIs, separate factual data from generative text, keep family-safety information reliable, and avoid turning every trip plan into a slow serial dependency chain.

Fuzzy input

Free text has to become destination, dates, children, pets, travel mode, and planning constraints.

API failure modes

Weather, geocoding, places, policy, AI, and persistence layers all fail differently.

Factual vs generative

Weather, safety, places, and packing must not be hallucinated by itinerary prose.

Latency

Moving from 8-12 seconds required parallelization, caching, and hot-path discipline.

ScreensShipped flow

The artifacts should show the shipped flow, not a decorative mockup.

SproutRoute destination search screen
Natural-language destination setup
SproutRoute date picker screen
Date range drives weather and packing
SproutRoute traveler setup screen
Family composition changes constraints
SproutRoute itinerary screen
Verified itinerary surface
SproutRoute packing list screen
Deterministic packing list
SproutRoute safety screen
Safety from verified sources
ArchitectureEvolution

Three architectural stages, each driven by a production problem.

V1: AI-heavy generation

Fast to ship, but slow, expensive, and unreliable for packing and safety.

V2: deterministic packing

Moved packing to rules and routed models by task to improve reliability.

V3: attraction memory

Stored verified attractions with freshness scoring so one trip improves the next.

Current state

Verified data feeds the AI planner; AI writes connective tissue, not facts.

V4: additive agent + MCP path

Implemented a LangGraph orchestrator with four specialist agents and a hosted MCP server without replacing the stable web route. The path validates delegation, partial results, trace privacy, and tool contracts for the enterprise agent runtime.

SproutRoute runtime architecture
Runtime architecture
SproutRoute trust architecture
Trust architecture
SproutRoute request lifecycle
Request lifecycle
SproutRoute latency comparison
Latency before and after
Claude Desktop calling the hosted SproutRoute MCP server: a San Diego trip plan plus the live agent handoff trace showing retrieval, safety, itinerary, and packing spans with per-agent latencies
Live MCP handoff trace
DecisionsJudgment

The page should make the tradeoffs inspectable.

Deterministic packing over AI packing.

Family travel packing is constraint-based. Reliability beats novelty.

Per-task model routing over one global model.

Different steps need different cost, latency, and reasoning profiles.

Cached attraction shortlist over open-ended discovery.

Freshness scoring narrows the search space and improves repeat plans.

Factual APIs separated from generative output.

Weather, places, and safety data need provenance before prose.

Privacy Terms