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.

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.


June 2026

Major new features (June 14 – June 28 batch)

  • #879, #690, #850, #865 — 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.
  • #878, #824, #808, #837, #815 — 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.
  • #736, #788, #826 — 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.
  • #774, #775 — 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.
  • #714 — 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.
  • #685 — Platform-admin subdomains. costs. / infra. / status.flatsbratislava.com carved off the per-tenant app to dedicated subdomains. See Platform admin → Subdomains.
  • #778, #822 — AI provider toggle. Anthropic ↔ Ollama at the platform level; Ollama hidden on prod, default on sandbox/preprod/demo. See Platform admin → AI provider toggle.
  • #684, #686, #687, #688 — 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.
  • #829 — 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.
  • #683, #679 — Mock services integration. Mock Nuki "Simulate entry" + teammate popup moved into Smart Locks screen. Mock WA impersonate merged into WA Communication screen.
  • #691, #699, #681 — 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.
  • #582 — Editable host personality. Operator can define concise tone in Natalia's editable personality (not hardcoded). LLM reply-draft over-confirmation reduced.
  • #785, #786 — 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.
  • #712, #677, #818 — Mobile parity. Mobile booking-calendar timeline. Desktop PWA dock-icon badge. Mobile composer "Improve with AI".
  • #702 — Mark-cash-settled. Symmetric with Mark-Expenses-Paid; clears spurious negative-net after settling.
  • #776, #805 — 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.
  • #851 — notifyOnResolved on manual markDone. Template's notifyOnResolved fires on manual markDone (approve OR reject), not only cron auto-resolve.
  • #821 — Translation defaults card. Clarifies tenant fallback + reveals per-admin reading-language override on teammate profile.

Major new features (June 5 – June 13 batch)

  • #620, #619 — Channel sync engine. Per-property "What syncs?" matrix between FlatsBratislava 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.
  • #552 — 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.
  • #562, #583, #561, #584, #579, #578, #558, #553 — 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.
  • #542, #545 — 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.
  • #523 — Cost observability dashboard. Cross-tenant AI + integration spend at costs.flatsbratislava.com (superadmin only). See Cost observability.
  • #533 — Status page. status.flatsbratislava.com shows all 4 envs' health (prod / preprod / sandbox / demo). See Status page.
  • #306 — Community portal. /roadmap Phase 1 (in-house, vote on queued features) + Discourse community.flatsbratislava.com Phase 2 (operator-to-operator forum, SSO). See Community portal.
  • #673, #674, #541, #564 — 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.
  • #549 — 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.
  • #668, #671, #559 — Reservation FINANCIALS + RESERVATION panels. Booking discount row, guest breakdown (adults / children / infants / pets), Open + Regenerate Guest Book buttons. See Reservations → Financials panel.
  • #519, #636 — Occupancy-aware date picker. The task due-date param widget now shows vacant/occupied days inline; operator picks dates without conflict-checking separately.
  • #660, #663, #565 — 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.
  • #544, #543 — 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.
  • #567, #568, #528, #656 — 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)

  • #524 — 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.
  • #515, #513, #487, #529, #481 — V28 Supplies. Pack-size mapping with LLM web-lookup, in-app receipt viewer, configurable auto-close on restock. See Supplies.
  • #415, #414, #412 — 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.
  • #367, #480, #458, #459, #494, #501, #406, #407, #410, #445, #347 — 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.
  • #167, #168, #342#344, #358, #465 — 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.
  • #431, #263, #242 — Special Requests. Prompt-driven LLM detection, approval-gated, per-tenant — early check-in / late checkout / wine / parking / beds / pet / other. See Special Requests.
  • #502, #504, #506 — 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.
  • #105#109 — Mobile app. Operator-facing mobile shell (Pulse / Inbox / Locks / AI), PWA-installable, viewport-switches at 760 px. See Mobile app.
  • #313 — V28 Message Templates editor. V28-native editor for guest-facing message bodies — no more bouncing to legacy. See Communications → Message Templates editor.
  • #319 — V28 Inbox search. Search across guest names + message content. See Communications → V28 Inbox search.
  • #300, #301 — 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.
  • #305 — Public /changelog page. Logged-out + logged-in users see ship notes at /changelog rendering CHANGELOG.md. See Getting Started → Public changelog page.
  • #430 — Google login. Replaces Manus IAM; direct Google OAuth is the primary login path. See Getting Started → Login.
  • #493 — V28 is the default UI. /admin redirects to /v28/…; persistent switch to legacy in the top-right. See Getting Started → V28 default.
  • #264, #249 — 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.
  • #112 — 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

  • #260"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

  • #254 — Task-template validator no longer false-flags {{guest.email}} / {{guest.name}} as unrecognised placeholders. See Task Templates → Placeholders.
  • #161 — 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 FlatsBratislava operator manual.