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-neededlabel 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
LockProviderfacade with 5-attempt retry policy for all lock calls, never-silent-error policy, 2Ndisposelifecycle, 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-personalscope. 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.flatsbratislava.comcarved 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 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.
- ** — In-app notifications**. Tab shake + audio + persistent inbox bell + 60s WA fallback if not acked. Per-template
inherit/force-audio/silent/wa-onlyoverride. 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 at
costs.flatsbratislava.com(superadmin only). See Cost observability. - ** — Status page**.
status.flatsbratislava.comshows all 4 envs' health (prod / preprod / sandbox / demo). See Status page. - ** — Community portal**.
/roadmapPhase 1 (in-house, vote on queued features) + Discoursecommunity.flatsbratislava.comPhase 2 (operator-to-operator forum, SSO). 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:00chip → 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; newtimevalue 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 FAILUREreclassified — 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ánwalkthrough. 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
/changelogrenderingCHANGELOG.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**.
/adminredirects 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 + cleanerplán; cleaner vacation/unavailability tracking via WA + app. See Team & Access → Cleaner Walkthrough. - ** — Mobile-native capability hooks**.
useShare/useHaptics/useCameraavailable 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
- **** — WA bot dead because
tenants.whatsappPhoneNumberIdwas NULL on tenant rows. Bootstrap migration ran; admin can edit the field in Settings → Integrations. - **** — V28 Edit Teammate modal now uses V28 design system. See Team & Access → Teammates.
- **** — Auto-resolve task card now shows scheduled fire time + condition status without expansion. See Tasks → Task Card.
- **** — V28 Payout Report From/To filter inputs wired correctly; prevents catastrophic "MARK N PAID" on all-time records. See Reports → Payout Report.
- **** — Cleaner WA free-text + photo reports now routed through LLM intent classification instead of silently dropped. See Team & Access → Cleaner Walkthrough.
- **** — Cleaner WA
plánnow includes dashboard-assigned cleanings (previously silently invisible). See Team & Access → Cleaner Walkthrough. - **** — Pulse Copilot UX: send button no longer clipped; CMD+V paste-image works. See Pulse Copilot → Usage.
- **** — Pulse Copilot reliability: timeout + hallucination guard. UI shows ✓ badge only when tool actually executed. See Pulse Copilot.
- **** — "Add FAQ entry" task no longer fails with "Property not found" (placeholder schema regression). See Communications → FAQ Knowledge Base.
- **** — Cleaner WA walkthrough no longer sends mixed-language messages (Slovak scaffolding + cleaner-language labels). See Team & Access → Cleaner Walkthrough.
- **** — 27 "New Task Created" notification flood after admin photo eliminated; admin chat now visible on
/v28/wa-comm. See Tasks → Notifications, Reservations → Messages. - **** — Silent skip no longer marks task
done— moves tofailedwith reason. See Tasks → Auto-resolve, Admin → Activity Log. - **** — Loading state UX: every data-fetching screen shows a skeleton instead of blank. See Getting Started → Dashboard, Tasks → Task List.
- **** —
assign_cleanertask action respects the May-16 unassignment fix. See Team & Access → Cleaner Walkthrough. - **** — Removing teammate access code now revokes Nuki PIN end-to-end. See Team & Access → Access Codes.
- **** — V28 Team & Account feature parity: access-code editor + per-teammate guestbook generation + Generate Nuki PIN + 2N QR. See Team & Access → Teammates.
- **** — AI Suggest no longer pollutes language detection with synthetic system notes. See Communications → AI Suggest, Communications → Languages.
- **** — V28 editor allows saving a template with
allowDismissonly (no action) with proper validation surfacing. See Task Templates → Editor. - **** — Cleaner WA walkthrough: prefetch next item; photos accepted without
📷 Fototap. See Team & Access → Cleaner Walkthrough. - **** — NULL
propertyNameon reservation6147057327data fix. See Properties → Property List.
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:
- The relevant page(s) in this manual are updated.
- The issue gets the
user-manual:documentedlabel. - A line is added to this changelog under the relevant date.
When an issue is purely technical (security audits, refactors, internal helpers, test infrastructure):
- The issue gets the
user-manual:not-neededlabel. - It's not added to this changelog.
- The developer reference under
docs/captures it instead.
Older history
Pre-May 2026 changes are not retroactively documented here. For pre-May history, see:
docs/v28-redesign-mapping.md— V28 redesign scope (read-only ports).docs/cleaner-walkthrough-rollout-playbook.md— cleaner walkthrough rollout history.- GitHub issue history with the
documentationandenhancementlabels.
Source: the FlatsBratislava operator manual.