Hallucinated, not contracted, or not available: three different failures
In short
Three different defects get filed as hallucination: a property that does not exist, a real property you have no contract for, and a contracted property that cannot be sold on those dates. They need retrieval constraints, a resolution gate and an availability check respectively, and fixing one does nothing for the other 2. The middle case is the one that survives review.
Key takeaways
- An invented property, an uncontracted one and a sold-out one are 3 defects with 3 unrelated fixes.
- The real-but-uncontracted suggestion passes every check a reviewer can run, which is why it ships.
- Every property name in a draft must resolve to a catalogue id, or the draft is blocked, not cleaned.
- Stripping unrecognised names leaves a day describing a hotel nobody can book. Regenerate instead.
- Log the uncontracted suggestions by frequency. That list is a contracting backlog, not just noise.
When a drafted itinerary proposes a property you cannot sell, work out which of 3 things happened before deciding what to fix. The property may not exist at all. It may exist, be excellent, and be one you have no contract for. Or it may be a product you hold and cannot sell on those particular dates, because the allotment is gone, the release date has passed, or the season is closed.
These look the same in the document and share nothing else. The first is a retrieval failure, the second is a scoping failure, the third is a currency failure. A team that hardens retrieval and declares the problem solved will keep shipping the other 2 — and the second is the one that costs money, because it is the only one that passes every check a reviewer can run.
What each defect looks like on the page
| Defect | How it reads in the draft | Who catches it, and when | The control |
|---|---|---|---|
| The property does not exist | Plausible name, often a composite of 2 real ones, with vague descriptive copy and no specifics | A consultant who knows the region, in seconds. Anyone else, never | Constrain retrieval, and have the model emit ids rather than names |
| Real, but not contracted | Correct name, accurate description, right part of town, right standard. Everything checks out | Nobody, until someone tries to price it or a client asks to book it | A resolution gate: every named product must map to a row in your catalogue |
| Contracted, not sellable on those dates | Correct in every respect except that the inventory is not there | The operations team, at confirmation, after the client has approved | An availability check at draft time, repeated before the proposal is sent |
| Contracted, sellable, wrong season | A property or route that is genuinely shut on the dates proposed | Sometimes nobody, until the client arrives | Seasonal and closure data on the product, treated as a retrieved fact |
The fourth row is a variant of the third and it is worth separating, because seasonality is usually held somewhere different from allotment — in a rate calendar, or in a supplier PDF, or in one person's head. The diagnosis for that one is the model that keeps proposing a place that is shut, and it is a genuinely different data problem from an exhausted allotment even though the client experience is identical.
The middle case is the expensive one
An invented hotel is embarrassing and cheap. It fails the first check anyone runs, and a consultant reading a draft for a region they sell will spot it immediately. A real property you do not hold fails nothing. The name is right because the model has seen it. The description is right. The location is right. It survives the review pass in checking an AI draft before it reaches a client precisely because every verifiable thing about it verifies.
Then the client reads the proposal and wants that hotel. You now have 3 options and none of them is good: buy it ad hoc at a worse rate with no allotment and no cancellation protection, substitute something else and explain why the itinerary changed before it was even confirmed, or hold the line and look like a business that does not know its own inventory. The damage is commercial, not technical, and it lands weeks after the defect was introduced.
The suggestion that hurts you is not the one that is obviously wrong. It is the one that is completely correct about a property you cannot sell.
Three controls, and why one never covers another
- Constrain retrieval to your own products. The candidate set the model reasons over contains only rows from your contracted catalogue, with their seasons, allotments and terms — building that index is its own piece of work, described in indexing your own products so a model can find them. This kills the invented property and does nothing about the other 2, because the model can still name a hotel it knows in prose that was never retrieved.
- Gate on resolution. Before a draft is stored or shown, every product-shaped noun in it must resolve to an id in your catalogue. Unresolved means blocked, not cleaned. This is the only control that catches the real-but-uncontracted case, and it is the one most implementations skip because retrieval feels like it should have handled it.
- Check availability at draft time and again before sending. Allotment, release date, stop-sell and season, all read as facts rather than assumed — the field-level split behind that is set out in what grounded means when a model drafts a trip. The second check matters because a draft that sat in a consultant's queue for 4 days is quoting a 4-day-old answer, the same decay that makes the results price never the checkout price on any inventory-backed site.
The three are genuinely independent. A perfect index does not stop a model writing a famous property into a paragraph. A resolution gate does not know the room is sold out. An availability check does not care that the property was never yours. Any 2 of the 3 leave a live failure path, and it is always the path nobody is watching.
The suggestions worth keeping rather than suppressing
There is a real signal buried in the blocked suggestions. A model constrained to your catalogue, given a brief in a region where your coverage is thin, will keep reaching for the same handful of properties you do not hold — because they are the obvious answer to that brief. Suppressing them silently throws that away.
- Log every blocked property name with the brief that produced it, and count frequency by region and month. A name that appears 30 times in a quarter is a contracting conversation, not a bug.
- Separate the invented names from the real-but-uncontracted ones in that log. Only the second list is useful, and mixing them makes the whole thing look like noise.
- Show the consultant what was blocked, not just that something was. A consultant who can see the drafter wanted a property in a particular area can make the substitution deliberately instead of accepting whatever the constrained set produced.
- Feed the list to whoever owns supplier relationships on a schedule. Coverage gaps found this way are cheap to find and expensive to discover from a lost booking, and this is the one place a drafting system tells you something about the business rather than about itself.
Two adjacent failures are deliberately out of scope here. A price that nobody can find in the rate card is a different defect with a different trace, covered in the draft that quotes a number that is not in the rate card. And the end-to-end version, where one brief is followed field by field through a constrained drafter, is one brief run through a grounded drafter. Both sit inside letting a model draft the trip, and the controls above are ordinary MVP and product build work in our travel and tourism practice — a resolution gate is a database lookup, not a research project.
Frequently asked questions
Short answers to the follow-ups this page tends to raise.
Is a real hotel we do not contract with a hallucination?
No, and calling it one sends you to the wrong fix. A hallucination is an assertion with no referent; this is a true statement about a property that is simply outside your commercial scope. The distinction matters because the remedies differ completely: better retrieval and better models reduce invented properties, while only a resolution gate against your own catalogue catches a real one you do not hold.
Why does constraining retrieval not solve this on its own?
Because the model can name a property it has never retrieved. Retrieval controls what the model reasons over; it does not control what the model already knows, and a well-known hotel in a well-known city is exactly the kind of thing it knows. The output has to be checked against your catalogue after generation as well as constrained before it, which is 2 controls rather than 1.
What should happen when a property fails the resolution check?
Block the draft and regenerate against the constrained candidate set, or route it to a consultant with the unresolved name visible. Do not delete the name and ship the paragraph: that leaves a day describing a hotel with no booking path, and it converts a defect a reviewer could have seen into one nobody will. Blocking is noisy at first, which is a useful measure of how often it was happening.
How often should availability be re-checked before a proposal goes out?
At draft time and again immediately before sending, at minimum. Any answer in between has an age, and a proposal that sat in a review queue over a weekend is quoting inventory as it stood days earlier. For allotment-backed products the second check is the one that matters, because the interval between drafting and sending is exactly when someone else sells the room.
- inventory
- hallucination
- contracting
- itinerary drafting
The work behind this page
Builds from our portfolio that this page draws on.
QuoteForge
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 AIShortList
An AI recruiting screener that reads every application, scores candidates against the role, and hands recruiters a ranked shortlist with outreach already drafted.
HR & RecruitingRead next
- Drafts that put a closed property on day four: fixing seasonal blindnessSeasonal blindness is a metadata failure, not a prompting failure: the closure lives in a sentence nobody can filter on, so the shut property stays in the candidate set the model draws from.diagnostic
- 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
- 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
- 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