← All projects

Parks Planner

Four agents plan a national park trip. Then a separate check decides whether the plan gets shown at all.

Route sketch. Stops are in order, not to scale.

Loading saved plans.

How a plan gets made

Every handoff is a typed object, so every handoff can be logged, replayed and checked by itself. The failures in multi-agent systems live in the handoffs, and a framework would hide them.

Agents return typed objects. If an agent can't fill its schema, that is a signal, not something to fix with a longer prompt.

Facts come from data. Fees, closures, campgrounds, gas and meal rates are pulled from public APIs into a local database, not recalled by a model.

Agents don't add or grade. Totals are summed in code, and the gate reads what the orchestrator collected, not what the last agent says about itself.

A model call Plain code

  1. Seasonality

    Works out which part of your window each park is open and sensible: permits, closures, crowds. Reads park alerts and conditions from the NPS database.

    Returns windows, permit notes and any constraint it couldn't satisfy.

  2. Logistics

    Lays out the legs between parks, the drive time for each, and which entrance to use.

    Returns legs and entrances. Drive times are the model's estimate today; a routing source is next.

  3. Budget

    Chooses where you sleep and prices only what no data source can.

    Returns a lodging choice per park and a few estimated lines.

  4. Itinerary

    Sequences the other three outputs into days. It carries their warnings forward and is not allowed to resolve or hide them.

    Returns one day plan per calendar day.

  5. Costing

    Prices fees, campsites, gas and meals from NPS, EIA and GSA data. Totals are sums, and every line records where its number came from.

    Returns the cost lines and any budget violation.

  6. The gate

    Checks hard constraints against what the pipeline actually produced: budget, drive limits, closures, dates. A plan that fails is not shown as an itinerary.

    Returns pass or fail for each check, with the reason.