Ask a model to research something and you get fluent paragraphs with links underneath. Read the links and the paragraphs stop holding up: in a study of deployed generative search engines, only about half of the generated sentences were fully supported by the sources they cited.1 The links make an answer look sourced. They don't make it sourced.
Hotel is built around one refusal. When you or a model bring something in from the web, the next step is refused until someone writes down what the source claims and quotes the passage that says it.2 The quote isn't taken on trust either. Hotel looks for it in the text it stored, and a quote that isn't there is rejected.3
inbox harness 2 open
== ROOM: harness == @L0001 [ ] bounty origin=user ts=2026-10-20T23:16:01Z | Does Exa's search API support filtering by | published date? @L0002 [.] monologue origin=user ts=2026-10-20T23:16:01Z | I think Exa has date filters but I am not sure.
R:1 lobby_edit user + L0001 R:2 lobby_edit user + L0002 R:3 retrieval user exa.search "exa published date filter" R:4 blocked user exa.search pending [3]
annotation gate: annotate R:3 before the next call
One document that only grows
Your notes live in a single plain-text file, the lobby: questions, ideas, reasoning and logs, grouped into rooms. Nothing in it is rewritten. An entry's body can't change; you write a new entry that supersedes it, and both stay.4 A question closes only on a retrieval that has been annotated, so every closed question points at a quote.5
Underneath it, every search, fetch and model call is a row in an append-only record. That isn't a policy; the database itself refuses to edit it.6
What a week of it showed
The first week left 226 rows in the record, between 18 and 23 October. Most of them are model calls; the handful that matter are the retrievals and what happened to them.
| kind | rows | what a row of this kind is |
|---|---|---|
| model | 119 | A model call, logged with its tokens and latency. |
| internal | 29 | A lookup in your own data, such as a lobby search. Logged, never gated. |
| lobby_edit | 26 | A validated change to the lobby, committed to git. |
| blocked | 13 | A call the gate refused because a retrieval was still unannotated. |
| output | 11 | A final answer, written only once the gate is open. |
| retrieval | 10 | Knowledge fetched from outside: Exa, Parallel or the RAG store. Gated. |
| annotation | 10 | A claim and a quote for one retrieval, or “nothing useful”. |
| review · decision | 6 · 2 | A model's proposal waiting for you, and your verdict on it. |
| total | 226 |
Eleven of the thirteen refusals were a single agent asking for the same page again and again until the run was stopped.7
The more useful failure was quieter. Asked which local embedding model fits a Mac, the agent found a real sentence and quoted it correctly.8 The note that was approved from it says something else: the most suitable local embedding model for a Mac.9 Best balance is not most suitable. The gate proves a quote exists; it cannot prove the claim follows from it. That is the entailment verifier's job, and in this lobby it was switched off.
Reading
The papers Hotel leans on, and where.10
| paper | where Hotel uses it | source |
|---|---|---|
| Evaluating Verifiability in Generative Search Engines | Why the gate exists. | Liu, Zhang, Liang · 2023 arXiv:2304.09848 |
| Reciprocal Rank Fusion outperforms Condorcet and individual rank learning methods | Merging Exa, Parallel, bm25 and dense results into one list.10 | Cormack, Clarke, Buettcher · SIGIR 2009 10.1145/1571941.1572114 |
| EmbeddingGemma: Powerful and Lightweight Text Representations | The local embedder behind lobby and RAG search. | Schechter Vera et al. · 2025 arXiv:2509.20354 |
Hotel runs in your terminal and needs Python 3.12 or later and git. Install it yourself, or let your agent do it.
git clone https://github.com/Desto2000/hotel.git && cd hotel scripts/install.sh ~/lobby hotel
# PowerShell: ./scripts/install.ps1 -LobbyDir ~\lobby