{
"trip": "aachen-thermen",
"name": "Aachen thermal night",
"where": "Aachen, Germany",
"task": "Finish planning this trip. Fill every entry in `unresearched` with sourced figures in the same shape.",
"assumptions": {
"travellers": 2,
"rooms": 1,
"dinner_for": 2
},
"fx": {
"base": "EUR",
"rates": {
"EUR": 1,
"CHF": 1.0681
},
"checked": "2026-08-24",
"note": "Reference rates, updated by hand. Do not call a currency service."
},
"readiness_percent": 75,
"planning_state": "Ready to book",
"claims": [
{
"field": "travel.duration",
"status": "estimate",
"value": [
1.67,
2
],
"unit": "hours by car from Antwerp",
"basis": "Planning range with a modest traffic buffer; verify with live navigation for the chosen departure.",
"checked": "2026-08-25"
},
{
"field": "cost.spa",
"status": "fact",
"value": [
96,
96
],
"currency": "EUR",
"unit": "Carolus 4.5 h weekend bath + sauna for two",
"source": "https://carolus-thermen.de/en/prices/",
"checked": "2026-08-25"
},
{
"field": "cost.spa-parking",
"status": "fact",
"value": [
6,
6
],
"currency": "EUR",
"unit": "Carolus parking",
"source": "https://carolus-thermen.de/en/prices/",
"checked": "2026-08-25"
},
{
"field": "choice",
"status": "our_choice",
"value": "Use the 4.5-hour weekend ticket including sauna."
},
{
"field": "choice",
"status": "our_choice",
"value": "Sleep at Parkhotel Quellenhof and keep the morning to one official old-town circuit."
},
{
"field": "verify",
"status": "must_verify",
"note": "Exact room and cancellation conditions."
},
{
"field": "verify",
"status": "must_verify",
"note": "Date-specific spa access, sauna rules and any closure day."
},
{
"field": "verify",
"status": "must_verify",
"note": "Green emissions sticker and current Aachen environmental-zone rules."
}
],
"unresearched": [
"cost.room",
"cost.hotel-parking",
"cost.dinner",
"cost.fuel"
],
"blocks_total_cost": true,
"cost_total_rule": "A whole-trip total is published only when every cost component is sourced. Never a partial total, never 'from', never an estimated total.",
"itinerary": [
{
"day": 1,
"label": "Saturday",
"title": "Warm water, then dinner",
"activities": [
{
"label": "Drive Antwerp → Aachen",
"hours": [
1.67,
2
],
"status": "estimate"
},
{
"label": "Carolus thermal bath and sauna",
"hours": 4.5,
"status": "fact",
"source": "https://carolus-thermen.de/en/prices/"
},
{
"label": "Dinner",
"hours": null,
"status": "unresolved",
"note": "Restaurant and reservation are still open."
}
]
},
{
"day": 2,
"label": "Sunday",
"title": "A small imperial-city morning",
"activities": [
{
"label": "Official historic-centre circuit",
"hours": 1,
"status": "fact",
"source": "https://www.aachen-tourismus.de/en/stadtrundgaenge/kleine-stadtfuehrung/"
},
{
"label": "Drive Aachen → Antwerp",
"hours": [
1.67,
2
],
"status": "estimate"
}
]
}
],
"itinerary_mode": "days",
"open_questions": [
"Exact Quellenhof double-room quote, breakfast inclusion and cancellation terms.",
"Hotel parking and the exact hotel-to-spa transfer.",
"Dinner reservation, fuel cost and current low-emission-zone requirements."
],
"itinerary_contract": "Every trip page uses this shape. Timings are rough and may be wrong unless calendar_event is true, which identifies the one activity fixed by trip.calendar. Fill day -> activities[] -> {label, hours, status, calendar_event?}, or say why a day is empty. hours may be a number, a [min,max] range, or null when no figure is published - never invent one. status is fact (sourced timing), estimate (reasoned) or unresolved (something must be decided or booked first). Do not invent waking, breakfast or transfer time, and do not compute how full a day is - just list what we want to do and roughly how long it takes.",
"discovery_query": "Carolus Thermen Parkhotel Quellenhof Aachen overnight review"
}