fix: resolve pre-release browser-QA issues#14
Conversation
…s/lows) Addresses the review bundle in ~/tripl-prerelease-review (29 issues). BLOCKER - B1: event-detail crash. Backend emitters (activity feed, search index, alert payloads) now produce the canonical /p/<slug>/monitoring/event/<id> instead of the crashing /events/detail/<id>; App.tsx redirects the legacy URL and MonitoringDetailPage defaults the scope to "event" defensively; the error boundary no longer renders raw internal error strings. HIGH - H1: counters reconciled. Sidebar "Monitors" badge no longer shows the signal count; Overview headline and notifications "N active" bind to the same active-signals selector as their panels; failed deliveries get their own badge. - H2: single plan-coverage formatter (lib/coverage.ts) — dashboard and Live activity now render 320/323 identically as "99.1%" (no round-up to 100%). - H3: scan failures sanitised. Backend stores a friendly message + logs the raw exception; frontend lib/scanError.ts maps any raw text to a safe message and keeps internals behind an owner-only expander. No host/port/ORM leaks. - H4: dead "Implementation"/"Watch" CTAs disabled with "Coming soon". - H5: "(preview only)" accent + Defaults controls now visibly disabled. - H6: scan run status shows a text+icon pill (Failed/Succeeded/Running) + retry. - H7: events / event-detail / event-types tables expose grid semantics. - H8: non-functional monitor row made visibly non-interactive. MEDIUM/LOW - M1 stale source-health labelling, M2 immutable event-type select, M3 subject template placeholder, M4 breadcrumbs + type-scoped heading, M5 palette vocabulary, M6 Variables/Relations in sidebar, M7 "open merge"->"ungated", M8 chart text alternatives, M9 stat label/value association, M10 stat units, L1 pluralization, L2 zero-vs-not-wired, L3 empty-metric hints, L4 colon names, L5 columns badge, L6 settings nav a11y label, L7 "Dev" sublabel, L8 placeholder. - L10 (moment.js warning): not our code — moment is absent from the bundle. Quality gates: tsc, eslint (zero-warnings), vitest 273/273, pytest 552/552.
Removes the last windy reference in shipped code (the project-slug prefix shown in project settings). The windy-ios / ch.windyapp.co / *@windyapp.co strings from the review are live DB records, not code.
From the v2 UX/design review (~/tripl-prerelease-review/v2). Bounded craft
items across 8 surfaces; the M/L "reshape a core surface" bets are deferred.
- H1 residual: dashboard no longer labels the recent-signal count "active"
(only Live activity/Monitors speak of active/open signals).
- UX-2/3: empty & zero cells muted (var(--fg-faint)); bare "—" carries a
"no data" tooltip and is told apart from a real 0 (events table, event detail).
- UX-5: event-detail "Coming soon" actions (Watch/Implementation) moved out of
the primary bar into a "…" overflow menu; Edit promoted to primary.
- UX-6: events drag handle now reveals on row hover/focus instead of always-on.
- UX-7: reconciliation "never" dead events calmed from red to amber + an
explanation line; bulk-archive affordance stub.
- UX-8: scan list leads with a human "name · source · cadence" summary; raw SQL
demoted to a faint secondary line + tooltip.
- UX-9: glitchy empty-segment event names ("spot::services", "0:forecast:0")
render an explicit muted placeholder instead of "::" or a bare "0".
- UX-17: failed/stale data sources get inline Re-test / Edit recovery actions.
- UX-18: dashboard Latest-scan panel shows the real last result (status + rows).
- UX-19/20: empty alerting channels pocketed into one "Add another channel" row;
added a signal→destination routing framing line.
- UX-21: ${…} template tokens in property values tinted as variables.
- UX-22: auth card title/subtitle reflect the active Sign in / Create Account tab.
- UX-23: project card leads with a single attention color; supporting chips calmed.
Gates: tsc, eslint (zero-warnings), vitest 294/294.
Closes the open backend follow-ups and the deferred feature bets.
- firing_monitor_count: new ProjectSummary field (= MonitorsSummary.firing_count);
sidebar "Monitors" badge now shows firing monitors in danger tone (H1 PRIMARY,
tripl-tksk).
- Error sanitization: shared worker/tasks/_errors.py; metrics-replay and
data-source test_connection now persist friendly messages, raw to logs
(tripl-xnu2; sync test-connection API path noted as remaining).
- Alert-delivery retry: POST /alert-deliveries/{id}/retry + retry buttons on the
delivery rows and notifications (tripl-yhia).
- Monitor drill-in (UX-12 / H8 / tripl-ox4b): new MonitorDetailPage (condition,
fired-history timeline, routing, recency, mute/unmute via new muted_until
column + endpoints); monitor rows now navigate (keyboard-accessible).
- Reconciliation dead-events archive (UX-16 backend + bulk UI) + constant-match
layout; api/reconciliation.archiveDeadEvents.
- Regenerated backend/openapi.json + frontend api.gen.ts for the new surface.
Gates: backend pytest 565 (incl. OpenAPI contract), tsc, eslint, vitest 311/311.
…mns (UX-14) - UX-10: merged the dashboard's three stacked stat tiers into one row (no metric shown twice); state metrics vs action-needed cards visually separated via an AttentionStat; create-actions moved into the header. - UX-14: lean default Events column set for fresh users (long tail one click away in the Columns editor; persisted prefs respected); toolbar grouped into primary/secondary/utility tiers; "Ask AI" surfaced as a differentiator. Gates: tsc, eslint, vitest 315/315.
…ing (UX-15)
- UX-11/25: when exactly one project exists, "/" redirects straight into it
(/p/<slug>/overview); 0 or 2+ projects show the workspace dashboard. The
portfolio view stays reachable at a new /workspace route (non-destructive).
- UX-15: instead of a risky merge, the two settings surfaces are now explicitly
signposted ("Project operations" vs "Workspace & account configuration") with
cross-links both ways and consistent group labels + descriptors.
Gates: tsc, eslint, vitest 321/321.
New lib/statusLexicon.ts is the single source for {label, tone} per status
family (event lifecycle, monitor, scan-run, signal, review, data-source health,
alert delivery, coverage) with a documented colour-meaning key. Surfaces now
resolve status colour/word through it.
Concrete inconsistencies fixed:
- DataSourcesPage: failed source amber → red (matches Overview + its own banner);
"unverified" → "untested".
- ReconciliationPage: good (≥90%) coverage heatmap brand-blue → green (a calm
"done" metric no longer competes with real alerts in brand colour).
- Monitor STATUS_TONE/LABEL de-duplicated across MonitorsPage / MonitorDetailPage
/ RoutingRulesPanel; delivery + scan-run + event-row signal tones routed
through the lexicon.
No new hex/CSS vars; existing var(--*) tokens only. Cohesive visual language
preserved (direction cues + timing windows left as-is).
Gates: tsc, eslint, vitest 336/336.
… (UX-26) - UX-24: new onboarding-checklist on the project Overview — the 5 core-loop steps (define plan → connect source → run scan → review reconciliation → set up alerting) with auto-derived completion from project state, deep links, a "N of 5" progress chip; dismissible (localStorage) and self-hides when complete. - UX-26: new ConceptsPage at /p/:slug/concepts — a Plan→Observe→Govern concept map + grouped glossary of the core terms (taught, not renamed), each linking to its home; reachable from a new sidebar "Concepts" entry. Gates: tsc, eslint, vitest 346/346.
…ipl-xnu2) The synchronous test-connection probe (datasource_service._run_adapter_test) returned raw str(exc) into DataSourceTestResponse.message and DataSource.last_test_message, leaking host/port/driver/credential internals. Now it logs the full exception and returns a friendly, category-based message (timeout / unreachable / auth / generic). Closes the last sanitization gap. Test: TestConnectionErrorSanitization asserts no host/port/errno/username leaks.
Additive responsive utilities at sm/md breakpoints; desktop (lg+) unchanged. - MonitorsPage: fixed-grid table wrapped in overflow-x-auto + min-w floor so it scrolls horizontally on narrow screens (inert at lg). - MonitoringDetailPage: fields table overflow-x-auto; page padding p-4 sm:p-6. Most surfaces were already responsive (verified). First pass — needs device QA.
…nput CI's jsdom build omits localStorage, so onboarding-checklist.test's localStorage.clear() threw and aborted Testing Library's cleanup, leaking renders into later tests (red pipeline). test-setup.ts now installs an in-memory Storage unconditionally so every test file behaves identically. Also removed the unsupported python-version-file input from setup-uv (warning).
…uff E501) Hoist the hint tuples to module constants and wrap the long message so the file passes ruff's 100-col limit (the CI ruff gate).
checkout v4->v7, setup-node v4->v6, pnpm/action-setup v4->v6, setup-uv v3->v8 — all current majors run on Node 24, clearing the deprecation warnings. pnpm/action-setup now reads the version from frontend/package.json "packageManager" (pnpm@11.6.0) instead of a conflicting version: input.
astral-sh/setup-uv publishes full-version tags for v7/v8 (no floating major), so @v8 failed to resolve. Pin the latest full version; still on Node 24.
…ipl-7zz2)
P0 regression: the all-projects/workspace portfolio (which holds New /
Generate-demo project) was unreachable — the sidebar logos and "View all
projects" pointed at "/", which HomeRoute bounces into the sole project.
- Repoint both sidebar logos + "View all projects" to /workspace
- Add /projects -> /workspace redirect and a catch-all *->NotFoundPage
(unknown routes rendered a blank black page)
- SettingsArea back fallback "/" -> /workspace
UX polish:
- UX-9: shared <EventName> renders empty name segments as a muted marker
in both Events list and Reconciliation (kills literal "0:forecast_for_4:0")
- UX-21: tint ${...} template tokens in the expanded JSON field value
- UX-14: "Dynamics" chart defaults open; leaner default Events columns
- UX-4: coached empty states on event detail ("No metrics data available",
"No recent changes") instead of bare dashes
- UX-16: empty reconciliation inbox sizes to content, no half-screen dead space
- Auth: align CTA + accents from blue (sky) to product teal
Gates: tsc clean, eslint 0 warnings, vitest 349/349.
|
Analysis CompleteGenerated ECC bundle from 16 commits | Confidence: 75% View Pull Request #15Repository Profile
Changed Files (123)
Top hotspots
Top directories
Analysis Depth Readiness (evidence-backed, 71%)ECC Tools uses this to decide whether recommendations should stay at commit-history/setup guidance or expand into CI, security, harness, reference-set, AI-routing, and team backlog work.
Reference Set Readiness (2/7, 29%)
Likely Future Issues (10)
Suggested Follow-up Work (10)
Copy-ready bodies test: add integration coverage for backend/src/tripl/api/v1/alerting.py + backend/src/tripl/api/v1/reconciliation.py ## Summary
- Add integration or end-to-end coverage for the recently changed API surface.
## Why
- Backfill integration or end-to-end coverage for the changed API surface before more contract changes land.
## Touched paths
- `backend/src/tripl/api/v1/alerting.py`
- `backend/src/tripl/api/v1/reconciliation.py`
## Validation
- Add or extend integration / e2e coverage for the changed API, route, or contract surface.
- Exercise the touched endpoints or route handlers against realistic request / response flows.db: add migration follow-up for backend/src/tripl/models/alert_rule.py ## Summary
- Add the missing migration or schema rollout step for the recently changed schema surface.
## Why
- Backfill the missing migration artifact before another schema or model change lands on top.
## Touched paths
- `backend/src/tripl/models/alert_rule.py`
## Validation
- Create the migration or schema rollout artifact used by this repo.
- Run the repo migration / schema validation flow and verify the changed models still match production expectations.chore: sync config templates for .claude/settings.json ## Summary
- Update the example env files, sample configs, or deployment templates that should mirror the changed runtime configuration surface.
## Why
- Backfill example env files or config templates before a fresh setup drifts from the shipped runtime surface.
## Touched paths
- `.claude/settings.json`
## Validation
- Update the repo example env file or config template that should reflect the new runtime settings.
- Run the setup, boot, or deployment validation flow that depends on the changed config surface.test: add async coverage for backend/src/tripl/worker/tasks/_errors.py + backend/src/tripl/worker/tasks/metrics/tasks.py ## Summary
- Add async reliability coverage for the recently changed queue, worker, cron, or webhook surface.
## Why
- Backfill async reliability coverage before another queue, worker, or webhook change lands on the touched surface.
## Touched paths
- `backend/src/tripl/worker/tasks/_errors.py`
- `backend/src/tripl/worker/tasks/metrics/tasks.py`
## Validation
- Add or extend integration / e2e coverage for the changed queue, worker, cron, or webhook behavior.
- Exercise retries, idempotency, failure handling, or equivalent async boundary cases.test: add browser coverage for frontend/src/App.test.tsx + frontend/src/App.tsx ## Summary
- Add browser or end-to-end coverage for the recently changed user-facing surface.
## Why
- Backfill browser coverage before another user-facing UI change lands on the touched surface.
## Touched paths
- `frontend/src/App.test.tsx`
- `frontend/src/App.tsx`
## Validation
- Add or extend browser / e2e coverage for the changed component, page, or flow.
- Exercise the visible user journey that depends on the touched UI surface.test: add budget evidence for CLAUDE.md ## Summary
- Add budget or usage-limit validation for the recently changed AI routing or model-call surface.
## Why
- Backfill cost, token, or usage-limit validation before another model-routing change lands on the touched surface.
## Touched paths
- `CLAUDE.md`
## Validation
- Add or extend budget, token, usage-limit, or model-routing regression coverage for the changed path.
- Verify the route still enforces plan limits, retry caps, fallback behavior, or explicit cost controls.analysis: add reference-set evidence for .claude/settings.json ## Summary
- Add reference-set or eval evidence for the recently changed AI, analyzer, skill, agent, command, or harness guidance surface.
## Why
- Backfill eval, golden trace, benchmark, or reference-set evidence before another AI or harness-analysis change lands on the touched surface.
## Touched paths
- `.claude/settings.json`
## Validation
- Add or update an eval, golden trace, benchmark, fixture, or reference-set artifact for the changed AI/harness behavior.
- Compare the changed behavior against the maintained reference set and record the pass/fail evidence.
- Confirm the follow-up evidence covers the same analyzer, skill, agent, command, or harness surface touched by this PR.ci: add failure-mode evidence for .github/workflows/ci.yml ## Summary
- Add CI failure-mode evidence for the recently changed workflow or test-runner surface.
## Why
- Backfill CI failure-mode evidence before another workflow or test-runner change lands on the touched surface.
## Touched paths
- `.github/workflows/ci.yml`
## Validation
- Add or update a CI failure fixture, captured failing log, troubleshooting note, workflow dry-run evidence, or regression test for the changed CI/test-runner behavior.
- Run the affected workflow or test-runner entrypoint locally or in CI and record pass/fail evidence.harness: add config quality evidence for .claude/settings.json ## Summary
- Add harness compatibility evidence for the recently changed config surface.
## Why
- Backfill harness audit, adapter matrix, or cross-harness compatibility evidence before another config change lands on the touched surface.
## Touched paths
- `.claude/settings.json`
## Validation
- Run or update the harness audit, adapter compliance matrix, or cross-harness compatibility check for the changed config.
- Add or update a regression, fixture, or doc evidence path that covers the affected harness, MCP, plugin, or agent loading behavior.chore: refresh lockfile and validate CI after dependency updates ## Summary
- Refresh the lockfile and rerun CI after the dependency or workflow changes in this PR.
## Why
- Package or workflow changes without a lockfile refresh tend to turn into noisy follow-up fixes after merge.
## Touched paths
- `.github/workflows/ci.yml`
## Validation
- Refresh the lockfile in the same package manager used by the repo.
- Run the repo typecheck / test / CI entrypoints that depend on the updated package graph.Detected Workflows (5)
Generated Instincts (32)
After merging, import with: Files
|
Live-app walkthrough findings — consistency, copy, empty-states: - #2 Reconciliation: rename "data-match coverage" → "seen in data" so it no longer collides with the Overview/Portfolio plan "Coverage" - #3 Overview: H1 "Overview" → "Live activity" to match nav + breadcrumb - #4 Alerting: zero-state shows channel buttons inline under the empty state; "Add another channel" → "Add a channel" when no channels exist - #5 Dynamics chart: compact one-line empty state instead of a tall empty block when there's no recent data (chart now defaults open) - #6 Event types: clarify "gated"/"ungated" via consistent hover tooltips - #9 Hide all-empty columns: Sensitive/Owner on the event-types table and Sensitivity on the event-detail Fields table - #10 Reconciliation: align dead-events window to 14d (was 30d) - #12 Overview: clearer "Active trend · 14d" sparkline + a11y label - #13 Onboarding checklist collapses to a slim bar once mostly done #1 (stale demo data / contradictory 24h labels) was a data-freshness artifact — the generator is rolling/correct; resolved by re-seeding the demo project. #8 (pluralization) was already implemented. Verified live in-browser against a freshly re-seeded demo. Gates: tsc clean, eslint 0 warnings, vitest 351/351.
…ne (tripl-re3c) - #11a Monitors: centered guidance empty state (icon + copy + "Alerting settings" CTA) filling the void; muted all-zero stat tiles - #11b Alerting: pull the "No alert destinations" empty state up under its heading (py-16 → py-8) so heading + message + channel buttons read as one - #11c Reconciliation: give empty Shadow/Dead panels min-height with centered content so the page isn't top-heavy - #12 Overview: align the "Active trend · 14d" sparkline cell with the stat columns + right padding so it no longer bleeds into the card edge Layout/CSS only. Verified live in-browser on the re-seeded demo. Gates: tsc clean, eslint 0 warnings, vitest passes in isolation (full-suite failures are pre-existing concurrency flakiness, all touched files green alone).
Addresses the review bundle in ~/tripl-prerelease-review (29 issues).
BLOCKER
HIGH
MEDIUM/LOW
Quality gates: tsc, eslint (zero-warnings), vitest 273/273, pytest 552/552.