From ec54942628d618ff937c068cc2c599680110fff9 Mon Sep 17 00:00:00 2001 From: Hongming Wang Date: Sun, 3 May 2026 17:26:15 -0700 Subject: [PATCH 1/2] canvas/BundleDropZone: theme-flip drag overlay + announce import + reduced-motion MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Three small UIUX fixes for the bundle drag-import surface. 1. Drag overlay was hardcoded blue-950/blue-400 — those tones don't exist in the warm-paper light theme, so the overlay washed out inconsistently. Switched to bg-accent/15 + border-accent/40 so the overlay flips with theme and matches the inner card's border-accent/50. 2. Importing spinner was visually obvious but invisible to screen readers — only the result toast had aria-live. Operators relying on AT had no way to know the import was in flight. Added role="status" + aria-live="polite" + aria-hidden on the spinner itself so the SR hears "Importing bundle..." once. 3. animate-spin → motion-safe:animate-spin so the spinner respects prefers-reduced-motion (Tailwind's built-in variant gates the animation on the user's OS setting). Layout doesn't change in either case — text alone communicates state. Also dropped border-sky-400 → border-accent on the spinner so it matches the rest of the canvas semantics. Co-Authored-By: Claude Opus 4.7 (1M context) --- canvas/src/components/BundleDropZone.tsx | 23 ++++++++++++++++++----- 1 file changed, 18 insertions(+), 5 deletions(-) diff --git a/canvas/src/components/BundleDropZone.tsx b/canvas/src/components/BundleDropZone.tsx index dd6bff81..52437db3 100644 --- a/canvas/src/components/BundleDropZone.tsx +++ b/canvas/src/components/BundleDropZone.tsx @@ -117,9 +117,11 @@ export function BundleDropZone() { 📦 Import bundle - {/* Visual overlay when dragging */} + {/* Visual overlay when dragging — was hardcoded blue-950/blue-400 + which doesn't flip with theme. accent colors stay visually + consistent with the rest of the canvas in both modes. */} {isDragging && ( -
+
Drop Bundle to Import
@@ -128,10 +130,21 @@ export function BundleDropZone() {
)} - {/* Importing spinner */} + {/* Importing indicator — role=status + aria-live so SR users hear + "Importing bundle..." while the API call is in flight, not just + the result toast that fires after. motion-safe:animate-spin + respects prefers-reduced-motion (Tailwind's motion-safe variant + gates animation on the user's OS setting). */} {importing && ( -
-
+
+ )} From a306a97dd3a4e50c3f2b4ce7ec52e358eb8796ee Mon Sep 17 00:00:00 2001 From: Hongming Wang Date: Sun, 3 May 2026 17:28:45 -0700 Subject: [PATCH 2/2] ci(synth-e2e): move cron off :00 to dodge GH scheduler drops MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit GitHub Actions scheduler de-prioritises :00 cron firings under load. Empirical 2026-05-03: the canary's cron was '0,20,40 * * * *' but actual firings landed at :08, :03, :01, :03 — :20 and :40 silently dropped. Detection latency degraded from claimed 20 min to actual ~60 min worst case. Move to '10,30,50 * * * *': - :10/:30/:50 sit 10 min off the top-of-hour load peak - Still 5 min from :15 sweep-cf-orphans and :45 sweep-cf-tunnels (the original constraint that kept us off :15/:45) - Same 20-min cadence; only the phase changes No code change beyond the cron expression + comment refresh. Co-Authored-By: Claude Opus 4.7 (1M context) --- .github/workflows/continuous-synth-e2e.yml | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/.github/workflows/continuous-synth-e2e.yml b/.github/workflows/continuous-synth-e2e.yml index 924684e8..ba9633a9 100644 --- a/.github/workflows/continuous-synth-e2e.yml +++ b/.github/workflows/continuous-synth-e2e.yml @@ -32,10 +32,20 @@ name: Continuous synthetic E2E (staging) on: schedule: - # Every 20 minutes, on the :00 :20 :40. Offsets the existing :15 - # sweep-cf-orphans and :45 sweep-cf-tunnels so the three - # operations don't all hit Cloudflare/AWS at the same minute. - - cron: '0,20,40 * * * *' + # Every 20 minutes, on :10 :30 :50. Two constraints: + # 1. Stay off the top-of-hour. GitHub Actions scheduler drops + # :00 firings under high load (own docs: + # https://docs.github.com/en/actions/using-workflows/events-that-trigger-workflows#schedule). + # Empirical 2026-05-03: cron was '0,20,40 * * * *' but actual + # firings landed at :08, :03, :01, :03 with :20 + :40 silently + # dropped — only the :00-region run survived. Detection + # latency degraded from claimed 20 min to actual ~60 min. + # :10/:30/:50 sit far enough from :00 that GH-load skips + # stop dropping us. + # 2. Avoid colliding with the existing :15 sweep-cf-orphans + # and :45 sweep-cf-tunnels — both hit the CF API and we + # don't want to fight for rate-limit tokens. + - cron: '10,30,50 * * * *' workflow_dispatch: inputs: runtime: