diff --git a/.playwright-mcp/page-2026-08-26T22-41-55-734Z.yml b/.playwright-mcp/page-2026-08-26T22-41-55-734Z.yml
new file mode 100644
index 0000000..2baf449
--- /dev/null
+++ b/.playwright-mcp/page-2026-08-26T22-41-55-734Z.yml
@@ -0,0 +1 @@
+- button "Open Next.js Dev Tools" [ref=e10] [cursor=pointer]
\ No newline at end of file
diff --git a/docs/superpowers/specs/2026-08-28-fuel-attention-dismissal-design.md b/docs/superpowers/specs/2026-08-28-fuel-attention-dismissal-design.md
new file mode 100644
index 0000000..224cbed
--- /dev/null
+++ b/docs/superpowers/specs/2026-08-28-fuel-attention-dismissal-design.md
@@ -0,0 +1,375 @@
+# Fuel: dismiss false-positive "Attention required" alerts per vehicle
+
+## Context
+
+The "Attention required" panel on `/dashboard/fuel` lists every vehicle with at
+least one flagged fuel log (status `warn` or `alert`). The list is computed in
+`src/app/dashboard/fuel/page.tsx` from per-vehicle summaries and rendered by
+`src/app/dashboard/fuel/fuel-view.tsx` as `AlertCard` (mobile) and
+`AlertListRow` (desktop).
+
+Two known false-positive scenarios:
+
+1. **No start-date odo reading.** A vehicle's first imported fuel log has no
+ prior reading, so the variance computation has nothing to compare against.
+ The row lands in the alert list even though there's nothing genuinely wrong.
+2. **Same vehicle flagged repeatedly.** A single over-limit event generates
+ `N` rows of "alert" state (one per affected log). The vehicle is listed
+ once but the operator has to mentally aggregate that all those alerts trace
+ back to one event — and click through to the vehicle to verify that.
+
+Today there's no way to mark a vehicle as "seen" — every refresh re-surfaces
+the same false positives. This adds an explicit, per-vehicle "I've seen this"
+control with **auto-undismiss on new flags**: the dismissal sticks until a
+fresh flagged log with a `date_logged` strictly later than the dismissal
+arrives, at which point the vehicle pops back. Timestamp only — no reason
+field, no per-user attribution.
+
+## Changes
+
+### 1. PocketBase schema — add `attention_dismissed_at` to `vehicles`
+
+Add one optional date field `attention_dismissed_at` to the `vehicles`
+collection. Auto-undismiss is a pure server-side comparison against fuel log
+`date_logged`, so no other collections are touched.
+
+**New migration** `scripts/migrations/2026-08-28-vehicles-attention-dismissed.py`
+(modeled on `scripts/migrations/2026-08-24-fuel-logs-latest-consumption.py`):
+
+- Idempotent — re-runs are safe; existing fields are skipped.
+- Auths via `PB_ADMIN_EMAIL` / `PB_ADMIN_PASSWORD` env vars using the same
+ `urllib.request` shape as the existing migration.
+- PATCHes `/api/collections/vehicles` with the new field merged onto the
+ existing fields list.
+- Prints the final field list for the operator.
+- Single field:
+ ```python
+ NEW_FIELDS = {
+ "attention_dismissed_at": {
+ "name": "attention_dismissed_at",
+ "type": "date",
+ "required": False,
+ },
+ }
+ ```
+
+**`scripts/pb-bootstrap-schema.py`** — also add the field to the
+`DEFS["vehicles"]` field list (around line 174) so freshly bootstrapped
+environments get it. Keeps the two paths in sync.
+
+No index needed (date field, queried per-vehicle, not in bulk).
+
+### 2. Server mapper — extend `VehicleSummary`
+
+**`src/app/dashboard/fuel/page.tsx`** — for each vehicle, also compute:
+
+- `vMaxFlaggedDate`: max `date_logged` across that vehicle's `warn`/`alert`
+ rows, or `null` if none.
+- `attentionDismissedAt`: `v.attention_dismissed_at ?? null`, normalized to
+ ISO string (PB returns dates as ISO).
+
+Extend the `VehicleSummary` interface in `fuel-view.tsx`:
+
+```ts
+export interface VehicleSummary {
+ // ... existing fields ...
+ attentionDismissedAt: string | null;
+ maxFlaggedDate: string | null;
+}
+```
+
+`FuelView` filters `flaggedVehicles` instead:
+
+```ts
+const flaggedVehicles = React.useMemo(
+ () =>
+ vehicles
+ .filter((v) => {
+ if (v.flagged === 0) return false;
+ // Dismissed AND every flagged log is at-or-before the dismissal
+ // → we've already seen this state. Hide.
+ if (
+ v.attentionDismissedAt !== null &&
+ (v.maxFlaggedDate === null ||
+ v.maxFlaggedDate <= v.attentionDismissedAt)
+ ) {
+ return false;
+ }
+ return true;
+ })
+ .sort(/* unchanged: alert desc → warn desc → spend desc */),
+ [vehicles],
+);
+```
+
+Edge cases covered:
+
+- `v.flagged === 0` → already excluded before the dismissal check, so a
+ dismissed vehicle with no flagged logs doesn't appear at all.
+- `attentionDismissedAt` set but `maxFlaggedDate === null` → vehicle has
+ `vFlagged > 0` so at least one flagged log exists; `null <= ISO` evaluates
+ safely because the early branch handles `null` separately. Kept explicit
+ for clarity.
+- ISO date strings compare lexicographically the same way they compare as
+ dates (YYYY-MM-DD) — no `Date` parsing needed in the filter.
+- A freshly-imported flagged log with `date_logged > attentionDismissedAt`
+ will re-trigger inclusion on the next page load — that's the auto-undismiss.
+
+### 3. UI — "Dismiss" button on each alert row
+
+Both `AlertCard` (mobile, lines ~713–786 of `fuel-view.tsx`) and
+`AlertListRow` (desktop, lines ~788–846) currently render a `` wrapping
+the whole row. Click anywhere → navigates to the vehicle detail. We need a
+button that doesn't trigger navigation.
+
+**Pattern:** add a small `