Zerf home

2 What she produced

The real run of this version: It's Monday. Do the Monday work described in CLAUDE.md, using the OPERA export in data/opera.

deck-OWN-001.json

{
  "owner_id": "OWN-001",
  "week_start": "2027-10-18",
  "property_ids": ["HOTEL-001"],
  "subject": "Demo Hotel 001: week of 2027-10-18",
  "body": "Hi,\n\nThe deck for the week of 2027-10-18 is attached. The next 7 days average 66.6% occupancy on the books, up from 57.3% last week. Two nights are below target: 2027-10-18 and 2027-10-23. The 85% on 2027-10-24 still needs a check in OPERA.\n\nBest regards",
  "placeholders": {
    "title": "Monday report: Demo Hotel 001",
    "week": "Week of 2027-10-18 (next 7 days: 2027-10-18 to 2027-10-24)",
    "headline_1": "Next 7 days: 66.6% on the books, up 9.3 points from 57.3% last week.",
    "headline_2": "Two nights below target: 2027-10-18 (60.4%) and 2027-10-23 (62.7%).",
    "headline_3": "Sunday 2027-10-24 shows 85%, but that number needs a check in OPERA.",
    "property_name": "Demo Hotel 001 (fictional)",
    "property_line": "66.6% average for the week. Highest night 2027-10-24 at 85%. Lowest night 2027-10-18 at 60.4%. Group pickup 0 of 2 rooms. 45 rooms have open maintenance.",
    "weak_nights": "2027-10-18: 60.4%, 490 rooms open. 2027-10-23: 62.7%, 461 rooms open.",
    "next_steps": "Review rates for Saturday 2027-10-23. Confirm the 2027-10-24 number. Ask sales about the 2 group rooms on 2027-10-19. Ask engineering which of the 45 rooms return before the weekend."
  }
}

insights.json

{
  "week_start": "2027-10-18",
  "insights": [
    {
      "property_id": "HOTEL-001",
      "what_changed": "Occupancy on the books for the next 7 days averages 0.6656, up 0.0929 from 0.5727 in the last 7 days (2027-10-11 to 2027-10-17).",
      "why": "Most of the week sits between 0.6274 and 0.66. The lift leans on 2027-10-24 at 0.85, the highest date of the week. Rooms available for that date are derived from the inventory, because the export has no hotel-level availability row for it.",
      "what_to_look_at": "Confirm 2027-10-24 in OPERA before telling anyone the week is up. If that date is lower, most of the gain goes away.",
      "evidence": [
        "outputs/report.json last_7_days (source hotel-001.json)",
        "hotel-001.json occupancy[13]; derived from inventory (report row 2027-10-24)",
        "Warning: rooms_available for 2027-10-24 is derived from the inventory and the occupancy."
      ]
    },
    {
      "property_id": "HOTEL-001",
      "what_changed": "Two nights are below the occupancy threshold in the report: 2027-10-18 at 0.6043 with 490 rooms available, and 2027-10-23 at 0.6274 with 461 rooms available.",
      "why": "The export does not say why. No group rooms are picked up on either night, so groups add nothing to these dates.",
      "what_to_look_at": "2027-10-18 is the business date, so only same-day sales can help it. 2027-10-23 is a Saturday five days out: review rates and channel availability for that night now.",
      "evidence": [
        "hotel-001.json occupancy[7]; availability[0] (report row 2027-10-18)",
        "hotel-001.json occupancy[12]; availability[5] (report row 2027-10-23)"
      ]
    },
    {
      "property_id": "HOTEL-001",
      "what_changed": "Four midweek nights sit just above the threshold: 2027-10-19 at 0.66, 2027-10-20 at 0.6478, 2027-10-21 at 0.6342 and 2027-10-22 at 0.6355.",
      "why": "2027-10-21 and 2027-10-22 are the closest to the line. A few cancellations would push them below it.",
      "what_to_look_at": "Watch pickup and cancellations on 2027-10-21 and 2027-10-22 during the week.",
      "evidence": [
        "hotel-001.json occupancy[8]; availability[1] (report row 2027-10-19)",
        "hotel-001.json occupancy[9]; availability[2] (report row 2027-10-20)",
        "hotel-001.json occupancy[10]; availability[3] (report row 2027-10-21)",
        "hotel-001.json occupancy[11]; availability[4] (report row 2027-10-22)"
      ]
    },
    {
      "property_id": "HOTEL-001",
      "what_changed": "Group pickup is 0 of 2 allocated rooms on 2027-10-18 and 0 of 2 on 2027-10-19. No group rooms are allocated for the rest of the week.",
      "why": "The block has not picked up any rooms. The group grid covers only 1 of the 25 blocks listed in the export, so these numbers do not show all group business.",
      "what_to_look_at": "Ask sales whether the 2 rooms on 2027-10-19 will be used or released, and why the other 24 blocks are missing from the group grid.",
      "evidence": [
        "hotel-001.json occupancy[7]; availability[0] (report row 2027-10-18, group_rooms_allocated, group_rooms_picked_up)",
        "hotel-001.json occupancy[8]; availability[1] (report row 2027-10-19, group_rooms_allocated, group_rooms_picked_up)",
        "Warning: the group grid covers 1 of 25 blocks listed in the export."
      ]
    },
    {
      "property_id": "HOTEL-001",
      "what_changed": "45 rooms have open maintenance records. The busiest date, 2027-10-24 at 0.85, has 186 rooms available.",
      "why": "The maintenance records have no end dates, so the report shows the same 45 rooms on every date. It cannot tell which ones will be fixed before the weekend.",
      "what_to_look_at": "Ask engineering which of the 45 rooms will be back in service before 2027-10-24.",
      "evidence": [
        "hotel-001.json occupancy[13]; derived from inventory (report row 2027-10-24, rooms_with_open_maintenance)",
        "Warning: rooms_with_open_maintenance is one count for every date: the export has no end dates for maintenance records."
      ]
    }
  ]
}

report.csv

property_id,week_start,date,occupancy_on_books,rooms_available,below_threshold,group_rooms_allocated,group_rooms_picked_up,rooms_with_open_maintenance,source_file,source_row
HOTEL-001,2027-10-18,2027-10-18,0.6043,490,true,2,0,45,hotel-001.json,occupancy[7]; availability[0]
HOTEL-001,2027-10-18,2027-10-19,0.66,421,false,2,0,45,hotel-001.json,occupancy[8]; availability[1]
HOTEL-001,2027-10-18,2027-10-20,0.6478,436,false,0,0,45,hotel-001.json,occupancy[9]; availability[2]
HOTEL-001,2027-10-18,2027-10-21,0.6342,453,false,0,0,45,hotel-001.json,occupancy[10]; availability[3]
HOTEL-001,2027-10-18,2027-10-22,0.6355,451,false,0,0,45,hotel-001.json,occupancy[11]; availability[4]
HOTEL-001,2027-10-18,2027-10-23,0.6274,461,true,0,0,45,hotel-001.json,occupancy[12]; availability[5]
HOTEL-001,2027-10-18,2027-10-24,0.85,186,false,0,0,45,hotel-001.json,occupancy[13]; derived from inventory

report.json

{
  "business_date": "2027-10-18",
  "property_id": "HOTEL-001",
  "threshold": 0.63,
  "rows": [
    {
      "date": "2027-10-18",
      "occupancy_on_books": 0.6043,
      "rooms_available": 490,
      "below_threshold": true,
      "group_rooms_allocated": 2,
      "group_rooms_picked_up": 0,
      "rooms_with_open_maintenance": 45,
      "source_file": "hotel-001.json",
      "source_row": "occupancy[7]; availability[0]"
    },
    {
      "date": "2027-10-19",
      "occupancy_on_books": 0.66,
      "rooms_available": 421,
      "below_threshold": false,
      "group_rooms_allocated": 2,
      "group_rooms_picked_up": 0,
      "rooms_with_open_maintenance": 45,
      "source_file": "hotel-001.json",
      "source_row": "occupancy[8]; availability[1]"
    },
    {
      "date": "2027-10-20",
      "occupancy_on_books": 0.6478,
      "rooms_available": 436,
      "below_threshold": false,
      "group_rooms_allocated": 0,
      "group_rooms_picked_up": 0,
      "rooms_with_open_maintenance": 45,
      "source_file": "hotel-001.json",
      "source_row": "occupancy[9]; availability[2]"
    },
    {
      "date": "2027-10-21",
      "occupancy_on_books": 0.6342,
      "rooms_available": 453,
      "below_threshold": false,
      "group_rooms_allocated": 0,
      "group_rooms_picked_up": 0,
      "rooms_with_open_maintenance": 45,
      "source_file": "hotel-001.json",
      "source_row": "occupancy[10]; availability[3]"
    },
    {
      "date": "2027-10-22",
      "occupancy_on_books": 0.6355,
      "rooms_available": 451,
      "below_threshold": false,
      "group_rooms_allocated": 0,
      "group_rooms_picked_up": 0,
      "rooms_with_open_maintenance": 45,
      "source_file": "hotel-001.json",
      "source_row": "occupancy[11]; availability[4]"
    },
    {
      "date": "2027-10-23",
      "occupancy_on_books": 0.6274,
      "rooms_available": 461,
      "below_threshold": true,
      "group_rooms_allocated": 0,
      "group_rooms_picked_up": 0,
      "rooms_with_open_maintenance": 45,
      "source_file": "hotel-001.json",
      "source_row": "occupancy[12]; availability[5]"
    },
    {
      "date": "2027-10-24",
      "occupancy_on_books": 0.85,
      "rooms_available": 186,
      "below_threshold": false,
      "group_rooms_allocated": 0,
      "group_rooms_picked_up": 0,
      "rooms_with_open_maintenance": 45,
      "source_file": "hotel-001.json",
      "source_row": "occupancy[13]; derived from inventory"
    }
  ],
  "last_7_days": {
    "start_date": "2027-10-11",
    "end_date": "2027-10-17",
    "days": 7,
    "occupancy_avg": 0.5727,
    "next_7_days_occupancy_avg": 0.6656,
    "change_vs_last_7_days": 0.0929
  },
  "warnings": [
    "rooms_available for 2027-10-24 is derived from the inventory and the occupancy: the export has no hotel-level availability row for that date.",
    "The group grid covers 1 of 25 blocks listed in the export. Group numbers cover only the blocks in the grid.",
    "rooms_with_open_maintenance is one count for every date: the export has no end dates for maintenance records."
  ]
}