A status report from another corner of the workshop. We've been building a trip-planning project called mytraces — internal for now, no public landing page, no signup — and the design questions that have come up while building it are general enough to be worth writing down. This post is about the shape of the system, not its features.
The pull toward "just use the LLM"
Every recommendation problem these days has the same easy first answer: ask the model. And it works. You can build a surprisingly good trip planner by handing a query to a capable LLM and asking it to write the day for you. We tried that. It gave us reasonable mornings.
What it didn't give us was reasons. The same question on Tuesday produced a different itinerary than the same question on Friday. Nothing about our previous decisions accumulated. When we asked "why this place," the answer was a paragraph that sounded right and might have been made up. For a tool we wanted to actually use ourselves on actual trips, that wasn't enough.
The other pillar: an ontology
So we built a second thing alongside the model — a curated graph of travel concepts, with weighted relationships between them, plus a list of curated places (instances) tagged with those concepts. Contemplative is a concept. Alpine is a concept. There's a relationship that says "contemplative amplifies alpine," with a weight; another that says "contemplative inhibits crowded." Yangmingshan National Park is an instance; it's tagged alpine, forest-bathing, quiet, and a handful more.
When you tell the system you want a quiet day, it walks the graph from that mood through the relationships to the instances that score well, and shows you the chain it walked. "Yangmingshan, because contemplative amplifies forest-bathing and alpine; this site is tagged with both." You can disagree with the chain. You can ask for a different mood. You can see the reasoning.
The graph also accepts regimes — context dimensions that modulate the relationship weights. Season is a regime (the same alpine site is rated higher in spring than winter). Group composition is one ("alpine + family-with-kids" is a mismatch). Transit mode is one (a car-only site under "I'll use the metro" gets demoted). Repeat-visitor status is one (iconic must-sees fade for someone returning). Four axes, each modest, each authored only where the curator has a genuine signal. The system stays small.
What the model does in this picture
The ontology doesn't replace the model. It gives the model vocabulary and a factual anchor. You type a free-form sentence — "I want a chill afternoon with my mom who hates crowds" — and the model parses it into the structured signals the ontology speaks: a mood, a group shape, a tone preference. The ontology runs propagation and returns candidates with reasoning chains. The model then composes those into prose, weaving in tone, sequencing, pacing notes the ontology can't generate.
The model handles the parts of language and composition that a structured graph can't do well. The ontology handles the parts of grounded recommendation a generative model can't do transparently. The model gets smarter as the ontology gets richer, not constrained — it has firmer ground to stand on.
What's actually built
The current ontology is small on purpose: about 130 concepts across five layers, around 120 weighted edges, four regime axes, and roughly 90 curated places across Taiwan and Japan. Per-user weight overlays exist as a structural layer (your preferences drift independently of the cohort default). A scenario suite runs the whole graph through hand-authored "sensible answer" tests so we notice when something has drifted. Curator-authored, not crawled. The point isn't coverage; it's leverage.
What we're deliberately not building
Every instinct says add more. Most of those instincts are wrong, and we've been disciplined about saying so:
- We don't ontologize the long tail. Fengjia Night Market is one place; the 200 food stalls inside are not 200 ontology nodes. The model + a notes layer handle that altitude.
- We don't author a concept for something the model can read out of a place's description. Concepts exist to drive propagation, not to label everything.
- We don't add a regime axis without evidence that real edges shift under it. Pace, duration, trip purpose — all plausible regimes — are deliberately not in the system yet.
- We don't do live route planning. The user has a phone and a maps app; we say "from your hotel, go to X" and let them handle the route.
- We don't book anything. No room rates, no availability, no checkout. External references are links, not affiliate flows.
Where it goes from here
We're using mytraces ourselves before we open it. The first real test is an actual day in Taichung — one of the makers planning a one-night trip on the metro, ontology providing the candidates, model composing the day, everything else falling out as feedback. Whatever surfaces will shape the next post. We expect surprises.
Internal dogfood until something is worth pointing at. The two pillars feel right; we'll write again when one of them has earned its keep. As always: small steps, no launches, no big reveals — just notes from the workshop floor.
← All journal posts