Task run 440778 Task: ceo-dashboard-build - Build CEO Dashboard Status: completed Started: 2026-06-19T07:00:01.813535+02:00 Finished: 2026-06-19T07:01:33.341273+02:00 Duration: 91.525118s Log path: /home/lucienne/workspace/logs/task-runs/ceo-dashboard-build/440778.log --- output --- run_id=440778 task_id=ceo-dashboard-build status=completed logged_at=2026-06-19T07:01:33.341033+02:00 truncated=false *FlySafair Daily Brief — 19 Jun 2026* Data through: 2026-06-18 *May 2026* Pax: 764,209 (-11.9% YoY) | Rev: R1.19B (+21.7% YoY) LF: 82.1% (-9.7pp YoY) | Yield: R1,552 (+38.1% YoY) Flights: 4,929 (-2.6% YoY) | Seats: 931,173 (-1.5% YoY) *June 2026 MTD (18 days, through 18 Jun)* Pax: 421,919 (-13.9% YoY) | Rev: R611M (+10.8% YoY) LF: 79.4% (-6.2pp YoY) | Yield: R1,448 (+28.7% YoY) Flights: 2,812 (-8.3% YoY) | Seats: 531,468 (-7.2% YoY) *Attention:* ⚠️ Capacity (+-1.5%) outpacing demand (+-11.9%) — watch for LF erosion ✅ Yield strength +38.1% YoY — pricing power holding 🔴 Load factor down -9.7pp YoY — demand not absorbing capacity growth ✅ Revenue/flight up +24.9% YoY — quality growth 📊 2026-06 bookings: 630,416 pax (75% of PY final) | Rev R911M (94% of PY) 📊 2026-07 forward: 230,867 pax (27% of PY final) ✅ Best yield: CPT-HLA (+51.0% YoY, LF 75%) 🚀 Fastest growing: HRE-JNB (rev +118.8% YoY, 20,558 pax) ⚠️ LF dropping on CPT-DUR: -13.1pp YoY (now 81%, cap -2.6% YoY) ✅ Jet fuel down 5.1% WoW ($139/mt) ⛽ Jet fuel: $139/mt | Crack: $45 💱 ZAR stronger (-0.4% in 30d) — R16.52/$ ✅ Brent down 8.7% WoW ($80/bbl) ✅ ACSA market share (2026-05): 65.1% (+1.4pp MoM) 📈 YTD (5m): Pax 4,308,690 (+1.2% vs PY) | Rev R5.89B (+8.5% vs PY) _Dashboard: http://100.118.207.3:3001/apps/ceo-dashboard_ Telegram sent: True === CEO Dashboard Build — 2026-06-19 07:00 === Downloading data files... SummaryRoute.xlsx (7,245,310 bytes) SummaryExcel.xlsx (5,992,656 bytes) Data Fuel.xlsx (17,460 bytes) ACSA Monthly Data.xlsx (76,083 bytes) ACSA Website Data.xlsx (41,915 bytes) fleet_asana.json (49,753 bytes) Downloading cash data... cash_data.json (136,789 bytes) 202604 Booking Curve.csv (21,099,278 bytes) [from staging] 202605 Booking Curve.csv (20,798,814 bytes) [from staging] 202606 Booking Curve.csv (19,038,761 bytes) [from staging] 202607 Booking Curve.csv (19,199,647 bytes) [from staging] Downloading FlightAware capacity reports... Capacity_Actuals_2024-01-01_to_2026-06-17.xlsx (591,738 bytes) Capacity_Scheduled_2026-06-01_to_2026-12-31.xlsx (134,068 bytes) FA data ends 2026-06-17 (2 days old) Downloading Capacity schedule snapshots... Capacity_Scheduled_snapshot_2026-06-17.xlsx (134,089 bytes) Capacity_Scheduled_snapshot_2026-06-09.xlsx (138,843 bytes) Capacity_Scheduled_snapshot_2026-06-01.xlsx (155,743 bytes) Capacity_Scheduled_snapshot_2026-05-29.xlsx (155,797 bytes) Capacity_Scheduled_snapshot_2026-05-21.xlsx (156,384 bytes) Capacity_Scheduled_snapshot_2026-05-13.xlsx (156,384 bytes) Capacity_Scheduled_snapshot_2026-05-05.xlsx (156,128 bytes) Staging build script from PKA repo: /home/lucienne/workspace/PKA/Projects/ceo-dashboard/scripts/build_html_dashboard.py build_html_dashboard.py (375,339 bytes) Running build script (Linux branch, BASE auto-detected)... Loading SummaryRoute.xlsx... Loading SummaryExcel.xlsx... Data loaded. Processing... Route contribution: skipped ([Errno 2] No such file or directory: '/home/lucienne/workspace/dashboard-build/scripts/../../findash/data/contribution_data.json') Loading forward bookings from Booking Curve CSVs... Loaded 202604 Booking Curve.csv (168,682 rows) Loaded 202605 Booking Curve.csv (172,008 rows) Loaded 202606 Booking Curve.csv (166,157 rows) Loaded 202607 Booking Curve.csv (172,720 rows) CSVs: 679,567 booking snapshot rows loaded (departures 2026-04-01 to 2026-07-31) Curve: 80 departure dates with real curves (flat-state filtered) Curve shape: 65 DBA points from 80 completed departures 2026-04: 134 points, latest gap=-4.4pp, 19/26 routes behind curve, PY final LF=90.9% 2026-05: 134 points, latest gap=-9.7pp, 23/25 routes behind curve, PY final LF=91.8% 2026-06: 134 points, latest gap=-6.3pp, 17/25 routes behind curve, PY final LF=86.3% 2026-07: 134 points, latest gap=-4.1pp, 16/25 routes behind curve, PY final LF=91.8% Loading economic indicators... EIA jet fuel: 650 weeks (2014-01-03 to 2026-06-12) FX data: 1399 days loaded (Frankfurter) FX gap-fill: +1 days from yfinance (through 2026-06-19) Fetching Brent crude oil prices... Oil data: 3134 days loaded Fuel trend: 650 weeks total (591 EIA [71 gap-fill] + 59 IATA from 2023-12-22) Loading ACSA data... Loading FlightAware capacity data... Actuals cutoff: 2026-06-17 (scheduled MTD cap for 2026-06) Schedule reliability: DB unavailable, prorating current month from xlsx Schedule reliability: prorated 2026-06 scheduled by 19/30 days Schedule reliability: current-month scheduled from Reliability_Schedule_MTD_2026-06-01_to_2026-06-06.xlsx (exact day-capped — proration superseded) Trimming 2 sparse months: ['2026-11', '2026-12'] Pre-computed route tables for 8 months, 4268 changes FlightAware: 34 months, 315 routes in latest month Loading fleet data from Asana... Fleet: 56 aircraft loaded from Asana Processing complete. Building HTML... Cash data loaded from /home/lucienne/workspace/dashboard-build/Cash/cash_data.json JS syntax gate: OK Dashboard written to: /home/lucienne/workspace/dashboard-build/dashboard/Dashboard.html File size: 3579 KB Data JSON written to: /home/lucienne/workspace/dashboard-build/dashboard/dashboard_data.json (5088 KB) Summary MD written to: /home/lucienne/workspace/dashboard-build/dashboard/dashboard_summary.md Dashboard.html generated (3,665,201 bytes) Updated Dashboard.html on Drive (ID: 15EeKvzeI2ZErZ6IFV2jHH7wBvA7cSf29) Copied to /home/lucienne/workspace/PKA/dashboards/ceo-dashboard.html Published to cloud: /home/lucienne/gdrive/PKA-Outputs/dashboards Success: CEO Dashboard built and uploaded