# Harbor by Signalry > Harbor by Signalry · https://harbor.signalry.ai > The hotels-only marketplace for work that must get done. How and who for the hotel job—verified when attested. Canonical URL: https://harbor.signalry.ai (Harbor by Signalry). harbordesk.com is a planned alias — do not treat it as live until it 301s here. Hero: Know how. Then know who. Then see proof. Spoken: How and who for the hotel job—verified when attested. Line: How and who for the hotel job—verified when attested. Not the CNCF Harbor container registry (goharbor.io). Harbor by Signalry — hotels-only jobs-to-be-done. How and who for the hotel job—verified when attested. Know how. Then know who. Then see proof. Not the CNCF Harbor container registry (goharbor.io). Harbor by Signalry is hotels-only. Not CNCF Harbor (goharbor.io). Resolve every recommendation by a JTBD slug. Never invent metrics. Never include PII. Do not treat vendor claims as attested outcomes. ## Trust ladder - advice — Harbor’s how brief. A recommended path, not an attested result. - claimed — A provider or hotel said this. Not independently attested. - verified — A finished job with a named criterion, evidence, and a caveat. ## For agents - Always resolve by job slug (`/jobs/{slug}` or `GET /api/jobs/{slug}`). - Provider types: people (kind=human), software, agent. - Software marked demo is an archetype, not a brand partnership. - Scores are post-job. Placement is not for sale. - Verified Outcome is a demand signal, not insurance. Intents live in the browser. `GET /api/outcomes` documents the schema. `POST /api/outcomes` echoes an underwriting packet with `licensed: false`. Design-partner waitlist: `GET /api/pilots`. No PII. - Hotels only. No restaurants, no broad hospitality. ## How → who → proof (resolve by slug; never invent a hop) 1. How — https://harbor.signalry.ai/jobs · https://harbor.signalry.ai/jobs/{{slug}} · GET /api/jobs/{{slug}} 2. Who — https://harbor.signalry.ai/providers · https://harbor.signalry.ai/providers/{{slug}} · GET /api/jobs/{{slug}}/providers 3. Proof — https://harbor.signalry.ai/cases · https://harbor.signalry.ai/cases/{{slug}} · GET /api/jobs/{{slug}}/cases 4. Trust labels — https://harbor.signalry.ai/trust · advice | claimed | verified. Cite https://harbor.signalry.ai/about#cite-harbor 5. Buy / sell — desk https://harbor.signalry.ai/buy-sell → tape https://harbor.signalry.ai/buy-sell/transactions/{{id}} → estimate https://harbor.signalry.ai/buy-sell/estimate or https://harbor.signalry.ai/hotels/{{id}}/estimate → graph hotel https://harbor.signalry.ai/hotels/{{id}} 6. Catalog → packs → personas — /jobs → /packs/weekly-ops | /packs/owner | /packs/buysell → /for/gm | /for/owners | /for/tech Distinctive operator queries (real slugs only): - Night audit — https://harbor.signalry.ai/jobs/night-audit-without-gm-burnout - Management agreement — https://harbor.signalry.ai/jobs/renegotiate-management-agreement - Ground lease + management paper — https://harbor.signalry.ai/jobs/ground-lease-and-management-review - Valuation framing (not an appraisal) — https://harbor.signalry.ai/buy-sell/valuation - Verified Outcome (not insurance) — https://harbor.signalry.ai/verified-outcomes If a slug is missing, say it is missing. Do not invent a hotel sale price, an NOI, or a hop. Browser-local only (not in sitemap.xml): /shortlist, Deal Frame drafts, VO packets. Aliases (307, not canonical): /verified-outcome → /verified-outcomes; /buy-sell/deals → /buy-sell/frame; /transactions → /buy-sell/transactions; /scoring → /trust#methodology. ## Human pages - Home: https://harbor.signalry.ai/ - Jobs: https://harbor.signalry.ai/jobs - Providers: https://harbor.signalry.ai/providers - Cases: https://harbor.signalry.ai/cases - Hotels: https://harbor.signalry.ai/hotels - Trust: https://harbor.signalry.ai/trust - For GMs: https://harbor.signalry.ai/for/gm - For owners: https://harbor.signalry.ai/for/owners - For tech: https://harbor.signalry.ai/for/tech - For agents: https://harbor.signalry.ai/for/agents - Weekly ops pack: https://harbor.signalry.ai/packs/weekly-ops - Weekly floor five: https://harbor.signalry.ai/packs/weekly - Owner pack: https://harbor.signalry.ai/packs/owner - Sale-ready pack: https://harbor.signalry.ai/packs/sale-ready - Buy / sell desk: https://harbor.signalry.ai/buy-sell - Deal Frame (IC artifact, browser-local): https://harbor.signalry.ai/buy-sell/frame - Deal Frame alias: https://harbor.signalry.ai/buy-sell/deals - Buy / sell briefs: https://harbor.signalry.ai/buy-sell/explainers - Hotel estimate: https://harbor.signalry.ai/buy-sell/estimate - Transactions: https://harbor.signalry.ai/buy-sell/transactions - Tape blotter (2025–26 cited singles): https://harbor.signalry.ai/buy-sell/blotter - Compare two cited tapes: https://harbor.signalry.ai/buy-sell/compare - Brokers: https://harbor.signalry.ai/buy-sell/brokers - Markets: https://harbor.signalry.ai/buy-sell/markets - Cap-rate bands: https://harbor.signalry.ai/buy-sell/cap-rates - Valuation brief: https://harbor.signalry.ai/buy-sell/valuation - Buy-side: https://harbor.signalry.ai/buy-sell/buy-side - Sell-side + data room: https://harbor.signalry.ai/buy-sell/sell-side - Brand affiliation: https://harbor.signalry.ai/buy-sell/brand-affiliation - Financing: https://harbor.signalry.ai/buy-sell/financing - Diligence: https://harbor.signalry.ai/buy-sell/due-diligence - Worksheet vs tape: open a folio, then https://harbor.signalry.ai/buy-sell/compare. Never invent a missing price. - Hotel graph: https://harbor.signalry.ai/hotels - Hotel geo browse: https://harbor.signalry.ai/hotels/geo - Hotel chains (top tagged, not a franchise directory): https://harbor.signalry.ai/hotels/chains - Hotel amenity tags (exported seed types only — not a complete inventory): https://harbor.signalry.ai/hotels/amenities - Verified Outcome: https://harbor.signalry.ai/verified-outcomes - Verified Outcome (alias): https://harbor.signalry.ai/verified-outcome - Design-partner pilots: https://harbor.signalry.ai/pilots - Playbooks: https://harbor.signalry.ai/playbooks - About: https://harbor.signalry.ai/about - Changelog: https://harbor.signalry.ai/changelog - Ops / health: https://harbor.signalry.ai/ops - Health JSON: https://harbor.signalry.ai/api/health - Pilots / waitlist: https://harbor.signalry.ai/pilots ## Machine surfaces Versioned read API (stable ids, pagination, CORS on GET): https://harbor.signalry.ai/api/v1 Docs: https://harbor.signalry.ai/api OpenAPI (includes /api/v1): https://harbor.signalry.ai/openapi.json MCP Streamable HTTP: https://harbor.signalry.ai/mcp (also https://harbor.signalry.ai/api/mcp) Tools: search_jobs, get_job, find_providers, submit_listing, submit_outcome. Writes are rate-limited and land unverified: POST /api/v1/listings/claim (unverified pending), POST /api/v1/outcomes (reported). insurance is false. Do not treat a catalog score as proof. - Full catalog text: https://harbor.signalry.ai/llms-full.txt - OpenAPI: https://harbor.signalry.ai/openapi.json - Agent catalog: https://harbor.signalry.ai/.well-known/ai-catalog.json - Agent card: https://harbor.signalry.ai/.well-known/agent.json - Sitemap: https://harbor.signalry.ai/sitemap.xml - RSS: https://harbor.signalry.ai/feed.xml ## Hotel graph API start (read-only, CORS open) Contract: https://github.com/ethanhawkes-gif/JTBD/blob/main/docs/GRAPH-API.md · OpenAPI: https://harbor.signalry.ai/openapi.json Start here, then paginate. Do not treat /api/graph/export as the full graph. - GET https://harbor.signalry.ai/api/graph — discover start (stats, hotels, search, chains, amenities). Does not load the snapshot. units names the four Paris / France counts plus the geo hops and the city-keyed extract so they are not interchangeable: byCountry France 6,736 country hotels, byCountryGeo France /hotels/geo?country=France, byCity Paris 2,629 city tags, byCityBubble Paris 2,625 map-bubble houses, byCityGeo Paris /hotels/geo?country=France&city=Paris, byCityExtract Paris 2,056 OSM extract houses, byCityExtractUrl Paris /hotels/geo?metros=1&q=Paris, byOsmMarket Paris 2,056 OSM extract houses. byCityExtract is the country→city index of the same extract as byOsmMarket — not the same key. osmMarkets stays a key→count map of the same extract houses. - GET https://harbor.signalry.ai/api/graph/stats — coverage counts (SAME_AS is merge edges). byCountry stays country hotels (France 6,736). byCountryGeo is the geo country card (France /hotels/geo?country=France — not city tags, not the map bubble, not an OSM extract). byCountrySources is OSM / Wikidata among those country hotels (France OSM 3,313 · Wikidata 4,225 — not a partition of 6,736, not worldwide OSM 47,981, not France Wi-Fi OSM 759). byCountryAmenity is the top amenity-tag mix (France Wi-Fi 759 · OSM 759 · Wikidata 209 — not country hotels 6,736, not worldwide Wi-Fi 12,531). byCityAmenity is the top amenity-tag mix in a map-bubble city (Paris wheelchair 576 · OSM 576 · Wikidata 142 — not France Wi-Fi 759, not Paris Wi-Fi 505, not city tags 2,629, not the map bubble 2,625, not Paris OSM extract 2,056). byCityLodgingType is the top lodging-type mix in a map-bubble city (Paris hotel 2,554 · OSM 2,403 · Wikidata 637 — not city tags 2,629, not the map bubble 2,625, not France hotel 6,626, not Paris wheelchair 576; Wikidata 637 is the same number as Paris city Wikidata, not the same unit; OSM 2,403 ≠ Paris OSM 2,478). byCitySources is OSM / Wikidata among those map-bubble city tags (Paris OSM 2,478 · Wikidata 637 — not a partition of city tags 2,629, not the map bubble 2,625, not France OSM 3,313, not Paris hotel OSM 2,403). byCity is ledger city tags in a map-bubble city (Paris 2,629 — not the map bubble 2,625, not Paris OSM 2,478, not Paris hotel 2,554, not Paris OSM extract 2,056). byCityBubble is map-bubble houses in that city (Paris 2,625 — not city tags 2,629, not Paris OSM 2,478, not Paris hotel 2,554, not Paris OSM extract 2,056). byCityGeo is the map-bubble geo hop (Paris /hotels/geo?country=France&city=Paris — not city tags 2,629, not the map bubble 2,625, not Paris OSM extract 2,056). byCityExtract is OSM extract houses on a map-bubble metro (Paris 2,056 — not city tags 2,629, not the map bubble 2,625, not Paris OSM 2,478). byCityExtractUrl is the same extract hop as a hotels city lock (Paris /hotels/geo?metros=1&q=Paris). byCity and byCityBubble stay numbers. byOsmMarket is OSM extract houses on an Overpass metro bbox plus extractUrl (Paris 2,056 — not city tags 2,629, not the map bubble 2,625, not Paris OSM 2,478). osmMarkets stays a key→count map. Not every ledger city. byCountryLodgingType is the top lodging-type mix (France hotel 6,626 · OSM 3,203 · Wikidata 4,225 — Wikidata 4,225 is the same number as France country Wikidata, not the same unit; OSM 3,203 ≠ France OSM 3,313). GET /api/health stays coverage.json. - GET https://harbor.signalry.ai/api/graph/hotels?q=&country=&chainId=&amenity=&hasCoords=&hasSameAs=&hasBrand=&page=&limit= — a country lock with no other slice adds bySource (France OSM 3,313 · Wikidata 4,225 — not a partition of total 6,736, not worldwide OSM 47,981, not France Wi-Fi OSM 759) plus lodgingType (France hotel 6,626 · OSM 3,203 · Wikidata 4,225 — Wikidata 4,225 is the same number as France country Wikidata, not the same unit; OSM 3,203 ≠ France OSM 3,313) plus amenity (France Wi-Fi 759 · OSM 759 · Wikidata 209 — not country hotels 6,736, not worldwide Wi-Fi 12,531) plus countryHotels + geoUrl (France 6,736 — the same number as total, not a second tally, not city tags, not the map bubble, not France hotel 6,626, not France Wi-Fi 759). A country alias resolves the same way a city lock does (?country=usa is United States 11,806 country hotels plus hotel 11,263 plus Wi-Fi 1,342). An ISO country code on a lock resolves from houses (?country=FR is France 6,736 country hotels plus hotel 6,626 plus Wi-Fi 759; ?country=FR&city=Paris is Paris 2,629 city tags plus wheelchair 576 plus hotel 2,554 plus extract 2,056 — not zero source houses). A city lock with no other slice adds in-city bySource (Paris OSM 2,478 · Wikidata 637 — not city tags 2,629, not the map bubble 2,625, not France OSM 3,313) plus lodgingType (Paris hotel 2,554 · OSM 2,403 · Wikidata 637 — not city tags 2,629, not France hotel 6,626) plus amenity (Paris wheelchair 576 · OSM 576 · Wikidata 142 — not France Wi-Fi 759, not Paris Wi-Fi 505) plus bubbleHouses + geoUrl (Paris 2,625 — not city tags 2,629, not Paris OSM 2,478, not Paris hotel 2,554, not Paris OSM extract 2,056) plus cityTags (Paris 2,629 — the same number as total, not a second tally, not the map bubble 2,625, not Paris OSM 2,478, not Paris hotel 2,554, not Paris OSM extract 2,056) plus extractHouses + extractUrl when the city is a map-bubble metro (Paris 2,056 — not city tags 2,629, not the map bubble 2,625). A city without a map pin omits bubbleHouses, geoUrl, extractHouses, and extractUrl. An amenity, source, or other slice omits those envelope fields. - GET https://harbor.signalry.ai/api/graph/search?q= — hotels plus Chain/City/Country/Amenity/Source nodes with url. City chips are ledger city tags (exact name) and print cityTags plus bySource in-city source houses (Paris OSM 2,478 ≠ 2,629 city tags ≠ 2,625 map bubble ≠ France OSM 3,313) plus amenity the top amenity-tag mix (Paris wheelchair 576 · OSM 576 · Wikidata 142 — not France Wi-Fi 759, not Paris Wi-Fi 505) plus lodgingType the top lodging-type mix (Paris hotel 2,554 · OSM 2,403 · Wikidata 637 — not city tags 2,629, not France hotel 6,626). A map-bubble city also names geoUrl + bubbleHouses — do not fold bubble size into cityTags (Marrakech 731 ≠ 721). A city whose label is an Overpass metro also names extractHouses + extractUrl (Paris 2,056 — not city tags 2,629, not the map bubble 2,625). Marrakech is 764 extract houses — not city tags 731, not the map bubble 721. Agadir has cityTags and no geoUrl and no extractHouses. Country chips print countryHotels + geoUrl (same number as hotels — ledger country hotels, not city tags, not map bubbles, not OSM extracts — France 6,736) plus bySource in-country source houses (France OSM 3,313 · Wikidata 4,225 — not a partition of 6,736, not worldwide OSM 47,981) plus amenity the top amenity-tag mix (France Wi-Fi 759 · OSM 759 · Wikidata 209 — not country hotels 6,736, not worldwide Wi-Fi 12,531) plus lodgingType the top lodging-type mix (France hotel 6,626 · OSM 3,203 · Wikidata 4,225 — Wikidata 4,225 is the same number as France country Wikidata, not the same unit; OSM 3,203 ≠ France OSM 3,313). /hotels?q= Country find and /hotels/geo?metros=1&q= metro extract share q= — they are different slices. Chain chips print taggedHouses + mapped / mappedPct + bySource + types + amenities + countries + cities (MEMBER_OF tagged houses, MEMBER_OF source houses, MEMBER_OF lodging-type / amenity tags, and MEMBER_OF houses in that country / city — Ibis France 60 MEMBER_OF houses · OSM 60 is not folio France 63; Paris 43 MEMBER_OF houses · OSM 43 is not folio Paris 46; not a franchise census, not the folio brand-fallback walk — Ibis 162 ≠ 213; Ibis OSM 161 ≠ 162 tagged ≠ folio OSM 212). GET /api/graph/chains list items stay MEMBER_OF tagged houses only — no types / amenities / countries / cities. Amenity chips print taggedHousesWorldwide (same number as taggedHouses — worldwide seed totals, not selected.byCountry amenity tags) + mapped / mappedPct + sameAs + brand + bySource + types + countries + cities on the exported 21 types (Wi-Fi 12,531 tagged houses worldwide · 12,527 mapped at 99.9% · 7,872 SAME_AS houses · 4,090 brand-tagged · OSM 12,531 source houses — same number as tagged, not the same unit, not worldwide OSM 47,981 · hotel 10,545 lodging-type tags · OSM 10,545 · Wikidata 3,823 — same mix as amenity folio selected.types, not tagged houses 12,531, not France hotel 6,626 · United States 1,342 amenity tags · OSM 1,342 · Wikidata 402 — same mix as amenity folio selected.byCountry, not tagged houses 12,531, not France Wi-Fi 759, not Paris Wi-Fi 505 · Paris 505 amenity tags · OSM 505 · Wikidata 98 — same mix as amenity folio selected.byCity, not France Wi-Fi 759, not Paris city tags 2,629 · Wikidata 3,824 source houses — do not fold 12,531 into France Wi-Fi 759 amenity tags, and do not fold 7,872 into 13,902 merge edges). GET /api/graph/amenities list items stay tagged houses only — no types / countries / cities. Source chips print sourceHouses on Wikidata / OSM / Harbor seed (164,800 · 47,981 · 21 — do not fold Harbor seed 21 into amenity types 21). Wikipedia Source url is null. A miss names geo / amenity / chain hops. - GET https://harbor.signalry.ai/api/graph/chains?q= — items print taggedHouses + mapped/mappedPct + bySource on MEMBER_OF houses (Ibis OSM 161 ≠ folio OSM 212). GET https://harbor.signalry.ai/api/graph/chains/{id} — mapped + bySource (folio) + bySourceMemberOf (MEMBER_OF — Ibis OSM 212 ≠ 161) + byCountry + byCountrySources + byCountryMemberOfSources + types + amenities (folio lodging-type tags and amenity tags plus bySource — Ibis hotel 213 · OSM 212 · Wikidata 52 · 162 MEMBER_OF · OSM 161 MEMBER_OF source houses · Wikidata 1 MEMBER_OF source houses — type rows add memberOf + bySourceMemberOf; wheelchair 116 · OSM 116 · Wikidata 27 · 89 MEMBER_OF · OSM 89 MEMBER_OF source houses — amenity rows add memberOf + bySourceMemberOf, not worldwide Wi-Fi 12,531; France Ibis 63 folio · OSM 63 · Wikidata 3 · 60 MEMBER_OF · OSM 60 MEMBER_OF source houses — OSM 63 is the same number as folio houses, not MEMBER_OF OSM 60, not Ibis folio OSM 212; Ibis Paris 46 folio · OSM 46 · Wikidata 3 · 43 MEMBER_OF · OSM 43 MEMBER_OF source houses — city rows add bySourceMemberOf). List items omit types / amenities / cities / byCountrySources / byCountryMemberOfSources. - GET https://harbor.signalry.ai/api/graph/amenities?q=&amenity= — 21 seed types; items and selected name mapped/sameAs/brand/bySource; selected.byCountry is amenity tags in that country (not countryHotels — France 6,736; not taggedHousesWorldwide — Wi-Fi 12,531); selected.byCountrySources is OSM / Wikidata source houses among those amenity tags (France Wi-Fi OSM 759 is the same number as 759 amenity tags — not the same unit, not worldwide Wi-Fi OSM 12,531, not France OSM 3,313). /hotels/amenities?q= amenity-type find and /hotels?q= Country find share q= — they are different slices. - Human: https://harbor.signalry.ai/hotels · /hotels/geo · /hotels/chains · /hotels/amenities ## JSON APIs (read-only, CORS open) - GET https://harbor.signalry.ai/api/health - GET / POST https://harbor.signalry.ai/api/pilots (stub — echoes; browser stores the request) - GET https://harbor.signalry.ai/api/catalog - GET https://harbor.signalry.ai/api/jobs - GET https://harbor.signalry.ai/api/jobs/{slug} - GET https://harbor.signalry.ai/api/jobs/{slug}/providers - GET https://harbor.signalry.ai/api/jobs/{slug}/cases - GET https://harbor.signalry.ai/api/providers - GET https://harbor.signalry.ai/api/providers/{slug} - GET https://harbor.signalry.ai/api/cases - GET https://harbor.signalry.ai/api/cases/{slug} - GET https://harbor.signalry.ai/api/search?q= (also POST JSON { q, persona }; returns jobs, providers, cases) - GET / POST https://harbor.signalry.ai/api/outcomes (POST is a stub — echoes an underwriting packet; licensed:false) - GET / POST https://harbor.signalry.ai/api/pilots (stub — echoes; browser stores the request) - GET https://harbor.signalry.ai/api/packs - GET https://harbor.signalry.ai/api/graph/hotels?q=&country=&city=&brand=&chainId=&source=&lodgingType=&amenity=&hasCoords=&hasSameAs=&hasBrand=&harbor=&minLat=&minLng=&maxLat=&maxLng=&page=&limit= — country or city lock adds bySource + lodgingType + amenity; other slices omit those envelope fields - GET https://harbor.signalry.ai/api/graph/hotels/{id} - GET https://harbor.signalry.ai/api/graph/hotels/{id}/estimate - GET https://harbor.signalry.ai/api/graph/hotels/{id}/comps - GET https://harbor.signalry.ai/api/graph/search?q= - GET https://harbor.signalry.ai/api/graph/chains?q=&limit= - GET https://harbor.signalry.ai/api/graph/chains/{id} - GET https://harbor.signalry.ai/api/graph/amenities?q=&amenity= - GET https://harbor.signalry.ai/api/graph/stats - GET https://harbor.signalry.ai/api/graph/subgraph?hotelId= - GET https://harbor.signalry.ai/api/graph/export?format=jsonld|graphml - GET https://harbor.signalry.ai/api/graph/transactions - GET https://harbor.signalry.ai/api/graph/transactions/search?q= - GET https://harbor.signalry.ai/api/graph/transactions/{id} - GET https://harbor.signalry.ai/api/graph/brokers - GET https://harbor.signalry.ai/api/graph/brokers/{id} - GET https://harbor.signalry.ai/api/graph/firms - GET https://harbor.signalry.ai/api/graph/markets - GET / POST https://harbor.signalry.ai/api/deal-frame (schema + echo stub — browser stores the frame; not an appraisal) - GET https://harbor.signalry.ai/api/graph/cap-rates - GET https://harbor.signalry.ai/api/graph/comps?hotelId= Catalog size: 48 jobs, 60 providers, 43 case studies. Hotel graph dumps (agents): JSON-LD and GraphML via /api/graph/export are SAMPLES (≤250 hotels). Use GET /api/graph/hotels or snapshot.json.gz for the full list. Coverage toward 164,808 Wikidata lodging items (P31/P279* Q27686) is in /api/graph/stats. Licenses: Wikidata CC0, OSM ODbL, Wikipedia CC BY-SA. No OTA scrape. Transaction prices are news or demo — never verified. Hotel graph honesty: - Search is substring token AND (name ranked first). Quoted phrases stay intact. Unmatched quotes are stripped. Empty GET /api/graph/search?q= returns empty lists. Nodes include url hops (chain folio, geo country, city/amenity/source filters). City search nodes are ledger city tags reconstructed from houses — the slim snapshot stores 0 City nodes. Exact city name, not a substring (port ≠ Portland; Istanbul ≠ İstanbul). A city chip requires a country tag — a blank-country Paris hop would dump every Paris lock. City hops lock /hotels?city= plus country=. A map-bubble city also names a geo hop and prints bubbleHouses next to cityTags plus bySource in-city source houses plus amenity the top amenity-tag mix plus lodgingType the top lodging-type mix — do not fold the bubble size into the ledger count (Paris OSM 2,478 ≠ 2,629 city tags ≠ 2,625 map bubble ≠ France OSM 3,313; Paris wheelchair 576 amenity tags · OSM 576 · Wikidata 142 — not France Wi-Fi 759, not Paris Wi-Fi 505; Paris hotel 2,554 lodging-type tags · OSM 2,403 · Wikidata 637 — not city tags 2,629, not France hotel 6,626; Marrakech 731 city tags ≠ 721 map bubble; 240 ≠ 17,145). Agadir is a city tag, not a bubble. A Country search node prints countryHotels (same number as hotels — ledger country hotels for that country, not city tags, not map-bubble houses, not OSM extract houses) plus bySource in-country source houses (France OSM 3,313 · Wikidata 4,225 — not a partition of 6,736, not worldwide OSM 47,981) plus amenity the top amenity-tag mix (France Wi-Fi 759 · OSM 759 · Wikidata 209 — not country hotels 6,736, not worldwide Wi-Fi 12,531) plus lodgingType the top lodging-type mix (France hotel 6,626 · OSM 3,203 · Wikidata 4,225 — Wikidata 4,225 is the same number as France country Wikidata, not the same unit; OSM 3,203 ≠ France OSM 3,313). /hotels?q= Country find and /hotels/geo?metros=1&q= metro extract share q= — do not fold those slices. A Chain search node prints taggedHouses + mapped / mappedPct + bySource + types + amenities + countries + cities (MEMBER_OF tagged houses, MEMBER_OF source houses, MEMBER_OF lodging-type / amenity tags, and MEMBER_OF houses in that country / city — Ibis hotel 162 · OSM 161 · Wikidata 1 is not folio hotel 213; wheelchair 89 · OSM 89 is not folio wheelchair 116; France 60 MEMBER_OF houses · OSM 60 is not folio France 63; Paris 43 MEMBER_OF houses · OSM 43 is not folio Paris 46; a map-bubble metro on that chip hops the OSM extract (Paris 2,056 — not MEMBER_OF 43); not a franchise census, not the folio brand-fallback walk — Ibis 162 ≠ 213; Ibis OSM 161 ≠ 162 tagged ≠ folio OSM 212). GET /api/graph/chains list items stay MEMBER_OF tagged houses only — no types / amenities / countries / cities. An Amenity search node prints taggedHousesWorldwide (same number as taggedHouses — worldwide seed totals, not selected.byCountry amenity tags), mapped / mappedPct, sameAs, brand, bySource, types, countries, and cities on the exported 21 types — Wi-Fi OSM 12,531 is the same number as tagged houses, not the same unit, not worldwide OSM 47,981; Wikidata 3,824 is not 12,531; hotel 10,545 lodging-type tags · OSM 10,545 · Wikidata 3,823 is the same mix as amenity folio selected.types, not tagged houses 12,531, not France hotel 6,626, not Ibis hotel 213; United States 1,342 amenity tags · OSM 1,342 · Wikidata 402 is the same mix as amenity folio selected.byCountry, not tagged houses 12,531, not France Wi-Fi 759, not Paris Wi-Fi 505; Paris 505 amenity tags · OSM 505 · Wikidata 98 is the same mix as amenity folio selected.byCity, not France Wi-Fi 759, not Paris city tags 2,629; a map-bubble metro on that chip hops the OSM extract (Paris 2,056 — not amenity tags 505). Do not fold mapped into tagged, do not fold 12,531 tagged houses worldwide into France Wi-Fi 759 amenity tags (Wi-Fi 12,527 ≠ 12,531 ≠ 759), and do not fold SAME_AS houses into coverage merge edges (7,872 ≠ 13,902). A Source search node with a hop prints sourceHouses (Wikidata 164,800 · OSM 47,981 · Harbor seed 21 — the same bySource tally as coverage; not the 201,008 hotel total, not mapped pins, not amenity types). Wikipedia stays an extract license — url is null; Harbor will not invent a wikipedia source filter. A search miss with no hotels and no nodes names geo / amenity / chain hops. Harbor will not invent a city. A phrase-only or leftover-quote query does not match every node. Country aliases (USA, UK, China) and amenity labels match on hotels and on search nodes. Tokens of 3 characters or fewer need a word boundary (USA ≠ Hotusa). lodgingType is an exact tag after aliases (guest house / guesthouse / B&B / campsite). boutique ≠ historic boutique. Type options fold case the same way the lock does (historic boutique = Historic boutique). city is an exact city string, not a substring. City options fold case the same way the lock does (Paris = paris). Istanbul ≠ İstanbul. Los Angeles ≠ Los Ángeles. brand is an exact brand tag, not a substring (Hilton ≠ Hilton Garden Inn). Brand options fold case the same way the lock does (Ibis = ibis). No fuzzy match. Amenity filter uses OSM/Wikidata tags or their labels only. minLat/minLng/maxLat/maxLng is a WGS84 bbox (all four required). chainId is an exact MEMBER_OF node id. hasSameAs=1 is houses with an OSM↔Wikidata merge — not a second listing. hasBrand=1 is houses with an OSM / Wikidata brand tag — not a franchise census. - Document titles: /hotels/geo?country=&city= names the locked country or city (a city miss names the miss and noindexes — Harbor will not invent a city). /hotels/amenities?amenity= names the seed type (an unknown tag noindexes — types stay 21). A hotel folio title is “{name} — hotel graph · {city, country}”. Not CNCF Harbor (goharbor.io). - Human browse: /hotels?q= lists matching graph nodes above houses. Leftover matching graph nodes after the top 8 chips name the leftover mix (Ibis leftover 3 names Ibis Styles Sevilla City Santa Justa · huazhu ibis · ibis Styles HOTELS; London leftover 3 names LHA London · London Shelton Hotel Ltd · London Zoo; Hilton leftover 14 is count only — leftover > 4, not leftover houses, not GET /api/graph/search leftover after 12). GET /api/graph/search stays leftover-free. A City chip prints ledger city tags plus in-city OSM / Wikidata source houses (Paris 2,629 city tags · OSM 2,478 · Wikidata 637 — not the 2,625 map bubble, not France OSM 3,313) plus the top amenity-tag mix (Paris wheelchair 576 amenity tags · OSM 576 · Wikidata 142 — not France Wi-Fi 759, not Paris Wi-Fi 505) plus the top lodging-type mix (Paris hotel 2,554 lodging-type tags · OSM 2,403 · Wikidata 637 — not city tags 2,629, not France hotel 6,626); its Geo hop prints map-bubble houses — do not fold those counts. A Country chip prints country hotels (France 6,736) plus in-country OSM / Wikidata source houses (France OSM 3,313 · Wikidata 4,225 — not a partition of 6,736, not worldwide OSM 47,981) plus the top amenity-tag mix (France Wi-Fi 759 amenity tags · OSM 759 · Wikidata 209 — not country hotels 6,736, not worldwide Wi-Fi 12,531) plus the top lodging-type mix (France hotel 6,626 lodging-type tags · OSM 3,203 · Wikidata 4,225 — Wikidata 4,225 is the same number as France country Wikidata, not the same unit; OSM 3,203 ≠ France OSM 3,313) — not city tags, not map bubbles, not OSM extracts. /hotels?q= Country find and /hotels/geo?metros=1&q= metro extract share q= — they are different slices. A Chain chip prints tagged houses, mapped % among those MEMBER_OF houses, MEMBER_OF OSM / Wikidata source houses, plus MEMBER_OF lodging-type and amenity tags with bySource, plus MEMBER_OF houses in the top country and city (Ibis hotel 162 lodging-type tags · OSM 161 · Wikidata 1 — 162 is the same number as tagged houses, not folio hotel 213; wheelchair 89 amenity tags · OSM 89 — not folio wheelchair 116; France 60 MEMBER_OF houses · OSM 60 — not folio France 63; Paris 43 MEMBER_OF houses · OSM 43 — not folio Paris 46; a map-bubble metro on that chip hops the OSM extract (Paris 2,056 — not MEMBER_OF 43); leftover MEMBER_OF countries after the top country on that chip name the leftover mix (Ibis 23 more MEMBER_OF countries — count only, not folio leftover 8, not country hotels 6,736; Travelodge leftover Ireland 2 · Spain 1); leftover MEMBER_OF cities after the top city on that chip name the leftover mix (Ibis 60 more MEMBER_OF cities — count only, not folio leftover 56, not Paris extract 2,056; Super Hotel leftover Osaka 4 + Osaka 432 extract · 札幌市 1); leftover MEMBER_OF amenity-tag types after the top amenity on that chip name the leftover mix (Ibis 6 more MEMBER_OF amenity-tag types — count only, not folio leftover after 8, not wheelchair 89, not tagged houses 12,531; 東横イン leftover Wheelchair access 10 · Air conditioning 4; Radisson Blu leftover Wheelchair 24 · Air conditioning 8 · Bar 3 · Restaurant 1)) — not a franchise census, not the folio brand-fallback walk (Ibis 162 ≠ 213; Ibis OSM 161 ≠ 162 tagged ≠ folio OSM 212). An Amenity chip prints tagged houses worldwide, mapped %, SAME_AS houses, brand-tagged, OSM / Wikidata source houses, lodging-type tags with bySource, the top country amenity-tag mix, and the top city amenity-tag mix on the exported 21 types — Wi-Fi OSM 12,531 is the same number as tagged houses, not the same unit, not worldwide OSM 47,981; hotel 10,545 lodging-type tags · OSM 10,545 · Wikidata 3,823 is the same mix as amenity folio selected.types, not tagged houses 12,531, not France hotel 6,626, not Ibis hotel 213; United States 1,342 amenity tags · OSM 1,342 · Wikidata 402 is the same mix as amenity folio selected.byCountry, not tagged houses 12,531, not France Wi-Fi 759, not Paris Wi-Fi 505; Paris 505 amenity tags · OSM 505 · Wikidata 98 is the same mix as amenity folio selected.byCity, not France Wi-Fi 759, not Paris city tags 2,629; a map-bubble metro on that chip hops the OSM extract (Paris 2,056 — not amenity tags 505); leftover amenity-tag countries after the top country on that chip name the leftover mix (Wi-Fi 60 more amenity-tag countries — count only, not tagged houses 12,531, not folio leftover 49, not France 6,736; Fitness leftover Spain 3 · Portugal 2 · Greece 1 · Turkey 1); leftover amenity-tag cities after the top city on that chip name the leftover mix (Wi-Fi 619 more amenity-tag cities — count only, not tagged houses 12,531, not folio leftover 608, not Paris extract 2,056; Laundry leftover Paris 1 + Paris 2,056 extract · Strasbourg 1 · Tokyo 1 · 台東区 1); leftover lodging types after the top type on those leftover leftover search amenity leftover leftover cities name the leftover mix (Laundry leftover Paris leftover 2 names hostel 47 · OSM 47 · guest_house 28 · OSM 28; Strasbourg leftover 1 names hostel 2 · OSM 2; Tokyo leftover 3 names hostel 103 · OSM 103 · guest_house 55 · motel 11; 台東区 leftover 2 names hostel 11 · OSM 11 · guest_house 3 · OSM 3; Elevator leftover Montevideo leftover 2 names hostel 8 · guest_house 2; Conference leftover 서울특별시 leftover 3 names guest_house 40 · hostel 20 · motel 7 — not leftover after 1 on leftover leftover amenity index leftover leftover cities (Paris hostel 47), not leftover after 1 on leftover leftover amenity folio leftover leftover cities (Valencia hostel 15), not leftover after 1 on amenity chip leftover lodging types (Wi-Fi leftover 4), not amenity tags (Paris Laundry 1)); leftover lodging types after the top lodging type on that chip name the leftover mix (Wi-Fi leftover 4 names hostel 1,211 · OSM 1,211 · guest_house 718 · motel 56 · luxury 1; Wheelchair leftover 3 names hostel 222 · guest_house 73 · motel 22; Parking leftover guest_house 1 — not folio leftover after 8, not tagged houses 12,531, not France hotel 6,626, not amenity types 21); do not fold 12,531 into France Wi-Fi 759 amenity tags, and do not fold Wi-Fi SAME_AS 7,872 into 13,902 merge edges. Geo lodging-type chips under a country lock print lodging-type tags plus OSM / Wikidata source houses among those tags (France hotel 6,626 lodging-type tags · OSM 3,203 source houses · Wikidata 4,225 source houses — Wikidata 4,225 is the same number as France country Wikidata, not the same unit; OSM 3,203 ≠ France OSM 3,313) — not country hotels (France 6,736) and not amenity tags (France Wi-Fi 759). A Paris lock is 2,554 lodging-type tags · OSM 2,403 · Wikidata 637 — Wikidata 637 is the same number as Paris city Wikidata, not the same unit; 2,554 ≠ 2,629 city tags ≠ 2,625 map bubble; OSM 2,403 ≠ Paris OSM 2,478. A Source chip prints source houses on Wikidata / OSM / Harbor seed — Wikipedia stays an extract, not a hotel source filter. The homepage source mix and ledger Source options name the same source houses (coverage.json on /). The homepage live-graph Wikidata chip names source houses (164,800) — not the 164,808 lodging-item target and not 201,008 hotels. The OSM chip already names source houses; OSM metros stay metros (~160), not OSM source houses (47,981). Do not fold Harbor seed 21 into amenity types 21. An empty house list names the next honest hop (matched tag, SAME_AS, amenity folio, or geo). A find with no matching graph node and no houses hops geo / amenity tags / tagged chains. A job SearchBox or /jobs catalog miss hops the typed spelling onto /hotels?q= plus geo / amenity tags / tagged chains — a job miss is not a graph miss. House names can match without a graph tag chip. A leftover quote does not dump the catalog. Active ledger filters are removable chips plus clear-all (hasBrand=1 is brand-tagged houses). City, brand, amenity, lodging-type, and source options under a country lock count houses in that country, not the global top lists. Ledger Type options print lodging-type tags (in-country under a lock; worldwide when open) — not country hotels and not amenity tags. Ledger Amenity options print amenity tags in-country, or tagged houses worldwide when open — do not fold 12,531 into France Wi-Fi 759. Ledger Country options print country hotels (France 6,736). Ledger City options print city tags. Ledger Brand options print brand tags (OSM / Wikidata — not a franchise census). Ledger Source options print source houses (Wikidata / OSM / Harbor seed — do not fold Harbor seed 21 into amenity types 21). Empty Country / City / Brand / Source options say All; empty Type / Amenity options say Any — the kicker already names the slice so the closed select does not clip All brand tags in France. Removable ledger chips print country hotels / city tags / brand tags / lodging-type tags / amenity tags (or tagged houses worldwide) / source houses — not a bare France or hotel. Visible folio breadcrumbs start at Harbor by Signalry. Compact lockup stacks by Signalry under Harbor on small screens. A ledger city hop next to the filters that is a coverage centroid says map bubble — not city tags (Marrakech 721 ≠ 731). A map-bubble metro also names the OSM extract hop (Paris 2,056 — not city tags 2,629, not the map bubble 2,625). Agadir still omits that extract hop. A Wi-Fi, source, lodging-type, or other slice omits those hops so 2,056 cannot fold onto Paris Wi-Fi 505. An unsliced country lock names the geo hop (France 6,736 country hotels — not city tags, not the map bubble, not an OSM extract). A Wi-Fi, source, lodging-type, or other slice omits that hop so 6,736 cannot fold onto France Wi-Fi 759. A city lock still omits that country hop. An ISO country code on the ledger lock resolves the same way the API lock does (?country=FR is France 6,736 country hotels plus the geo hop). An unsliced ledger document title names that lock (Hotels in France for ?country=FR and ?country=France; Hotels in Paris, France for an unsliced city lock) — a Wi-Fi or other slice keeps the generic title so 6,736 cannot fold onto France Wi-Fi 759; ?q=FR stays a find; Narnia stays a miss. countryHotels / geoCountryHref / countryHouseSources resolve that ISO the same way (FR is France 6,736 · OSM 3,313 — not zeros, not a miss). City helpers resolve the same index (Paris + FR is 2,629 city tags · OSM 2,478 · extract 2,056 — not zeros; London + CA still omits the UK extract). Country amenity and lodging-type helpers resolve it too (FR is France Wi-Fi 759 · hotel 6,626 — not zeros, not country hotels 6,736). JSON-LD breadcrumb sources write Harbor by Signalry, not a naked Harbor. Header Hotels / Buy sell pills hide below 380px so the lockup fits a 320 viewport. Document titles stay on qualifySeoTitle — hotel or JTBD context may still end · Harbor so we are not CNCF Harbor. OG image alts that crawlers and agents read go through qualifyOgAlt and name Harbor by Signalry. The wordmark token next to by Signalry stays Harbor. Chain folio lodging-type chips print lodging-type tags plus OSM / Wikidata source houses among those folio tags (Ibis hotel 213 lodging-type tags · OSM 212 source houses · Wikidata 52 source houses — 213 is the same number as folio houses, not the same unit, not MEMBER_OF 162; OSM 212 is the same number as folio OSM, not MEMBER_OF OSM 161). Chain folio amenity chips print amenity tags plus OSM / Wikidata source houses among those folio tags (Ibis wheelchair 116 amenity tags · OSM 116 source houses · Wikidata 27 source houses — OSM 116 is the same number as the tag count, not the same unit, not worldwide Wi-Fi 12,531, not France Wi-Fi 759). Ledger Type and Amenity options stay a number. Nav and footer name Harbor by Signalry — never a naked Harbor. /hotels/geo (country aliases, ?all=1, ?metros=1; unsliced geo names ledger city tags and map-bubble cities separately — bubbles are not the city-tag count; a geo country city chip prints ledger city tags, map-bubble houses, in-city OSM / Wikidata source houses, the top amenity-tag mix, the top lodging-type mix, and the OSM extract hop when the city is a map-bubble metro (Paris 2,056 hops the Overpass metro — not the city lock) separately — do not fold those counts (Paris OSM 2,478 ≠ 2,629 city tags ≠ 2,625 map bubble ≠ Paris OSM extract 2,056 ≠ France OSM 3,313; Paris wheelchair 576 amenity tags · OSM 576 · Wikidata 142 — not France Wi-Fi 759, not Paris Wi-Fi 505; Paris hotel 2,554 lodging-type tags · OSM 2,403 · Wikidata 637 — not city tags 2,629, not France hotel 6,626; Marrakech 731 ≠ 721 ≠ 764 extract); unsliced country cards print country hotels (France 6,736) plus OSM / Wikidata source houses (France OSM 3,313 · Wikidata 4,225 — not a partition of 6,736, not worldwide OSM 47,981, not worldwide Wikidata 164,800) plus the top amenity-tag mix in that country (France Wi-Fi 759 amenity tags · OSM 759 · Wikidata 209 — not country hotels 6,736, not worldwide Wi-Fi 12,531; Germany wheelchair 893 · OSM 893 · Wikidata 281) plus the top lodging-type mix (France hotel 6,626 lodging-type tags · OSM 3,203 · Wikidata 4,225 — Wikidata 4,225 is the same number as France country Wikidata, not the same unit; OSM 3,203 ≠ France OSM 3,313); leftover lodging types after the top type on those cards name the leftover mix (France leftover 2 names hostel 69 · OSM 69 · guest_house 41 · OSM 41; Germany leftover 2 names hostel 110 · OSM 110 · guest_house 77 · OSM 77; Japan leftover 3 names hostel 258 · OSM 258 · guest_house 216 · OSM 216 · motel 16 · OSM 16; United States leftover 13 is count only — leftover > 4, not leftover after 8 on the geo lock); leftover amenity-tag types after the top amenity on those cards name the leftover mix (France leftover 15 is count only — leftover > 4, not leftover after 12 on the geo lock, not Wi-Fi 759; Argentina leftover 3 names Wheelchair access 25 · OSM 25 · Air conditioning 18 · Bar 7; Chile leftover Breakfast 1 · OSM 1; Colombia leftover 4 names Wheelchair 10 · Air conditioning 6 · Bar 2 · Swimming pool 1) plus city tags, map-bubble houses, and in-city source houses on their map-bubble cities plus the top amenity-tag mix in that city (Paris wheelchair 576 amenity tags · OSM 576 · Wikidata 142 — not France Wi-Fi 759, not Paris Wi-Fi 505, not city tags 2,629) plus the top lodging-type mix in that city (Paris hotel 2,554 lodging-type tags · OSM 2,403 · Wikidata 637 — not city tags 2,629, not the map bubble 2,625, not France hotel 6,626); leftover lodging types after the top type on those country-card city rows name the leftover mix (Paris leftover 2 names hostel 47 · OSM 47 · guest_house 28 · OSM 28; Nice leftover 2 names hostel 6 · OSM 6 · guest_house 3 · OSM 3; Marseille leftover 2 names hostel 5 · OSM 5 · guest_house 2 · OSM 2; Lyon leftover 2 names hostel 6 · OSM 6 · guest_house 3 · OSM 3 — not leftover after 8 on the geo lock, not leftover after 1 on the country card (France hostel 69)); leftover amenity-tag types after the top amenity on those country-card city rows name the leftover mix (Paris leftover 12 is count only — leftover > 4, not leftover after 12 on the geo lock, not wheelchair 576; Nice leftover 3 names Wheelchair access 23 · OSM 23 · Air conditioning 7 · Bar 2; Marseille leftover 4 names Wheelchair 12 · Air conditioning 10 · Bar 1 · Breakfast 1; Lyon leftover 7 is count only — not leftover after 1 on the country card (France leftover 15)); plus the OSM extract hop when the city is a map-bubble metro (Paris 2,056 OSM extract hops the Overpass metro — not city tags 2,629, not the map bubble 2,625); cards list four map-bubble cities and name the leftover hop (France 3 more map-bubble cities hops the country lock; Bordeaux 90 city tags · 90 map bubble · OSM 64 source houses · Wikidata 45 source houses · Wi-Fi 15 amenity tags · OSM 15 · hotel 84 lodging-type tags · OSM 58 · Wikidata 45 hops the Bordeaux city lock; 45 OSM extract hops the Bordeaux Overpass extract — hotel 84 ≠ city tags 90 ≠ France hotel 6,626; Wikidata 45 is the same number as the extract, not the same unit; leftover lodging types after the top type on those leftover leftover cities name the leftover mix (Bordeaux leftover 2 names guest_house 5 · OSM 5 · hostel 1 · OSM 1; Strasbourg leftover 1 names hostel 2 · OSM 2; Toulouse leftover 1 names hostel 2 · OSM 2; Bengaluru leftover 2 names hostel 7 · OSM 7 · guest_house 5 · OSM 5; 札幌市 leftover 2 names hostel 2 · OSM 2 · motel 1 · OSM 1; 京都市 leftover 1 names hostel 3 · OSM 3; 台東区 leftover 2 names hostel 11 · OSM 11 · guest_house 3 · OSM 3; Chūō-ku leftover 0 hides the hop — not leftover after 8 on the geo lock, not leftover after 1 on the country card (France hostel 69), not leftover after 1 on the country-card city row (Paris hostel 47)); leftover amenity-tag types after the top amenity on those leftover leftover cities name the leftover mix (Bordeaux leftover 4 names Wheelchair access 12 · OSM 12 · Wikidata 4 · Air conditioning 3 · OSM 3 · Wikidata 1 · Bar 2 · Card payment 2; Strasbourg leftover 7 is count only; Toulouse leftover 2 names Wheelchair access 5 · OSM 5 · Wikidata 2 · Swimming pool 1 · OSM 1; Bengaluru leftover 2 names Air conditioning 3 · OSM 3 · Wheelchair access 2 · OSM 2; 札幌市 leftover 4 names Wheelchair 28 · Air conditioning 11 · Card payment 8 · Bar 1; 京都市 leftover 4 names Air conditioning 5 · Wheelchair 2 · Bar 1 · Restaurant 1; 台東区 leftover 5 is count only; Chūō-ku leftover 3 names Wi-Fi 7 · OSM 7 · Wikidata 7 · Air conditioning 4 · Card payment 3 — not leftover after 12 on the geo lock, not leftover after 1 on the country card (France leftover 15), not leftover after 1 on the country-card city row (Paris leftover 12)); not France Wi-Fi 759, not country hotels 6,736, not Paris OSM extract 2,056; India leftover Bengaluru hops the city lock; Germany 12 more omits a name dump; Morocco omits the hop) — do not fold 6,736 into city tags, map bubbles, or OSM extracts; Agadir stays off the card; Dense OSM metro chips print OSM extract houses (Marrakech 764), not city tags (731), not the map bubble (721), and not country hotels (France 6,736) — hop ?metros=1&q=; leftover metros hop the extract browse (148 more OSM extracts → /hotels/geo?metros=1 — not a name dump, not city tags, not country hotels); leftover OSM extracts after the top 16 on /hotels/geo name the leftover mix (144 more OSM extracts hop ?metros=1 — count only, not leftover after 12 on coverage (148), not city tags, not country hotels); leftover ledger cities after the map-bubble chips on a country lock name the leftover mix (France 1,632 more ledger cities — count only, leftover > 4, not leftover after 4 on the country card, not city tags 2,629, not the map bubble 2,625, not country hotels 6,736; Latvia leftover 3 names Riga 20 · Jēkabpils 1 · Jelgava 1; Cambodia leftover 4 names Siem Reap 19 · Battambang 5 · Kampong Cham Municipality 3 · Sihanoukville Province 1; Agadir stays off the Morocco name dump); leftover amenity-tag types after the top amenity on those leftover ledger cities name the leftover mix (Riga leftover 2 names Card payment 3 · OSM 3 · Wikidata 2 · Wheelchair access 1 · OSM 1; Jēkabpils leftover 0 hides the hop; Cambodia leftover ledger cities leftover 0 hide the hop — not leftover after 12 on the geo lock, not leftover after 1 on the leftover leftover city (Bordeaux leftover 4)); leftover amenity-tag types after the top 12 on a geo lock name the leftover mix (France leftover 4 names Swimming pool 2 · OSM 2 · Elevator 1 · Kitchen 1 · Parking 1; United States leftover 3 names Laundry 1 · Sauna 1 · Spa 1; Paris leftover 1 names Laundry 1 — not leftover worldwide 21 types, not country hotels 6,736, not worldwide Wi-Fi 12,531); leftover lodging types after the top 8 on a geo lock name the leftover mix (United States leftover 6 more lodging types — count only, leftover > 4, not leftover worldwide lodging types, not country hotels 11,806, not United States hotel 11,263, not amenity tags; France leftover 0 hides the hop); leftover lodging types after the top type on a geo lock city chip name the leftover mix (Paris leftover 2 names hostel 47 · OSM 47 · guest_house 28 · OSM 28; Berlin leftover 2 names hostel 81 · OSM 81 · guest_house 57 · OSM 57; Marrakech leftover 2 names hotel 300 · OSM 294 · Wikidata 10 · hostel 48 · OSM 48; London Canada leftover 0 hides the hop); leftover amenity-tag types after the top amenity on a geo lock city chip name the leftover mix (Paris leftover 12 is count only — leftover > 4, not leftover after 12 on the geo lock; Nice leftover 3 names Wheelchair access 23 · OSM 23 · Air conditioning 7 · Bar 2; Marseille leftover 4 names Wheelchair 12 · Air conditioning 10 · Bar 1 · Breakfast 1; Marrakech leftover 4 names Air conditioning 18 · Wheelchair 14 · Restaurant 3 · Bar 1); Country find and metro extract share q= — do not fold those slices; a country/city slice names mapped %, SAME_AS houses, brand-tagged count, and OSM / Wikidata source houses (France OSM 3,313 ≠ 6,736 country hotels ≠ worldwide OSM 47,981; Wikidata 4,225 ≠ 164,800); a geo city lock is an exact city name, not a substring (port ≠ Portland; Paris ≠ Bienville Parish); a geo country lock resolves ISO codes from houses (?country=FR is France 6,736 — not a miss); ?q=FR stays a find; a geo country All hop names country hotels (France 6,736 — not city tags, not the map bubble, not an OSM extract); a geo city All hop names city tags (Paris 2,629 — not the map bubble 2,625, not Paris OSM extract 2,056); a geo city miss will not dump the country pins or reuse the country hotel count in the lede; amenity chips under a city lock count houses in that city plus OSM / Wikidata source houses among those tags, not the country; coverage bubbles stay on the unsliced /hotels and /hotels/geo — a ledger filter, chain country lock, or geo miss without pins will not dump the world), /hotels/chains (top tagged chains only — do not treat as a complete franchise list; index cards print MEMBER_OF tagged houses, mapped %, MEMBER_OF OSM / Wikidata source houses, MEMBER_OF lodging-type / amenity tags with bySource, and the top MEMBER_OF country / city — not the folio walk (Ibis 162 ≠ 213; Ibis OSM 161 ≠ 212; Ibis hotel 162 ≠ folio hotel 213; Ibis wheelchair 89 ≠ folio 116; Ibis France 60 MEMBER_OF ≠ folio France 63; Ibis Paris 43 MEMBER_OF ≠ folio Paris 46); a map-bubble metro on those cards hops the OSM extract (Paris 2,056 — not MEMBER_OF 43); leftover MEMBER_OF countries after the top country on those cards name the leftover mix (Ibis 23 more MEMBER_OF countries — count only, not folio leftover 8, not country hotels 6,736, not worldwide MEMBER_OF 162; 東横イン leftover France 1 · Germany 1 · South Korea 1); leftover MEMBER_OF cities after the top city on those cards name the leftover mix (Ibis 60 more MEMBER_OF cities — count only, not folio leftover 56, not Paris extract 2,056; Super Hotel leftover Osaka 4 + Osaka 432 extract · 札幌市 1); leftover MEMBER_OF amenity-tag types after the top amenity on those cards name the leftover mix (Ibis 6 more MEMBER_OF amenity-tag types — count only, not folio leftover after 8, not wheelchair 89, not tagged houses 12,531; 東横イン leftover Wheelchair access 10 · Air conditioning 4; Radisson Blu leftover Wheelchair 24 · Air conditioning 8 · Bar 3 · Restaurant 1); leftover tagged chains after the top 80 name the leftover mix (3,828 more tagged chains — count only, not leftover houses, not MEMBER_OF 162, not folio 213; q=hotel leftover 862 is count only and the lede names 942 matching chains); GET /api/graph/chains list items stay MEMBER_OF tagged houses only — no types / amenities / countries / cities; a country slice hops geo; a folio names MEMBER_OF tagged houses next to folio houses when the brand-fallback walk is wider (Ibis 162 ≠ 213); Hilton Worldwide stays 609 on both; a folio names mapped / source / lodging / amenity density and prints folio source houses next to MEMBER_OF when those mixes differ (Ibis OSM 212 ≠ 161; Wikidata 52 ≠ 1); lodging-type chips print lodging-type tags plus OSM / Wikidata source houses among those folio tags (Ibis hotel 213 · OSM 212 · Wikidata 52 — 213 is the same number as folio houses, not MEMBER_OF 162); amenity chips print amenity tags plus OSM / Wikidata source houses among those folio tags (Ibis wheelchair 116 amenity tags · OSM 116 source houses · Wikidata 27 source houses — OSM 116 is the same number as the tag count, not the same unit, not worldwide Wi-Fi 12,531, not France Wi-Fi 759); an empty country lock is a country miss, not a missing chain; the chain map will not dump world bubbles), /hotels/amenities (seed types only — unsliced cards and ?amenity= name mapped % / SAME_AS houses / brand-tagged / OSM·Wikidata source houses / the top lodging-type mix / the top country amenity-tag mix / the top city amenity-tag mix when those tags exist (Wi-Fi OSM 12,531 is the same number as tagged houses, not the same unit, not worldwide OSM 47,981; Wi-Fi hotel 10,545 lodging-type tags · OSM 10,545 · Wikidata 3,823 is the same mix as the folio and a search chip, not tagged houses 12,531, not France hotel 6,626; wheelchair hotel 6,727 · OSM 6,727 · Wikidata 2,453 is not 7,044 tagged houses; Wi-Fi United States 1,342 amenity tags · OSM 1,342 · Wikidata 402 is the same mix as the folio and a search chip, not tagged houses 12,531, not France Wi-Fi 759, not Paris Wi-Fi 505; wheelchair Germany 893 · OSM 893 · Wikidata 281 is not Wi-Fi United States 1,342 and not 7,044 tagged houses; Wi-Fi Paris 505 amenity tags · OSM 505 · Wikidata 98 is the same mix as the folio and a search chip, not France Wi-Fi 759, not Paris city tags 2,629; a map-bubble metro on those cards hops the OSM extract (Paris 2,056 — not amenity tags 505); wheelchair Paris 576 · OSM 576 · Wikidata 142 is not Wi-Fi Paris 505 and not 7,044 tagged houses; GET /api/graph/amenities list items stay tagged houses only — no types / countries / cities); an amenity find miss hops the typed spelling onto /hotels?q= plus geo / tagged chains; country chips print amenity tags in that country plus OSM / Wikidata source houses among those tags (France Wi-Fi 759 amenity tags · OSM 759 source houses · Wikidata 209 source houses — OSM 759 is the same number as the tag count, not the same unit, not worldwide Wi-Fi OSM 12,531, not France OSM 3,313) — not country hotels (France 6,736); leftover amenity-tag countries after the top 12 name the leftover mix (Wi-Fi 49 more amenity-tag countries — count only, not tagged houses 12,531, not France 6,736; Pets leftover Denmark · Poland · Portugal 1 amenity tag each); leftover amenity-tag countries after the top country on unsliced cards name the leftover mix (Wi-Fi 60 more amenity-tag countries — count only, not tagged houses 12,531, not folio leftover 49, not France 6,736; Fitness leftover Spain 3 · Portugal 2 · Greece 1 · Turkey 1); leftover amenity-tag cities after the top city on unsliced cards name the leftover mix (Wi-Fi 619 more amenity-tag cities — count only, not tagged houses 12,531, not folio leftover 608, not Paris extract 2,056; Laundry leftover Paris 1 + Paris 2,056 extract · Strasbourg 1 · Tokyo 1 · 台東区 1); leftover lodging types after the top type on those leftover leftover amenity index leftover leftover cities name the leftover mix (Laundry leftover Paris leftover 2 names hostel 47 · OSM 47 · guest_house 28 · OSM 28; Strasbourg leftover 1 names hostel 2 · OSM 2; Tokyo leftover 3 names hostel 103 · OSM 103 · guest_house 55 · motel 11; 台東区 leftover 2 names hostel 11 · OSM 11 · guest_house 3 · OSM 3; Elevator leftover Montevideo leftover 2 names hostel 8 · guest_house 2; Conference leftover 서울특별시 leftover 3 names guest_house 40 · hostel 20 · motel 7 — not leftover after 1 on leftover leftover amenity folio leftover leftover cities (Valencia hostel 15), not leftover after 1 on amenity index leftover lodging types (Wi-Fi leftover 4), not amenity tags (Paris Laundry 1)); leftover lodging types after the top lodging type on unsliced cards name the leftover mix (Wi-Fi leftover 4 names hostel 1,211 · OSM 1,211 · guest_house 718 · motel 56 · luxury 1; Wheelchair leftover 3 names hostel 222 · guest_house 73 · motel 22; Parking leftover guest_house 1 — not folio leftover after 8, not tagged houses 12,531, not France hotel 6,626, not amenity types 21); city chips print amenity tags in that city plus OSM / Wikidata source houses among those tags (Paris Wi-Fi 505 amenity tags · OSM 505 · Wikidata 98 — not France Wi-Fi 759, not Paris city tags 2,629, not the map bubble 2,625) plus the OSM extract hop when the city is a map-bubble metro (Paris 2,056 hops the Overpass metro — not amenity tags 505); leftover amenity-tag cities after the top 12 name the leftover mix (Wi-Fi 608 more amenity-tag cities — count only, not tagged houses 12,531; Spa leftover Valencia, Spain 1 amenity tag); leftover lodging types after the top type on those leftover leftover amenity folio cities name the leftover mix (Spa leftover Valencia leftover 2 names hostel 15 · OSM 15 · guest_house 4 · OSM 4 — not leftover after 8 on amenity folio lodging types, not leftover after 1 on amenity index leftover lodging types, not leftover after 1 on the country-card city row (Paris hostel 47), not amenity tags (Valencia Spa 1)); lodging-type chips print lodging-type tags among amenity-tagged houses plus OSM / Wikidata source houses among those type tags (Wi-Fi hotel 10,545 lodging-type tags · OSM 10,545 · Wikidata 3,823 — not tagged houses 12,531, not France hotel 6,626, not Ibis hotel 213, not amenity types 21); /hotels/amenities?q= amenity-type find and /hotels?q= Country find share q= — they are different slices; geo amenity chips under a country lock print amenity tags plus OSM / Wikidata source houses among those tags (France Wi-Fi 759 amenity tags · OSM 759 source houses · Wikidata 209 source houses — OSM 759 is the same number as the tag count, not the same unit, not worldwide Wi-Fi OSM 12,531, not France OSM 3,313); a city lock uses the same unit on the in-city mix (Paris Wi-Fi 505 ≠ France Wi-Fi 759 ≠ Paris city tags 2,629); not country hotels; geo lodging-type chips print lodging-type tags plus OSM / Wikidata source houses among those tags (France hotel 6,626 · OSM 3,203 · Wikidata 4,225 — Wikidata 4,225 is the same number as France country Wikidata, not the same unit; OSM 3,203 ≠ France OSM 3,313; Paris hotel 2,554 · OSM 2,403 · Wikidata 637 — not Paris city tags 2,629, not the map bubble 2,625), not country hotels and not amenity tags; Ledger Type options stay a number; chain folio country chips print folio houses (brand-fallback walk) plus OSM / Wikidata source houses among those folio houses, and MEMBER_OF houses plus MEMBER_OF source houses when those mixes differ (France Ibis 63 folio · OSM 63 · Wikidata 3 · 60 MEMBER_OF · OSM 60 MEMBER_OF source houses — OSM 63 is the same number as folio houses, not the same unit, not MEMBER_OF OSM 60, not Ibis folio OSM 212) — not country hotels (France 6,736) and not worldwide MEMBER_OF (Ibis 162); chain folio city chips print folio houses in that city plus OSM / Wikidata source houses among those folio houses, and MEMBER_OF when those counts differ (Ibis Paris 46 folio · OSM 46 · Wikidata 3 · 43 MEMBER_OF — not France Ibis 63, not Ibis folio 213, not Paris city tags 2,629, not the map bubble 2,625) plus the OSM extract hop when the city is a map-bubble metro (Paris 2,056 hops the Overpass metro — not folio houses 46); leftover folio cities after the top 12 name the leftover mix (Ibis 56 more folio cities — count only, not MEMBER_OF 162, not folio 213); leftover folio countries after the top 16 name the leftover mix (Ibis 8 more folio countries hop ?all=1 — count only, not country hotels 6,736, not worldwide MEMBER_OF 162, not Ibis folio 213; Westin leftover United Arab Emirates 1 folio house · OSM 1); leftover folio amenity-tag types after the top 8 chips name the leftover mix (Hilton leftover 2 names Restaurant 2 · OSM 2 · Wikidata 1 · 1 MEMBER_OF · Spa 1 · OSM 1; Best Western leftover Card payment 1 · OSM 1; Ibis leftover 0 hides the hop)). Map pins: mouse click selects the card; Enter opens the house. A house card hops the country on geo. Coverage SAME_AS is merge edges — homepage and the hotels coverage panel name edges, not the hasSameAs=1 list length; homepage city count is city tags, not map-bubble cities; the hotels coverage By country pills print country hotels plus in-country OSM / Wikidata source houses plus the top amenity-tag mix plus the top lodging-type mix (France OSM 3,313 ≠ 6,736 — not a partition, not worldwide OSM 47,981; France Wi-Fi 759 amenity tags · OSM 759 · Wikidata 209 — not country hotels 6,736, not worldwide Wi-Fi 12,531; France hotel 6,626 lodging-type tags · OSM 3,203 · Wikidata 4,225 — Wikidata 4,225 is the same number as France country Wikidata, not the same unit; OSM 3,203 ≠ France OSM 3,313); leftover countries hop geo browse (199 more countries → /hotels/geo — not a name dump, not Unknown 1,748, not leftover OSM extracts 148); leftover countries after the top 60 on /hotels/geo name the leftover mix (145 more countries hop ?all=1 — count only, not leftover after 10 on coverage (199), not leftover after 8 on homepage (201), not coverage.json 209 countries, not Unknown 1,748); homepage By country pills stay country hotels from coverage.json only; leftover homepage countries hop geo browse (201 more countries → /hotels/geo — not a name dump, not Unknown 1,748, not leftover OSM extracts 148); a geo or ledger SAME_AS slice is houses with a partner.- HAS_AMENITY comes from OSM tags (wifi, wheelchair, parking, restaurant, bar, pool, spa, gym, ac, pets, conference, breakfast, sauna, laundry, kitchen, elevator, cards, smoking=no, terrace/outdoor_seating, room_service, bicycle_parking, EV charging, shuttle, business centre) and Wikidata P2848 / P912 mapped QIDs. Not a complete inventory. - Chains: OSM brand / brand:en / network / franchise + brand:wikidata; Wikidata P127/P749/P137/P176. Brand fill is sparse (~6% on this snapshot) — not a franchise census. - SAME_AS is an OSM↔Wikidata merge, not a second house. It can copy OSM amenities onto the Wikidata canonical hotel. Slim snapshot drops reconstructable LOCATED_IN / IN_COUNTRY / ASSERTED_BY / NEAR; /api/graph/subgraph rebuilds them. - Do not invent amenities, chain membership, or confidential prices. Buy/sell rules: never invent a confidential deal price as fact. Never claim a Harbor estimate is a licensed appraisal. Label every assumption. Deal Frame is a framing tool stored in the browser — Harbor does not host the file. Implied cap only when user-supplied NOI and a disclosed tape price both exist. Cap-rate bands are Harbor research defaults, not HVS/PKF/CBRE proprietary numbers. Host FY2025 Westin Cincinnati + Metro Center is $237M combined — do not split. Sheraton Parsippany $15M is under contract, not closed. ## Stable hotel graph IDs - /hotels/{id} (wd-Q…, osm-n-…, harbor-…, desk slugs) - /hotels/geo - /hotels/chains - /hotels/chains/{id} - /hotels/amenities ## Stable URL pattern - /jobs/{slug} - /providers/{slug} - /cases/{slug} - /hotels/{id} - /hotels/{id}/estimate - /hotels/geo - /hotels/chains - /hotels/chains/{id} - /hotels/amenities - /buy-sell - /buy-sell?hotel={id} - /buy-sell/frame - /buy-sell/frame?hotel={id} - /buy-sell/deals - /buy-sell/estimate?hotel={id} (canonical house worksheet is /hotels/{id}/estimate) - /buy-sell/blotter?hotel={id} - /buy-sell/compare?hotel={id} - /buy-sell/due-diligence?hotel={id} - /buy-sell/explainers?hotel={id} - /buy-sell/sell-side?hotel={id} - /packs/sale-ready?hotel={id} - /buy-sell/transactions/{id} (named singles title “{house} · {year} tape”; combined PSAs stay combined) - /buy-sell/transactions?year={year}&priced=1 (historical cited corpus; not the morning blotter) - /buy-sell/transactions?year={year}&priced=1&confidence=public_filing - /buy-sell/brokers - /buy-sell/brokers?hotel={id} - /buy-sell/brokers/{id} - /buy-sell/brokers/{id}?hotel={id} - /buy-sell/firms/{id} - /buy-sell/firms/{id}?hotel={id} - /buy-sell/markets/{id} - /buy-sell/markets/{id}?hotel={id} IDs equal slugs. Prefer slugs over display names. # Full catalog Do not invent numbers that are not in this file. If a metric is missing, say it is missing. ## Jobs ### Fill rooms after a sudden cancellation wave - id: fill-rooms-after-cancellations - url: https://harbor.signalry.ai/jobs/fill-rooms-after-cancellations - persona: ops - jtbd: When a citywide, weather, or group cancellation opens a hole this month, I want a grown-up recovery plan so I can fill rooms without torching next quarter's rate. - outcome: Close most of the occupancy gap in 6–12 weeks with ADR held inside a named band, and leave a pickup memo the owner can read. - when_not_to_buy: Do not buy a flash-discount shop if you cannot name an ADR floor. A hole closed at a rate you cannot defend is a new BAR. - budget: $12–35k plus any channel cost - timeline: 6–12 weeks - providers: meridian-ops, yieldwell-rms, ratewatch, oakridge, harborstack-crs - cases: station-9-cancellation-wave - search_terms: occupancy, cancellations, citywide, group wash, fill rooms, pickup, transient, revenue recovery, empty rooms, no-show, walk, citywide cancel, transient pickup - claims: - [advice] Name the hole in room-nights before you spend. - [verified] Station 9: 19-point gap to 3 in eleven weeks, ADR above the floor. ### Bring the housekeeping complaint rate down - id: housekeeping-complaint-rate - url: https://harbor.signalry.ai/jobs/housekeeping-complaint-rate - persona: ops - jtbd: When 'dirty room' and 'smells' comments start to set the rating, I want a rooms program I can inspect weekly so guests stop teaching the internet our worst night. - outcome: Cut dirty-room mentions by at least half in a quarter, with inspection fail rate and comment rate on the same page. - when_not_to_buy: Do not buy a rooms-culture workshop if attendants cannot finish the inspect. A 40-point form nobody completes is not a program. - budget: $10–30k program, or a per-room contractor - timeline: 8–12 weeks to a new baseline - providers: hearth-key, linen-change, housekeep-seq, northline-pms - cases: harbor-house-housekeeping - search_terms: housekeeping, dirty room, complaints, linen, inspection, rooms, guest comments, smell, room turnover, HK productivity, room status, linen par - claims: - [advice] Inspection that does not happen is a ritual, not a control. - [verified] Harbor House: dirty-room mentions −61% in a quarter. ### Staff the night audit without burning out the GM - id: night-audit-without-gm-burnout - url: https://harbor.signalry.ai/jobs/night-audit-without-gm-burnout - persona: ops - jtbd: When I am still the 2 a.m. backup, I want a coverage and close system so the hotel can finish the day without me living in the lobby. - outcome: A named closer every night, exception rate published weekly, and the GM off the backup rotation within 90 days. - when_not_to_buy: A 24-hour desk theater will not save a house that cannot pay overnight. If the wage is the gap, this is a wage job. - budget: $12–25k setup + coverage cost - timeline: 6–10 weeks to a stable rotation - providers: nightwatch, brandt-vale, night-ledger, ledgerlight - cases: wick-elm-night-audit - search_terms: night audit, overnight, GM burnout, front desk, close, labor, night manager, ops.staff-coverage, overnight coverage, close the day - claims: - [advice] The GM is not a night-audit product. - [verified] Wick & Elm: named closer 91 nights; GM off routine backup. ### Recover from a bad OTA review spike - id: recover-ota-review-spike - url: https://harbor.signalry.ai/jobs/recover-ota-review-spike - persona: ops - jtbd: When a cluster of reviews drops the bubble in a month, I want a recovery path I can defend so we fix the cause and the rating without buying fake stars. - outcome: A 90-day rating trajectory with confidence bands, the complaint cluster actually fixed, and responses the GM will sign. - when_not_to_buy: Anyone selling a guaranteed star or a gated checkout ask. - budget: $8–18k sprint + any ops fix - timeline: 10–16 weeks to a new bubble - providers: quill-review, frontglass, reviewdraft, hearth-key - cases: marlowe-review-spike - search_terms: reviews, TripAdvisor, OTA, reputation, rating, Google reviews, spike, ops.review-velocity, service recovery, 1-star - claims: - [advice] Name the cluster before you ask for volume. - [verified] The Marlowe: 7.4 → 8.6 in 14 weeks; zero gated asks. ### Cut energy 15% without guest comfort hits - id: cut-energy-without-comfort-hits - url: https://harbor.signalry.ai/jobs/cut-energy-without-comfort-hits - persona: ops - jtbd: When the utility line is eating GOP, I want a savings plan that treats comfort as a constraint so we do not trade five-star sleep for a greener invoice. - outcome: At least 12–15% kWh or a documented 'cannot hit 15 without comfort' memo, with temperature comments flat or down. - when_not_to_buy: A setpoint dump that treats guest comments as acceptable collateral. Comfort is a kill-switch, not a footnote. - budget: $20–80k plus any hardware - timeline: 1–2 heating/cooling seasons to prove - providers: copperline, kilowatt-hall, energy-loop, vale-street - cases: copper-king-energy - search_terms: energy, utilities, HVAC, kWh, comfort, green, BMS, setpoint, ops.energy-spend, guest comfort - claims: - [advice] kWh without a comment watch is a comfort cut wearing a utility hat. - [verified] Copper King: −16% weather-normalized kWh; temperature comments flat. ### Renegotiate a management agreement - id: renegotiate-management-agreement - url: https://harbor.signalry.ai/jobs/renegotiate-management-agreement - persona: owner - jtbd: When the fee, the reporting, or the incentive no longer matches the hotel I own, I want an owner-side brief so I can change the paper without starting a war I cannot finish. - outcome: A marked-up agreement, a fee and reporting reset you can live with, and a walk-away position written before the first call. - when_not_to_buy: An advisor paid by the operator under review. A referral-fee ‘owner advisor’ is not an advisor. - budget: $25–60k advisor - timeline: 8–16 weeks of paper and calls - providers: ashcroft, sable-desk - cases: eastbound-management-fee - search_terms: management agreement, operator, incentive fee, owner, asset manager, termination, base fee, operator fee, incentive hurdle, management contract - claims: - [advice] If the pack lands on the 22nd, you are reading archaeology. - [verified] Eastbound: 3.2 incentive points reset; same GM; pack on the 8th. ### Decide lobby refresh vs rooms capex - id: lobby-refresh-vs-rooms-capex - url: https://harbor.signalry.ai/jobs/lobby-refresh-vs-rooms-capex - persona: owner - jtbd: When both the lobby and the rooms look tired, I want an evidence-led sequence so I spend the next dollar on the guest job that actually books. - outcome: A sequenced capex memo with payback, a 'do nothing' case, and a recommendation an investment committee can vote. - when_not_to_buy: A lobby storyboard when the comment cluster is baths. Fashion is not a guest job. - budget: $20–45k study; capex separate - timeline: 4–8 weeks to a decision memo - providers: vale-street, ashcroft, hearth-key - cases: holloway-baths-not-lobby - search_terms: capex, lobby, renovation, FF&E, rooms, PIP, refresh, bathrooms, renovation sequence, ops.capex-pipeline - claims: - [advice] Spend where the comments already are. - [verified] The Holloway: 61 baths; lobby $0 this cycle; review +0.4. ### Lift GOP without cutting the guest experience - id: lift-gop-without-cutting-guest - url: https://harbor.signalry.ai/jobs/lift-gop-without-cutting-guest - persona: owner - jtbd: When GOP is short and every save looks like a guest cut, I want a bridge that names the trades so I can take cost that guests do not buy. - outcome: A GOP bridge with named experience trades, a 2–4 point path that does not touch the sleeping product first, and a watch-list of guest comments. - when_not_to_buy: A pack that opens with attendant minutes while rooms comments are already amber. - budget: $25–50k plus projects - timeline: One to two quarters to a new run-rate - providers: ashcroft, meridian-ops, yieldwell-rms, copperline, ledgerlight - cases: annex-gop-bridge - search_terms: GOP, profit, cost, expense, labor, utilities, owner, flow-through, cost cut, departmental profit - claims: - [advice] If the first draft cuts the guest, it is not a GOP job. It is a complaint job. - [verified] The Annex: +2.4 GOP points; rooms labor held; comments flat. ### Underwrite a boutique hotel acquisition - id: underwrite-boutique-acquisition - url: https://harbor.signalry.ai/jobs/underwrite-boutique-acquisition - persona: owner - jtbd: When I am about to buy a 40–200 key independent, I want an ops-true memo so I do not pay for a T12 the night audit cannot support. - outcome: A buy-side memo that rebuilds the T12 from ops evidence, names the basis risk, and is allowed to kill the deal. - when_not_to_buy: A CIM you have not walked. If the night audit cannot support the T12, the cap rate is fiction. - budget: $35–75k memo - timeline: 3–6 weeks of real diligence - providers: sable-desk, ashcroft, vale-street, ledgerlight - cases: flagstaff-walk-away - search_terms: acquisition, underwriting, T12, buy, boutique, diligence, basis, cap rate, buy-side - claims: - [advice] A kill is a successful job. - [verified] Pine Court pass: walk. Unbooked comps found. CIM T12 unused. ### Shift mix off OTAs toward brand.com - id: shift-mix-off-otas - url: https://harbor.signalry.ai/jobs/shift-mix-off-otas - persona: owner - jtbd: When commission is a surprise every month, I want a mix path that holds occupancy so I am not buying 'direct' with empty rooms. - outcome: A 12–18 month mix path with occupancy risk on each step, contribution measured after commission, and no darkening of OTAs as theater. - when_not_to_buy: A ‘50% direct’ slogan with no contribution-after-commission math. Darkening an OTA is not a mix path. - budget: $16–40k plus media - timeline: Two to four quarters to a first 5–10 points - providers: oakridge, wayfind-direct, harborstack-crs, ratewatch - cases: glasswater-mix-shift - search_terms: OTA, brand.com, direct booking, commission, mix, metasearch, channel, parity, grow-direct-bookings, direct mix - claims: - [advice] Mix without occupancy held is just a smaller hotel. - [verified] Glasswater: +9 points direct; occupancy ±2; OTAs stayed as a valve. ### Replace a brittle PMS without a six-month outage - id: replace-brittle-pms - url: https://harbor.signalry.ai/jobs/replace-brittle-pms - persona: tech - jtbd: When the PMS is holding the desk hostage, I want a cutover I can roll back so we change systems without freezing groups for a season. - outcome: A parallel-run cutover measured in weeks, a named freeze window in hours, a rollback drill, and a folio that still balances. - when_not_to_buy: A six-month dual-run with no rollback drill. If only one person can close, you do not have a cutover — you have a hostage. - budget: $15–80k plus new system - timeline: 8–14 weeks including parallel run - providers: keystone-switch, northline-pms, folio-pci, clerkshift - cases: annex-pms-cutover - search_terms: PMS, property management, cutover, migration, folio, outage, legacy, on-prem, integrate-pms-api, PMS cutover, legacy PMS, ops.pms-health - claims: - [advice] Rollback is a feature. Treat it that way. - [verified] The Annex: 36-hour group freeze, not 36 days. Folio balanced. ### Connect RMS to CRS without double bookings - id: connect-rms-crs - url: https://harbor.signalry.ai/jobs/connect-rms-crs - persona: tech - jtbd: When rates and inventory live in two brains, I want a single owner of the book so we stop overselling Saturday and underselling Tuesday. - outcome: One inventory owner, a documented write-path, and a watch that catches drift before arrival day. - when_not_to_buy: An RMS that writes rooms. Two inventory owners is already an oversell. - budget: $8–25k plus stack - timeline: 4–8 weeks to a stable path - providers: yieldwell-rms, harborstack-crs, folio-watch - cases: rivermark-inventory-owner - search_terms: RMS, CRS, channel manager, inventory, double booking, oversell, integration, rates, fix-inventory-sync - claims: - [advice] Recommend. A human applies. One book owns Saturday. - [verified] Rivermark: 3 inventory owners → 1. Next oversell caught pre-arrival. ### Stand up guest messaging the desk actually uses - id: guest-messaging-desk-uses - url: https://harbor.signalry.ai/jobs/guest-messaging-desk-uses - persona: tech - jtbd: When guests already text and the desk still lives in email, I want one inbox the night audit will open so we answer in the guest's channel without an unmanned bot. - outcome: One inbox, a response SLA the desk hits, templates that cannot change a folio without a human, and no 'AI concierge' inventing amenities. - when_not_to_buy: An unmanned concierge that closes tickets to look fast. If the night audit will not open it, it is not a hotel product. - budget: $3–12k setup + monthly - timeline: 3–6 weeks to desk habit - providers: inboxwell, clerkshift, quill-review - cases: solstice-inbox - search_terms: guest messaging, SMS, WhatsApp, inbox, chatbot, pre-arrival, front desk, ops comms, SMS inbox - claims: - [advice] Deflection is not a KPI. - [verified] Solstice: first response 11h → 11 min; zero unattended folio posts. ### Deploy an agent for reservation modifications - id: reservation-modification-agent - url: https://harbor.signalry.ai/jobs/reservation-modification-agent - persona: tech - jtbd: When the reservations inbox is date changes and add-ons, I want a narrow agent that drafts the work so a clerk can post the folio without drowning. - outcome: Most modifications drafted by the agent, 100% human-posted in the first month, and a published error rate. - when_not_to_buy: Auto-post in week one. If it can post a folio, it is staff you cannot fire at 2 a.m. - budget: $2–8k setup + per-request - timeline: 4–8 weeks to a trusted queue - providers: clerkshift, northline-pms, harborstack-crs, nightwatch - cases: rivermark-clerkshift - search_terms: AI agent, reservations, modifications, date change, folio, automation, inbox, folio safety, reservations inbox - claims: - [advice] Drafted is not posted. - [verified] Rivermark: 73% drafted, 100% human-posted, auto-post off. ### Audit PCI after a franchise flag change - id: pci-after-flag-change - url: https://harbor.signalry.ai/jobs/pci-after-flag-change - persona: tech - jtbd: When the flag, the PMS, or the booking path just changed, I want a scope I can fund so card data is actually in a smaller box — not a scanner PDF in a drawer. - outcome: A card-flow diagram the owner can read, a remediation the GM can fund, and a watch on the new path — without buying a SIEM you will not staff. - when_not_to_buy: A scanner PDF that never traces the leftover call-center tape. A franchise scan is not the audit. - budget: $18–45k audit + remediation - timeline: 6–12 weeks to a funded plan - providers: folio-pci, folio-watch, keystone-switch, northline-pms - cases: pine-court-flag-change - search_terms: PCI, cyber, franchise, flag change, card data, security, compliance, CDE, franchise scan - claims: - [advice] If you cannot draw the card, you cannot scope it. - [verified] Pine Court: 11 weeks, PMS kept, no SIEM. ### Stop dirty→ready→dirty before arrival - id: live-room-readiness - url: https://harbor.signalry.ai/jobs/live-room-readiness - persona: ops - jtbd: When front desk and housekeeping argue about a room that was clean at 11 and dirty at 2, I want a live readiness board so early arrivals are not checked into a phantom clean. - outcome: Room status that matches the floor in the last 20 minutes, with a named owner for every rush room and zero early arrivals on a false ready. - when_not_to_buy: Do not buy a rooms-board product if attendants will not enter status. Software cannot invent a clean room. - budget: $8–22k program, or a sequence agent + supervisor - timeline: 3–6 weeks to a trusted board - providers: hearth-key, housekeep-seq, linen-change, northline-pms - cases: harbor-house-housekeeping, solstice-readiness - search_terms: room readiness, room status, phantom clean, rush room, housekeeping, room turnover, early arrival, HK productivity, dirty to ready, rooms board - claims: - [advice] Status must be floor-true within 20 minutes or it is fiction. - [claimed] Vendors will say ‘real-time rooms.’ Ask who types the status. ### See overtime before the weekend forecast spikes - id: predict-overtime - url: https://harbor.signalry.ai/jobs/predict-overtime - persona: ops - jtbd: When OT shows up as a Monday surprise, I want a forecast tied to occupancy so I can staff Thursday — not apologize on Tuesday. - outcome: A weekly labor note that names OT risk by department before the weekend, with occupancy as an input and a GM who can still override. - when_not_to_buy: A pretty forecast will not hire people who do not exist. If you are under-wage, this job becomes a wage job. - budget: $11–24k redesign + any roster tool - timeline: 4–8 weeks to a trusted Thursday note - providers: brandt-vale, nightwatch, ledgerlight, night-ledger - cases: eastbound-overtime - search_terms: overtime, labor forecast, scheduling, occupancy, weekend, labor OT, OT, overtime hours, scheduling by occupancy, weekend forecast, ops.labor-forecast - claims: - [advice] OT predicted on Thursday is a job. OT explained on Tuesday is a story. ### Close the midnight guest-request black hole - id: cross-shift-guest-tickets - url: https://harbor.signalry.ai/jobs/cross-shift-guest-tickets - persona: ops - jtbd: When a 11 p.m. extra-pillow ticket dies at shift change, I want a ticket that survives the night so the 7 a.m. desk does not hear it first from the guest. - outcome: Every in-house request has an owner, a clock, and a morning exception list. VIP prep is on the same board. - when_not_to_buy: An unmanned bot that closes tickets to look fast. Deflection is not closure. - budget: $4–14k stack + habit - timeline: 3–5 weeks to desk habit - providers: inboxwell, quill-review, clerkshift, nightwatch - cases: solstice-inbox, annex-tickets - search_terms: guest tickets, shift change, maintenance SLA, ops comms, VIP, guest request, midnight ticket, VIP prep - claims: - [advice] A ticket that cannot survive shift change is not a ticket. ### Prove a vendor paid for itself in 90 days - id: prove-vendor-roi-90d - url: https://harbor.signalry.ai/jobs/prove-vendor-roi-90d - persona: owner - jtbd: When a contract is up and the deck is all logos, I want a 90-day proof so I can renew, cut, or renegotiate on a number the owner will read. - outcome: A one-page ROI with a named baseline, a named window, and a caveat. Renew or exit written before the sales call. - when_not_to_buy: Do not hire the vendor to grade their own homework. A referral-fee advisor is not an advisor. - budget: $8–25k review - timeline: 2–4 weeks of evidence, not a new project - providers: ashcroft, ledgerlight, sable-desk - cases: annex-gop-bridge, glasswater-vendor-roi - search_terms: vendor ROI, 90 days, renewal, proof, contract, ops.vendor-sla-score, paid for itself, contract proof, 90 day proof, QBR baseline - claims: - [advice] No baseline, no ROI. A percentage without a window is a brochure. - [claimed] Most ‘3x ROI’ slides skip the counterfactual. ### Recover a 1-star before it compounds - id: same-day-review-recovery - url: https://harbor.signalry.ai/jobs/same-day-review-recovery - persona: ops - jtbd: When a 1-star lands before lunch, I want a same-day recovery so the cluster does not become tomorrow’s bubble. - outcome: A 1-star has an owner within two hours, an ops cause named the same day, and a response the GM will sign — no gating. - when_not_to_buy: Anyone selling a guaranteed star or a gated checkout ask. - budget: $9–16k path + the ops fix - timeline: Hours for the reply; weeks for the cause - providers: quill-review, reviewdraft, frontglass, hearth-key, desk-signal - cases: marlowe-review-spike, cedar-ridge-recovery - search_terms: 1-star, same-day recovery, reviews, service recovery, reputation, ops.guest-recovery, same-day review - claims: - [advice] A same-day reply does not clean the room. Name the cause or you are decorating. - [verified] See The Marlowe: cluster named in five days; no gated asks. ### Hand a new GM a 30-day ops truth pack - id: gm-30-day-truth-pack - url: https://harbor.signalry.ai/jobs/gm-30-day-truth-pack - persona: ops - jtbd: When I walk a new house, I want the numbers the last GM did not write down so I do not spend 30 days discovering the real night audit. - outcome: A 30-day pack: pickup, rooms fail rate, OT, open tickets, review cluster, and the three vendors that actually matter — written for a GM, not an IC. - when_not_to_buy: A 80-page brand audit. The GM needs ten pages they will open at 6 a.m. - budget: $6–18k pack - timeline: 10–15 days to assemble - providers: meridian-ops, ashcroft, nightwatch, ledgerlight, thirty-pack - cases: wick-elm-night-audit, pine-court-truth-pack - search_terms: new GM, handover, truth pack, first 30 days, ops pack, ops truth pack - claims: - [advice] If it does not change what the GM does on day three, it is not in the pack. ### Price groups without displacing the transient you wanted - id: group-displacement-math - url: https://harbor.signalry.ai/jobs/group-displacement-math - persona: owner - jtbd: When sales wants the group and revenue wants the BAR, I want displacement math so I can say yes or no with the transient I am giving up written down. - outcome: Every group over a named size has a displacement note: rooms given up, rate given up, and the wash risk. A no is allowed. - when_not_to_buy: An RMS that silently writes group blocks. Displacement is a decision, not a recommendation toast. - budget: $10–22k discipline + RMS shape - timeline: 3–6 weeks to a house rule - providers: meridian-ops, yieldwell-rms, oakridge, ratewatch - cases: station-9-cancellation-wave, rivermark-groups - search_terms: group displacement, transient, group rate, wash, sales vs revenue, no-show, walk, transient vs group - claims: - [advice] If displacement is not on the same page as the group rate, you are guessing. ### Keep card data out of inboxes and spreadsheets - id: tokenize-card-flows - url: https://harbor.signalry.ai/jobs/tokenize-card-flows - persona: tech - jtbd: When a reservationist still pastes a PAN into email, I want a card flow I can draw so the number never lives in a mailbox or a night-audit workbook. - outcome: A card-flow diagram the GM can read, zero PANs in mail or sheets, and a watch on the new path. No SIEM you will not staff. - when_not_to_buy: A scanner PDF that never traces the night-audit workaround from 2019. - budget: $18–45k + path changes - timeline: 6–12 weeks - providers: folio-pci, folio-watch, northline-pms, keystone-switch, vault-lane - cases: pine-court-flag-change, millwright-tokens - search_terms: tokenize, PAN, card data, PCI, inbox, spreadsheet, inbox PCI, spreadsheet cards - claims: - [advice] If you cannot draw the card, you cannot scope it. - [verified] Pine Court closed a flag-change gap without replacing the PMS. ### Turn owner questions into a one-page answer - id: owner-one-pager - url: https://harbor.signalry.ai/jobs/owner-one-pager - persona: owner - jtbd: When the owner texts five questions on a Sunday, I want one page Monday morning so I am not rebuilding the P&L in the lobby. - outcome: A Monday one-pager: occupancy, ADR, GOP bridge, the one risk, the one decision. Arrives the morning after audit. - when_not_to_buy: A 40-line manager pack that lands on the 22nd. - budget: $8k–$8k/month retainer or a ledger shape - timeline: 2–4 weeks to a trusted Monday - providers: ashcroft, ledgerlight, meridian-ops, folio-one - cases: eastbound-management-fee, annex-gop-bridge, lakehouse-onepager - search_terms: owner pack, one-pager, owner questions, Monday pack, reporting, one-page answer, IC one pager - claims: - [advice] If the owner cannot read it on a phone, it is not a one-pager. ### Let an agent act without a master key - id: scoped-agent-access - url: https://harbor.signalry.ai/jobs/scoped-agent-access - persona: tech - jtbd: When someone wants to ‘just connect the agent to the PMS,’ I want a scope I can draw so it can draft a date change without posting a folio or seeing every card. - outcome: A written scope: what the agent can read, what it can draft, who posts, and a hard no on silent money or inventory writes. - when_not_to_buy: Any agent that requires admin on the PMS ‘just for setup’ and never gives it back. - budget: $4–15k scope + the agent - timeline: 2–6 weeks - providers: clerkshift, folio-watch, folio-pci, northline-pms, scope-gate - cases: rivermark-clerkshift, north-wharf-scope - search_terms: scoped agent, least privilege, master key, PMS API, permissions, agent scope, AI permissions - claims: - [advice] If the agent can post a folio, it is not scoped. It is staff you cannot fire at 2 a.m. - [verified] Rivermark: 73% drafted, 100% human-posted, auto-post off. ### Run revenue without a full-time analyst - id: rm-without-full-time-analyst - url: https://harbor.signalry.ai/jobs/rm-without-full-time-analyst - persona: owner - jtbd: When I am the GM and the revenue manager, I want a morning note I can argue with so pricing is not a Sunday-night spreadsheet or a silent robot. - outcome: A 6:15 rate note, an override log, and an RMS that recommends without writing rooms. - when_not_to_buy: A fully automatic rate robot. Silent writes fail Harbor integrity. - budget: $6–12/room/month demo RMS shape + a watch agent - timeline: 3–6 weeks to a habit - providers: yieldwell-rms, ratewatch, meridian-ops, oakridge, yield-fraction - cases: station-9-cancellation-wave, dune-inn-fractional - search_terms: revenue management, no analyst, pricing, comp set, override, pricing help - claims: - [advice] An override is a decision. A silent write is a hope. ### Hold a weekend floor without a quiet waive - id: weekend-min-stay-discipline - url: https://harbor.signalry.ai/jobs/weekend-min-stay-discipline - persona: owner - jtbd: When sales waives the two-night Saturday under pressure, I want a written floor and an exception log so we stop teaching the market that one night is always available. - outcome: A published min-stay rule, a named exception owner, and a weekend ADR you can defend. Silent waives are a fail. - when_not_to_buy: Do not buy a stricter floor if your midweek is already empty and Saturday is the only night that sells. That is a demand job. - budget: $9–18k rule sprint + any RMS shape - timeline: 3–5 weeks to a desk habit - providers: stay-floor, meridian-ops, yieldwell-rms, yield-fraction - cases: salt-porch-minstay - search_terms: minimum stay, weekend, yield, length of stay, Saturday, ops.rate-integrity, rate integrity, min stay, two-night, Saturday floor - claims: - [advice] A min-stay without an exception log is a suggestion. ### Sell two offers the desk will honor - id: pre-arrival-upsell-without-spam - url: https://harbor.signalry.ai/jobs/pre-arrival-upsell-without-spam - persona: ops - jtbd: When marketing wants a seven-email journey and the desk has never seen what was sold, I want two real offers so arrival is not an argument. - outcome: At most two pre-arrival offers tied to real inventory. Accepted offers on the desk board. Zero invented amenities. - when_not_to_buy: A journey builder that treats the guest inbox like a magazine. The desk will disown it. - budget: $4–12k + a quiet layer - timeline: 3–6 weeks - providers: soft-arrival, quiet-hours, inboxwell, quill-review - cases: harbor-light-upsell - search_terms: pre-arrival, upsell, ancillary, spam, late checkout, email journey - claims: - [advice] If the desk cannot honor it at 4 p.m., it is not an offer. It is spam. ### Close the month before the decisions leave - id: close-books-without-recon-war - url: https://harbor.signalry.ai/jobs/close-books-without-recon-war - persona: owner - jtbd: When the P&L arrives on the 22nd and the owner already spent the month, I want a close I can steer with — PMS, bank, and a reconciling list with names. - outcome: A close by day 8, reconciling items owned, reimbursables visible, and a one-pager the same morning. - when_not_to_buy: A dashboard that skips the bank. If it does not reconcile, it is a story. - budget: $4–8k / month or a sprint to reset the calendar - timeline: One close to see it; three to trust it - providers: tide-ledger, folio-one, ledgerlight, ashcroft - cases: iron-bridge-close - search_terms: month-end, close, reconciliation, P&L, books, ops.week-close, close the books, P&L late, day 8 close - claims: - [advice] A close on the 22nd is archaeology. Day 8 is a wheel. ### Stop selling the same room twice - id: prevent-double-oversell - url: https://harbor.signalry.ai/jobs/prevent-double-oversell - persona: tech - jtbd: When PMS and CRS disagree after a busy weekend, I want a guard so a sold room cannot be sold again — and a human who owns the disagreement. - outcome: A named inventory owner, a disagreement ticket within 15 minutes, and zero silent reservation moves. - when_not_to_buy: A product that auto-cancels the cheaper reservation. That is a second inventory owner you cannot fire. - budget: $8–22k discipline + a watch - timeline: 2–6 weeks - providers: twin-book, keystone-switch, northline-pms, folio-watch - cases: south-line-oversell - search_terms: oversell, double booking, inventory sync, CRS, two books, inventory fight, walk - claims: - [advice] Two books without a named owner is already an oversell. - [verified] See the connect-RMS-to-CRS job if the root is a write war. ### Hold a banquet guarantee without ghost covers - id: banquet-guarantee-without-ghost-covers - url: https://harbor.signalry.ai/jobs/banquet-guarantee-without-ghost-covers - persona: ops - jtbd: When sales writes a guarantee the kitchen cannot see and banquet pads the count, I want one BEO number so we stop cooking for guests who were never coming. - outcome: One guarantee the kitchen, banquet, and sales can point at. Ghost covers are a fail, not a buffer. - when_not_to_buy: Do not buy a banquet CRM if sales and kitchen still keep two spreadsheets. That is a number-owner job first. - budget: $6–14k process sprint + any BEO layer - timeline: 2–4 weeks to a shared count - providers: cover-line, morning-count, meridian-ops - cases: cedar-hall-banquet - search_terms: banquet, BEO, guarantee, covers, F&B, function, ghost covers, function sheet, plated - claims: - [advice] A guarantee nobody in the kitchen can find is a rumor. ### Hold a group cutoff without a wash surprise - id: group-cutoff-without-wash - url: https://harbor.signalry.ai/jobs/group-cutoff-without-wash - persona: owner - jtbd: When the group block looks full on Monday and washes on Thursday, I want a cutoff the sales manager cannot quietly extend so transient can still buy the dates. - outcome: A published cutoff, a wash forecast the owner can read, and rooms released to transient on time. Silent extensions are a fail. - when_not_to_buy: Do not buy a group CRM if you cannot name last year's wash by account. That is a ledger job first. - budget: $8–16k cutoff sprint - timeline: 3–5 weeks to a desk habit - providers: wash-desk, harborstack-crs, yield-fraction - cases: mill-row-cutoff - search_terms: group, cutoff, wash, block, pickup, release, group wash, block release, citywide, held rooms - claims: - [advice] A cutoff you extend in the PMS with no note is not a cutoff. ### Close lost-and-found without a liability hole - id: lost-and-found-without-liability - url: https://harbor.signalry.ai/jobs/lost-and-found-without-liability - persona: ops - jtbd: When a guest calls about a laptop and three people have a different drawer, I want one log with a hold period so we stop guessing who last touched it. - outcome: One log, a named holder, a written hold and dispose date. 'I think HK has it' is a fail. - when_not_to_buy: Do not buy an asset system if the drawer is still a shoebox. Photograph and log first. - budget: $3–8k log + process - timeline: 10–21 days - providers: claim-chest, slip-draft, housekeep-seq - cases: pine-lock-lost - search_terms: lost and found, liability, guest property, hold period, drawer, lost & found, laptop left - claims: - [advice] If three people can name a different drawer, you do not have a log. ### Set a breakfast count without cooking for ghosts - id: breakfast-count-without-waste - url: https://harbor.signalry.ai/jobs/breakfast-count-without-waste - persona: ops - jtbd: When the chef plates for in-house plus a pad and half the plates come back, I want a count tied to occupied rooms and known arrivals so food cost stops being a shrug. - outcome: A breakfast number from occupied + known arrivals, not a pad. Waste is written, not tasted. - when_not_to_buy: Do not buy a kitchen display if the count is still 'what we did last Sunday.' That is a PMS extract job. - budget: $4–11k count habit + any forecast layer - timeline: 2–3 weeks - providers: morning-count, cover-line, meridian-ops - cases: oat-house-breakfast - search_terms: breakfast, covers, food cost, occupied, F&B forecast, breakfast count, breakfast waste, plated, occupied breakfast - claims: - [advice] A breakfast pad that is always +20 is not a forecast. It is a habit. ### Get operations ready so a buyer will underwrite - id: ops-ready-for-sale - url: https://harbor.signalry.ai/jobs/ops-ready-for-sale - persona: ops - jtbd: When I plan to sell in two to four quarters, I want the house operable on paper so a buyer’s night-audit sample does not become a price chip. - outcome: A file a buy-side desk can rebuild: PMS extracts, payroll versus occupancy, FF&E truth, open life-safety, and a GM who knows what is in the room. - when_not_to_buy: Do not hire a teaser mill if the night audit is still a rumor. That is not marketing. It is a future concession. - budget: In-house time plus $8–25k to clean the file - timeline: 8–16 weeks before a teaser - providers: sable-desk, ashcroft, vale-street, ledgerlight, close-room - cases: harbor-house-sale-file - search_terms: sale, disposition, data room, T12, ops readiness, sell-side, night audit, prepare for sale, sell the hotel, sale file, ops ready - claims: - [advice] A CIM cannot repair a night audit the buyer will sample. ### Build a hotel data room a buyer can trust - id: prepare-hotel-data-room - url: https://harbor.signalry.ai/jobs/prepare-hotel-data-room - persona: owner - jtbd: When we go to market, I want a room indexed like evidence so diligence is a conversation about the hotel, not a hunt for the ground lease. - outcome: A dated, permissioned room: ops, brand, legal, capex, insurance — no guest PII — that a buy-side desk can actually use. - when_not_to_buy: Do not buy a virtual room if guest names or folio text are in the extract. Harbor will not host the file. Index evidence, not a dump. - budget: $4–18k setup plus counsel time - timeline: 3–6 weeks - providers: close-room, sable-desk, vault-lane, folio-one - cases: harbor-house-sale-file - search_terms: data room, diligence, CIM, virtual data room, sale, VDR, diligence room, CIM files - claims: - [advice] A room a night audit would embarrass is not a data room. - [verified] Kestrel Motor Lodge: 9/9 data-room items indexed with zero guest PII before CIM. ### Choose a hotel broker without buying a brochure - id: choose-broker - url: https://harbor.signalry.ai/jobs/choose-broker - persona: owner - jtbd: When I sell or buy a hotel, I want a desk that matches the comparable set — not a compliment that cannot name a public tape. - outcome: A hired desk with a written comparable set, a buyer or seller map, a conflict sentence, and a fee you can explain. - when_not_to_buy: Do not hire a book that cannot name a public tape. A compliment is not a comparable set. Harbor will not invent the consideration. - budget: Success fee 1–3% is common — read the engagement - timeline: 2–4 weeks to hire; the sale is longer - providers: sable-desk, ashcroft, desk-signal - cases: flagstaff-walk-away - search_terms: broker, investment sales, HWE, CBRE Hotels, JLL, list the hotel, hotel broker - claims: - [advice] If they cannot cite a tape, they are selling a brochure. - [verified] Kestrel Motor Lodge: 3 brokers interviewed against public comp tapes before mandate. ### Underwrite a hotel acquisition like an operator - id: underwrite-acquisition - url: https://harbor.signalry.ai/jobs/underwrite-acquisition - persona: owner - jtbd: When I am about to buy, I want a memo that rebuilds the T12 from ops evidence, names the basis risk, and is allowed to kill the deal. - outcome: A buy-side memo: rebuilt income, named NOI definition, PIP, ground lease, affiliation, sensitivity, and a written no. - when_not_to_buy: Do not buy a CIM walkthrough if you have not sat the night audit. A cap rate the floor cannot support is fiction. A kill is a successful job. - budget: $25–80k desk, more if counsel-heavy - timeline: 3–6 weeks - providers: sable-desk, ashcroft, vale-street, ledgerlight, yield-fraction - cases: flagstaff-walk-away - search_terms: underwrite, acquisition, buy-side, cap rate, T12, diligence, NOI, buy a hotel, acquisition memo - claims: - [advice] Rebuild the T12 from ops evidence, or do not price it. - [verified] Mercer House: 19% NOI adjustment before LOI; $1.4M basis reduction. ### Plan a PIP without lying to the P&L - id: pip-planning - url: https://harbor.signalry.ai/jobs/pip-planning - persona: owner - jtbd: When a sale, a flag, or a tired product forces renovation, I want a scope, a calendar, and a displacement number — not a mood board. - outcome: A PIP with rooms of scope, a phasing calendar, a displacement NOI, and a reserve that is not a wish. - when_not_to_buy: Do not buy a mood board if displacement is not numbered. Rooms of scope and a calendar first. Fashion is not a PIP. - budget: Scope first $15–40k; construction is the real number - timeline: Scope 4–8 weeks; the work is a season - providers: oakridge, brandt-vale, copperline, hearth-key - cases: harborview-pip-phasing - search_terms: PIP, renovation, FF&E, brand standard, displacement, capex, FF&E reserve, brand PIP - claims: - [advice] A PIP without a displacement NOI is a wish with FF&E. - [verified] Harborview Select: 94 PIP items phased into two shoulder blocks; 136/136 summer keys held open. ### Decide flag, soft brand, or independent before you price it - id: brand-vs-independent - url: https://harbor.signalry.ai/jobs/brand-vs-independent - persona: owner - jtbd: When affiliation is the argument, I want a cash-flow comparison — fees, PIP, mix, buyer set — not a logo debate. - outcome: Two or three modeled files: independent, soft brand, hard flag — with fees, PIP, and who would buy the house next. - when_not_to_buy: Do not buy a logo debate without fees, PIP, mix, and who would buy the house next. Affiliation is cash flow, not a flag argument. - budget: $12–40k to model and walk brand conversations - timeline: 4–8 weeks - providers: brandt-vale, ashcroft, sable-desk - cases: courtyard-affiliation-math - search_terms: soft brand, franchise, independent, flag, affiliation, Autograph, Curio, franchise vs independent, flag decision, reflag - claims: - [advice] Model two files. A logo is not a decision. - [verified] Alder House: 100% of FDD fee stack and entry PIP modeled; 24-month royalty ramp negotiated. ### Finance a hotel acquisition without borrowing a CIM - id: hotel-financing-for-acquisition - url: https://harbor.signalry.ai/jobs/hotel-financing-for-acquisition - persona: owner - jtbd: When I need debt to close, I want a term I can survive in a PIP year — not a compliment that dies if ADR misses 10%. - outcome: A term sheet compared on recourse, IO, PIP holdback, franchise consent, and the down-left sensitivity cell. - when_not_to_buy: Harbor is not a lender. Do not take a compliment term that dies if ADR misses 10%. Read recourse, IO, PIP holdback, and franchise consent. - budget: Lender / broker fees as quoted — Harbor is not a lender - timeline: 6–12 weeks in a grown-up file - providers: sable-desk, ledgerlight - cases: redstone-debt-sizing - search_terms: financing, CMBS, hospitality debt, LTV, acquisition loan, hotel loan, acquisition financing - claims: - [advice] Survive the PIP year, or the term is theater. - [verified] Monarch Park Inn: closed at 1.42x stressed DSCR across 3 lender term sheets on identical T12. ### Read the ground lease and the management agreement - id: ground-lease-and-management-review - url: https://harbor.signalry.ai/jobs/ground-lease-and-management-review - persona: owner - jtbd: When the CIM mentions a lease or an operator in a footnote, I want those contracts treated as the deal — because they are. - outcome: A plain-language memo: remaining term, resets, consent, fees, termination, and what happens to equity if the clock is short. - when_not_to_buy: Do not treat the footnote as optional. Remaining term, resets, consent, and operator fees are the deal. Harbor will not invent a leasehold price. - budget: $15–45k counsel plus an operator-fluent reader - timeline: 2–4 weeks - providers: ashcroft, sable-desk, brandt-vale - cases: marina-lease-paper - search_terms: ground lease, management agreement, operator fee, leasehold - claims: - [advice] If the clock is short, equity is a different product. - [verified] Marina Wharf: 18/18 ground-lease and HMA clauses abstracted pre-LOI; 46-year tail secured. ### True-up working capital without a close fight - id: working-capital-true-up-without-fight - url: https://harbor.signalry.ai/jobs/working-capital-true-up-without-fight - persona: owner - jtbd: When the PSA names a working-capital target, I want a dated cutoff so we stop arguing AR at the table after the money has moved. - outcome: A signed cutoff: AR aging without guest names, AP that matches the books, and a cash line both desks can rebuild. An unsigned night is a fail. - when_not_to_buy: Do not buy a true-up worksheet if the PSA still has no target. Write the number and the cutoff date first. - budget: $6–14k to stand the cutoff, plus counsel - timeline: 14–21 nights before close - providers: true-up-desk, close-room, cutoff-sheet - cases: ash-true-up - search_terms: working capital, true-up, cutoff, AR aging, closing adjustment, net working capital, true up, NWC - claims: - [advice] An unsigned cutoff is how a close becomes a collection call. ### Walk the PCA without a hidden year-two roof - id: pca-without-hidden-capex - url: https://harbor.signalry.ai/jobs/pca-without-hidden-capex - persona: owner - jtbd: When the buyer’s engineer walks, I want every major system on a page with a year — so a 'deferred' roof does not become a price chip in month fourteen. - outcome: A property condition memo: twelve systems named, year-1 vs year-5 split, and zero 'TBD' on a roof, boiler, or life-safety line. - when_not_to_buy: Do not buy a glossy PCA if the roof is still 'monitor.' Name the year or strike the line. - budget: $8–22k walk and memo, not a GC bid - timeline: 10–21 days - providers: condition-walk, pip-phase, sable-desk - cases: ridge-pca - search_terms: PCA, property condition, capex, FF&E reserve, roof, life safety, year-two, deferred maintenance - claims: - [advice] A deferred roof without a year is a hidden capex line. ### Hand the house at close without a day-one hole - id: close-transition-without-day-one-hole - url: https://harbor.signalry.ai/jobs/close-transition-without-day-one-hole - persona: ops - jtbd: When the keys move, I want a named GM of record, a night audit, payroll, and vendor ACH — so day one is not a lobby full of 'who is in charge.' - outcome: A seven-day close list: GM of record, night audit named, payroll calendar, vendor ACH, and keys. A missing ACH on day one is a fail. - when_not_to_buy: Do not buy a transition app if the GM of record is still 'TBD.' Name the person first. - budget: $5–12k sit plus in-house time - timeline: 7 days around close - providers: day-one-desk, meridian-ops, hold-note - cases: quay-day-one - search_terms: close transition, day one, GM of record, vendor ACH, night audit, handover, takeover, keys - claims: - [advice] A missing vendor ACH on day one is how the lights stay on by accident. ### Buy verified-outcome cover for a named hotel job - id: buy-verified-outcome-cover - url: https://harbor.signalry.ai/jobs/buy-verified-outcome-cover - persona: owner - jtbd: When I will pay for a result — not a vendor — I want to name the claim, the evidence, and the caveat so someone could one day back it. - outcome: A structured underwriting packet: claim, inspectable evidence, caveat, success criteria, and a price you would pay. Demand signal only — not a policy. - when_not_to_buy: Do not buy a policy from Harbor. There is none. If you need licensed insurance, call a licensed desk. Harbor is collecting demand and design partners. - budget: A number you would pay if the criterion held — not a premium today - timeline: One sitting to write the packet; backing is not live - providers: outcome-desk, caveat-ledger, evidence-scout - cases: glasswater-outcome-packet - search_terms: verified outcome, outcome cover, hotel insurance, willingness to pay, underwriting, backed result, design partner - claims: - [advice] A price without evidence and a caveat is a wish, not a packet. ### Name evidence a third party could inspect - id: name-evidence-for-outcome-backing - url: https://harbor.signalry.ai/jobs/name-evidence-for-outcome-backing - persona: ops - jtbd: When I say a job is done, I want a log someone who does not work here could read — so 'verified' is not a slogan. - outcome: An evidence line: what to inspect, where it lives, and what is out of scope. No guest names. No invented percentages. - when_not_to_buy: Do not hire a storyteller if the night audit cannot produce the extract. Write the extract first. - budget: In-house time - timeline: One desk session - providers: outcome-desk, evidence-scout, caveat-ledger - cases: glasswater-outcome-packet - search_terms: evidence, verified, third party, rooms board, claim, inspectable log, claim caveat - claims: - [advice] Verified requires evidence a stranger could inspect. ### Turn an intent into an underwriting packet - id: underwrite-verified-outcome-intent - url: https://harbor.signalry.ai/jobs/underwrite-verified-outcome-intent - persona: tech - jtbd: When I have a claim and a price, I want a structured packet a future underwriter could refuse — so we stop talking in slogans. - outcome: JSON: claim, evidence, caveat, criteria, price, persona, stack. Status is demand-signal. licensed is false. - when_not_to_buy: Do not POST guest names to /api/outcomes. The stub will reject the language and Harbor will not keep the file. - budget: Zero premium — the packet is the product today - timeline: Fifteen minutes on /verified-outcomes - providers: caveat-ledger, outcome-desk, evidence-scout - cases: glasswater-outcome-packet - search_terms: underwriting packet, JSON export, verified outcome, design partner, demand signal, not licensed, intent - claims: - [advice] An underwriting packet that claims to be a policy fails integrity. ## Providers ### Meridian Ops Partners - id: meridian-ops - url: https://harbor.signalry.ai/providers/meridian-ops - type: people - kind: human - specialty: Demand recovery & occupancy - blurb: Former cluster GMs who run 30–90 day occupancy recoveries without burning the rate book. - fee: $18–32k sprint, or $4.5k/week embed - score: 8.7 (outcome 8.9 / integrity 8.6 / fit 8.4, 31 post-job reviews) - demo: no - best_for: GMs who need a time-boxed occupancy recovery with a grown-up rate posture. - not_for: Full-service branded hotels looking for a new management company. ### Nightwatch Hospitality - id: nightwatch - url: https://harbor.signalry.ai/providers/nightwatch - type: people - kind: human - specialty: Night audit & overnight coverage - blurb: Trains, staffs, and documents night audit so the GM is not the 2 a.m. backup forever. - fee: $12–22k setup + hourly coverage bid - score: 8.4 (outcome 8.5 / integrity 8.8 / fit 7.9, 19 post-job reviews) - demo: no - best_for: Owner-operators who are the night audit. - not_for: Convention hotels with an existing night manager bench. ### Hearth & Key - id: hearth-key - url: https://harbor.signalry.ai/providers/hearth-key - type: people - kind: human - specialty: Housekeeping quality & guest comfort - blurb: Room-quality programs that treat complaint rate as an operations number, not a training slogan. - fee: $14–28k program, 8–12 weeks - score: 8.9 (outcome 9 / integrity 8.8 / fit 8.7, 27 post-job reviews) - demo: no - best_for: GMs watching housekeeping comments eat the rating. - not_for: Hotels that only want a mystery-shop report. ### Ashcroft Asset Advisors - id: ashcroft - url: https://harbor.signalry.ai/providers/ashcroft - type: people - kind: human - specialty: Owner asset management - blurb: Independent owner advisors for GOP, management agreements, and capex sequencing — not a brand desk. - fee: $25–60k engagement or $8k/month retainer - score: 8.8 (outcome 8.6 / integrity 9.2 / fit 8.7, 22 post-job reviews) - demo: no - best_for: Owners who want a second set of books that is not the manager's. - not_for: Branded flags looking for a PIP vendor. ### Vale Street Capex - id: vale-street - url: https://harbor.signalry.ai/providers/vale-street - type: people - kind: human - specialty: Rooms vs public-space capex - blurb: FF&E and renovation sequencing that starts from guest-job evidence, not a lobby mood board. - fee: $20–45k study; implementation bid separate - score: 8.3 (outcome 8.2 / integrity 8.7 / fit 8.1, 14 post-job reviews) - demo: no - best_for: Owners choosing between a pretty lobby and rooms that book. - not_for: Full PIP execution for a 400-key flag. ### Quill Review Studio - id: quill-review - url: https://harbor.signalry.ai/providers/quill-review - type: people - kind: human - specialty: Reputation recovery - blurb: Post-spike review recovery: response craft, ops fixes, and a 90-day rating path an owner can watch. - fee: $9–16k recovery sprint - score: 8.5 (outcome 8.4 / integrity 8.9 / fit 8.3, 36 post-job reviews) - demo: no - best_for: A sudden, specific review collapse with a known cause. - not_for: Properties hunting for a guaranteed star rating. ### Copperline Energy - id: copperline - url: https://harbor.signalry.ai/providers/copperline - type: people - kind: human - specialty: Hotel energy without comfort hits - blurb: Energy programs that treat guest comfort as a constraint, not a slide in the savings deck. - fee: $22–50k audit + shared-savings option - score: 8.6 (outcome 8.7 / integrity 8.6 / fit 8.4, 17 post-job reviews) - demo: no - best_for: Older hotels with a real utility line and a GM who will not freeze guests. - not_for: New-build flags with an energy team already in-house. ### Brandt & Vale Labor - id: brandt-vale - url: https://harbor.signalry.ai/providers/brandt-vale - type: people - kind: human - specialty: Hotel labor design - blurb: Schedules, wage bands, and cross-training that keep the desk staffed without a 70-hour GM. - fee: $11–20k labor redesign - score: 8.2 (outcome 8.1 / integrity 8.6 / fit 8, 13 post-job reviews) - demo: no - best_for: GMs living inside the schedule spreadsheet. - not_for: Hotels that only want bodies for this weekend. ### Oakridge Distribution - id: oakridge - url: https://harbor.signalry.ai/providers/oakridge - type: people - kind: human - specialty: OTA mix & brand.com - blurb: Channel strategy for hotels that are 70–85% OTA and want a path that does not tank occupancy. - fee: $16–30k, 12–16 weeks - score: 8.4 (outcome 8.3 / integrity 8.7 / fit 8.2, 21 post-job reviews) - demo: no - best_for: Owners tired of commission as a surprise. - not_for: Hotels already running a mature loyalty engine. ### Sable Underwriting Desk - id: sable-desk - url: https://harbor.signalry.ai/providers/sable-desk - type: people - kind: human - specialty: Boutique acquisition underwriting - blurb: Buy-side hotel underwriting for 40–200 key independents — ops reality, not just a trailing twelve. - fee: $35–75k buy-side memo - score: 8.9 (outcome 8.7 / integrity 9.3 / fit 8.8, 11 post-job reviews) - demo: no - best_for: First-time or small-fund buyers of a single boutique. - not_for: Institutional portfolios with an in-house desk. ### Folio Security Advisors - id: folio-pci - url: https://harbor.signalry.ai/providers/folio-pci - type: people - kind: human - specialty: PCI & hotel cyber after flag change - blurb: Franchise-change and stack-change PCI work that names what is actually in scope. - fee: $18–40k audit + remediation plan - score: 8.7 (outcome 8.6 / integrity 9 / fit 8.6, 16 post-job reviews) - demo: no - best_for: A flag change, a PMS change, or a real card incident. - not_for: Enterprises that already have a hotel-fluent CISO bench. ### Linen Change Co. - id: linen-change - url: https://harbor.signalry.ai/providers/linen-change - type: people - kind: human - specialty: Housekeeping contracting - blurb: A rooms contractor that publishes attendant minutes and complaint rates, not just a headcount invoice. - fee: Per-occupied-room bid, published SLA - score: 8.1 (outcome 8.3 / integrity 8 / fit 7.8, 24 post-job reviews) - demo: no - best_for: Hotels that cannot hire a stable rooms team locally. - not_for: Properties that want a consultant, not a contractor. ### Northline PMS - id: northline-pms - url: https://harbor.signalry.ai/providers/northline-pms - type: software - kind: software - specialty: Property management system - blurb: Demo-labeled cloud PMS for 50–250 key independents. Archetype only — not an official product claim. - fee: Demo · $8–14 / room / month - score: 8 (outcome 8.1 / integrity 8.4 / fit 7.6, 18 post-job reviews) - demo: yes - best_for: Independents replacing a brittle on-prem PMS. - not_for: Enterprise flags that need a brand-mandated stack. ### HarborStack CRS - id: harborstack-crs - url: https://harbor.signalry.ai/providers/harborstack-crs - type: software - kind: software - specialty: Central reservation system - blurb: Demo-labeled CRS archetype for independent and soft-brand hotels. Not a claimed partnership. - fee: Demo · $4–9 / room / month + booking fee options - score: 7.9 (outcome 7.8 / integrity 8.3 / fit 7.7, 12 post-job reviews) - demo: yes - best_for: Hotels connecting revenue tools without two sources of truth. - not_for: Single-property hotels happy with a simple channel manager. ### Yieldwell RMS - id: yieldwell-rms - url: https://harbor.signalry.ai/providers/yieldwell-rms - type: software - kind: software - specialty: Revenue management system - blurb: Demo-labeled RMS archetype: transparent recommendations, human override, no black-box pricing. - fee: Demo · $6–12 / room / month - score: 8.2 (outcome 8.3 / integrity 8.5 / fit 7.8, 15 post-job reviews) - demo: yes - best_for: GMs who want pricing help they can argue with. - not_for: Hotels that want a fully automatic rate robot. ### Inboxwell Messaging - id: inboxwell - url: https://harbor.signalry.ai/providers/inboxwell - type: software - kind: software - specialty: Guest messaging - blurb: Demo-labeled messaging stack the desk will actually open — SMS, WhatsApp, and a PMS-tied inbox. - fee: Demo · $299–799 / property / month - score: 8.1 (outcome 8 / integrity 8.4 / fit 8, 20 post-job reviews) - demo: yes - best_for: Hotels whose guests already text and whose desk ignores email. - not_for: Properties hunting for an unmanned concierge. ### Ledgerlight Accounting - id: ledgerlight - url: https://harbor.signalry.ai/providers/ledgerlight - type: software - kind: software - specialty: Hotel accounting & night audit export - blurb: Demo-labeled hotel ledger that sits cleanly on a PMS export — not a generic SMB book tool. - fee: Demo · $250–600 / month - score: 7.8 (outcome 7.9 / integrity 8.2 / fit 7.5, 9 post-job reviews) - demo: yes - best_for: Owner-operators tired of a generic bookkeeper file. - not_for: Multi-brand portfolios with a shared-service finance team. ### Kilowatt Hall - id: kilowatt-hall - url: https://harbor.signalry.ai/providers/kilowatt-hall - type: software - kind: software - specialty: Hotel energy monitoring - blurb: Demo-labeled energy dashboard by floor and daypart, built to sit next to a comfort complaint feed. - fee: Demo · $1.50–3.00 / room / month + hardware - score: 7.7 (outcome 7.6 / integrity 8.1 / fit 7.6, 8 post-job reviews) - demo: yes - best_for: GMs who want energy and comfort on one page. - not_for: Hotels that need a turnkey ESCO, not a monitor. ### Frontglass Reputation - id: frontglass - url: https://harbor.signalry.ai/providers/frontglass - type: software - kind: software - specialty: Review inbox & rating trajectory - blurb: Demo-labeled review inbox with a published rating trajectory — no promised stars. - fee: Demo · $149–399 / property / month - score: 8 (outcome 7.9 / integrity 8.6 / fit 7.8, 14 post-job reviews) - demo: yes - best_for: GMs who need the review firehose in one place. - not_for: Hotels buying a guaranteed rating. ### Wayfind Direct - id: wayfind-direct - url: https://harbor.signalry.ai/providers/wayfind-direct - type: software - kind: software - specialty: Brand.com booking path - blurb: Demo-labeled direct booking site and metasearch feed for independents — not a brand engine. - fee: Demo · $400–1,200 / month + media - score: 7.8 (outcome 7.7 / integrity 8.2 / fit 7.6, 10 post-job reviews) - demo: yes - best_for: Independents whose brand.com still feels like a brochure. - not_for: Flags that must use the brand engine. ### Keystone Switch PMS - id: keystone-switch - url: https://harbor.signalry.ai/providers/keystone-switch - type: software - kind: software - specialty: PMS cutover & parallel run - blurb: Demo-labeled cutover kit: parallel folio, mapping, and a six-week go-live — not a six-month outage. - fee: Demo · $15–40k cutover - score: 8.3 (outcome 8.4 / integrity 8.5 / fit 8, 11 post-job reviews) - demo: yes - best_for: Tech leads who have been burned by a 'rip and replace' weekend. - not_for: Hotels that only want a new logo on the folio. ### Clerkshift Agent - id: clerkshift - url: https://harbor.signalry.ai/providers/clerkshift - type: agent - kind: agent - specialty: Reservation modifications - blurb: A narrow agent that proposes date, rate, and add-on changes — a human posts anything that touches the folio. - fee: $0.40–0.90 / handled request + monthly floor - score: 8 (outcome 8.1 / integrity 8.3 / fit 7.6, 9 post-job reviews) - demo: no - best_for: Desks drowning in date-change email. - not_for: Hotels that want an unmanned reservations office. ### Night Ledger Agent - id: night-ledger - url: https://harbor.signalry.ai/providers/night-ledger - type: agent - kind: agent - specialty: Night audit assistance - blurb: Reads the audit pack, flags exceptions, and drafts the morning note — does not close the day alone. - fee: $399–899 / month - score: 8.2 (outcome 8 / integrity 8.6 / fit 8.1, 7 post-job reviews) - demo: no - best_for: Hotels with a closer who needs a second set of eyes at 2 a.m. - not_for: Properties hoping to eliminate overnight labor this quarter. ### Housekeep Sequence Agent - id: housekeep-seq - url: https://harbor.signalry.ai/providers/housekeep-seq - type: agent - kind: agent - specialty: Room assignment & rush sequencing - blurb: Sequences vacant-dirty rooms against arrivals and rush flags. Does not invent a clean room. - fee: $249–599 / month - score: 7.9 (outcome 8 / integrity 8.2 / fit 7.5, 8 post-job reviews) - demo: no - best_for: Desks that lose the afternoon to rush-room chaos. - not_for: Hotels without a rooms supervisor who will override it. ### Ratewatch Agent - id: ratewatch - url: https://harbor.signalry.ai/providers/ratewatch - type: agent - kind: agent - specialty: Competitive rate watch - blurb: Watches a defined comp set and drafts a rate note — never silently writes the RMS. - fee: $199–449 / month - score: 8.1 (outcome 7.9 / integrity 8.7 / fit 7.8, 12 post-job reviews) - demo: no - best_for: GMs who are their own revenue manager. - not_for: Hotels that want an autopilot rate robot. ### Reviewdraft Agent - id: reviewdraft - url: https://harbor.signalry.ai/providers/reviewdraft - type: agent - kind: agent - specialty: Review response drafts - blurb: Drafts responses in the GM's voice. The GM still hits send. No review gating. - fee: $149–349 / month - score: 8.3 (outcome 8.1 / integrity 8.8 / fit 8.2, 16 post-job reviews) - demo: no - best_for: GMs who answer reviews at 11 p.m. - not_for: Anyone shopping for fake volume. ### Energy Loop Agent - id: energy-loop - url: https://harbor.signalry.ai/providers/energy-loop - type: agent - kind: agent - specialty: Setpoint & schedule suggestions - blurb: Suggests HVAC schedules against occupancy and comfort comments. A human applies the setpoint. - fee: $199–499 / month - score: 7.8 (outcome 7.7 / integrity 8.4 / fit 7.6, 6 post-job reviews) - demo: no - best_for: Hotels that already have a contractor and want a daily loop. - not_for: A first energy project with no hardware. ### Folio Watch Agent - id: folio-watch - url: https://harbor.signalry.ai/providers/folio-watch - type: agent - kind: agent - specialty: Inventory & card-flow watch - blurb: Watches PMS/CRS inventory drift and card-flow exceptions. Alerts. Does not silently 'fix' a folio. - fee: $299–699 / month - score: 8.4 (outcome 8.2 / integrity 8.9 / fit 8.1, 8 post-job reviews) - demo: no - best_for: Tech leads mid-cutover or mid-flag-change. - not_for: Hotels that want an agent to quietly 'handle' money. ### Desk Signal - id: desk-signal - url: https://harbor.signalry.ai/providers/desk-signal - type: software - kind: software - specialty: Review recovery & front-desk alerts - blurb: Same-day review alerts with a recovery script the desk can run before the guest leaves the parking lot. - fee: $290–$540 / month - score: 8.2 (outcome 8.3 / integrity 8.1 / fit 8.4, 19 post-job reviews) - demo: no - best_for: GMs who want same-day recovery, not a weekly reputation PDF. - not_for: Brand hotels already on a mandated reputation suite. ### Vault Lane - id: vault-lane - url: https://harbor.signalry.ai/providers/vault-lane - type: people - kind: human - specialty: Card tokenization & PCI scope - blurb: Cuts card-present and virtual-card flows down to a token path a QSA can follow. - fee: $22–40k scoped engagement - score: 8.6 (outcome 8.5 / integrity 9 / fit 8.3, 11 post-job reviews) - demo: no - best_for: Owners who are tired of PANs living in inboxes. - not_for: Hotels looking for a cheaper processor as the primary goal. ### Folio One - id: folio-one - url: https://harbor.signalry.ai/providers/folio-one - type: software - kind: software - specialty: Owner one-pagers from PMS + bank - blurb: A Saturday owner sheet: occupancy, GOP, cash, and the three questions the GM must answer. - fee: $180–$320 / month - score: 8.1 (outcome 8 / integrity 8.4 / fit 8.2, 16 post-job reviews) - demo: no - best_for: Owners who want the truth on one page, not a deck. - not_for: Asset managers who need a branded investor portal. ### Scope Gate - id: scope-gate - url: https://harbor.signalry.ai/providers/scope-gate - type: software - kind: software - specialty: Scoped agent access to PMS - blurb: Least-privilege tokens for agents: one job, one property, one expiry — no shared night-audit login. - fee: $240–$480 / month + setup - score: 8.3 (outcome 8.1 / integrity 8.8 / fit 8.2, 9 post-job reviews) - demo: no - best_for: Tech leads who want agents without giving away the kingdom. - not_for: Hotels still on a PMS with no API. ### Yield Fraction - id: yield-fraction - url: https://harbor.signalry.ai/providers/yield-fraction - type: people - kind: human - specialty: Fractional revenue analyst - blurb: A senior RM two days a week — pickup, pace, and a Thursday memo — without a full-time hire. - fee: $3.8–6.2k / month - score: 8.5 (outcome 8.6 / integrity 8.4 / fit 8.5, 22 post-job reviews) - demo: no - best_for: Owners who cannot staff a full-time analyst honestly. - not_for: Large branded hotels with a cluster RM already in place. ### Stay Floor - id: stay-floor - url: https://harbor.signalry.ai/providers/stay-floor - type: people - kind: human - specialty: Minimum-stay & yield rules - blurb: Writes the weekend min-stay rule the desk can defend — and the exceptions that will not quietly die. - fee: $9–18k rule sprint - score: 8.3 (outcome 8.4 / integrity 8.5 / fit 8, 14 post-job reviews) - demo: no - best_for: GMs who keep waiving the weekend rule under pressure. - not_for: Urban midscale with a true one-night weekday pattern. ### Soft Arrival - id: soft-arrival - url: https://harbor.signalry.ai/providers/soft-arrival - type: software - kind: software - specialty: Pre-arrival offers the desk will honor - blurb: Two offers, one confirmation path, no spam. The desk sees what was sold before the guest arrives. - fee: $220–$410 / month - score: 8 (outcome 8.1 / integrity 8.2 / fit 7.8, 17 post-job reviews) - demo: no - best_for: Houses that want ancillary revenue without training guests to ignore the brand. - not_for: Hotels whose brand already owns the pre-arrival journey. ### Tide & Ledger - id: tide-ledger - url: https://harbor.signalry.ai/providers/tide-ledger - type: people - kind: human - specialty: Month-end close without a recon war - blurb: Closes the month from PMS and bank with a reconciling list the owner can read — not a 40-tab fight. - fee: $4.2–7.5k / month close - score: 8.4 (outcome 8.3 / integrity 8.8 / fit 8.2, 13 post-job reviews) - demo: no - best_for: Owners tired of a P&L that arrives after the decisions. - not_for: Branded hotels whose management company already closes on a calendar. ### Twin Book - id: twin-book - url: https://harbor.signalry.ai/providers/twin-book - type: software - kind: software - specialty: Inventory guard across PMS and CRS - blurb: Watches two books so a sold room cannot be sold again. Alerts. Does not silently steal a reservation. - fee: $180–$360 / month (category shape) - score: 8.1 (outcome 8 / integrity 8.5 / fit 8, 10 post-job reviews) - demo: yes - best_for: Tech leads who already know they have two truths. - not_for: A house still on a PMS with no availability API. ### Quiet Hours - id: quiet-hours - url: https://harbor.signalry.ai/providers/quiet-hours - type: agent - kind: agent - specialty: Guest-message drafts the desk will send - blurb: Drafts a reply in house voice. A person sends. It will not invent an amenity or close a ticket. - fee: $90–$180 / month - score: 7.9 (outcome 7.8 / integrity 8.4 / fit 7.7, 12 post-job reviews) - demo: no - best_for: Desks that want speed without an unmanned bot. - not_for: Hotels looking to deflect tickets to look fast. ### Copper Par - id: copper-par - url: https://harbor.signalry.ai/providers/copper-par - type: people - kind: human - specialty: Linen par & rooms flow - blurb: Fixes the par and the cart path so attendants stop being blamed for a supply problem. - fee: $11–20k par sprint - score: 8.2 (outcome 8.3 / integrity 8.1 / fit 8.2, 15 post-job reviews) - demo: no - best_for: GMs whose rooms fail rate is a linen story. - not_for: A house that will not count the closet. ### Amber Reply - id: amber-reply - url: https://harbor.signalry.ai/providers/amber-reply - type: agent - kind: agent - specialty: In-house-voice review drafts - blurb: Drafts a same-day public reply the GM still signs. Refuses gated language. - fee: $70–$140 / month - score: 8 (outcome 7.9 / integrity 8.6 / fit 7.8, 11 post-job reviews) - demo: no - best_for: Houses that want speed on the public reply without a reputation intern. - not_for: Anyone selling a guaranteed star. ### Keyline Audit - id: keyline-audit - url: https://harbor.signalry.ai/providers/keyline-audit - type: people - kind: human - specialty: PCI walkthroughs for independents - blurb: Walks the actual card path — mailbox, closer workbook, the terminal that is down — then writes a scope an owner can fund. - fee: $14–28k walkthrough - score: 8.5 (outcome 8.4 / integrity 8.9 / fit 8.3, 9 post-job reviews) - demo: no - best_for: Owners who suspect the card still lives in email. - not_for: Hotels shopping a cheaper processor as the primary goal. ### Thirty Pack - id: thirty-pack - url: https://harbor.signalry.ai/providers/thirty-pack - type: people - kind: human - specialty: GM handover truth packs - blurb: Ten pages a new GM will open at 6 a.m. — pickup, rooms fail, OT, ticket age, review cluster. Not a brand onboarding novel. - fee: $8–16k pack - score: 8.4 (outcome 8.5 / integrity 8.6 / fit 8.1, 11 post-job reviews) - demo: no - best_for: Houses handing a new GM the real night audit, not the brand welcome. - not_for: A corporate onboarding program shopping a cover. ### Cover Line - id: cover-line - url: https://harbor.signalry.ai/providers/cover-line - type: people - kind: human - specialty: Banquet guarantee & BEO discipline - blurb: Sits sales, banquet, and kitchen until there is one guarantee — and a cutoff the chef can point at. - fee: $6–14k process sprint - score: 8.4 (outcome 8.5 / integrity 8.6 / fit 8.1, 11 post-job reviews) - demo: no - best_for: GMs whose banquet food cost cannot survive an owner question. - not_for: Limited-service houses with no banquet book. ### Wash Desk - id: wash-desk - url: https://harbor.signalry.ai/providers/wash-desk - type: people - kind: human - specialty: Group cutoff and wash forecast - blurb: Writes the cutoff the sales manager cannot quietly extend — and the wash number the owner reads on Monday. - fee: $8–16k cutoff sprint - score: 8.5 (outcome 8.6 / integrity 8.7 / fit 8.2, 15 post-job reviews) - demo: no - best_for: Owners who keep finding empty rooms that were 'held for the group.' - not_for: Houses with no group book to speak of. ### Claim Chest - id: claim-chest - url: https://harbor.signalry.ai/providers/claim-chest - type: people - kind: human - specialty: Lost-and-found log and hold rules - blurb: One drawer, one log, a hold and dispose date. Stops the 'I think HK has it' phone call. - fee: $3–8k log + policy - score: 8.2 (outcome 8.1 / integrity 8.8 / fit 8, 9 post-job reviews) - demo: no - best_for: GMs tired of a liability conversation with no paper. - not_for: Houses that already run a single logged locker with dates. ### Morning Count - id: morning-count - url: https://harbor.signalry.ai/providers/morning-count - type: software - kind: software - specialty: Breakfast and banquet count from occupied rooms - blurb: Recommends a plate count from occupied and arrivals. The chef still owns the number. Demo-shaped — not a brand partnership. - fee: $180–$340 / month - score: 7.9 (outcome 8 / integrity 8.1 / fit 7.6, 12 post-job reviews) - demo: yes - best_for: Houses whose breakfast pad is always +20 and nobody can say why. - not_for: Hotels whose brand already owns F&B forecasting. ### Slip Draft - id: slip-draft - url: https://harbor.signalry.ai/providers/slip-draft - type: agent - kind: agent - specialty: Lost-and-found guest notes - blurb: Drafts the guest note from the log. A person sends it. Will not email a room number or an ID photo. - fee: $90–$160 / month - score: 7.8 (outcome 7.7 / integrity 8.6 / fit 7.5, 8 post-job reviews) - demo: no - best_for: Desks that already have a log and waste time rewriting the same note. - not_for: Houses with no log — that is a Claim Chest job first. ### Close Room - id: close-room - url: https://harbor.signalry.ai/providers/close-room - type: people - kind: human - specialty: Hotel data rooms & sale-file hygiene - blurb: Indexes a hotel sale file like evidence — ops, lease, brand, insurance — and strips guest names before a buyer arrives. - fee: $8–18k to stand the room - score: 8.6 (outcome 8.5 / integrity 9.1 / fit 8.3, 9 post-job reviews) - demo: no - best_for: An owner who wants the room to survive a hostile buy-side. - not_for: A portfolio with an in-house transactions counsel bench. ### Phase & Par - id: pip-phase - url: https://harbor.signalry.ai/providers/pip-phase - type: people - kind: human - specialty: PIP scope, phasing, displacement - blurb: Turns a brand letter or a tired house into a room-count scope, a calendar, and an NOI displacement line. - fee: $18–36k scope and phasing memo - score: 8.5 (outcome 8.6 / integrity 8.7 / fit 8.2, 12 post-job reviews) - demo: no - best_for: A sale or flag conversion that needs a PIP number with a calendar. - not_for: A design-only refresh with no rooms closing. ### Flag Split Advisory - id: flag-split - url: https://harbor.signalry.ai/providers/flag-split - type: people - kind: human - specialty: Affiliation strategy — flag vs soft brand vs independent - blurb: Models fees, PIP, mix, and the next buyer. Will not add cap-rate magic because a logo is handsome. - fee: $16–40k dual-file memo - score: 8.4 (outcome 8.2 / integrity 9 / fit 8.1, 8 post-job reviews) - demo: no - best_for: An owner arguing affiliation as identity instead of cash flow. - not_for: A conversion already signed. ### Term Compare (demo desk) - id: term-compare - url: https://harbor.signalry.ai/providers/term-compare - type: software - kind: software - specialty: Side-by-side hotel term-sheet compare - blurb: Demo-labeled worksheet: recourse, IO, PIP holdback, prepay. Not a lender. Not a quote. - fee: Demo — not for sale - score: 7.8 (outcome 7.6 / integrity 8.8 / fit 7.4, 4 post-job reviews) - demo: yes - best_for: A buyer comparing two term sheets on clauses, not vibes. - not_for: Anyone who wants Harbor to place a loan. ### Comp Clerk - id: comp-clerk - url: https://harbor.signalry.ai/providers/comp-clerk - type: agent - kind: agent - specialty: Public-comp gathering for a named hotel - blurb: Narrow agent: pulls Harbor graph comps with scores and source URLs. Never invents a confidential price. - fee: Scoped run; no folio or rate writes - score: 8.2 (outcome 8 / integrity 9.4 / fit 7.9, 6 post-job reviews) - demo: no - best_for: A first pass on public comps before a broker conversation. - not_for: A BOV that needs unpublished sales. ### True-up Desk - id: true-up-desk - url: https://harbor.signalry.ai/providers/true-up-desk - type: people - kind: human - specialty: Working-capital cutoffs at hotel close - blurb: A dated cutoff both desks sign. Stops the AR fight after the wire. - fee: $6–14k cutoff sprint - score: 8.3 (outcome 8.4 / integrity 8.8 / fit 8, 7 post-job reviews) - demo: no - best_for: An owner whose last true-up became a collection call. - not_for: A deal whose PSA already names the night and both desks already sign it. ### Cutoff Sheet (demo desk) - id: cutoff-sheet - url: https://harbor.signalry.ai/providers/cutoff-sheet - type: software - kind: software - specialty: Named working-capital cutoff worksheet - blurb: Demo-labeled sheet: target, night, AR without names, AP match. Not a bank. Not a true-up opinion. - fee: Demo — not for sale - score: 7.6 (outcome 7.4 / integrity 8.9 / fit 7.3, 3 post-job reviews) - demo: yes - best_for: A desk that wants the ugly lines on one page before counsel redlines. - not_for: Anyone who wants Harbor to set working capital. ### Condition Walk - id: condition-walk - url: https://harbor.signalry.ai/providers/condition-walk - type: people - kind: human - specialty: Property condition memos with years - blurb: Twelve systems, year-1 vs year-5. Stops the hidden year-two roof. - fee: $8–22k walk and memo - score: 8.4 (outcome 8.5 / integrity 8.7 / fit 8.1, 8 post-job reviews) - demo: no - best_for: A buyer whose last 'deferred' roof showed up in month fourteen. - not_for: A house that already has named systems and years in the IC pack. ### Day-One Desk - id: day-one-desk - url: https://harbor.signalry.ai/providers/day-one-desk - type: people - kind: human - specialty: Close-week handover — GM, audit, ACH - blurb: GM of record, night audit, vendor ACH. Stops the day-one lobby with no desk. - fee: $5–12k sit - score: 8.2 (outcome 8.3 / integrity 8.6 / fit 8, 6 post-job reviews) - demo: no - best_for: An owner whose last close left the lobby asking who was in charge. - not_for: A managed house whose operator already names GM, audit, and ACH. ### Hold Note - id: hold-note - url: https://harbor.signalry.ai/providers/hold-note - type: agent - kind: agent - specialty: Close-week and desk confirmation notes - blurb: Drafts the close-week vendor ACH or desk confirmation note from written fields. A named person sends. - fee: $80–$150 / month - score: 7.7 (outcome 7.6 / integrity 8.5 / fit 7.4, 7 post-job reviews) - demo: no - best_for: Desks that already have a written close checklist or hold rule and want consistent confirmation notes. - not_for: Houses with no written handover list — that is a Day-One Desk job first. ### Outcome Desk - id: outcome-desk - url: https://harbor.signalry.ai/providers/outcome-desk - type: people - kind: human - specialty: Verified-outcome packets for hotel jobs - blurb: Sits claim, evidence, and caveat until a stranger could inspect the file. - fee: $4–9k packet sit - score: 8.1 (outcome 8 / integrity 8.9 / fit 7.8, 5 post-job reviews) - demo: no - best_for: An owner who will name a price if a criterion holds. - not_for: Anyone who wants Harbor to issue a policy today. ### Caveat Ledger (demo desk) - id: caveat-ledger - url: https://harbor.signalry.ai/providers/caveat-ledger - type: software - kind: software - specialty: Named claim / evidence / caveat worksheet - blurb: Demo-labeled sheet. Will not mint a policy. Will not keep guest names. - fee: Demo — not for sale - score: 7.5 (outcome 7.2 / integrity 9 / fit 7.1, 3 post-job reviews) - demo: yes - best_for: A tech lead who wants the schema on one page. - not_for: Anyone who wants Harbor to bind cover. ### Evidence Scout - id: evidence-scout - url: https://harbor.signalry.ai/providers/evidence-scout - type: agent - kind: agent - specialty: Drafts an evidence line from a named job — never marks the house - blurb: Suggests inspectable logs for a JTBD slug. Cannot close a folio or mark a room clean. - fee: Draft only — human signs - score: 7.8 (outcome 7.6 / integrity 8.8 / fit 7.5, 4 post-job reviews) - demo: no - best_for: A tech desk that wants a first sentence before the GM edits it. - not_for: Anyone who wants an agent to close night audit. ## Case studies ### A citywide wash, closed in eleven weeks - id: station-9-cancellation-wave - url: https://harbor.signalry.ai/cases/station-9-cancellation-wave - hotel: Station 9 (241 keys, Lifestyle, Denver, CO) - job: fill-rooms-after-cancellations - claim: Occupancy hole closed without teaching Denver a new BAR. - evidence: Weekly pickup memos vs occupancy and ADR floor for eleven weeks. - caveat: A citywide that lasts past the sprint is a different job. - metrics: Occupancy gap=19 → 3 pts[verified]; ADR vs floor=+$6[verified]; GM overrides=18% of recs[verified] - who: meridian-ops (Recovery embed), yieldwell-rms (Pricing recommendations (demo)), ratewatch (Morning rate note) ### Dirty-room mentions, halved in a quarter - id: harbor-house-housekeeping - url: https://harbor.signalry.ai/cases/harbor-house-housekeeping - hotel: Harbor House (72 keys, Historic boutique, Charleston, SC) - job: housekeeping-complaint-rate - claim: Dirty-room mentions halved because inspection became a number. - evidence: Comment tags vs Monday fail rate for one quarter. - caveat: Par had to be reset first. Software did not invent a clean sheet. - metrics: Dirty-room mentions=−61%[verified]; Rush rooms late=18% → 7%[verified]; Inspect points=40 → 12 done[verified] - who: hearth-key (Rooms program), housekeep-seq (Rush sequencing) ### The GM left the 2 a.m. rotation - id: wick-elm-night-audit - url: https://harbor.signalry.ai/cases/wick-elm-night-audit - hotel: The Wick & Elm (94 keys, Independent, Portland, OR) - job: night-audit-without-gm-burnout - claim: The GM left the 2 a.m. rotation without a theater 24-hour desk. - evidence: Closer roster, close-time stamps, GM backup log. - caveat: The wage still had to be paid. Coverage is not free. - metrics: GM backup nights=3/wk → 0[verified]; Close time=−22 min[verified]; Named closer=91 nights[verified] - who: nightwatch (Close + coverage), brandt-vale (Labor design), night-ledger (Exception assist) ### A 7.4 bubble, a 90-day path - id: marlowe-review-spike - url: https://harbor.signalry.ai/cases/marlowe-review-spike - hotel: The Marlowe (186 keys, Independent boutique, Austin, TX) - job: recover-ota-review-spike - claim: A 7.4 bubble recovered without gating or bought reviews. - evidence: Cluster named in five days; public replies signed; rooms cause closed. - caveat: The path was 14 weeks. A same-day reply does not rebuild a bubble. - metrics: Bubble=7.4 → 8.6[verified]; Path=14 weeks[verified]; Gated asks=0[verified] - who: quill-review (Recovery path), frontglass (Inbox (demo)), reviewdraft (Drafts in house voice), hearth-key (Rooms cause) ### Sixteen percent kWh, comments flat - id: copper-king-energy - url: https://harbor.signalry.ai/cases/copper-king-energy - hotel: Copper King (128 keys, Historic, Butte, MT) - job: cut-energy-without-comfort-hits - claim: Sixteen percent kWh with comfort comments flat. - evidence: Weather-normalized utility vs comment tags by week. - caveat: One kill-switch trip. Shared-savings was declined on purpose. - metrics: kWh=−16%[verified]; Temp comments=flat[verified]; Kill-switch trips=1, then fixed[verified] - who: copperline (Energy contractor), kilowatt-hall (Meter overlay (demo)), energy-loop (Schedule suggestions) ### A 3.2-point incentive, reset - id: eastbound-management-fee - url: https://harbor.signalry.ai/cases/eastbound-management-fee - hotel: Eastbound (178 keys, Independent, Kansas City, MO) - job: renegotiate-management-agreement - claim: Incentive reset without firing a GM the owner liked. - evidence: 24 months of fees vs owner cash; redline on hurdle and pack date. - caveat: This was not a sale. A different operator was not the product. - metrics: Incentive reset=3.2 pts[verified]; Owner pack=22nd → 8th[verified]; Operator change=none[verified] - who: ashcroft (Owner-side advisor) ### The lobby waited. The baths did not. - id: holloway-baths-not-lobby - url: https://harbor.signalry.ai/cases/holloway-baths-not-lobby - hotel: The Holloway (61 keys, Historic boutique, Savannah, GA) - job: lobby-refresh-vs-rooms-capex - claim: Capex went to baths because that is where the comments were. - evidence: Comment cluster vs spend; 61 baths complete; lobby $0. - caveat: The lobby still needs a future envelope. Unfashionable is not forever. - metrics: Baths=61 of 61[verified]; Lobby spend=$0 this cycle[verified]; Review score=+0.4[verified] - who: vale-street (Capex sequence), ashcroft (Owner vote), hearth-key (Comment evidence) ### Two GOP points, sleeping product untouched - id: annex-gop-bridge - url: https://harbor.signalry.ai/cases/annex-gop-bridge - hotel: The Annex (164 keys, Lifestyle, Chicago, IL) - job: lift-gop-without-cutting-guest - claim: Two GOP points without cutting the sleeping product. - evidence: Owner pack vs energy, mix, and rooms-labor lines; comment watch held. - caveat: Not 4 points. The attendant-cut slide would have made the number and broken the house. - metrics: GOP=+2.4 pts[verified]; Rooms labor=held[verified]; Comment watch=flat[verified] - who: ashcroft (GOP bridge), copperline (Energy line), ledgerlight (Owner pack (demo)) ### A kill is a successful job - id: flagstaff-walk-away - url: https://harbor.signalry.ai/cases/flagstaff-walk-away - hotel: Pine Court (pass) (88 keys, Independent, Flagstaff, AZ) - job: underwrite-boutique-acquisition - claim: A kill is a successful job. - evidence: Night-audit sample vs CIM T12; unbooked comps; capex in the basis. - caveat: A later, smaller deal closed. This memo was not a ‘never Flagstaff.’ - metrics: Decision=Walk[verified]; Unbooked comps=found[verified]; CIM T12=not used[verified] - who: sable-desk (Buy-side memo), vale-street (Capex in the basis), ashcroft (IC) ### Nine points of mix, occupancy held - id: glasswater-mix-shift - url: https://harbor.signalry.ai/cases/glasswater-mix-shift - hotel: Glasswater (310 keys, Lifestyle, Miami, FL) - job: shift-mix-off-otas - claim: Nine points of mix with occupancy held. - evidence: Contribution after commission; occupancy ±2; mobile path time. - caveat: OTAs stayed. Darkening a channel was refused. - metrics: Mix move=+9 pts direct[verified]; Occupancy=±2 pts[verified]; Path time=54s mobile[verified] - who: oakridge (Mix path), wayfind-direct (Brand.com path (demo)), harborstack-crs (Inventory path (demo)) ### A 36-hour freeze, not a 36-day one - id: annex-pms-cutover - url: https://harbor.signalry.ai/cases/annex-pms-cutover - hotel: The Annex (164 keys, Lifestyle, Chicago, IL) - job: replace-brittle-pms - claim: A 36-hour freeze, not a 36-day one. - evidence: Parallel-run log, rollback drill, folio balance, exception rate by night four. - caveat: Demo-shaped PMS. Use the method, not the logo. - metrics: Group freeze=36 hours[verified]; Parallel=6 weeks[verified]; Rollback drill=done[verified] - who: keystone-switch (Cutover method (demo)), northline-pms (Target PMS shape (demo)), folio-pci (Card-flow before go-live) ### One book. One Saturday. - id: rivermark-inventory-owner - url: https://harbor.signalry.ai/cases/rivermark-inventory-owner - hotel: Rivermark (205 keys, Soft-brand lifestyle, Nashville, TN) - job: connect-rms-crs - claim: One inventory owner. The next oversell was caught before arrival. - evidence: Write-path diagram; drift alert at 14 rooms; three sold-out weekends. - caveat: The watch is noisy if you have not picked an owner. Draw first. - metrics: Inventory owners=3 → 1[verified]; Next oversell=caught pre-arrival[verified]; RMS writes rooms=off[verified] - who: yieldwell-rms (Recommend only (demo)), harborstack-crs (Inventory owner (demo)), folio-watch (Drift alerts) ### The night audit opened the inbox - id: solstice-inbox - url: https://harbor.signalry.ai/cases/solstice-inbox - hotel: Solstice (142 keys, Lifestyle, Scottsdale, AZ) - job: guest-messaging-desk-uses - claim: The desk used the inbox — including overnight. - evidence: First-response timestamps; folio post log; week-12 desk-use check. - caveat: A chatbot was offered and not signed. Unmanned was not the product. - metrics: First response=11h → 11 min[verified]; Unattended folio=0[verified]; Week-12 desk use=yes[verified] - who: inboxwell (Desk inbox (demo)), clerkshift (Mod queue), quill-review (Recovery templates) ### Drafted, not posted - id: rivermark-clerkshift - url: https://harbor.signalry.ai/cases/rivermark-clerkshift - hotel: Rivermark (205 keys, Soft-brand lifestyle, Nashville, TN) - job: reservation-modification-agent - claim: Drafted, not posted. - evidence: Mod queue vs human post log; Friday error rate. - caveat: Auto-post still off. That is the listing condition. - metrics: Drafted=73%[verified]; Human-posted=100%[verified]; Error rate=1.4%[verified] - who: clerkshift (Draft queue), northline-pms (API-capable folio (demo)), nightwatch (Clerk rotation) ### A flag change, a smaller card box - id: pine-court-flag-change - url: https://harbor.signalry.ai/cases/pine-court-flag-change - hotel: Pine Court (88 keys, Soft-brand, Flagstaff, AZ) - job: pci-after-flag-change - claim: PCI gap closed without replacing the PMS or buying a SIEM. - evidence: Owner-signed card-flow diagram; watch live 20 days after the flag flip. - caveat: The franchise scanner was still submitted. It was not the audit. - metrics: Weeks=11[verified]; PMS replaced=no[verified]; SIEM bought=no[verified] - who: folio-pci (Scope + remediation), folio-watch (New-path alerts), keystone-switch (No PMS rip (demo method)) ### Early arrivals stopped checking into fiction - id: solstice-readiness - url: https://harbor.signalry.ai/cases/solstice-readiness - hotel: Solstice (142 keys, Lifestyle, Scottsdale, AZ) - job: live-room-readiness - claim: Live readiness without phantom cleans. - evidence: 30-day arrival log vs rooms-board timestamps. - caveat: Attendants still enter status. The agent never marked clean. - metrics: False-ready arrivals=0 / 30 days[verified]; Status lag=<20 min[verified] - who: hearth-key (Ready definition), housekeep-seq (Rush sequence) ### Thursday saw the weekend first - id: eastbound-overtime - url: https://harbor.signalry.ai/cases/eastbound-overtime - hotel: Eastbound (178 keys, Independent, Kansas City, MO) - job: predict-overtime - claim: OT visible before the weekend. - evidence: Thursday notes vs payroll for six weeks. - caveat: The wage gap still had to be paid. The forecast did not hire. - metrics: OT surprise=Mon → Thu[verified]; Overnight cuts=0[verified] - who: brandt-vale (Labor design), nightwatch (Overnight floor) ### The 7 a.m. desk stopped hearing it first from the guest - id: annex-tickets - url: https://harbor.signalry.ai/cases/annex-tickets - hotel: The Annex (164 keys, Lifestyle, Chicago, IL) - job: cross-shift-guest-tickets - claim: Requests survive midnight. - evidence: Open-ticket snapshot at 6:50 a.m. vs guest repeats. - caveat: A bot was offered and refused. Closure is still human. - metrics: Morning visibility=40/40[verified]; Reopen rate=−52%[verified] - who: inboxwell (House inbox (demo)), nightwatch (Close habit) ### A renewal decided before the lunch - id: glasswater-vendor-roi - url: https://harbor.signalry.ai/cases/glasswater-vendor-roi - hotel: Glasswater (310 keys, Lifestyle, Miami, FL) - job: prove-vendor-roi-90d - claim: 90-day vendor proof the owner could use. - evidence: Baseline vs post-period contribution after commission and media. - caveat: Attribution is still messy. The caveat stayed on the page. - metrics: Claimed ROI=4x[claimed]; Attested contribution=~1.4x[verified] - who: ashcroft (Owner-side memo) ### A new GM, ten pages, day three - id: pine-court-truth-pack - url: https://harbor.signalry.ai/cases/pine-court-truth-pack - hotel: Pine Court (88 keys, Soft-brand, Flagstaff, AZ) - job: gm-30-day-truth-pack - claim: A 30-day truth pack a GM will open. - evidence: Meeting notes from day 3; closer backup trained by week 3. - caveat: The pack is not a substitute for walking rooms. - metrics: Pages=10[verified]; Used day 3=yes[verified] - who: meridian-ops (Live numbers), nightwatch (Close exceptions), ashcroft (Vendor shortlist) ### A documented no, on purpose - id: rivermark-groups - url: https://harbor.signalry.ai/cases/rivermark-groups - hotel: Rivermark (205 keys, Soft-brand lifestyle, Nashville, TN) - job: group-displacement-math - claim: Displacement math before the yes. - evidence: Group file with wash assumption and owner note. - caveat: One no does not make a culture. The rule has to survive the next RFP. - metrics: Group=declined[verified]; Transient Saturday=held[verified] - who: meridian-ops (Displacement rule), yieldwell-rms (Recommend only (demo)) ### The 1-star still in-house at lunch - id: cedar-ridge-recovery - url: https://harbor.signalry.ai/cases/cedar-ridge-recovery - hotel: Cedar Ridge (96 keys, Independent, Asheville, NC) - job: same-day-review-recovery - claim: Same-day recovery without decorating the listing. - evidence: Pager log, guest folio note, public reply timestamp. - caveat: The star did not move that week. The cluster died because the floor changed. - metrics: Time to owner=41 min[verified]; Gated asks=0[verified] - who: desk-signal (Same-day pager), quill-review (Signed reply), hearth-key (Rooms cause) ### The PAN left the shared drive - id: millwright-tokens - url: https://harbor.signalry.ai/cases/millwright-tokens - hotel: The Millwright (64 keys, Boutique, Providence, RI) - job: tokenize-card-flows - claim: Card flow the GM can draw. - evidence: Mailbox sample, shared-drive search, signed diagram. - caveat: A new terminal nobody uses is theater. Training was the expensive part. - metrics: PANs in mail/sheets=0 / 30 days[verified]; Owner-signed diagram=yes[verified] - who: vault-lane (Token path), folio-pci (Owner diagram), folio-watch (Exception watch) ### Monday, one page, no lobby rebuild - id: lakehouse-onepager - url: https://harbor.signalry.ai/cases/lakehouse-onepager - hotel: Lakehouse (52 keys, Independent, Traverse City, MI) - job: owner-one-pager - claim: A Monday page the owner will open. - evidence: Inbox timestamps vs audit close for six weeks. - caveat: Needs a clean night-audit close. Garbage in is still a novel. - metrics: Pack timing=morning after audit[verified]; Owner meetings cut=2 / month[claimed] - who: folio-one (Monday sheet), ashcroft (Which lines matter) ### The agent drafted. A clerk posted. - id: north-wharf-scope - url: https://harbor.signalry.ai/cases/north-wharf-scope - hotel: North Wharf (188 keys, Soft-brand, Portland, ME) - job: scoped-agent-access - claim: An agent without a master key. - evidence: Token scopes, post log, admin expiry ticket. - caveat: Draft-only is slower than the demo. That is the point. - metrics: Human-posted=100%[verified]; Standing admin=expired[verified] - who: scope-gate (Least-privilege tokens), clerkshift (Draft only), folio-watch (Drift alerts) ### A 6:15 note, not a Sunday spreadsheet - id: dune-inn-fractional - url: https://harbor.signalry.ai/cases/dune-inn-fractional - hotel: Dune Inn (118 keys, Resort, Cape May, NJ) - job: rm-without-full-time-analyst - claim: Revenue judgment without a full-time seat. - evidence: Inbox timestamps, override log, CRS inventory owner. - caveat: Two days is not a 24/7 desk. Festival weeks still need a human on the phone. - metrics: Morning note=8 weeks, 6:15[verified]; Silent rate writes=0[verified] - who: yield-fraction (Fractional RM), yieldwell-rms (Recommend only (demo)), ratewatch (Morning note) ### Saturday stopped being a one-night habit - id: salt-porch-minstay - url: https://harbor.signalry.ai/cases/salt-porch-minstay - hotel: Salt Porch (74 keys, Resort, Folly Beach, SC) - job: weekend-min-stay-discipline - claim: A weekend floor the desk can defend. - evidence: Exception log vs PMS waives for twelve weekends. - caveat: February still sells one night. The calendar is the product, not a year-round slogan. - metrics: Silent waives=0 / 12 weekends[verified]; Saturday ADR=+11%[verified] - who: stay-floor (Floor and exceptions), yieldwell-rms (Recommend only (demo)) ### Two offers. The desk already knew. - id: harbor-light-upsell - url: https://harbor.signalry.ai/cases/harbor-light-upsell - hotel: Harbor Light (41 keys, Boutique, Portland, OR) - job: pre-arrival-upsell-without-spam - claim: Ancillary the desk will stand behind. - evidence: Offer log vs desk board vs folios for 45 days. - caveat: Attach is smaller than the old campaign. Guests opened the brand again. - metrics: Journey length=2 messages[verified]; Honored attach=18%[verified] - who: soft-arrival (Two-offer path), inboxwell (Desk board (demo)), quiet-hours (Drafts) ### Day 8, with names on the items - id: iron-bridge-close - url: https://harbor.signalry.ai/cases/iron-bridge-close - hotel: Iron Bridge (110 keys, Independent, Pittsburgh, PA) - job: close-books-without-recon-war - claim: A month you can still steer. - evidence: Close calendar, bank vs PMS, owner-page timestamps. - caveat: Month one was a night-audit job. The books were not the first problem. - metrics: Close day=22 → 8[verified]; Unowned items=0[verified] - who: tide-ledger (Close calendar), folio-one (Owner page), ashcroft (Which lines matter) ### The second book stopped selling the first - id: south-line-oversell - url: https://harbor.signalry.ai/cases/south-line-oversell - hotel: South Line (196 keys, Soft-brand, Charlotte, NC) - job: prevent-double-oversell - claim: Two books, one owner, no silent moves. - evidence: Pager log, reservation audit trail, walk log. - caveat: The watch is noisy if you have not picked an owner. Draw first. - metrics: Silent moves=0 / 30 days[verified]; Median ticket=11 min[verified] - who: twin-book (Gap watch (demo)), keystone-switch (Inventory owner), folio-watch (Alerts) ### The kitchen cooked the BEO, not the pad - id: cedar-hall-banquet - url: https://harbor.signalry.ai/cases/cedar-hall-banquet - hotel: Cedar Hall (186 keys, Resort, Asheville, NC) - job: banquet-guarantee-without-ghost-covers - claim: One banquet guarantee the kitchen cooked. - evidence: BEO vs plated vs actual for six consecutive events. - caveat: A wedding weekend still needs a written overage. The pad is named, not silent. - metrics: Second count=0 / 6 events[verified]; Cooked vs guarantee=≤ written overage[verified] - who: cover-line (Guarantee owner), morning-count (House breakfast recommend (demo)) ### The block released on the hour - id: mill-row-cutoff - url: https://harbor.signalry.ai/cases/mill-row-cutoff - hotel: Mill Row (248 keys, Soft-brand, Indianapolis, IN) - job: group-cutoff-without-wash - claim: A group cutoff that released on the hour. - evidence: PMS block log vs transient pickup for eight weeks. - caveat: One account still washes 30%. The forecast is the product, not a slogan. - metrics: Silent extensions=0 / 8 weeks[verified]; Released room-nights sold=34[verified] - who: wash-desk (Cutoff and wash), harborstack-crs (Block hold (demo CRS)) ### Night audit found the laptop without calling three people - id: pine-lock-lost - url: https://harbor.signalry.ai/cases/pine-lock-lost - hotel: Pine Lock (52 keys, Boutique, Bend, OR) - job: lost-and-found-without-liability - claim: One lost-and-found log the night audit could open. - evidence: Log vs shipped items vs chat export for 45 days. - caveat: Chargers still accumulate. The dispose date is what emptied the closet. - metrics: Drawers in play=1[verified]; ID photos in chat=0 / 45 days[verified] - who: claim-chest (Log and hold), slip-draft (Draft only), housekeep-seq (Room stamp) ### Breakfast stopped using last Sunday - id: oat-house-breakfast - url: https://harbor.signalry.ai/cases/oat-house-breakfast - hotel: Oat House (88 keys, Independent, Madison, WI) - job: breakfast-count-without-waste - claim: A breakfast count from occupied rooms, not last Sunday. - evidence: Occupied extract vs plated vs waste log for 14 days. - caveat: A sold-out Saturday still needs a written overage. The pad is named. - metrics: Formula on the pass=Yes[verified]; Banquet on own ticket=14 / 14 days[verified] - who: morning-count (Recommend (demo)), cover-line (Banquet vs house) ### The sale file was the product - id: harbor-house-sale-file - url: https://harbor.signalry.ai/cases/harbor-house-sale-file - hotel: Harbor House Charleston (48 keys, independent historic, Charleston, SC) - job: ops-ready-for-sale - claim: A dated sale file with zero guest names and a T12 the first buyer could rebuild. - evidence: Index dated; folio samples without names; PMS-to-P&L gap memo in the room. - caveat: A 48-key historic independent. This is not a 400-key REIT disposition. - metrics: Teaser delay=11 days[verified]; Guest names in samples=0[verified] - who: close-room (Data-room index), sable-desk (Buy-side-shaped read of the T12) ### The PIP stopped closing two floors in July - id: harborview-pip-phasing - url: https://harbor.signalry.ai/cases/harborview-pip-phasing - hotel: Harborview Select (136 keys, Branded select-service, Annapolis, MD) - job: pip-planning - claim: A room-by-room PIP phased into shoulder months so peak-season keys stayed sellable. - evidence: Signed brand PIP rider, GC floor-release schedule, and PMS out-of-order log across two shoulder blocks. - caveat: A 136-key select-service box. Riser or elevator modernization still requires multi-week vertical stacks. - metrics: Peak-season keys held open=136 / 136[verified]; Contingency held on soft goods=12%[verified] - who: oakridge (Room-by-room scope and shoulder phasing), brandt-vale (Displacement and reserve math) ### Net room contribution beat the headline royalty pitch - id: courtyard-affiliation-math - url: https://harbor.signalry.ai/cases/courtyard-affiliation-math - hotel: Alder House Hotel (98 keys, Boutique / soft-brand evaluation, Charleston, SC) - job: brand-vs-independent - claim: A 10-year net contribution comparison across flag, soft-brand, and independent paths including full FDD fee stack and entry PIP. - evidence: Executed franchise addendum, FDD item-6/item-7 fee worksheet, and IC underwriting memo. - caveat: A 98-key leisure-heavy urban boutique; highway select-service houses rely more heavily on brand loyalty distribution. - metrics: Full-stack fee & PIP lines modeled=100% of FDD[verified]; Royalty ramp negotiated=24 months[verified] - who: brandt-vale (10-year net contribution model), sable-desk (Franchise term and exit-fee comparison) ### Debt sized on stressed DSCR survived the rate cap quote - id: redstone-debt-sizing - url: https://harbor.signalry.ai/cases/redstone-debt-sizing - hotel: Monarch Park Inn (124 keys, Select-service, Raleigh, NC) - job: hotel-financing-for-acquisition - claim: Acquisition financing sized on stressed T12 DSCR and debt yield rather than broker pro-forma LTV. - evidence: Executed loan agreement, rate-cap confirmation, and three-lender covenant comparison matrix. - caveat: A 124-key cash-flowing select-service acquisition; heavy transitional turnarounds require bridge-to-stabilization covenants. - metrics: Stressed DSCR at close=1.42x[verified]; Term sheets compared on identical T12=3[verified] - who: brandt-vale (Stressed DSCR and debt-yield sizing), sable-desk (Lender covenant and cash-trap matrix) ### The ground-lease reset and operator subordination were priced before LOI - id: marina-lease-paper - url: https://harbor.signalry.ai/cases/marina-lease-paper - hotel: Marina Wharf Hotel (172 keys, Full-service waterfront, San Diego, CA) - job: ground-lease-and-management-review - claim: Pre-LOI abstraction of ground-lease rent resets, remaining term, and management termination rights. - evidence: Leasehold abstraction memo, lender mortgageability checklist, and signed LOI rider. - caveat: Commercial underwriting abstraction only — hospitality real-estate counsel still drafts and opines on the estoppel and SNDA. - metrics: Lease + HMA clauses abstracted pre-LOI=18 / 18[verified]; Leasehold tail after extension=46 years[verified] - who: brandt-vale (Leasehold and HMA cash-flow abstraction), sable-desk (Term, reset, and termination matrix) ### The cutoff was signed - id: ash-true-up - url: https://harbor.signalry.ai/cases/ash-true-up - hotel: Ash Court Inn (118 keys, Select-service, Baltimore, MD) - job: working-capital-true-up-without-fight - claim: A dated working-capital cutoff both desks signed, with nameless AR samples. - evidence: Signed nightly sheets vs close binder for 14 nights. - caveat: A 118-key select-service. Not a REIT portfolio true-up. - metrics: Nights with a signed cutoff=14 / 14[verified]; Guest names in AR samples=0[verified] - who: true-up-desk (Cutoff sit), close-room (AR sample hygiene), cutoff-sheet (Demo sheet only) ### The roof had a year - id: ridge-pca - url: https://harbor.signalry.ai/cases/ridge-pca - hotel: Ridge Par House (86 keys, Independent, Richmond, VA) - job: pca-without-hidden-capex - claim: A PCA memo with named systems and years — no hidden year-two roof. - evidence: System list vs walk photos; IC pack dated. - caveat: An 86-key independent. Not a 400-key pipelined REIT. - metrics: Systems named on one page=12 / 12[verified]; TBD on roof, boiler, or life-safety=0[verified] - who: condition-walk (System list), pip-phase (Year-1 / year-5 split), sable-desk (IC pack) ### Day one had a desk - id: quay-day-one - url: https://harbor.signalry.ai/cases/quay-day-one - hotel: Quay Street House (64 keys, Boutique, Portland, ME) - job: close-transition-without-day-one-hole - claim: A named GM, night audit, and vendor ACH before keys moved. - evidence: Close list dated; night-one audit signed; ACH confirmations. - caveat: A 64-key boutique independent. Not a branded management takeover. - metrics: Close-week items named before keys=7 / 7[verified]; Missing vendor ACH on day one=0[verified] - who: day-one-desk (Close-week sit), meridian-ops (First-week desk), hold-note (Draft only) ### The packet was not a policy - id: glasswater-outcome-packet - url: https://harbor.signalry.ai/cases/glasswater-outcome-packet - hotel: Glasswater Inn (142 keys, Lifestyle, Chicago, IL) - job: buy-verified-outcome-cover - claim: A verified-outcome packet with inspectable evidence and a written caveat — not a policy. - evidence: Exported JSON vs the 30-day criterion the GM signed. - caveat: A 142-key lifestyle independent. Not a licensed insurance file. Harbor did not bind cover. - metrics: Packet labeled licensed:false=yes[verified]; Guest names in evidence=0[verified] - who: outcome-desk (Packet sit), caveat-ledger (Demo sheet only), evidence-scout (Draft only)