{
"trip": "euskirchen-palms-eifel",
"name": "Palms first, Eifel second",
"where": "Euskirchen & Bad Münstereifel, 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": 94,
"planning_state": "Ready to book",
"claims": [
{
"field": "travel.duration",
"status": "estimate",
"value": [
2.25,
2.75
],
"unit": "hours by car from Antwerp",
"basis": "Planning range with traffic buffer; the research baseline was about 198 km and 2 h 11 before stops.",
"checked": "2026-08-25"
},
{
"field": "cost.package",
"status": "fact",
"value": [
226,
226
],
"currency": "EUR",
"unit": "Silver package for two — published starting anchor",
"variable": "Starting price only; never a firm room price.",
"source": "https://www.welcome-hotels.com/en/offers/wellness/badewelt-euskirchen-3/",
"checked": "2026-08-25"
},
{
"field": "cost.sauna",
"status": "fact",
"value": [
12,
12
],
"currency": "EUR",
"unit": "Optional Vitaltherme/sauna upgrade for two",
"conditional": "Only if we choose the textile-free adult sauna area.",
"source": "https://www.welcome-hotels.com/en/offers/wellness/badewelt-euskirchen-3/",
"checked": "2026-08-25"
},
{
"field": "choice",
"status": "our_choice",
"value": "Use the Silver one-night package and visit the spa on day one."
},
{
"field": "choice",
"status": "our_choice",
"value": "Keep the 4.8 km EifelSchleife for the morning after breakfast."
},
{
"field": "verify",
"status": "must_verify",
"note": "Exact package quote and cancellation rules."
},
{
"field": "verify",
"status": "must_verify",
"note": "Dated spa ticket, age rules, textile-free sauna choice and robe fees."
},
{
"field": "verify",
"status": "must_verify",
"note": "Trail condition and rain fallback."
}
],
"unresearched": [
"cost.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": "Palms before check-in",
"activities": [
{
"label": "Drive Antwerp → Euskirchen",
"hours": [
2.25,
2.75
],
"status": "estimate"
},
{
"label": "Palmenparadies day visit",
"hours": null,
"status": "unresolved",
"note": "The package supplies a day ticket, not a fixed duration."
},
{
"label": "Dinner",
"hours": null,
"status": "unresolved",
"note": "Restaurant and timing remain to choose."
}
]
},
{
"day": 2,
"label": "Sunday",
"title": "Half-timber and beech forest",
"activities": [
{
"label": "EifelSchleife Eselsberg",
"hours": 1.23,
"status": "fact",
"source": "https://www.eifel.info/en/touren/eifelschleife-eselsberg"
},
{
"label": "Drive Bad Münstereifel → Antwerp",
"hours": [
2.25,
2.75
],
"status": "estimate"
}
]
}
],
"itinerary_mode": "days",
"open_questions": [
"Exact Silver package availability and room category for the chosen date.",
"Robe/slipper, transfer and parking charges.",
"Dinner, fuel, lunch and wet-weather fallback."
],
"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": "Therme Euskirchen Welcome Parkhotel Silver EifelSchleife weekend review"
}