Drafts that put a closed property on day four: fixing seasonal blindness
In short
A drafter keeps proposing places that are shut because the closure is written in prose inside the product description rather than stored as date ranges the retrieval query can filter on. Re-run retrieval with the travel dates bound as a filter: if the offending component still comes back, no instruction added to the prompt will remove it, and the fix is a metadata schema plus a hard filter.
Key takeaways
- Seasonality written as a sentence cannot be filtered on, and a model reads it as colour rather than a rule.
- The confirming check is one query: bind the travel dates as a filter and see whether the shut component still returns.
- There are at least 6 distinct kinds of shut, and only 2 of them appear in a supplier rate sheet.
- Annual closures are re-announced each year, so a season record without an expiry is wrong the moment it matters.
- A property that is open but unreachable is the same failure — model access dependencies as explicit links between components.
The season is in your prose and not in your metadata. That is the whole finding in most of these cases: the product description says the lodge closes for the wet months, or that the pass is shut in winter, and the retrieval query has no date bound at all — so nothing was ever excluded, and the model chose a component it was legitimately offered. Adding a sentence to the prompt about checking seasonality changes the wording of the draft and not the candidate set.
Keep this apart from supply. A property that is open but sold out, or on stop-sell, or out of allotment, is a different failure with different owners — the distinction is drawn in is a blackout the same thing as a stop sell. Seasonal blindness is about the 2 cases where the place is shut to everyone: the site itself is closed, or the way in is.
Six kinds of shut, and only two of them reach your rate sheet
| Class | Where the truth lives | How it changes |
|---|---|---|
| Road or pass closed by snow | The road authority's own notice, announced each year | Opening dates move by weeks between years; last year's record is a guess |
| Weather suspension of an activity | The operator's terms — boat, raft, dive, high-altitude trek | A recurring window, sometimes cut short or extended within a season |
| Protected-area closure | The park or reserve authority, per park and per zone | Wet-season and breeding-season closures published annually, rarely uniform across parks |
| Annual maintenance closure | The supplier contract for that property | Set per property each year, and frequently changed after the contract lands |
| Weekly closing day and public holidays | The site's own opening hours and the national holiday calendar | Stable, but the holiday calendar shifts and regional holidays are not national ones |
| A festival that shuts a city rather than opening it | Local knowledge, then confirmed with the ground operator | Movable dates, and the effect is transport and closures rather than a single site |
Only the annual maintenance closure and, sometimes, the activity suspension arrive with the contracted rates. The other 4 have to be gathered and maintained deliberately, which is the real cost of fixing this and the reason it gets patched with prompt text instead. A 7th case behaves like a closure and is modelled differently: the property is open on those dates and the only road to it is not, which no field on the property itself can express.
One query with the dates bound tells you which layer is broken
- Take the offending draft. Note the component identifier and the calendar date it was placed on — not day 4, the date that day 4 resolves to.
- Re-run retrieval for that brief with the travel dates bound as a hard filter. If the component still comes back, it carries no structured dates and the investigation is over.
- Open the row. Find where the closure is actually recorded. In most systems it is a clause inside a paragraph written for a brochure, which is unfilterable by construction.
- Check whether the closure sentence was even retrieved. Chunked prose competes on similarity, and the passage about the infinity pool routinely outranks the passage about the wet season.
- Log the query's filters, not only its text. Teams are often surprised to find the date filter was dropped somewhere between the brief parser and the retrieval call.
- Repeat over 10 drafts across 3 destinations and count failures by region. Clustering in 1 region means data coverage; even spread means the query, and those are different backlogs.
The fields that make a season filterable
The unit that carries these fields is one sellable component, not a document — the argument for that unit is in indexing your own products so a model can find them. Onto each component, add the following.
| Field | Shape | What it prevents |
|---|---|---|
| openPeriods, closedPeriods | ISO 8601 date intervals, each marked recurring-annual or fixed-dated | The single most common gap: no interval to test the travel dates against |
| weeklyClosedDays, holidayCalendar | Day-of-week set plus a named calendar identifier per country or state | A day trip planned to a site that closes every Monday, or on a regional holiday 1 state observes |
| operatingHours | Per day-of-week open and close times | A visit scheduled after last entry, which reads as feasible and is not |
| accessDependencies | Identifiers of the road, ferry or pass components this one requires | An open property reached only by a route that is shut |
| seasonSource, sourceDate | Who said so — authority, supplier, ground operator — and when | A closure nobody can attribute, which reviewers cannot confirm or overrule |
| verifiedAt, expiresAt | Last confirmation, and the date the record stops being trusted | An annual announcement asserted forever after the year it was true |
Filter the candidate set; stop instructing the model about seasons
With the fields in place, the fix is a hard filter in the retrieval query rather than a line in the prompt: every candidate must be open across the dates it would occupy, and every access dependency must be open too. The general mechanics of pushing date and category constraints into the query itself are in metadata filters in a retrieval query.
- Filter on the dates the component would be used, not the trip's start date. A 14-day itinerary starting on 26 September can cross 2 seasons, and day 12 is where this bites.
- Treat unknown as excluded for automatic drafting. A component with no seasonality data is not open; it is unverified, and a consultant can override that in seconds.
- Expand the filter to dependencies. If the pass component is shut, everything whose accessDependencies name it is shut too, regardless of what the property says.
- Keep a second net after generation. A validator that rejects a draft placing a closed component on a date is the same shape as the pacing validator in six stops and nine hours of driving on day two, and it catches the case where the filter was correct and the assembly was not.
- Do not rely on the model's own knowledge of a destination. It has read a great deal about famous places being open, and general knowledge outranks a sentence buried in your product copy every time.
You cannot prompt your way out of a candidate set. If a shut property is in the list the model chooses from, sooner or later it is in the itinerary, and the only durable fix is that it never appears.
What the filter cannot know, and who covers it
A date filter answers only what somebody recorded. It does not know that this year's opening has not been announced yet, that a landslide shut the route last week, that a park closed a zone early, or that entry is capped by a permit quota rather than a gate. Those belong to the review step, which is why the reviewer must see the source and the date beside every seasonal claim rather than a green tick — the queue design is in the consultant review step before a client sees a draft, and a full brief traced through retrieval, drafting and validation is worked through in one brief run through a grounded drafter.
There is also decay to plan for. A component that was open when the draft was built can be shut by the time the client accepts, which is the same class of problem as a held price expiring between basket and confirmation — the failure mode described in booking fails on an expired token mid-checkout. Carry the verification time with the claim, and re-check seasonality at the point the itinerary is confirmed rather than only when it is written.
Keeping the closure data alive without a person reading notices
The maintenance burden is what kills this work, so automate the watching and not the deciding. A scheduled job polls the pages where closures are published — park authorities, road authorities, supplier notices — detects that the text has changed since the last hash, and opens a task with the diff attached. A person confirms the new dates, and only then does the record change, with the source and confirmation date stamped on it. That propose-then-confirm split is the pattern we use for most AI agents and automation work, for the reasons set out in AI in logistics operations: it earns its place by watching 200 sources nobody would read weekly, and it is safe because it changes 0 records on its own.
Two habits make the rest of it hold. Record closures against the component that is actually shut, not against the trip that mentioned it, so 40 itineraries update from 1 edit. And review the seasonality coverage by region each season, because the destinations where drafts fail are the destinations where nobody has loaded the data — the same conclusion the counting step above reaches. The rest of the guardrail set sits in letting a model draft the trip, within our wider travel and tourism work.
Frequently asked questions
Short answers to the follow-ups this page tends to raise.
Why does the model keep suggesting a place my product description says is closed?
Because a sentence in a description is not a constraint the retrieval query can apply. The component stays in the candidate set, and the model treats the closure line as background colour rather than a rule — if it was retrieved at all, since chunked prose competes on similarity and the closure sentence often loses to more descriptive passages. Store the closure as date intervals and filter on them.
Should seasonality live in the product record or in the availability system?
In the product record, because it is a property of the place rather than of your supply. Availability answers whether you can sell a component on a date; seasonality answers whether it exists on that date at all, and the two fail differently — a sold-out lodge can be swapped for another, while a shut pass invalidates the route for everyone. Keep both, and filter on seasonality first.
How do we keep annual closure dates current without a person reading every notice?
Poll the publishing sources for changes and route the change to a person, rather than letting anything update a record automatically. Park and road authorities re-announce dates each year, so every seasonality record should carry a verification date and an expiry, drop out of the automatic filter when it expires, and be re-confirmed by whoever owns that destination before it comes back into use.
Is a validator after generation enough, without changing the retrieval query?
It stops bad drafts reaching clients, but it wastes a generation and it degrades badly. If shut components stay in the candidate set, the drafter keeps proposing them, the validator keeps rejecting, and on constrained briefs the retry loop runs out of alternatives and escalates work that a filter would have prevented. Use the filter as the control and the validator as the second net.
- seasonality
- retrieval
- itinerary drafting
- metadata
The work behind this page
Builds from our portfolio that this page draws on.
AskVault
An AI internal knowledge-search platform that answers employee questions from your own docs — grounded in citations, with knowledge gaps surfaced and deflection tracked.
Productivity AIQuoteForge
An AI CPQ and proposal platform that builds enterprise quotes from your catalog, guards every discount against the margin floor, routes approvals, and generates the proposal.
Sales AIRead next
- The draft packs an impossible day: constraining pacing without hard-codingAn over-packed day is not a prompting failure. The generator was handed no durations and no travel times, so it had nothing to violate — the fix is a mechanical day budget and a validator with a bounded retry.diagnostic
- Hallucinated, not contracted, or not available: three different failuresOne symptom, three defects. An invented property, a real one you do not hold, and a contracted one that is sold out need three unrelated controls — and the middle case is the one that reaches the client.definition
- The AI draft quotes a price that is in no rate card: tracing the numberA figure in a drafted itinerary that reconciles against nothing has 4 likely origins, and a provenance trace over the run's retrieved context and tool log tells you which one in about 20 minutes.diagnostic
- Bookings confirm on your site and the supplier has no recordA confirmation email proves the checkout finished, not that a supplier accepted anything. Here is the timed comparison that shows whether your booking script reads live availability or a copy.diagnostic
- Enquiry-to-booking conversion: the metric that lies at six monthsGroup enquiries by the month they arrived and follow them until they close. The calendar-month ratio moves when volume moves, so a growing month looks like a bad one.definition
- Follow-ups still chasing a client who already paid: the state gapA paid client getting "still thinking it over?" is not an email problem. It is two systems holding quote state, with the exit condition wired to the wrong event or to no event at all.diagnostic
Working on something in this space?
Tell us where you are in a sentence or two. We'll tell you honestly whether we're the right team, and what a sensible first slice of the work looks like.
Start the conversation