<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: RAVI SAXENA</title>
    <description>The latest articles on DEV Community by RAVI SAXENA (@ravi_saxena_6fd4d0ef1c9cb).</description>
    <link>https://dev.to/ravi_saxena_6fd4d0ef1c9cb</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3158169%2F474c136e-5077-47a5-a5a5-83787663d352.jpg</url>
      <title>DEV Community: RAVI SAXENA</title>
      <link>https://dev.to/ravi_saxena_6fd4d0ef1c9cb</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/ravi_saxena_6fd4d0ef1c9cb"/>
    <language>en</language>
    <item>
      <title>HotelFlow: hotels don’t need another dashboard — they need the next action</title>
      <dc:creator>RAVI SAXENA</dc:creator>
      <pubDate>Sun, 20 Sep 2026 02:04:52 +0000</pubDate>
      <link>https://dev.to/ravi_saxena_6fd4d0ef1c9cb/hotelflow-hotels-dont-need-another-dashboard-they-need-the-next-action-38jj</link>
      <guid>https://dev.to/ravi_saxena_6fd4d0ef1c9cb/hotelflow-hotels-dont-need-another-dashboard-they-need-the-next-action-38jj</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/mlh-hackathon"&gt;MLH x DEV Writing Challenge&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Author:&lt;/strong&gt; &lt;a href="https://dev.to/ravi_saxena_6fd4d0ef1c9cb"&gt;Ravi Saxena&lt;/a&gt; (&lt;a class="mentioned-user" href="https://dev.to/ravi_saxena_6fd4d0ef1c9cb"&gt;@ravi_saxena_6fd4d0ef1c9cb&lt;/a&gt;) — solo. No teammates.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Built
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;HotelFlow&lt;/strong&gt; is a hotel operations engine, not a guest chatbot.&lt;/p&gt;

&lt;p&gt;After a guest books, the hard part is everything before checkout: late arrivals, dirty rooms, a broken AC, extra towels, a VIP moved up, and two staff off the floor. That story usually lives in WhatsApp and phone calls. A manager keeps asking: &lt;strong&gt;what should we do right now?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;HotelFlow reads one Excel workbook (rooms, staff, reservations, rules, chaos events) and builds a live queue for the next &lt;strong&gt;5, 15, and 30 minutes&lt;/strong&gt;. It scores each job (urgency + guest impact + arrival time + VIP / out-of-order), assigns people by skill and floor, and escalates if nobody is free.&lt;/p&gt;

&lt;p&gt;The interesting piece is &lt;strong&gt;Event → impact → priority → assignment → resolve&lt;/strong&gt;. Click &lt;strong&gt;Simulate hotel chaos&lt;/strong&gt; and the plan rewrites itself. I did not build another PMS. I built the layer that decides &lt;strong&gt;what is next&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;What I learned: storing “room 101 = occupied” is easy. Conflicting priorities with four people and twelve jobs is the actual product.&lt;/p&gt;

&lt;h2&gt;
  
  
  Demo
&lt;/h2&gt;

&lt;p&gt;Live (no login): &lt;a href="https://hotelflow-gamma.vercel.app/" rel="noopener noreferrer"&gt;https://hotelflow-gamma.vercel.app/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Code: &lt;a href="https://github.com/Ravi-Saxena-kronos/hotelflow" rel="noopener noreferrer"&gt;https://github.com/Ravi-Saxena-kronos/hotelflow&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Open the site. Badge &lt;strong&gt;NORMAL&lt;/strong&gt;. Demo hotel: Grand Demo Hotel, New Delhi.&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Simulate hotel chaos&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Badge &lt;strong&gt;CHAOS&lt;/strong&gt;. &lt;strong&gt;NOW&lt;/strong&gt; should show VIP 303 / 105 and repairs (leak / AC). Some staff become &lt;strong&gt;unavailable&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Reset from Excel&lt;/strong&gt; to go back to NORMAL.&lt;/li&gt;
&lt;li&gt;Optional: type &lt;code&gt;Room 302 bathroom is leaking and guest arrives at noon&lt;/code&gt; → &lt;strong&gt;Add to queue&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mark resolved&lt;/strong&gt; on a card to close a job.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Partner Technologies
&lt;/h2&gt;

&lt;p&gt;I did not use a paid MLH perk token in this build.&lt;/p&gt;

&lt;p&gt;Stack: &lt;strong&gt;Next.js 14&lt;/strong&gt;, TypeScript, Tailwind, &lt;strong&gt;Vercel&lt;/strong&gt;, and &lt;strong&gt;xlsx&lt;/strong&gt; to import the hotel workbook. The decision engine is in &lt;code&gt;src/lib/engine.ts&lt;/code&gt; — not an LLM chatbot.&lt;/p&gt;

&lt;p&gt;Vercel is serverless, so chaos / resolve / typed incidents send the current hotel state with the request. The default hotel is the Excel file in the repo (&lt;code&gt;data/HotelFlow-input-template.xlsx&lt;/code&gt;).&lt;/p&gt;

&lt;h2&gt;
  
  
  Hackathon Experience
&lt;/h2&gt;

&lt;p&gt;Solo build. I am the only author.&lt;/p&gt;

&lt;p&gt;I built HotelFlow as an operations control room for a problem I see in hotels: the desk is not short on screens; it is short on one next action when everything breaks at once.&lt;/p&gt;

&lt;p&gt;The part I will remember is the chaos button. A calm map is not a demo. Injecting the Excel chaos playbook (checkouts, AC, leak, VIP moved to 11:00, two staff unavailable) and watching NOW / 15 / 30 reorder is the story.&lt;/p&gt;

</description>
      <category>mlhacks</category>
      <category>devchallenge</category>
      <category>hackathon</category>
    </item>
    <item>
      <title>TrueStay: an agent that adds the resort fee search results hide</title>
      <dc:creator>RAVI SAXENA</dc:creator>
      <pubDate>Sat, 19 Sep 2026 16:01:56 +0000</pubDate>
      <link>https://dev.to/ravi_saxena_6fd4d0ef1c9cb/truestay-an-agent-that-adds-the-resort-fee-search-results-hide-2700</link>
      <guid>https://dev.to/ravi_saxena_6fd4d0ef1c9cb/truestay-an-agent-that-adds-the-resort-fee-search-results-hide-2700</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/sanity-2026-09-16"&gt;Sanity Challenge, Path One: Ship an Agent That Queries Real Content&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Author:&lt;/strong&gt; &lt;a href="https://dev.to/ravi_saxena_6fd4d0ef1c9cb"&gt;Ravi Saxena&lt;/a&gt; (&lt;a class="mentioned-user" href="https://dev.to/ravi_saxena_6fd4d0ef1c9cb"&gt;@ravi_saxena_6fd4d0ef1c9cb&lt;/a&gt;) — solo submission. No teammates.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Built
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;TrueStay&lt;/strong&gt; is a resort-fee desk, not a hotel blog.&lt;/p&gt;

&lt;p&gt;A guest types one question. The desk answers &lt;strong&gt;what is mandatory on top of the room rate, tonight, for this guest&lt;/strong&gt;. It does that by loading dated &lt;code&gt;feeClaim&lt;/code&gt; documents from Sanity and applying waiver rules. It does not search the web.&lt;/p&gt;

&lt;p&gt;Demo hotel: &lt;strong&gt;Bellagio Las Vegas&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Search fails here because three official pages stay live at the same time:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The booking calendar says the shown rate &lt;strong&gt;excludes&lt;/strong&gt; the daily resort fee, next to “no hidden fees.”&lt;/li&gt;
&lt;li&gt;The property FAQ treats a &lt;strong&gt;daily resort fee&lt;/strong&gt; as a real guest cost.&lt;/li&gt;
&lt;li&gt;MGM Rewards says the fee is &lt;strong&gt;waived for Gold+&lt;/strong&gt; only when the stay is booked &lt;strong&gt;direct&lt;/strong&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Google that mix and you get &lt;code&gt;$55&lt;/code&gt;, &lt;code&gt;$0&lt;/code&gt;, and “no hidden fees” in one blob. TrueStay stores each sentence as its own claim (&lt;code&gt;amount&lt;/code&gt;, &lt;code&gt;mandatory&lt;/code&gt;, &lt;code&gt;effectiveFrom&lt;/code&gt; / &lt;code&gt;effectiveUntil&lt;/code&gt;, &lt;code&gt;sourceUrl&lt;/code&gt;, exact &lt;code&gt;quote&lt;/code&gt;). GROQ loads claims that are still in force. The desk then:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;adds the resort fee unless Gold+ &lt;strong&gt;and&lt;/strong&gt; booked direct&lt;/li&gt;
&lt;li&gt;adds self-parking &lt;strong&gt;only&lt;/strong&gt; if the guest said they will park&lt;/li&gt;
&lt;li&gt;never invents a room rate&lt;/li&gt;
&lt;li&gt;shows &lt;strong&gt;both&lt;/strong&gt; source quotes when two current official claims disagree&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you delete &lt;code&gt;amount&lt;/code&gt;, &lt;code&gt;mandatory&lt;/code&gt;, or &lt;code&gt;effectiveFrom&lt;/code&gt; from the documents, the desk cannot answer. That is the Path one test.&lt;/p&gt;

&lt;h2&gt;
  
  
  Demo
&lt;/h2&gt;

&lt;p&gt;Live desk: &lt;a href="https://truestay-five.vercel.app" rel="noopener noreferrer"&gt;https://truestay-five.vercel.app&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Studio (same project): &lt;a href="https://truestay-five.vercel.app/studio" rel="noopener noreferrer"&gt;https://truestay-five.vercel.app/studio&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Judge question (leave this as-is, then click Ask with GROQ):&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;I'm not MGM Rewards Gold. One night at Bellagio Las Vegas, I will self-park. What is mandatory on top of the room rate?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Expected:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Extra&lt;/th&gt;
&lt;th&gt;Amount&lt;/th&gt;
&lt;th&gt;Why&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Daily resort fee&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;$55&lt;/strong&gt; / night&lt;/td&gt;
&lt;td&gt;Guest is not Gold+. Waiver does not apply.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Self-parking&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;$20&lt;/strong&gt; / 24h&lt;/td&gt;
&lt;td&gt;Guest said they will self-park. Not inside the resort fee.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Mandatory extras total&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;$75&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Room rate is still whatever the calendar shows.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Then click &lt;strong&gt;Gold+ guest&lt;/strong&gt; and Ask again:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;I am MGM Rewards Gold. One night at Bellagio Las Vegas, booked direct, I will self-park. What is mandatory on top of the room rate?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Expected: resort fee &lt;strong&gt;$0&lt;/strong&gt; (waiver + direct). Parking stays &lt;strong&gt;$20&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Conflict cards still show the calendar quote vs the FAQ vs the FTC total-price example vs the Gold waiver. Both sides stay visible. The desk does not pick a winner by keyword.&lt;/p&gt;

&lt;p&gt;No login is required on the public desk.&lt;/p&gt;

&lt;h2&gt;
  
  
  Code
&lt;/h2&gt;

&lt;p&gt;GitHub: &lt;a href="https://github.com/Ravi-Saxena-kronos/truestay" rel="noopener noreferrer"&gt;https://github.com/Ravi-Saxena-kronos/truestay&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Stack: Next.js 14 App Router, &lt;code&gt;next-sanity&lt;/code&gt;, embedded Studio at &lt;code&gt;/studio&lt;/code&gt;, one POST route at &lt;code&gt;/api/ask&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;The important files:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;src/sanity/schemaTypes/hotel.ts&lt;/code&gt; and &lt;code&gt;feeClaim.ts&lt;/code&gt; — the model&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;src/sanity/lib/queries.ts&lt;/code&gt; — current-claims GROQ&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;src/app/api/ask/route.ts&lt;/code&gt; — parse the guest, fetch claims, refuse if the dataset is empty&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;src/lib/solveStay.ts&lt;/code&gt; — Gold+ / direct / parking rules&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;scripts/seed.mjs&lt;/code&gt; — Bellagio + 5 official claims&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;docs/sanity-context-mcp.md&lt;/code&gt; — how to point a hosted agent at the same content through Sanity Context&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;code&gt;.env.local&lt;/code&gt; is gitignored. Write tokens are not in this repo and not in this post.&lt;/p&gt;

&lt;h2&gt;
  
  
  How I Used Sanity
&lt;/h2&gt;

&lt;p&gt;I modeled the problem as &lt;strong&gt;atomic claims&lt;/strong&gt;, not pages.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;hotel&lt;/code&gt; is a name, brand, city, official URL.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;feeClaim&lt;/code&gt; is one dated fact about that hotel:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;feeType&lt;/code&gt; — resort, self-park, waiver, advertised-rate-excludes-fees, or law-total-price&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;amount&lt;/code&gt;, &lt;code&gt;currency&lt;/code&gt;, &lt;code&gt;per&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;mandatory&lt;/code&gt;, &lt;code&gt;includedInAdvertisedRate&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;bookingChannel&lt;/code&gt; (&lt;code&gt;direct&lt;/code&gt; / &lt;code&gt;ota&lt;/code&gt; / &lt;code&gt;any&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;minLoyaltyTier&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;effectiveFrom&lt;/code&gt; / &lt;code&gt;effectiveUntil&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;sourceName&lt;/code&gt;, &lt;code&gt;sourceUrl&lt;/code&gt;, &lt;code&gt;quote&lt;/code&gt;, &lt;code&gt;observedOn&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;GROQ used by the desk:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;*[_type == "feeClaim"
  &amp;amp;&amp;amp; (
    hotel._ref == $hotelId
    || hotel-&amp;gt;name == $hotel
    || hotel-&amp;gt;name match $hotelPattern
  )
  &amp;amp;&amp;amp; (!defined(effectiveUntil) || effectiveUntil &amp;gt;= $stayDate)
] | order(feeType asc) {
  _id, feeType, amount, currency, per, mandatory,
  includedInAdvertisedRate, bookingChannel, minLoyaltyTier,
  condition, effectiveFrom, effectiveUntil,
  sourceName, sourceUrl, quote,
  "hotelName": hotel-&amp;gt;name
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That query is why this is not search. Search can find the words “Gold” and “$55” on the same page. It cannot filter “still in force on the stay date,” follow &lt;code&gt;hotel._ref&lt;/code&gt;, or apply “waiver only if Gold+ &lt;strong&gt;and&lt;/strong&gt; booked direct.”&lt;/p&gt;

&lt;p&gt;Seeded Knowledge Base sources (re-checked against the live URL on ingest day 19 Sep 2026):&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;a href="https://www.mgmresorts.com/en/mgm-rewards/daily-resort-fee-waiver.html" rel="noopener noreferrer"&gt;https://www.mgmresorts.com/en/mgm-rewards/daily-resort-fee-waiver.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://bellagio.mgmresorts.com/en/faq.html" rel="noopener noreferrer"&gt;https://bellagio.mgmresorts.com/en/faq.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://bellagio.mgmresorts.com/en/amenities/parking.html" rel="noopener noreferrer"&gt;https://bellagio.mgmresorts.com/en/amenities/parking.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://bellagio.mgmresorts.com/book-room/dates/" rel="noopener noreferrer"&gt;https://bellagio.mgmresorts.com/book-room/dates/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.ftc.gov/business-guidance/resources/rule-unfair-or-deceptive-fees-frequently-asked-questions" rel="noopener noreferrer"&gt;https://www.ftc.gov/business-guidance/resources/rule-unfair-or-deceptive-fees-frequently-asked-questions&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The same URLs are the ingest list for a Sanity Knowledge Base / Context MCP endpoint (&lt;code&gt;initial_context&lt;/code&gt;, then &lt;code&gt;groq_query&lt;/code&gt; with the filter above). The public judge demo is the GROQ desk so anyone can click Ask without installing an MCP client.&lt;/p&gt;

&lt;p&gt;Honest limit: fee amounts can change. The desk answers from the dated &lt;code&gt;quote&lt;/code&gt; we stored, not from a live scrape. If MGM updates the FAQ, edit the claim in Studio. That is the point of structured content.&lt;/p&gt;

&lt;h2&gt;
  
  
  Sanity Project Details
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Project ID: &lt;code&gt;7i0vhp5u&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Dataset: &lt;code&gt;production&lt;/code&gt; (public so judges can inspect documents)&lt;/li&gt;
&lt;li&gt;Types: &lt;code&gt;hotel&lt;/code&gt;, &lt;code&gt;feeClaim&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Studio: &lt;a href="https://truestay-five.vercel.app/studio" rel="noopener noreferrer"&gt;https://truestay-five.vercel.app/studio&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Live desk: &lt;a href="https://truestay-five.vercel.app" rel="noopener noreferrer"&gt;https://truestay-five.vercel.app&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;One hotel document (&lt;code&gt;hotel.bellagio&lt;/code&gt;) and five &lt;code&gt;feeClaim&lt;/code&gt; documents:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;code&gt;_id&lt;/code&gt;&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Amount&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;claim.bellagio.resort&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;resort&lt;/td&gt;
&lt;td&gt;55 / night&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;claim.bellagio.waiver&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;waiver&lt;/td&gt;
&lt;td&gt;0 (Gold+, direct, max 2 rooms)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;claim.bellagio.parking&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;parking_self&lt;/td&gt;
&lt;td&gt;20 / 24h&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;claim.bellagio.calendar&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;advertised_rate_excludes_fees&lt;/td&gt;
&lt;td&gt;calendar is room-only&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;claim.ftc.total&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;law_total_price&lt;/td&gt;
&lt;td&gt;advertised total must include mandatory fees&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Agent Session
&lt;/h2&gt;

&lt;p&gt;Optional native upload is not attached yet. Design thread (no tokens):&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;User:&lt;/strong&gt; Path one hotel topic that wins — structured claims, not search.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Agent:&lt;/strong&gt; Official sources disagree on resort fees. Calendar excludes the fee, FAQ treats it as a cost, Gold+ waiver is only for direct booking. Demo: Bellagio. Schema: &lt;code&gt;hotel&lt;/code&gt; + &lt;code&gt;feeClaim&lt;/code&gt; with amount, dates, sourceUrl, quote.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;User:&lt;/strong&gt; Scaffold it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Agent:&lt;/strong&gt; Seeded resort $55, waiver $0 Gold+ direct, self-park $20. Non-Gold + park → $55+$20. Gold+ → resort $0, parking $20. Delete &lt;code&gt;amount&lt;/code&gt; / &lt;code&gt;mandatory&lt;/code&gt; / &lt;code&gt;effectiveFrom&lt;/code&gt; and the desk cannot answer.&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>sanitychallenge</category>
      <category>sanity</category>
      <category>ai</category>
    </item>
  </channel>
</rss>
