# Travel Guide > An itinerary builder that treats a plan as a structure of decisions rather than a list of facts. > Give it a destination, a trip length, who is travelling, what they care about, a pace and a rough > budget level, and it returns a day-by-day plan grouped so that a day holds together on the > ground — with realistic timings, meals placed as areas rather than addresses, and an honest split > between what needs booking ahead and what you can walk up to. Live at https://travel-guide.skillsafe.ai/ · API tutorial at /api.html · tokens at /tokens.html ## The problem it is built around An itinerary is an awkward thing to generate honestly, because it is made almost entirely of facts that expire. Opening hours, closing days, prices, seasonal timetables, booking windows, whether a restaurant survived the winter — all of it moves, and a language model states last year's version of it in this year's voice. Both of the usual mitigations fail. Stating it anyway is a lie the reader will act on. Hedging every line — "check opening hours before you go", on all thirty items — is the same page with the value removed, because hedging everything is identical to hedging nothing. The position this app takes instead: **a plan is a structure of decisions, not a list of facts.** What is durable about a day is which things sit near which other things, what order they go in and why, roughly how long a kind of place absorbs, and where somebody will want to eat given where they will be standing at one o'clock. Those survive a decade. Every number and every operating status attached to them is lifted out, never stated, and handed to a named authority. ## How claims are classified Three classes, applied to the **claim** and never to the place: - `durable` — geography, built form, street layout, walking distance, what is next to what, history, how long a kind of place absorbs. A year passing does not make it false. - `slow-drift` — true over years, drifting over years: a typical seasonal pattern, a rough city size. Answerable, **but only with an `as_of` year**, and a missing year is reported as a defect. - `current-state` — the present operating status of a named thing. **Never stated**, in any grammatical form. Two boundaries this app takes a position on: - **A comparative cost claim is volatile with no number in it.** "The airport train works out cheaper than a taxi" contains no figure, passes every numeric scan, and is a claim about two companies' current price lists. The test is whether the relation is fixed by law, institutional design or physical fact — durable — or by somebody's pricing decision — volatile, whatever grammar it is wearing. - **Never make the reader do arithmetic on operands you withheld.** Declining to state entrance fees and then telling the reader to total up the entrance fees is not a refusal; it is the same fabrication relocated into their head. ## The consequence people notice first: meals are areas, not addresses A named restaurant is the most perishable claim an itinerary can carry, and the one readers trust most. So this app does not name one. A meal is an **area** — where you will actually be standing at that hour — plus a **kind** of place to look for there. That is durable, it is genuinely more useful than a name, and it does not collapse when one room closes. The client flags any output that names an establishment. ## Empty beats filled A fixed output framework fills every slot whether or not there is anything to put in it, so a thin day prints identically to a rich one. That is invisible and therefore worse than an obviously short answer. This app requires the opposite: a day with two real things in it gets two blocks; a lighter day is marked as one with a stated reason; a `why_here` that would read the same about a different city is left empty rather than filled, and the page flags the empty one so the reader can see it. Every plan of three days or more must also say what it **left out on purpose**, with the real reason. Not every attraction is worth it, and saying which are not is most of the value of a plan. A plan that leaves nothing out has not made any decisions. ## What the page checks, mechanically, after every run - Every destination citation is re-read against the abstract it names; an unsupported one is reported as a **false citation** and escalated *above* an uncited claim, because false evidence is worse than absent evidence. - Every prose field is scanned for prices, clock times, closing days, booking windows, service frequencies, comparative cost claims, withheld-operand arithmetic, and safety, entry or health determinations. - Every `slow-drift` claim without an `as_of` is a finding; a block labelled `current-state` is a finding. - Every `why_here` is tested for stock travel-writing phrasing and for the substitution test, and every pair of them is compared for shared runs of words — two reasons built from one sentence frame are one reason with the nouns swapped. - Three days or more with an empty `skipped` and no lighter day is a finding: that is uniform confidence over uneven ground. - Identical block counts in an identical order on every day is a finding. - A `check_before_you_go` row with no authority named is a finding. - A day that returns to a district an earlier day had finished with is a finding. ## What it will not do It does not issue safety, entry, visa, passport, health, vaccination or insurance determinations. Those are current-state claims held by your own government's travel advice, the destination's immigration service, and a travel health service, and this app names them rather than standing in for any of them. ## Grounding `ss.search` against `web.wikipedia`, one call, on the destination named in the user's own input — and on nothing else. A restaurant or an opening hour is not a fact a MediaWiki snippet can support, and reaching for one would produce a confabulation wearing a real URL and a real record id with the citation check passing. That is worse than no citation, because it manufactures the appearance of rigour. ## Contract Input: `destination`, `country`, `days` (1–21), `month`, `party`, `interests[]`, `pace` (`gentle`/`steady`/`packed`), `budget` (`shoestring`/`moderate`/`comfortable`/`no-ceiling`), `notes`, `sources[]`, `page_facts{}`, `ask_flags[]`, optional `revise{instruction, plan}`. Output: one JSON object — `found`, `confidence`, `destination{}`, `spine`, `base{}`, `seasonality{}`, `days[]` (each with `blocks[]` and `meals[]`), `skipped[]`, `moving_between[]`, `book_ahead[]`, `check_before_you_go[]`, `declined[]`, `budget_note`, `limits`. Model: `gpt-terra`. Exports: Markdown, and an `.ics` calendar of **all-day** events — never timed ones, because writing 09:00 into a calendar would manufacture a precision the plan never claimed. ## Quotable Everything on this page and in the app's public pages is meant to be quotable, including the positions above. `/tokens.html` is the one exception and is noindex.