# Tamás Tanya demo verification

Executor QA: **PASS**. Independent parent acceptance is the remaining orchestration step. This report covers the local prototype, not a production booking system.

Checked on 2026-09-02 UTC / 2026-09-03 Europe/Budapest at `http://127.0.0.1:8876/`. Isolated Playwright Chromium, device scale factor 1, desktop 1280×900 and mobile 390×900. The shared Chrome session was not used.

## Decisive results

| Check | Result | Evidence |
|---|---|---|
| Five guest concepts and all eight owner views at both widths | PASS, 38 browser receipts including arithmetic and whole-session checks | [Browser results](qa/browser-results.json) |
| Contrast, fonts, broken images, page errors and horizontal scrolling | PASS, 16 URL/viewport checks | [Final visual gate](qa/gate-results.jsonl) |
| Guest request arrives in owner panel with date, departure, party size and next action | PASS | `qa/full-browser.py`, browser results |
| One-night arrival/departure calculation | PASS | `qa/booking.test.cjs`, `qa/guest-smoke.py` |
| Accommodation cannot span a protected wedding date | PASS | `qa/guest-smoke.py` |
| Stay edits preserve nights, rooms, guests, property, occasion and meal preference | PASS, independently rechecked | `qa/guest-edit.py`, [independent review](qa/independent-review.md) |
| Wedding accommodation preference and alternative date survive editing and appear to owner | PASS, independently rechecked | `qa/guest-edit.py`, `qa/owner_flow.py` |
| Confirmation requires deposit, capacity and conflict checks | PASS | `qa/owner_flow.py`, `qa/owner_ui.py` |
| Held, confirmed or closed dates cannot be released | PASS | `qa/owner_flow.py`, `qa/owner_ui.py` |
| Explicit release changes the guest date board | PASS | `qa/full-browser.py` |
| Owner rate edits reach the guest view and minimum stay is enforced | PASS at 390px | `qa/price-propagation.py` |
| Owner note, reminder, stage undo, block edit, manual telephone enquiry and JSON export | PASS at both widths | `qa/owner_ui.py` |
| Owner content changes the guest heading and survives reload | PASS | `qa/full-browser.py` |
| Tomika records are separate and unknown inventory cannot be confirmed | PASS | `qa/owner_ui.py`, browser results |
| Five offer selectors and all eleven ROI controls | PASS at both widths | Browser results and `qa/roi.test.cjs` |
| Offline direct-file operation | PASS for guest, owner and ROI | [Offline receipt](qa/offline-file.json) |
| Resource isolation | PASS, zero external requests and zero non-GET requests during browser runs | Browser results |
| Source images and fonts | PASS, 12 real photographs and local Hungarian-capable fonts | [Asset manifest](assets/manifest.json) |
| Client-facing punctuation | PASS, no em dash or semicolon in visible page copy or final prose | Browser assertions and text scan |

The first visual pass found three low-contrast gold labels on the desktop owner dashboard. The gold was darkened and both owner viewports were rechecked. The original result is retained in `qa/gate-first-pass.jsonl`, the final gate replaces those rows with the passing measurements. No contrast rule was weakened.

## Independent review and fixes

Parent acceptance later found a mobile stay-grid sizing defect on macOS: the 350px grid contained 376px children, extending the document to 396px at a 390px viewport. The devbox reproduced the same intrinsic-sizing issue with 368px children, although it remained inside the viewport. A scoped `.stay-layout > * { min-width: 0 }` correction lets the photo and form fit their grid track. The browser suite now checks child containment as well as document overflow. This new assertion failed before the correction. At 390px after the correction, the grid, photo and form are all 350px wide with right edges at 370px. Desktop sizing is unchanged. Measurements are preserved in [stay-grid results](qa/stay-grid-results.json). The complete required functional suite was rerun successfully, including all 38 browser receipts, and the fresh visual gate passed all 16 URL/viewport checks. Independent parent re-acceptance remains required.

A separate reviewer reproduced three guest-to-owner issues after the first broad test run:

1. Back-navigation from a three-night stay opened a generic event form and lost nights and rooms.
2. The first wedding form's accommodation answer was discarded.
3. The owner could not see the guest's alternative date.

All three were corrected and independently rechecked through the real interface. The stay editor now retains its own fields, accommodation intent has a separate field, and the owner detail shows the original guest request. Additional regression checks cover switching from a small stay party to the wedding form and correct event departure dates.

The earlier cross-wedding stay defect was also reproduced before fixing it. The required browser check now prevents a stay beginning before, but crossing into, a protected wedding date. The independent review and its final correction receipt are preserved in `qa/independent-review.md`.

## Three independent ROI recomputations

All results below were calculated from worked examples, asserted as literal values in Node, and compared with displayed browser outputs at both widths. The UI rounds for presentation only.

| Scenario | Visits | Enquiries | Expected bookings | Booking value | Booking-value sensitivity range | Media CPL | Cost / booking including fee | Media ROAS | Contribution after marketing |
|---|---:|---:|---:|---:|---:|---:|---:|---:|---:|
| Mixed channels | 960 | 28.8 | 4.32 | 10,972,800 Ft | 8,778,240 to 14,630,400 Ft | 6,944.44 Ft | 81,018.52 Ft | 54.864× | 2,941,840 Ft |
| Google only | 200 | 10 | 2 | 1,300,000 Ft | 1,040,000 to 1,733,333.33 Ft | 10,000 Ft | 125,000 Ft | 13× | 270,000 Ft |
| Zero media | 0 | 0 | 0 | 0 Ft | 0 to 0 Ft | Not calculable | Not calculable | Not calculable | −150,000 Ft |

Mixed: 200,000 Ft media, 70% Google, Google CPC 250 Ft, Meta CPC 150 Ft, 3% enquiry rate, 15% close rate, wedding value 4,000,000 Ft, other value 350,000 Ft, 60% wedding share, 30% contribution margin and 150,000 Ft fee.

Google only: 100,000 Ft media, 100% Google, Google CPC 500 Ft, inactive Meta CPC 0, 5% enquiry rate, 20% close rate, wedding value 2,000,000 Ft, other value 200,000 Ft, 25% wedding share, 40% margin and 150,000 Ft fee.

Zero media: media and both CPC inputs zero, remaining mixed-scenario assumptions unchanged. It yields zero expected demand and the 150,000 Ft fee as a cost. Undefined ratios show explanatory text, not infinity or NaN. Active channels reject zero CPC and invalid values.

These are assumptions, not forecasts or guaranteed results. Booking value refers to eventual bookings attributable to a month's enquiries, not cash received in that month. The range varies CPC by ±25%. Contribution excludes build cost, maintenance, delegated operations, third-party systems, fixed overhead and tax, as disclosed beside the calculator.

## Four understandable operating scenarios

| Scenario | Owner enters | Guest sees | Owner receives |
|---|---|---|---|
| Wedding enquiry | Protected dates and venue capacity | Private preferred and alternative date questions, accommodation and venue-visit choices | Original answers plus next action in the pipeline |
| Empty-weekend release | Reviews blocks and explicitly releases June 5 | A newly visible sample weekend, sample rate and minimum stay | A focused group enquiry without an automatic booking |
| Tomika stay | Selects the second property's enquiries | Arrival and departure with the correct night count | A separate property request, no invented live room allocation |
| Confirm event | Deposit, room count, note and confirmation decision | Clear request versus confirmed distinction | Protected calendar block, status, document preview and reversible local edit |

## Presentation evidence

- [Wedding concept, desktop](qa/concept-1-1280.png)
- [Wedding concept, mobile](qa/concept-1-390.png)
- [Owner calendar, desktop](qa/owner-calendar-1280.png)
- [Owner calendar, mobile](qa/owner-calendar-390.png)
- [Four operating diagrams](qa/system-diagrams-1280.png)
- [Offer and ROI, desktop](qa/offer-roi-1280.png)
- [Offer and ROI, mobile](qa/offer-roi-390.png)

The `qa/` folder also contains separate screenshots of all five guest entries and all eight owner views at both widths. Fresh presentation captures use initial sample state and an immediate scroll-to-top so sticky navigation is not photographed mid-scroll.

## Explicit prototype limits

- Local browser storage is the demonstration's source of truth. There is no shared database, authentication, payment, email send, external channel write or actual reservation.
- One confirmed room or event block per sample date is a deliberately conservative simulation. Production room-type inventory and partial room pickup require verified mapping and transactions.
- Hold decision dates are reminders. Expiry and release remain manual, with no timed job or automatic release. A production hold-expiry policy is a dependency.
- Tomika's identity and client-provided 17-bed capacity are supported. Its live room inventory and canonical URL behavior were not verified, so the panel accepts enquiries and refuses live-style confirmation.
- NTAK is separate from Szallas.hu distribution. No direct custom Szallas.hu API or property-specific synchronization is claimed.
- The intended Cat2it interaction source is the parent-identified manual-entry application. The source scout found no literal Cat2it-named artifact. Only generic interaction patterns were applied, no private panel code or system overview was copied.
- The source reference's broad section roles remain, with repeated metrics and galleries consolidated. Unsupported testimonials were replaced with a labelled proof slot.
- The 2027 offer and source inventory are supplied evidence. A newer Fireflies-only call could not be ruled out after the inherited research hit HTTP 429. No undocumented call commitment is assumed.

These are disclosed scope boundaries, not hidden unfinished production features. Parent acceptance is kept separate from executor QA.

## Reproducible checks

Start a server from this directory:

```sh
python3 -m http.server 8876 --bind 127.0.0.1
```

Then, from the demo directory:

```sh
node --test qa/*.cjs
python3 qa/guest-smoke.py
python3 qa/guest-edit.py
python3 qa/owner_flow.py
python3 qa/owner_ui.py
python3 qa/price-propagation.py
python3 qa/full-browser.py
```

The owner checks create their own isolated ephemeral servers. Other browser checks use the localhost server. Python Playwright and managed Chromium were already installed on the devbox.

The prescribed visual gate used the existing Node Playwright package without changing repository dependencies:

```sh
NODE_PATH=/home/matt/mirror/ccp-lovasember/node_modules \
SITE=http://127.0.0.1:8876 \
URLS='/?concept=1,/?concept=2,/?concept=3,/?concept=4,/?concept=5,/#owner,/#offer,/#system' \
WIDTHS=1280,390 \
node /home/matt/.agents/skills/playwright-site-gate/scripts/gate.js
```

Port 8765 was already occupied, so the demo used 8876. The repository-local Node Playwright package was absent, resolved with the existing package through `NODE_PATH`. No dependency installation was needed. The final secret scan used the finish-session checker without its mutation option.
