From 77cd39f25ce3c24c9ee76e1d35265c5c0a536ac3 Mon Sep 17 00:00:00 2001 From: Suprie Date: Wed, 5 Aug 2026 19:50:51 +0700 Subject: [PATCH] Toast showing [object object] since we print the object not the message --- .loopdeck/execution.yaml | 14 ++++++ .loopdeck/run-plan.yaml | 43 +++++++++++++++++++ .../selasar-revamp/prd-rebrand-tokens.md | 4 +- src/components/detail/EpicsPanel.tsx | 3 +- src/components/detail/LoopsPanel.tsx | 4 +- src/components/detail/MigrationCard.tsx | 7 +-- 6 files changed, 68 insertions(+), 7 deletions(-) create mode 100644 .loopdeck/execution.yaml create mode 100644 .loopdeck/run-plan.yaml diff --git a/.loopdeck/execution.yaml b/.loopdeck/execution.yaml new file mode 100644 index 0000000..9423456 --- /dev/null +++ b/.loopdeck/execution.yaml @@ -0,0 +1,14 @@ +schema_version: 1 +revision: 2 +queue: [] +history: +- id: selasar-revamp/visual-pass-in-light-dark-and-system-auto-against-every-existing + title: Visual pass in light, dark, and system-auto against every existing + origin: + epic: selasar-revamp + prd: prd-rebrand-tokens + phase: Phase 3 — Verification + outcome: completed + started_at: 2026-08-05T11:12:34.730540Z + completed_at: 2026-08-05T11:23:24.646485Z + attempt: 1 diff --git a/.loopdeck/run-plan.yaml b/.loopdeck/run-plan.yaml new file mode 100644 index 0000000..b9c0b2a --- /dev/null +++ b/.loopdeck/run-plan.yaml @@ -0,0 +1,43 @@ +id: run-e40096a5-5f97-4a58-a061-d188d566b577 +project: /Users/supriyantop/Workspace/others/loopdeck +created: 2026-08-05T10:56:59.735262Z +consent: + draft_pr_authorized: true +budgets: + per_phase_token_cap: 500000 + per_phase_wall_clock_secs: 5400 + total_run_wall_clock_secs: 28800 +environment: + worktree_kept: false +wall_clock_secs: 652 +stall_policy: continue_independent +phases: +- execution_id: selasar-revamp/visual-pass-in-light-dark-and-system-auto-against-every-existing + status: completed + interview: + - question: How should the system-auto theme mode be tested? In "auto", the app follows the real OS appearance via window.matchMedia, so verifying auto requires changing macOS's actual appearance setting — a system-wide side effect on your machine that may not restore if the run dies mid-way. + answer: Emulate, don't touch OS + - question: If the visual pass finds a contrast regression or visual defect, what should the run do? This loop is Phase 3 verification — it's unclear whether the agent should fix or just report when something fails. + answer: Fix and re-verify + - question: How should "no contrast regression" be judged with no human present? You can't eyeball the screenshots overnight, so the pass needs a defined verdict mechanism. + answer: Skip this, let me validate manually + - question: How deep should "every existing screen" go? Destructive/warning/focus states (delete-confirm dialogs, error banners, keyboard focus rings) only appear after driving the UI — the run must decide how much interaction to perform. + answer: skipp this as well, let human verify + interview_status: answered + depends_on: [] + park_payload: 'draft PR: https://github.com/suprie/loopdeck/pull/79' + token_usage: 205057 + wall_clock_secs: 324 +- execution_id: selasar-revamp/npx-tsc-noemit-clean-manual-smoke-confirming-selasar-appears-in + status: completed + interview: + - question: The acceptance criteria say 'manual smoke confirming "Selasar" appears in the window title bar,' but the run is unattended — no human present to do the manual part. What should the run do for the smoke step? + answer: Static check, defer eyeball + - question: If `npx tsc --noEmit` is not clean, or the "Selasar" title check fails, what should the run do? + answer: Fix and re-verify + interview_status: answered + depends_on: + - selasar-revamp/visual-pass-in-light-dark-and-system-auto-against-every-existing + park_payload: 'draft PR: https://github.com/suprie/loopdeck/pull/79' + token_usage: 205057 + wall_clock_secs: 324 diff --git a/docs/epics/selasar-revamp/prd-rebrand-tokens.md b/docs/epics/selasar-revamp/prd-rebrand-tokens.md index 93ea4f8..7221eb6 100644 --- a/docs/epics/selasar-revamp/prd-rebrand-tokens.md +++ b/docs/epics/selasar-revamp/prd-rebrand-tokens.md @@ -86,11 +86,11 @@ occurrence sites are Phase 1/Phase 2 outputs, not decided yet._ ### Phase 3 — Verification -- [ ] Visual pass in light, dark, and system-auto against every existing +- [ ] `selasar-revamp/visual-pass-in-light-dark-and-system-auto-against-every-existing` Visual pass in light, dark, and system-auto against every existing screen (Dashboard, ProjectDetail tabs, Settings, Activity, Loops, Decisions, Epics), confirming no contrast regression on destructive, warning, or focus states. -- [ ] `npx tsc --noEmit` clean; manual smoke confirming "Selasar" appears in +- [ ] `selasar-revamp/npx-tsc-noemit-clean-manual-smoke-confirming-selasar-appears-in` `npx tsc --noEmit` clean; manual smoke confirming "Selasar" appears in the window title bar. ## Open Questions diff --git a/src/components/detail/EpicsPanel.tsx b/src/components/detail/EpicsPanel.tsx index 942564c..b274b21 100644 --- a/src/components/detail/EpicsPanel.tsx +++ b/src/components/detail/EpicsPanel.tsx @@ -294,7 +294,8 @@ export function EpicsPanel({ projectPath }: EpicsPanelProps) { // refresh it so toggling doesn't leave a stale discrepancy warning. loadProgress(); } catch (err) { - toast.error("Failed to toggle", { description: String(err) }); + const appErr = err as AppError; + toast.error("Failed to toggle", { description: appErr.message ?? String(err) }); } finally { setToggling(null); } diff --git a/src/components/detail/LoopsPanel.tsx b/src/components/detail/LoopsPanel.tsx index 2e31372..85e38d5 100644 --- a/src/components/detail/LoopsPanel.tsx +++ b/src/components/detail/LoopsPanel.tsx @@ -16,6 +16,7 @@ import type { HistoryLoop, QueuedLoop, MigrationPreview, + AppError, } from "../../types"; import * as api from "../../lib/tauri"; import { LoadingSpinner } from "../shared/LoadingSpinner"; @@ -288,7 +289,8 @@ export function LoopsPanel({ projectPath }: LoopsPanelProps) { : prev, ); } catch (err) { - toast.error("Failed to toggle step", { description: String(err) }); + const appErr = err as AppError; + toast.error("Failed to toggle step", { description: appErr.message ?? String(err) }); } finally { setToggling(null); } diff --git a/src/components/detail/MigrationCard.tsx b/src/components/detail/MigrationCard.tsx index 340180d..6d095b6 100644 --- a/src/components/detail/MigrationCard.tsx +++ b/src/components/detail/MigrationCard.tsx @@ -3,10 +3,10 @@ import { ArrowRightLeft, AlertTriangle, ChevronDown, - Loader2, + Loader2, } from "lucide-react"; import { toast } from "sonner"; -import type { MigrationPreview } from "../../types"; +import type { MigrationPreview, AppError } from "../../types"; import * as api from "../../lib/tauri"; interface MigrationCardProps { @@ -49,7 +49,8 @@ export function MigrationCard({ }); onMigrated(); } catch (err) { - toast.error("Migration failed", { description: String(err) }); + const appErr = err as AppError; + toast.error("Migration failed", { description: appErr.message ?? String(err) }); } finally { setMigrating(false); setConfirming(false);