Changelog

Changelog

What changed in the platform, when, and which manual section it affects. Read top-to-bottom for the recent history; jump to a section if you're looking for a specific feature.

Public changelog page

Scope. This changelog covers user-facing changes — features added, bugs fixed that operators saw, UI affordances surfaced. Purely technical work (security audits, refactors, internal helpers) is tracked in GitHub issues with the user-manual:not-needed label and is omitted here.


July 2026

Major new features (June 29 – July 4 batch)

  • Supply canonical units. Every supply's stock lives in one of three base units — pieces / litres / kilograms. AI-assigned per product. Percent consumption uses % of one container (not % of stock). Same-property same-name dedup guard. See Supplies → Units overhaul.
  • Supply product images. Auto-fetch by receipt product string (not just canonical noun); LLM vision verification before save; large click popup instead of inline thumbnail; Reject + Re-fetch (AI) button. See Supplies → Product images.
  • Smart-lock provider abstraction. Nuki + 2N behind one LockProvider facade with 5-attempt retry policy for all lock calls, never-silent-error policy, 2N dispose lifecycle, no-direct-import CI ratchet. See Team & Access → Smart-lock abstraction.
  • V28 base-price editing. Per-property Pricing tab with calendar-grid base price + min stay + per-day override + presets. Discount % line in reservation FINANCIALS panel. See Properties → Base-price editing.
  • V28 Smart Locks overhaul. Integration-aware tabs, unified activity log with faults (⚠ chip), multi-lock status, charging V28-native panel. See Properties → Smart Locks V28 overhaul.
  • Given-name greeting. Deterministic given-name resolver at reservation ingest; every outbound greeting + calendar label + task overview uses guests.givenName, not raw name field. Recurrence-proof ratchet. See Communications → Given-name greeting.
  • Pulse Copilot capability epic. Approval gate on ALL mutations (including raw execute_trpc), anti-clobber read-merge, self-approval bypass fix, fuzzy/substring fallback + anchor-hints, missing admin-domain writes (email / pricing / set_cleaner / FAQ / message templates), AI Cockpit config read + writes, audit coverage extended, operator-friendly language. See Pulse Copilot → Capability parity.
  • Copilot cost + resilience. Right-sized specialist models to Sonnet 5 / Haiku with self-healing model resolution (no hardcoded SKUs). Cap tool-result dumps + stabilize prompt-cache prefix (72% spend on cache writes fixed). Plan/critique/revise pipeline collapsed to single specialist loop.
  • Beds24 enhancements. Reservation pull now covers Beds24-only properties. Setup validates read:bookings-personal scope. Rate/availability push live. V28 PM connector editor (provider + property ID + Test Connection + Map room). See Channel sync → Beds24 enhancements.
  • V28 Tasks EDIT. V28 Tasks page now supports editing a task instance (name / type / overview / property / duration) — legacy parity closed.
  • REOPEN discoverable. Collapsed done-task rows now surface REOPEN without expanding first.

June 2026

Major new features (June 14 – June 28 batch)

  • Validator + refine architecture. Unified outbound validation across both send paths. 3-button surface (Refine / Send Anyway / Dismiss) on all 8 send surfaces. Autonomous auto-refine loop (cap 5 + WA escalation). Configurable blocking threshold per template. General outbound delivery guard — no silent-done. See Validator + refine.
  • Supplies 4-level model. Parsed name / corrected name / product type / category. Merge-by-product-type across receipts. Unified Pack Sizes + Correct-names editor in a slide-over. AI canonical button. Ignore list. See Supplies → 4-level model.
  • Supplies consumption categories. Four-category model (Guest Consumables / Cleaning Supplies / Stay Essentials / Reusables) drives per-supply spend config + stale-stock warnings + Add-supply dropdown grouping. See Supplies → Consumption categories.
  • Per-property message templates. Templates moved per-property (not tenant-global); per-property override on top of global default. V28 Inbox REPLY WITH TEMPLATE picker now shows correct templates. See Communications → Per-property templates.
  • Super-admin tenant switcher. Dropdown in V28 top-nav lets superadmins switch tenants without re-login. Audit log captures actor=superadmin-impersonate:<id>. See Platform admin → Tenant switcher.
  • Platform-admin subdomains. costs. / infra. / status. carved off the per-tenant app to dedicated subdomains. See Platform admin → Subdomains.
  • AI provider toggle. Anthropic ↔ Ollama at the platform level; Ollama hidden on prod, default on sandbox/preprod/demo. See Platform admin → AI provider toggle.
  • V28 nav reorganization. Team & Billing → Operations as "Team". AI Cockpit Agents renamed "Chat Agents" + new "Event Agents" tab. Admin log items (Activity/Audit/Webhook/Errors) into one "Logs" entry with tabs. Manual Trigger folded into Smart Locks as per-property button.
  • Task-template 8-phase lifecycle. new / preparation / checkin / guest care / checkout / after stay / troubleshooting / other. All existing templates reset to "other" for manual re-categorization. See Task Templates → Lifecycle phases.
  • Mock services integration. Mock Nuki "Simulate entry" + teammate popup moved into Smart Locks screen. Mock WA impersonate merged into WA Communication screen.
  • Translation polish. Payout-report no longer translates admin action buttons (Print / Mark-Paid / Export CSV). Hardcoded Slovak glossary in payments.ts:579 removed. WA Communication surfaces target translation language.
  • Editable host personality. Operator can define concise tone in Natalia's editable personality (not hardcoded). LLM reply-draft over-confirmation reduced.
  • Pulse Copilot polish. Operator-friendly language (no tRPC/tool names / system-prompt jargon). Task-template audit log captures WHY + corrects copilot vs operator actor attribution.
  • Mobile parity. Mobile booking-calendar timeline. Desktop PWA dock-icon badge. Mobile composer "Improve with AI".
  • Mark-cash-settled. Symmetric with Mark-Expenses-Paid; clears spurious negative-net after settling.
  • PWA + crash resilience. SW stale-app-shell fix (login no longer fails on first load after deploy). ErrorBoundary chunk-load recovery + app_errors reporting + per-route mount deploy gate.
  • notifyOnResolved on manual markDone. Template's notifyOnResolved fires on manual markDone (approve OR reject), not only cron auto-resolve.
  • Translation defaults card. Clarifies tenant fallback + reveals per-admin reading-language override on teammate profile.

Major new features (June 5 – June 13 batch)

  • Channel sync engine. Per-property "What syncs?" matrix between luxury.host and booking channels (Beds24, Hospitable) with rate / availability / content / photo push, debounced + credit-budgeted. Hospitable rows render disabled (not hidden) so the gap is visible. See Channel sync.
  • In-app notifications. Tab shake + audio + persistent inbox bell + 60s WA fallback if not acked. Per-template inherit / force-audio / silent / wa-only override. See In-app notifications.
  • Mobile push + parity. Push end-to-end with deep-link to entity routes, bottom-nav + iOS app-icon badges, resolve tasks on mobile, reply-with-template, calendar/occupancy on Pulse, phone-viewport redirect to /m. See Mobile → Push notifications.
  • Per-property manuals (AI Q&A grounded). Upload PDF / DOCX / images per property; embeddings index them; AI Suggest pulls context from operator-curated source instead of guessing. Periodic compaction of message refinements into tenant personality + FAQs. See Communications → Property manuals.
  • Cost observability dashboard. Cross-tenant AI + integration spend dashboard (superadmin only). See Cost observability.
  • Status page. status.luxury.host shows all 4 envs' health (prod / preprod / sandbox / demo). See Status page.
  • Community portal. /roadmap (vote on queued features) + the /community page. See Community portal.
  • Supplies enhancements. Per-item pieces-remaining chart + category filter, AI-categorize per-row button, AI auto-estimates pack sizes for products without published counts, restock event for auto-resolve. See Supplies → History.
  • Late baggage pickup. LLM detects "I'll be back at 16:00 for the bags" → V28 approval task → cleaner sees 🧳 LATE PICKUP @ 16:00 chip → Nuki PIN extension if needed. See Special requests → Late baggage pickup.
  • Reservation FINANCIALS + RESERVATION panels. Booking discount row, guest breakdown (adults / children / infants / pets), Open + Regenerate Guest Book buttons. See Reservations → Financials panel.
  • Occupancy-aware date picker. The task due-date param widget now shows vacant/occupied days inline; operator picks dates without conflict-checking separately.
  • Conditions engine extensions. Watched-condition auto-dismiss flipped to ANY-false semantics (was ALL-false); messageThread.* conditions re-evaluable for auto-dismiss; new time value type + time-of-day comparison.
  • Notifications + Nuki polish. WhatsApp 'Choose action' menu no longer drops param-button groups after the first. Nuki wrong-PIN paged as NUKI LOCK FAILURE reclassified — guest-input codes now route as access-denied not lock failure.
  • UI polish. STAY invoice no longer bundles city tax + COMBINED invoice option added. Calendar chip reads "Arriving" instead of "Check-in HH:MM" when guest's expected arrival differs from the standard time. Approve & notify button relabeled. Paste image into V28 inbox composer auto-attaches.

Major new features (May 20 – June 4 batch)

  • Cleaner Web App (PWA). A mobile-first PWA alternative to the WhatsApp plán walkthrough. Phone-OTP login, 30-day cookie, 6 scenes (checklist / item detail / bulk-mark / issue report / offline / summary), service-worker offline queue, voice-note issue reporting. Channel B — WhatsApp Channel A stays. See Cleaner Web App.
  • V28 Supplies. Pack-size mapping with LLM web-lookup, in-app receipt viewer, configurable auto-close on restock. See Supplies.
  • AI Cockpit. Per-tenant per-specialist Agents editor (system prompt + model + thinking budget + tool rounds + plan-then-execute + max response tokens), turn-grouped cost dashboard. See AI Cockpit.
  • Accounting. Overview KPIs (PENDING PAYOUTS / monthly BUNDLE / CITY TAX), AccPayments with source-task peek, invoice editor with EN labels, link-to-existing-invoice. See Accounting.
  • In-app Report Bug. Screenshot/video/voice capture, auto-collected context, anonymization toggle, admin viewer, 30-day retention, drag-rectangle region select. See Bug Report.
  • Special Requests. Prompt-driven LLM detection, approval-gated, per-tenant — early check-in / late checkout / wine / parking / beds / pet / other. See Special Requests.
  • Auto-refine drafts. Per-template / per-tenant policy: confident drafts auto-send; flagged drafts run a refinement pass + auto-send OR queue for operator approval; courtesy-message guard on send-message auto-complete. See Auto-refine drafts.
  • – — Mobile app. Operator-facing mobile shell (Pulse / Inbox / Locks / AI), PWA-installable, viewport-switches at 760 px. See Mobile app.
  • V28 Message Templates editor. V28-native editor for guest-facing message bodies — no more bouncing to legacy. See Communications → Message Templates editor.
  • V28 Inbox search. Search across guest names + message content. See Communications → V28 Inbox search.
  • Task templates audit log. Every change to a task template is logged — actor, action, field diff. Operator can restore from history. See Admin → Task templates audit log.
  • Public /changelog page. Logged-out + logged-in users see ship notes at /changelog rendering CHANGELOG.md. See Getting Started → Public changelog page.
  • Google login. Replaces Manus IAM; direct Google OAuth is the primary login path. See Getting Started → Login.
  • V28 is the default UI. /admin redirects to /v28/…; persistent switch to legacy in the top-right. See Getting Started → V28 default.
  • Cleaner-facing surfaces. Inline special-request categories (🍷 / 🛏 / 🅿️ / eCI? @13:00) on calendar chips + cleaner plán; cleaner vacation/unavailability tracking via WA + app. See Team & Access → Cleaner Walkthrough.
  • Mobile-native capability hooks. useShare / useHaptics / useCamera available in the operator mobile shell + cleaner web app.

May 2026

2026-05-19 — Send Check-in data-integrity fix

  • **** — "Auto-resolve was BLOCKED because the condition is not met: reservation.nukiAccessCode is_not_null" could fire even when the PIN existed. Root cause: multiple guest rows per reservation, JOIN picked one without the PIN. Fixed: the JOIN now prefers rows with non-empty access codes (canonical-row picker). See Reservations → Send Check-in, Properties → Smart Locks.

2026-05-18 — V28 polish + critical-bug sweep

2026-05-17 — V28 Reports parity

  • **** — Task-template validator no longer false-flags {{guest.email}} / {{guest.name}} as unrecognised placeholders. See Task Templates → Placeholders.
  • **** — V28 Reports completeness vs legacy /metrics; Simulation added. See Reports.

How this changelog is maintained

When an issue closes with audit:validated-* and is user-facing:

  1. The relevant page(s) in this manual are updated.
  2. The issue gets the user-manual:documented label.
  3. A line is added to this changelog under the relevant date.

When an issue is purely technical (security audits, refactors, internal helpers, test infrastructure):

  1. The issue gets the user-manual:not-needed label.
  2. It's not added to this changelog.
  3. The developer reference under docs/ captures it instead.

Older history

Pre-May 2026 changes are not retroactively documented here. For pre-May history, see:

Source: the luxury.host operator manual.