{"definition_raw":"---\nid: ceo-dashboard-build\ntitle: Build CEO Dashboard\nschedule: \"0 5 * * 1-5\"\ntimeout: 600\nretry: true\nenabled: true\nnotify_on: always\nrun_as: shell\ncommand: \"cd /home/lucienne/workspace && /home/lucienne/workspace/.venvs/ceo-dashboard/bin/python scripts/ceo_dashboard_build.py\"\ntags: [flysafair, dashboard, ceo, reporting]\nruntime_profile: direct_python\n---\n**OVERRIDES runtime profile:** uses `direct_python` (plain Python, no model) because the command chain never invokes the `claude` CLI or any LLM API \u2014 pure-infra task; scheduler provider env injection is a no-op (MC-4942 U12 sweep).\n\nDaily CEO dashboard build. Downloads all data files from Google Drive,\nruns build_html_dashboard.py, uploads Dashboard.html back to Drive.\n\nRuns weekdays at 8:30am SAST (6:30 UTC) \u2014 after all data feeds are fresh:\n- SummaryRoute/Excel: synced from Dropbox via CloudHQ (~6:30am)\n- ACSA monthly: checked at 7:00am\n- Booking curve: pulled at 8:00am\n- ACSA website: updated Tue 8:00am\n- IATA fuel: updated Tue 8:10am  \n- Fleet: updated Tue 8:15am\n\n100% Python, zero AI cost. Downloads ~25MB of data, generates ~1.7MB HTML.\nAfter build, sends a Telegram briefing with critical analysis of the data.\n\nSource: All reporting data files on Google Drive\nTarget: Dashboard.html in Reporting Data folder (Google Drive)\nPost-build: scripts/ceo_briefing.py sends Telegram briefing\n","id":"ceo-dashboard-build","last_run":{"duration_s":122.32751,"log_path":"/home/lucienne/workspace/logs/task-runs/ceo-dashboard-build/409490.log","output":" final) | Rev R681M (70% of PY)\n\ud83d\udcca 2026-07 forward: 189,762 pax (22% of PY final)\n\u2705 Best yield: CPT-HLA (+51.0% YoY, LF 75%)\n\ud83d\ude80 Fastest growing: HRE-JNB (rev +118.8% YoY, 20,559 pax)\n\u26a0\ufe0f LF dropping on CPT-DUR: -13.1pp YoY (now 81%, cap -2.6% YoY)\n\u26a0\ufe0f Jet fuel up 3.3% WoW ($146/mt)\n\u26fd Jet fuel: $146/mt | Crack: $47\n\ud83d\udcb1 ZAR stronger (-1.0% in 30d) \u2014 R16.29/$\n\u2705 Brent down 6.3% WoW ($89/bbl)\n\u2705 ACSA market share (2026-05): 65.1% (+1.4pp MoM)\n\ud83d\udcc8 YTD (5m): Pax 4,308,739 (+1.2% vs PY) | Rev R5.89B (+8.5% vs PY)\n\n_Dashboard: http://100.118.207.3:3001/apps/ceo-dashboard_\n\nTelegram sent: True\n=== CEO Dashboard Build \u2014 2026-06-12 05:00 ===\nDownloading data files...\n  SummaryRoute.xlsx (7,227,751 bytes)\n  SummaryExcel.xlsx (6,016,226 bytes)\n  Data Fuel.xlsx (17,437 bytes)\n  ACSA Monthly Data.xlsx (76,083 bytes)\n  ACSA Website Data.xlsx (27,750 bytes)\n  fleet_asana.json (49,744 bytes)\n  202606 Booking Curve.csv (booking curve)\nDownloading FlightAware capacity reports...\n  Capacity_Scheduled_2026-06-01_to_2026-12-31.xlsx (138,845 bytes)\n  Capacity_Actuals_2024-01-01_to_2026-06-08.xlsx (603,061 bytes)\n  FA data ends 2026-06-08 (4 days old)\nDownloading Capacity schedule snapshots...\n  Capacity_Scheduled_snapshot_2026-06-09.xlsx (138,843 bytes)\n  Capacity_Scheduled_snapshot_2026-06-01.xlsx (155,743 bytes)\n  Capacity_Scheduled_snapshot_2026-05-29.xlsx (155,797 bytes)\n  Capacity_Scheduled_snapshot_2026-05-21.xlsx (156,384 bytes)\n  Capacity_Scheduled_snapshot_2026-05-13.xlsx (156,384 bytes)\n  Capacity_Scheduled_snapshot_2026-05-05.xlsx (156,128 bytes)\nStaging build script from PKA repo: /home/lucienne/workspace/PKA/Projects/ceo-dashboard/scripts/build_html_dashboard.py\n  build_html_dashboard.py (326,289 bytes)\nRunning build script (Linux branch, BASE auto-detected)...\nLoading SummaryRoute.xlsx...\nLoading SummaryExcel.xlsx...\nData loaded. Processing...\nLoading forward bookings from Neon DB...\n  Neon: 640,301 booking snapshot rows loaded (departures 2026-04-01 to 2026-07-31)\n  Curve: 73 departure dates with real curves (flat-state filtered)\n  Curve shape: 65 DBA points from 72 completed departures\n  2026-04: 126 points, latest gap=-4.4pp, 19/26 routes behind curve, PY final LF=90.9%\n  2026-05: 126 points, latest gap=-9.7pp, 23/25 routes behind curve, PY final LF=91.8%\n  2026-06: 126 points, latest gap=-7.2pp, 20/25 routes behind curve, PY final LF=86.3%\n  2026-07: 126 points, latest gap=-2.7pp, 16/25 routes behind curve, PY final LF=91.8%\nLoading economic indicators...\n  EIA jet fuel: 649 weeks (2014-01-03 to 2026-06-05)\n  FX data: 1394 days loaded (Frankfurter)\n  FX gap-fill: +1 days from yfinance (through 2026-06-12)\nFetching Brent crude oil prices...\n  Oil data: 3128 days loaded\n  Fuel trend: 649 weeks total (591 EIA [71 gap-fill] + 58 IATA from 2023-12-22)\nLoading ACSA data...\nLoading FlightAware capacity data...\n  Actuals cutoff: 2026-06-08 (scheduled MTD cap for 2026-06)\n  Schedule reliability: DB unavailable, prorating current month from xlsx\n  Schedule reliability: prorated 2026-06 scheduled by 12/30 days\n  Trimming 2 sparse months: ['2026-11', '2026-12']\n  Pre-computed route tables for 8 months, 4268 changes\n  FlightAware: 34 months, 315 routes in latest month\nLoading fleet data from Asana...\n  Fleet: 56 aircraft loaded from Asana\nProcessing complete. Building HTML...\nWARNING: cash_data.json unavailable (no candidate found); Cash tab will show a placeholder.\nDashboard written to: /home/lucienne/workspace/dashboard-build/dashboard/Dashboard.html\nFile size: 3380 KB\nData JSON written to: /home/lucienne/workspace/dashboard-build/dashboard/dashboard_data.json (4816 KB)\nSummary MD written to: /home/lucienne/workspace/dashboard-build/dashboard/dashboard_summary.md\n\n  Dashboard.html generated (3,461,018 bytes)\nUpdated Dashboard.html on Drive (ID: 15EeKvzeI2ZErZ6IFV2jHH7wBvA7cSf29)\nCopied to /home/lucienne/workspace/PKA/dashboards/ceo-dashboard.html\nPublished to cloud: /home/lucienne/gdrive/PKA-Outputs/dashboards\n\nSuccess: CEO Dashboard built and uploaded\n","started_at":"2026-06-12T05:00:06.268638+02:00","status":"completed"},"next_run":"2026-06-15 05:00","next_run_iso":"2026-06-15T05:00:00+02:00","runs":[{"duration_s":122.32751,"finished_at":"2026-06-12T05:02:08.599574+02:00","id":409490,"log_path":"/home/lucienne/workspace/logs/task-runs/ceo-dashboard-build/409490.log","output":" final) | Rev R681M (70% of PY)\n\ud83d\udcca 2026-07 forward: 189,762 pax (22% of PY final)\n\u2705 Best yield: CPT-HLA (+51.0% YoY, LF 75%)\n\ud83d\ude80 Fastest growing: HRE-JNB (rev +118.8% YoY, 20,559 pax)\n\u26a0\ufe0f LF dropping on CPT-DUR: -13.1pp YoY (now 81%, cap -2.6% YoY)\n\u26a0\ufe0f Jet fuel up 3.3% WoW ($146/mt)\n\u26fd Jet fuel: $146/mt | Crack: $47\n\ud83d\udcb1 ZAR stronger (-1.0% in 30d) \u2014 R16.29/$\n\u2705 Brent down 6.3% WoW ($89/bbl)\n\u2705 ACSA market share (2026-05): 65.1% (+1.4pp MoM)\n\ud83d\udcc8 YTD (5m): Pax 4,308,739 (+1.2% vs PY) | Rev R5.89B (+8.5% vs PY)\n\n_Dashboard: http://100.118.207.3:3001/apps/ceo-dashboard_\n\nTelegram sent: True\n=== CEO Dashboard Build \u2014 2026-06-12 05:00 ===\nDownloading data files...\n  SummaryRoute.xlsx (7,227,751 bytes)\n  SummaryExcel.xlsx (6,016,226 bytes)\n  Data Fuel.xlsx (17,437 bytes)\n  ACSA Monthly Data.xlsx (76,083 bytes)\n  ACSA Website Data.xlsx (27,750 bytes)\n  fleet_asana.json (49,744 bytes)\n  202606 Booking Curve.csv (booking curve)\nDownloading FlightAware capacity reports...\n  Capacity_Scheduled_2026-06-01_to_2026-12-31.xlsx (138,845 bytes)\n  Capacity_Actuals_2024-01-01_to_2026-06-08.xlsx (603,061 bytes)\n  FA data ends 2026-06-08 (4 days old)\nDownloading Capacity schedule snapshots...\n  Capacity_Scheduled_snapshot_2026-06-09.xlsx (138,843 bytes)\n  Capacity_Scheduled_snapshot_2026-06-01.xlsx (155,743 bytes)\n  Capacity_Scheduled_snapshot_2026-05-29.xlsx (155,797 bytes)\n  Capacity_Scheduled_snapshot_2026-05-21.xlsx (156,384 bytes)\n  Capacity_Scheduled_snapshot_2026-05-13.xlsx (156,384 bytes)\n  Capacity_Scheduled_snapshot_2026-05-05.xlsx (156,128 bytes)\nStaging build script from PKA repo: /home/lucienne/workspace/PKA/Projects/ceo-dashboard/scripts/build_html_dashboard.py\n  build_html_dashboard.py (326,289 bytes)\nRunning build script (Linux branch, BASE auto-detected)...\nLoading SummaryRoute.xlsx...\nLoading SummaryExcel.xlsx...\nData loaded. Processing...\nLoading forward bookings from Neon DB...\n  Neon: 640,301 booking snapshot rows loaded (departures 2026-04-01 to 2026-07-31)\n  Curve: 73 departure dates with real curves (flat-state filtered)\n  Curve shape: 65 DBA points from 72 completed departures\n  2026-04: 126 points, latest gap=-4.4pp, 19/26 routes behind curve, PY final LF=90.9%\n  2026-05: 126 points, latest gap=-9.7pp, 23/25 routes behind curve, PY final LF=91.8%\n  2026-06: 126 points, latest gap=-7.2pp, 20/25 routes behind curve, PY final LF=86.3%\n  2026-07: 126 points, latest gap=-2.7pp, 16/25 routes behind curve, PY final LF=91.8%\nLoading economic indicators...\n  EIA jet fuel: 649 weeks (2014-01-03 to 2026-06-05)\n  FX data: 1394 days loaded (Frankfurter)\n  FX gap-fill: +1 days from yfinance (through 2026-06-12)\nFetching Brent crude oil prices...\n  Oil data: 3128 days loaded\n  Fuel trend: 649 weeks total (591 EIA [71 gap-fill] + 58 IATA from 2023-12-22)\nLoading ACSA data...\nLoading FlightAware capacity data...\n  Actuals cutoff: 2026-06-08 (scheduled MTD cap for 2026-06)\n  Schedule reliability: DB unavailable, prorating current month from xlsx\n  Schedule reliability: prorated 2026-06 scheduled by 12/30 days\n  Trimming 2 sparse months: ['2026-11', '2026-12']\n  Pre-computed route tables for 8 months, 4268 changes\n  FlightAware: 34 months, 315 routes in latest month\nLoading fleet data from Asana...\n  Fleet: 56 aircraft loaded from Asana\nProcessing complete. Building HTML...\nWARNING: cash_data.json unavailable (no candidate found); Cash tab will show a placeholder.\nDashboard written to: /home/lucienne/workspace/dashboard-build/dashboard/Dashboard.html\nFile size: 3380 KB\nData JSON written to: /home/lucienne/workspace/dashboard-build/dashboard/dashboard_data.json (4816 KB)\nSummary MD written to: /home/lucienne/workspace/dashboard-build/dashboard/dashboard_summary.md\n\n  Dashboard.html generated (3,461,018 bytes)\nUpdated Dashboard.html on Drive (ID: 15EeKvzeI2ZErZ6IFV2jHH7wBvA7cSf29)\nCopied to /home/lucienne/workspace/PKA/dashboards/ceo-dashboard.html\nPublished to cloud: /home/lucienne/gdrive/PKA-Outputs/dashboards\n\nSuccess: CEO Dashboard built and uploaded\n","started_at":"2026-06-12T05:00:06.268638+02:00","status":"completed","task_id":"ceo-dashboard-build","task_name":"Build CEO Dashboard"},{"duration_s":122.844434,"finished_at":"2026-06-11T05:02:08.985634+02:00","id":405129,"log_path":"/home/lucienne/workspace/logs/task-runs/ceo-dashboard-build/405129.log","output":" 2026-07 forward: 183,643 pax (22% of PY final)\n\u2705 Best yield: CPT-HLA (+51.0% YoY, LF 75%)\n\ud83d\ude80 Fastest growing: HRE-JNB (rev +118.8% YoY, 20,557 pax)\n\u26a0\ufe0f LF dropping on CPT-PLZ: -13.2pp YoY (now 81%, cap +27.5% YoY)\n\u26a0\ufe0f Jet fuel up 3.3% WoW ($146/mt)\n\u26fd Jet fuel: $146/mt | Crack: $47\n\ud83d\udcb1 ZAR weaker (+0.5% in 30d) \u2014 R16.60/$\n\u2705 Brent down 3.4% WoW ($94/bbl)\n\u2705 ACSA market share (2026-05): 65.1% (+1.4pp MoM)\n\ud83d\udcc8 YTD (5m): Pax 4,301,241 (+1.2% vs PY) | Rev R5.88B (+8.4% vs PY)\n\n_Dashboard: http://100.118.207.3:3001/apps/ceo-dashboard_\n\nTelegram sent: True\n=== CEO Dashboard Build \u2014 2026-06-11 05:00 ===\nDownloading data files...\n  SummaryRoute.xlsx (7,243,470 bytes)\n  SummaryExcel.xlsx (6,013,774 bytes)\n  Data Fuel.xlsx (17,437 bytes)\n  ACSA Monthly Data.xlsx (76,083 bytes)\n  ACSA Website Data.xlsx (27,750 bytes)\n  fleet_asana.json (49,744 bytes)\n  202606 Booking Curve.csv (booking curve)\nDownloading FlightAware capacity reports...\n  Capacity_Scheduled_2026-06-01_to_2026-12-31.xlsx (138,845 bytes)\n  Capacity_Actuals_2024-01-01_to_2026-06-08.xlsx (603,061 bytes)\n  FA data ends 2026-06-08 (3 days old)\nDownloading Capacity schedule snapshots...\n  Capacity_Scheduled_snapshot_2026-06-09.xlsx (138,843 bytes)\n  Capacity_Scheduled_snapshot_2026-06-01.xlsx (155,743 bytes)\n  Capacity_Scheduled_snapshot_2026-05-29.xlsx (155,797 bytes)\n  Capacity_Scheduled_snapshot_2026-05-21.xlsx (156,384 bytes)\n  Capacity_Scheduled_snapshot_2026-05-13.xlsx (156,384 bytes)\n  Capacity_Scheduled_snapshot_2026-05-05.xlsx (156,128 bytes)\nStaging build script from PKA repo: /home/lucienne/workspace/PKA/Projects/ceo-dashboard/scripts/build_html_dashboard.py\n  build_html_dashboard.py (325,614 bytes)\nRunning build script (Linux branch, BASE auto-detected)...\nLoading SummaryRoute.xlsx...\nLoading SummaryExcel.xlsx...\nData loaded. Processing...\nLoading forward bookings from Neon DB...\n  Neon: 635,447 booking snapshot rows loaded (departures 2026-04-01 to 2026-07-31)\n  Curve: 72 departure dates with real curves (flat-state filtered)\n  Curve shape: 65 DBA points from 71 completed departures\n  2026-04: 125 points, latest gap=-4.6pp, 19/26 routes behind curve, PY final LF=90.8%\n  2026-05: 125 points, latest gap=-9.8pp, 23/25 routes behind curve, PY final LF=91.6%\n  2026-06: 125 points, latest gap=-7.2pp, 20/25 routes behind curve, PY final LF=86.1%\n  2026-07: 125 points, latest gap=-2.7pp, 16/25 routes behind curve, PY final LF=91.7%\nLoading economic indicators...\n  EIA jet fuel: 649 weeks (2014-01-03 to 2026-06-05)\n  FX data: 1393 days loaded (Frankfurter)\nFetching Brent crude oil prices...\n  Oil data: 3127 days loaded\n  Fuel trend: 649 weeks total (591 EIA [71 gap-fill] + 58 IATA from 2023-12-22)\nLoading ACSA data...\nLoading FlightAware capacity data...\n  Actuals cutoff: 2026-06-08 (scheduled MTD cap for 2026-06)\n  Schedule reliability: DB unavailable, prorating current month from xlsx\n  Schedule reliability: prorated 2026-06 scheduled by 11/30 days\n  Trimming 2 sparse months: ['2026-11', '2026-12']\n  Pre-computed route tables for 8 months, 4268 changes\n  FlightAware: 34 months, 315 routes in latest month\nLoading fleet data from Asana...\n  Fleet: 56 aircraft loaded from Asana\nProcessing complete. Building HTML...\nWARNING: cash_data.json unavailable ([Errno 2] No such file or directory: '/home/lucienne/workspace/dashboard-build/scripts/../data/cash_data.json'); Cash tab will show a placeholder.\nDashboard written to: /home/lucienne/workspace/dashboard-build/dashboard/Dashboard.html\nFile size: 3383 KB\nData JSON written to: /home/lucienne/workspace/dashboard-build/dashboard/dashboard_data.json (4820 KB)\nSummary MD written to: /home/lucienne/workspace/dashboard-build/dashboard/dashboard_summary.md\n\n  Dashboard.html generated (3,464,045 bytes)\nUpdated Dashboard.html on Drive (ID: 15EeKvzeI2ZErZ6IFV2jHH7wBvA7cSf29)\nCopied to /home/lucienne/workspace/PKA/dashboards/ceo-dashboard.html\nPublished to cloud: /home/lucienne/gdrive/PKA-Outputs/dashboards\n\nSuccess: CEO Dashboard built and uploaded\n","started_at":"2026-06-11T05:00:06.138334+02:00","status":"completed","task_id":"ceo-dashboard-build","task_name":"Build CEO Dashboard"},{"duration_s":119.67328,"finished_at":"2026-06-10T05:02:06.295824+02:00","id":400860,"log_path":"/home/lucienne/workspace/logs/task-runs/ceo-dashboard-build/400860.log","output":"f PY)\n\ud83d\udcca 2026-07 forward: 179,192 pax (21% of PY final)\n\u2705 Best yield: CPT-HLA (+51.0% YoY, LF 75%)\n\ud83d\ude80 Fastest growing: HRE-JNB (rev +118.8% YoY, 20,557 pax)\n\u26a0\ufe0f LF dropping on CPT-PLZ: -13.2pp YoY (now 81%, cap +27.5% YoY)\n\u26a0\ufe0f Jet fuel up 3.3% WoW ($146/mt)\n\u26fd Jet fuel: $146/mt | Crack: $47\n\ud83d\udcb1 ZAR weaker (+0.7% in 30d) \u2014 R16.55/$\n\u2705 Brent down 4.0% WoW ($92/bbl)\n\u2705 ACSA market share (2026-05): 65.1% (+1.4pp MoM)\n\ud83d\udcc8 YTD (5m): Pax 4,301,255 (+1.2% vs PY) | Rev R5.88B (+8.5% vs PY)\n\n_Dashboard: http://100.118.207.3:3001/apps/ceo-dashboard_\n\nTelegram sent: True\n=== CEO Dashboard Build \u2014 2026-06-10 05:00 ===\nDownloading data files...\n  SummaryRoute.xlsx (7,241,310 bytes)\n  SummaryExcel.xlsx (5,976,555 bytes)\n  Data Fuel.xlsx (17,437 bytes)\n  ACSA Monthly Data.xlsx (76,083 bytes)\n  ACSA Website Data.xlsx (27,750 bytes)\n  fleet_asana.json (49,744 bytes)\n  202606 Booking Curve.csv (booking curve)\nDownloading FlightAware capacity reports...\n  Capacity_Scheduled_2026-06-01_to_2026-12-31.xlsx (138,845 bytes)\n  Capacity_Actuals_2024-01-01_to_2026-06-08.xlsx (603,061 bytes)\n  FA data ends 2026-06-08 (2 days old)\nDownloading Capacity schedule snapshots...\n  Capacity_Scheduled_snapshot_2026-06-09.xlsx (138,843 bytes)\n  Capacity_Scheduled_snapshot_2026-06-01.xlsx (155,743 bytes)\n  Capacity_Scheduled_snapshot_2026-05-29.xlsx (155,797 bytes)\n  Capacity_Scheduled_snapshot_2026-05-21.xlsx (156,384 bytes)\n  Capacity_Scheduled_snapshot_2026-05-13.xlsx (156,384 bytes)\n  Capacity_Scheduled_snapshot_2026-05-05.xlsx (156,128 bytes)\nStaging build script from PKA repo: /home/lucienne/workspace/PKA/Projects/ceo-dashboard/scripts/build_html_dashboard.py\n  build_html_dashboard.py (325,614 bytes)\nRunning build script (Linux branch, BASE auto-detected)...\nLoading SummaryRoute.xlsx...\nLoading SummaryExcel.xlsx...\nData loaded. Processing...\nLoading forward bookings from Neon DB...\n  Neon: 630,524 booking snapshot rows loaded (departures 2026-04-01 to 2026-07-31)\n  Curve: 71 departure dates with real curves (flat-state filtered)\n  Curve shape: 65 DBA points from 70 completed departures\n  2026-04: 124 points, latest gap=-4.6pp, 19/26 routes behind curve, PY final LF=90.8%\n  2026-05: 124 points, latest gap=-9.8pp, 23/25 routes behind curve, PY final LF=91.6%\n  2026-06: 124 points, latest gap=-7.9pp, 20/25 routes behind curve, PY final LF=86.1%\n  2026-07: 124 points, latest gap=-2.7pp, 15/25 routes behind curve, PY final LF=91.7%\nLoading economic indicators...\n  EIA jet fuel: 648 weeks (2014-01-03 to 2026-05-29)\n  FX data: 1392 days loaded (Frankfurter)\n  FX gap-fill: +1 days from yfinance (through 2026-06-10)\nFetching Brent crude oil prices...\n  Oil data: 3126 days loaded\n  Fuel trend: 649 weeks total (591 EIA [71 gap-fill] + 58 IATA from 2023-12-22)\nLoading ACSA data...\nLoading FlightAware capacity data...\n  Actuals cutoff: 2026-06-08 (scheduled MTD cap for 2026-06)\n  Schedule reliability: DB unavailable, prorating current month from xlsx\n  Schedule reliability: prorated 2026-06 scheduled by 10/30 days\n  Trimming 2 sparse months: ['2026-11', '2026-12']\n  Pre-computed route tables for 8 months, 4268 changes\n  FlightAware: 34 months, 315 routes in latest month\nLoading fleet data from Asana...\n  Fleet: 56 aircraft loaded from Asana\nProcessing complete. Building HTML...\nWARNING: cash_data.json unavailable ([Errno 2] No such file or directory: '/home/lucienne/workspace/dashboard-build/scripts/../data/cash_data.json'); Cash tab will show a placeholder.\nDashboard written to: /home/lucienne/workspace/dashboard-build/dashboard/Dashboard.html\nFile size: 3378 KB\nData JSON written to: /home/lucienne/workspace/dashboard-build/dashboard/dashboard_data.json (4813 KB)\nSummary MD written to: /home/lucienne/workspace/dashboard-build/dashboard/dashboard_summary.md\n\n  Dashboard.html generated (3,459,317 bytes)\nUpdated Dashboard.html on Drive (ID: 15EeKvzeI2ZErZ6IFV2jHH7wBvA7cSf29)\nCopied to /home/lucienne/workspace/PKA/dashboards/ceo-dashboard.html\n\nSuccess: CEO Dashboard built and uploaded\n","started_at":"2026-06-10T05:00:06.619586+02:00","status":"completed","task_id":"ceo-dashboard-build","task_name":"Build CEO Dashboard"},{"duration_s":107.114904,"finished_at":"2026-06-09T05:01:53.251071+02:00","id":396586,"log_path":"/home/lucienne/workspace/logs/task-runs/ceo-dashboard-build/396586.log","output":"% YoY \u2014 quality growth\n\ud83d\udcca 2026-06 bookings: 439,285 pax (52% of PY final) | Rev R649M (67% of PY)\n\ud83d\udcca 2026-07 forward: 173,492 pax (20% of PY final)\n\u2705 Best yield: CPT-HLA (+51.0% YoY, LF 75%)\n\ud83d\ude80 Fastest growing: HRE-JNB (rev +118.8% YoY, 20,557 pax)\n\u26a0\ufe0f LF dropping on CPT-PLZ: -13.2pp YoY (now 81%, cap +27.5% YoY)\n\u26a0\ufe0f Jet fuel up 3.3% WoW ($146/mt)\n\u26fd Jet fuel: $146/mt | Crack: $47\n\ud83d\udcb1 ZAR weaker (+0.3% in 30d) \u2014 R16.46/$\n\u2705 ACSA market share (2026-05): 65.1% (+1.4pp MoM)\n\ud83d\udcc8 YTD (5m): Pax 4,301,267 (+1.2% vs PY) | Rev R5.88B (+8.5% vs PY)\n\n_Dashboard: http://100.118.207.3:3001/apps/ceo-dashboard_\n\nTelegram sent: True\n=== CEO Dashboard Build \u2014 2026-06-09 05:00 ===\nDownloading data files...\n  SummaryRoute.xlsx (7,240,713 bytes)\n  SummaryExcel.xlsx (5,976,555 bytes)\n  Data Fuel.xlsx (17,496 bytes)\n  ACSA Monthly Data.xlsx (76,083 bytes)\n  ACSA Website Data.xlsx (27,750 bytes)\n  fleet_asana.json (49,744 bytes)\n  202606 Booking Curve.csv (booking curve)\nDownloading FlightAware capacity reports...\n  Capacity_Scheduled_2026-06-01_to_2026-12-31.xlsx (138,843 bytes)\n  Capacity_Actuals_2024-01-01_to_2026-06-07.xlsx (602,962 bytes)\n  FA data ends 2026-06-07 (2 days old)\nDownloading Capacity schedule snapshots...\n  Capacity_Scheduled_snapshot_2026-06-09.xlsx (138,843 bytes)\n  Capacity_Scheduled_snapshot_2026-06-01.xlsx (155,743 bytes)\n  Capacity_Scheduled_snapshot_2026-05-29.xlsx (155,797 bytes)\n  Capacity_Scheduled_snapshot_2026-05-21.xlsx (156,384 bytes)\n  Capacity_Scheduled_snapshot_2026-05-13.xlsx (156,384 bytes)\n  Capacity_Scheduled_snapshot_2026-05-05.xlsx (156,128 bytes)\nStaging build script from PKA repo: /home/lucienne/workspace/PKA/Projects/ceo-dashboard/scripts/build_html_dashboard.py\n  build_html_dashboard.py (325,515 bytes)\nRunning build script (Linux branch, BASE auto-detected)...\nLoading SummaryRoute.xlsx...\nLoading SummaryExcel.xlsx...\nData loaded. Processing...\nLoading forward bookings from Neon DB...\n  Neon: 625,601 booking snapshot rows loaded (departures 2026-04-01 to 2026-07-31)\n  Curve: 70 departure dates with real curves (flat-state filtered)\n  Curve shape: 65 DBA points from 69 completed departures\n  2026-04: 123 points, latest gap=-4.6pp, 19/26 routes behind curve, PY final LF=90.8%\n  2026-05: 123 points, latest gap=-9.8pp, 23/25 routes behind curve, PY final LF=91.6%\n  2026-06: 123 points, latest gap=-8.6pp, 20/25 routes behind curve, PY final LF=86.1%\n  2026-07: 123 points, latest gap=-2.7pp, 15/25 routes behind curve, PY final LF=91.7%\nLoading economic indicators...\n  EIA jet fuel: 648 weeks (2014-01-03 to 2026-05-29)\n  FX data: 1391 days loaded (Frankfurter)\nFetching Brent crude oil prices...\n  Oil data: 3125 days loaded\n  Fuel trend: 649 weeks total (591 EIA [71 gap-fill] + 58 IATA from 2023-12-22)\nLoading ACSA data...\nLoading FlightAware capacity data...\n  Actuals cutoff: 2026-06-07 (scheduled MTD cap for 2026-06)\n  Schedule reliability: DB unavailable, prorating current month from xlsx\n  Schedule reliability: prorated 2026-06 scheduled by 9/30 days\n  Trimming 2 sparse months: ['2026-11', '2026-12']\n  Pre-computed route tables for 8 months, 4268 changes\n  FlightAware: 34 months, 315 routes in latest month\nLoading fleet data from Asana...\n  Fleet: 56 aircraft loaded from Asana\nProcessing complete. Building HTML...\nWARNING: cash_data.json unavailable ([Errno 2] No such file or directory: '/home/lucienne/workspace/dashboard-build/scripts/../data/cash_data.json'); Cash tab will show a placeholder.\nDashboard written to: /home/lucienne/workspace/dashboard-build/dashboard/Dashboard.html\nFile size: 3373 KB\nData JSON written to: /home/lucienne/workspace/dashboard-build/dashboard/dashboard_data.json (4804 KB)\nSummary MD written to: /home/lucienne/workspace/dashboard-build/dashboard/dashboard_summary.md\n\n  Dashboard.html generated (3,453,629 bytes)\nUpdated Dashboard.html on Drive (ID: 15EeKvzeI2ZErZ6IFV2jHH7wBvA7cSf29)\nCopied to /home/lucienne/workspace/PKA/dashboards/ceo-dashboard.html\n\nSuccess: CEO Dashboard built and uploaded\n","started_at":"2026-06-09T05:00:06.129739+02:00","status":"completed","task_id":"ceo-dashboard-build","task_name":"Build CEO Dashboard"},{"duration_s":102.735119,"finished_at":"2026-06-08T05:01:49.255593+02:00","id":392497,"log_path":"/home/lucienne/workspace/logs/task-runs/ceo-dashboard-build/392497.log","output":"nd not absorbing capacity growth\n\u2705 Revenue/flight up +24.8% YoY \u2014 quality growth\n\ud83d\udcca 2026-06 bookings: 428,032 pax (51% of PY final) | Rev R634M (65% of PY)\n\ud83d\udcca 2026-07 forward: 170,292 pax (20% of PY final)\n\u2705 Best yield: CPT-HLA (+51.0% YoY, LF 75%)\n\ud83d\ude80 Fastest growing: HRE-JNB (rev +118.8% YoY, 20,557 pax)\n\u26a0\ufe0f LF dropping on CPT-PLZ: -13.2pp YoY (now 81%, cap +27.5% YoY)\n\u2705 Jet fuel down 11.4% WoW ($142/mt)\n\u26fd Jet fuel: $142/mt | Crack: $41\n\ud83d\udcb1 ZAR stronger (-0.9% in 30d) \u2014 R16.27/$\n\u2705 ACSA market share (2026-04): 63.7% (+0.5pp MoM)\n\ud83d\udcc8 YTD (5m): Pax 4,301,263 (+1.2% vs PY) | Rev R5.88B (+8.5% vs PY)\n\n_Dashboard: http://100.118.207.3:3001/apps/ceo-dashboard_\n\nTelegram sent: True\n=== CEO Dashboard Build \u2014 2026-06-08 05:00 ===\nDownloading data files...\n  SummaryRoute.xlsx (7,239,722 bytes)\n  SummaryExcel.xlsx (5,974,292 bytes)\n  Data Fuel.xlsx (17,478 bytes)\n  ACSA Monthly Data.xlsx (76,043 bytes)\n  ACSA Website Data.xlsx (27,750 bytes)\n  fleet_asana.json (49,744 bytes)\n  202606 Booking Curve.csv (booking curve)\nDownloading FlightAware capacity reports...\n  Capacity_Scheduled_2026-06-01_to_2026-12-31.xlsx (138,831 bytes)\n  Capacity_Actuals_2024-01-01_to_2026-06-03.xlsx (581,941 bytes)\n  FA data ends 2026-06-03 (5 days old)\nDownloading Capacity schedule snapshots...\n  Capacity_Scheduled_snapshot_2026-06-01.xlsx (155,743 bytes)\n  Capacity_Scheduled_snapshot_2026-05-29.xlsx (155,797 bytes)\n  Capacity_Scheduled_snapshot_2026-05-21.xlsx (156,384 bytes)\n  Capacity_Scheduled_snapshot_2026-05-13.xlsx (156,384 bytes)\n  Capacity_Scheduled_snapshot_2026-05-05.xlsx (156,128 bytes)\nStaging build script from PKA repo: /home/lucienne/workspace/PKA/Projects/ceo-dashboard/scripts/build_html_dashboard.py\n  build_html_dashboard.py (325,515 bytes)\nRunning build script (Linux branch, BASE auto-detected)...\nLoading SummaryRoute.xlsx...\nLoading SummaryExcel.xlsx...\nData loaded. Processing...\nLoading forward bookings from Neon DB...\n  Neon: 620,678 booking snapshot rows loaded (departures 2026-04-01 to 2026-07-31)\n  Curve: 69 departure dates with real curves (flat-state filtered)\n  Curve shape: 65 DBA points from 68 completed departures\n  2026-04: 122 points, latest gap=-4.6pp, 19/26 routes behind curve, PY final LF=90.8%\n  2026-05: 122 points, latest gap=-9.8pp, 23/25 routes behind curve, PY final LF=91.6%\n  2026-06: 122 points, latest gap=-8.1pp, 20/25 routes behind curve, PY final LF=86.1%\n  2026-07: 122 points, latest gap=-2.6pp, 14/25 routes behind curve, PY final LF=91.7%\nLoading economic indicators...\n  EIA jet fuel: 648 weeks (2014-01-03 to 2026-05-29)\n  FX data: 1390 days loaded (Frankfurter)\nFetching Brent crude oil prices...\n  Oil data: 3125 days loaded\n  Fuel trend: 648 weeks total (591 EIA [71 gap-fill] + 57 IATA from 2023-12-22)\nLoading ACSA data...\nLoading FlightAware capacity data...\n  Actuals cutoff: 2026-06-03 (scheduled MTD cap for 2026-06)\n  Schedule reliability: DB unavailable, prorating current month from xlsx\n  Schedule reliability: prorated 2026-06 scheduled by 8/30 days\n  Trimming 2 sparse months: ['2026-11', '2026-12']\n  Pre-computed route tables for 8 months, 4231 changes\n  FlightAware: 34 months, 307 routes in latest month\nLoading fleet data from Asana...\n  Fleet: 56 aircraft loaded from Asana\nProcessing complete. Building HTML...\nWARNING: cash_data.json unavailable ([Errno 2] No such file or directory: '/home/lucienne/workspace/dashboard-build/scripts/../data/cash_data.json'); Cash tab will show a placeholder.\nDashboard written to: /home/lucienne/workspace/dashboard-build/dashboard/Dashboard.html\nFile size: 3349 KB\nData JSON written to: /home/lucienne/workspace/dashboard-build/dashboard/dashboard_data.json (4767 KB)\nSummary MD written to: /home/lucienne/workspace/dashboard-build/dashboard/dashboard_summary.md\n\n  Dashboard.html generated (3,429,117 bytes)\nUpdated Dashboard.html on Drive (ID: 15EeKvzeI2ZErZ6IFV2jHH7wBvA7cSf29)\nCopied to /home/lucienne/workspace/PKA/dashboards/ceo-dashboard.html\n\nSuccess: CEO Dashboard built and uploaded\n","started_at":"2026-06-08T05:00:06.518017+02:00","status":"completed","task_id":"ceo-dashboard-build","task_name":"Build CEO Dashboard"}],"runs_limit":20,"schedule":"0 5 * * 1-5","schedule_label":{"description":"Weekdays at 05:00","is_custom":false,"label":"Weekdays","sort":5,"sort_time":"05:00"},"stats":{"avg_duration":114.9390494,"completed":5,"failed":0,"timeout":0,"total":5},"task":{"_description":"**OVERRIDES runtime profile:** uses `direct_python` (plain Python, no model) because the command chain never invokes the `claude` CLI or any LLM API \u2014 pure-infra task; scheduler provider env injection is a no-op (MC-4942 U12 sweep).\n\nDaily CEO dashboard build. Downloads all data files from Google Drive,\nruns build_html_dashboard.py, uploads Dashboard.html back to Drive.\n\nRuns weekdays at 8:30am SAST (6:30 UTC) \u2014 after all data feeds are fresh:\n- SummaryRoute/Excel: synced from Dropbox via CloudHQ (~6:30am)\n- ACSA monthly: checked at 7:00am\n- Booking curve: pulled at 8:00am\n- ACSA website: updated Tue 8:00am\n- IATA fuel: updated Tue 8:10am  \n- Fleet: updated Tue 8:15am\n\n100% Python, zero AI cost. Downloads ~25MB of data, generates ~1.7MB HTML.\nAfter build, sends a Telegram briefing with critical analysis of the data.\n\nSource: All reporting data files on Google Drive\nTarget: Dashboard.html in Reporting Data folder (Google Drive)\nPost-build: scripts/ceo_briefing.py sends Telegram briefing","_file":"ceo-dashboard-build.md","_path":"/home/lucienne/workspace/tasks/ceo-dashboard-build.md","command":"cd /home/lucienne/workspace && /home/lucienne/workspace/.venvs/ceo-dashboard/bin/python scripts/ceo_dashboard_build.py","enabled":true,"id":"ceo-dashboard-build","notify_on":"always","retry":true,"run_as":"shell","runtime_profile":"direct_python","schedule":"0 5 * * 1-5","tags":["flysafair","dashboard","ceo","reporting"],"timeout":600,"title":"Build CEO Dashboard"}}
