{"definition_raw":"---\nid: canary-board-regression\ntitle: MC board execution regression (Canary)\nschedule: \"30 3 * * *\"\ntimeout: 360\nretry: false\nself_heal: false\nenabled: true\nnotify_on: failure\nrun_as: shell\ncommand: python3 /home/lucienne/workspace/mission-control/tests/canary/run_board_battery.py\ntags: [infrastructure, mc, monitoring, ui]\nruntime_profile: direct_mixed\n---\n\n**OVERRIDES runtime profile:** uses `direct_mixed` (node Canary CLI + python\n`mc_ticket.py`) because the task runs a browser-driven QA battery, not the `claude`\nCLI \u2014 no AI model/provider is invoked, so the wrapper would inject the wrong env.\n\nDaily **execution** regression for the Mission Control board v2 UI. Runs the Canary\nbattery (`tests/canary/run_board_battery.py`) which drives every interactive board\ncontrol in a real headless browser and asserts the OUTCOME (request fired /\nnavigation / state change), not just that it renders.\n\n## Why this exists\n\nRendering / Tessa passes check \"does it show?\" and miss dead-control regressions.\nOn 2026-06-08 `htmx.trigger(el,'load')` (a no-op in htmx 2.x after initial load)\nsilently broke board search, every filter, sort, the mine pill, SSE live-refresh,\nquick-actions, and new-ticket-create \u2014 all firing zero requests with no console\nerror, invisible to rendering tests. This gate exercises the controls so that\nclass of bug fails CI instead of reaching Elmar.\n\n## What it catches\n\n- Any board control wired to fire a request that silently stops (filters, search,\n  sort, mine pill, quick-actions, SSE/new-ticket refresh).\n- Console / page JS errors on the board or a ticket page.\n- Horizontal-overflow / broken layout at desktop (1440) or mobile (375).\n- Ticket-page disclosure / composer / back-nav breaking.\n\n## Overhead\n\nOne run \u2248 60\u201390s: creates one `[CANARY-TEST]` fixture (assigned elmar, project=test),\nspins a headless Chromium via the Canary daemon, runs ~12 checks, cleans up the\nfixture. `self_heal: false` keeps deterministic canary failures visible instead\nof spending the scheduler timeout on automated repair attempts. `notify_on: failure`\n\u2192 Telegram only when a control is dead. Exit non-zero on any failed check or console\nerror.\n\n## Logs\n\n- Scheduler log (human stdout): per-check PASS/FAIL table + `BATTERY pass=/fail=`.\n- Battery source: `mission-control/tests/canary/board_battery.js` (add a check when\n  you add a new board control).\n","id":"canary-board-regression","last_run":{"duration_s":39.242293,"log_path":"/home/lucienne/workspace/logs/task-runs/canary-board-regression/413392.log","output":"PROGRESS: creating canary fixture attempt 1/4\nPROGRESS: created canary fixture MC-5055\nPROGRESS: starting Canary browser session\nPROGRESS: running board battery in Canary session board-regression-mqbohe8b-8fac76\nPROGRESS: ending Canary session board-regression-mqbohe8b-8fac76\nCONSOLE_ERRS []\nBAD_RESP []\n  [PASS] search-filters                  13/52 req=q=Kapama\n  [PASS] sort-reorders                   reordered req=sort=priority\n  [PASS] project-filter                  44/52 req=project=Life\n  [PASS] mine-pill                       toggled+fetched\n  [PASS] legend-open-close               open+close\n  [PASS] new-ticket-modal-opens          opened\n  [PASS] view-all-done                   clicked\n  [PASS] quick-action-fires              posted+refetched (2)\n  [PASS] no-horizontal-overflow-desktop  no overflow\n  [PASS] mobile-switcher                 switch+no-overflow\n  [PASS] mobile-vertical-scroll          scrollY=500 max=1440\n  [PASS] ticket-page                     disclosure+composer+back\n  [PASS] light-theme-renders             light ok\nBATTERY pass=13 fail=0 consoleErrors=0\n","started_at":"2026-06-13T03:30:00.539016+02:00","status":"completed"},"next_run":"2026-06-14 03:30","next_run_iso":"2026-06-14T03:30:00+02:00","runs":[{"duration_s":39.242293,"finished_at":"2026-06-13T03:30:39.786833+02:00","id":413392,"log_path":"/home/lucienne/workspace/logs/task-runs/canary-board-regression/413392.log","output":"PROGRESS: creating canary fixture attempt 1/4\nPROGRESS: created canary fixture MC-5055\nPROGRESS: starting Canary browser session\nPROGRESS: running board battery in Canary session board-regression-mqbohe8b-8fac76\nPROGRESS: ending Canary session board-regression-mqbohe8b-8fac76\nCONSOLE_ERRS []\nBAD_RESP []\n  [PASS] search-filters                  13/52 req=q=Kapama\n  [PASS] sort-reorders                   reordered req=sort=priority\n  [PASS] project-filter                  44/52 req=project=Life\n  [PASS] mine-pill                       toggled+fetched\n  [PASS] legend-open-close               open+close\n  [PASS] new-ticket-modal-opens          opened\n  [PASS] view-all-done                   clicked\n  [PASS] quick-action-fires              posted+refetched (2)\n  [PASS] no-horizontal-overflow-desktop  no overflow\n  [PASS] mobile-switcher                 switch+no-overflow\n  [PASS] mobile-vertical-scroll          scrollY=500 max=1440\n  [PASS] ticket-page                     disclosure+composer+back\n  [PASS] light-theme-renders             light ok\nBATTERY pass=13 fail=0 consoleErrors=0\n","started_at":"2026-06-13T03:30:00.539016+02:00","status":"completed","task_id":"canary-board-regression","task_name":"MC board execution regression (Canary)"},{"duration_s":38.065138,"finished_at":"2026-06-12T03:30:38.705263+02:00","id":409226,"log_path":"/home/lucienne/workspace/logs/task-runs/canary-board-regression/409226.log","output":"PROGRESS: creating canary fixture attempt 1/4\nPROGRESS: created canary fixture MC-5008\nPROGRESS: starting Canary browser session\nPROGRESS: running board battery in Canary session board-regression-mqa91jk6-4f0f8a\nPROGRESS: ending Canary session board-regression-mqa91jk6-4f0f8a\nCONSOLE_ERRS []\nBAD_RESP []\n  [PASS] search-filters                  13/41 req=q=Kapama\n  [PASS] sort-reorders                   reordered req=sort=priority\n  [PASS] project-filter                  31/41 req=project=Life\n  [PASS] mine-pill                       toggled+fetched\n  [PASS] legend-open-close               open+close\n  [PASS] new-ticket-modal-opens          opened\n  [PASS] view-all-done                   clicked\n  [PASS] quick-action-fires              posted+refetched (2)\n  [PASS] no-horizontal-overflow-desktop  no overflow\n  [PASS] mobile-switcher                 switch+no-overflow\n  [PASS] mobile-vertical-scroll          scrollY=500 max=1105\n  [PASS] ticket-page                     disclosure+composer+back\n  [PASS] light-theme-renders             light ok\nBATTERY pass=13 fail=0 consoleErrors=0\n","started_at":"2026-06-12T03:30:00.582516+02:00","status":"completed","task_id":"canary-board-regression","task_name":"MC board execution regression (Canary)"},{"duration_s":38.756886,"finished_at":"2026-06-11T03:30:39.333428+02:00","id":404863,"log_path":"/home/lucienne/workspace/logs/task-runs/canary-board-regression/404863.log","output":"PROGRESS: creating canary fixture attempt 1/4\nPROGRESS: created canary fixture MC-4943\nPROGRESS: starting Canary browser session\nPROGRESS: running board battery in Canary session board-regression-mq8tlpd8-5f9f8b\nPROGRESS: ending Canary session board-regression-mq8tlpd8-5f9f8b\nCONSOLE_ERRS []\nBAD_RESP []\n  [PASS] search-filters                  11/38 req=q=Kapama\n  [PASS] sort-reorders                   reordered req=sort=priority\n  [PASS] project-filter                  33/38 req=project=Life\n  [PASS] mine-pill                       toggled+fetched\n  [PASS] legend-open-close               open+close\n  [PASS] new-ticket-modal-opens          opened\n  [PASS] view-all-done                   clicked\n  [PASS] quick-action-fires              posted+refetched (2)\n  [PASS] no-horizontal-overflow-desktop  no overflow\n  [PASS] mobile-switcher                 switch+no-overflow\n  [PASS] mobile-vertical-scroll          scrollY=500 max=1380\n  [PASS] ticket-page                     disclosure+composer+back\n  [PASS] light-theme-renders             light ok\nBATTERY pass=13 fail=0 consoleErrors=0\n","started_at":"2026-06-11T03:30:00.572469+02:00","status":"completed","task_id":"canary-board-regression","task_name":"MC board execution regression (Canary)"},{"duration_s":38.742148,"finished_at":"2026-06-10T03:30:39.362915+02:00","id":400587,"log_path":"/home/lucienne/workspace/logs/task-runs/canary-board-regression/400587.log","output":"self_heal disabled. Error: PROGRESS: creating canary fixture attempt 1/4\nPROGRESS: created canary fixture MC-4903\nPROGRESS: starting Canary browser session\nPROGRESS: running board battery in Canary session board-regression-mq7e5ud1-ea11a9\nPROGRESS: ending Canary session board-regression-mq7e5ud1-ea11a9\nCONSOLE_ERRS []\nBAD_RESP []\n  [PASS] search-filters                  9/20 req=q=Kapama\n  [PASS] sort-reorders                   reordered req=sort=priority\n  [PASS] project-filter                  14/20 req=project=Life\n  [PASS] mine-pill                       toggled+fetched\n  [PASS] legend-open-close               open+close\n  [PASS] new-ticket-modal-opens          opened\n  [PASS] view-all-done                   clicked\n  [FAIL] quick-action-fires              quick-action did not POST+refetch: [\"POST 200\"]\n  [PASS] no-horizontal-overflow-desktop  no overflow\n  [PASS] mobile-switcher                 switch+no-overflow\n  [FAIL] mobile-vertical-scroll          mobile board is not vertically scrollable: maxScroll=0","started_at":"2026-06-10T03:30:00.601249+02:00","status":"failed","task_id":"canary-board-regression","task_name":"MC board execution regression (Canary)"},{"duration_s":34.837262,"finished_at":"2026-06-09T03:30:35.353690+02:00","id":396351,"log_path":"/home/lucienne/workspace/logs/task-runs/canary-board-regression/396351.log","output":"PROGRESS: creating canary fixture attempt 1/4\nPROGRESS: created canary fixture MC-4855\nPROGRESS: starting Canary browser session\nPROGRESS: running board battery in Canary session board-regression-mq5ypzdk-9c648f\nPROGRESS: ending Canary session board-regression-mq5ypzdk-9c648f\nCONSOLE_ERRS []\nBAD_RESP []\n  [PASS] search-filters                  9/49 req=q=Kapama\n  [PASS] sort-reorders                   reordered req=sort=priority\n  [PASS] project-filter                  41/49 req=project=Life\n  [PASS] mine-pill                       toggled+fetched\n  [PASS] legend-open-close               open+close\n  [PASS] new-ticket-modal-opens          opened\n  [PASS] view-all-done                   clicked\n  [PASS] quick-action-fires              posted+refetched (2)\n  [PASS] no-horizontal-overflow-desktop  no overflow\n  [PASS] mobile-switcher                 switch+no-overflow\n  [PASS] ticket-page                     disclosure+composer+back\n  [PASS] light-theme-renders             light ok\nBATTERY pass=12 fail=0 consoleErrors=0\n","started_at":"2026-06-09T03:30:00.409939+02:00","status":"completed","task_id":"canary-board-regression","task_name":"MC board execution regression (Canary)"},{"duration_s":360.025634,"finished_at":"2026-06-08T23:20:05.608289+02:00","id":395618,"log_path":"/home/lucienne/workspace/logs/task-runs/canary-board-regression/395618.log","output":"Killed after 360s\n--- partial stdout (last 0 chars) ---\n\n--- partial stderr (last 0 chars) ---\n","started_at":"2026-06-08T23:14:05.578564+02:00","status":"timeout","task_id":"canary-board-regression","task_name":"MC board execution regression (Canary)"}],"runs_limit":20,"schedule":"30 3 * * *","schedule_label":{"description":"Daily at 03:30","is_custom":false,"label":"Daily","sort":4,"sort_time":"03:30"},"stats":{"avg_duration":91.61156016666666,"completed":4,"failed":1,"timeout":1,"total":6},"task":{"_description":"**OVERRIDES runtime profile:** uses `direct_mixed` (node Canary CLI + python\n`mc_ticket.py`) because the task runs a browser-driven QA battery, not the `claude`\nCLI \u2014 no AI model/provider is invoked, so the wrapper would inject the wrong env.\n\nDaily **execution** regression for the Mission Control board v2 UI. Runs the Canary\nbattery (`tests/canary/run_board_battery.py`) which drives every interactive board\ncontrol in a real headless browser and asserts the OUTCOME (request fired /\nnavigation / state change), not just that it renders.\n\n## Why this exists\n\nRendering / Tessa passes check \"does it show?\" and miss dead-control regressions.\nOn 2026-06-08 `htmx.trigger(el,'load')` (a no-op in htmx 2.x after initial load)\nsilently broke board search, every filter, sort, the mine pill, SSE live-refresh,\nquick-actions, and new-ticket-create \u2014 all firing zero requests with no console\nerror, invisible to rendering tests. This gate exercises the controls so that\nclass of bug fails CI instead of reaching Elmar.\n\n## What it catches\n\n- Any board control wired to fire a request that silently stops (filters, search,\n  sort, mine pill, quick-actions, SSE/new-ticket refresh).\n- Console / page JS errors on the board or a ticket page.\n- Horizontal-overflow / broken layout at desktop (1440) or mobile (375).\n- Ticket-page disclosure / composer / back-nav breaking.\n\n## Overhead\n\nOne run \u2248 60\u201390s: creates one `[CANARY-TEST]` fixture (assigned elmar, project=test),\nspins a headless Chromium via the Canary daemon, runs ~12 checks, cleans up the\nfixture. `self_heal: false` keeps deterministic canary failures visible instead\nof spending the scheduler timeout on automated repair attempts. `notify_on: failure`\n\u2192 Telegram only when a control is dead. Exit non-zero on any failed check or console\nerror.\n\n## Logs\n\n- Scheduler log (human stdout): per-check PASS/FAIL table + `BATTERY pass=/fail=`.\n- Battery source: `mission-control/tests/canary/board_battery.js` (add a check when\n  you add a new board control).","_file":"canary-board-regression.md","_path":"/home/lucienne/workspace/tasks/canary-board-regression.md","command":"python3 /home/lucienne/workspace/mission-control/tests/canary/run_board_battery.py","enabled":true,"id":"canary-board-regression","notify_on":"failure","retry":false,"run_as":"shell","runtime_profile":"direct_mixed","schedule":"30 3 * * *","self_heal":false,"tags":["infrastructure","mc","monitoring","ui"],"timeout":360,"title":"MC board execution regression (Canary)"}}
