Skip to content

feat(leadership): Test Intelligence Platform — multi-tenant dashboard with docs, screenshots, and Windows test fixes - #10

Merged
evoveotech merged 14 commits into
mainfrom
feat/leadership-dashboard
Aug 9, 2026
Merged

feat(leadership): Test Intelligence Platform — multi-tenant dashboard with docs, screenshots, and Windows test fixes#10
evoveotech merged 14 commits into
mainfrom
feat/leadership-dashboard

Conversation

@evoveotech

Copy link
Copy Markdown
Owner

Summary

This PR delivers the Test Intelligence Platform — a multi-tenant leadership dashboard that aggregates test runs across the entire enterprise (multiple clients, products, teams, and technology stacks) into one view. It answers the question every VP of Engineering asks: "How healthy is our test estate?"

Leadership Dashboard

  • Estate Overview: KPI cards (pass rate, flaky rate, total runs), trend chart, distribution heatmaps by client/product/team/stack
  • Team Contribution: tests authored (GitHub/GitLab) + fixes landed (Jira/Linear) per team, with worst-run and flaky-test drill-down
  • Recent Runs: run list with client, product, team, stack, pass rate, duration — click to drill down to the single-run HTML report
  • Period Comparison: current period vs previous period — are things getting better or worse?
  • Sync Health: CI pipeline connector status — is the dashboard data complete and current?
  • Settings: cloud storage (OneDrive/Google Drive), alert thresholds, connector config

Cloud-Drive Storage (No Docker, No Postgres)

  • Director connects their M365 OneDrive or Google Workspace Drive via Settings → OAuth
  • Data stored as JSONL in the director's cloud drive folder
  • Director shares the folder with the team via native M365/Google sharing
  • Team members connect to the same shared folder with their own credentials
  • The cloud drive IS the shared database — every enterprise already has M365 or Google Workspace

Auth Modes

Mode Use Case
Dev Local development (login form, trusts headers)
OIDC Enterprise SSO (Keycloak, Okta, Google, Azure AD) — native OIDC flow
SAML SAML via gateway delegation (mod_auth_mellon, Shibboleth) — documented honestly

Pipeline Sources (ADR-009)

  • GitHub Actions source: fetches test artifacts from public CI runs
  • Azure DevOps source: fetches test artifacts from Azure Pipelines
  • Classification engine: auto-classifies runs by client/product/team/stack
  • Sync orchestrator: schedules and tracks sync state
  • Real CI test data from 35+ public repos included as demo data

Connectors

  • GitHub/GitLab: testsAuthored (commits touching test files)
  • Jira/Linear: fixesLanded (resolved issues assigned to team members)
  • Integration tests skip-gated on GITHUB_TOKEN/JIRA_API_TOKEN env vars

Benchmark (10k scale)

Backend Ingest Rollup Viable?
FileStore (local disk) 1.5s 16ms Yes
Cloud-drive per-insert (50ms latency) 615s projected No
Cloud-drive batched (flush every 100) 7.8s 132ms Yes

LatencySimulatingStore enables cloud-drive benchmarking without OAuth credentials.

Documentation

  • New: docs/leadership-dashboard-guide.md (509 lines) — comprehensive user guide with screenshots of every view, cloud storage setup, auth modes, ingest API, connector configuration, and CLI reference
  • 8 screenshots in images/leadership-dashboard/ — captured via reproducible scripts/capture-dashboard-screenshots.js
  • README.md — new "Leadership Dashboard" section with quick start, views table, auth modes, and ingest example
  • tasks/plan.md — stopping criteria revised to match shipped reality (Postgres/RLS deferred, SaaS-day-one dropped)
  • ADR-002: Postgres implementation explicitly deferred to a future release
  • ADR-003: Self-hosted enterprise first; managed SaaS deferred
  • ADR-009: Pipeline sources (sync health)
  • docs/leadership-platform.md: SAML documented honestly as gateway delegation (not native assertion parsing)
  • Removed 7 historical docs (old plans, specs, investigation, release notes, idea one-pager) — code proves the work
  • AGENTS.md: verification commands + Windows test gotchas
  • CHANGELOG.md: [Unreleased] section with all changes

Windows Test Fixes (39 failures → 0)

All 39 pre-existing Windows test failures are now resolved. The full test suite passes on Windows as well as Linux/macOS.

Root Cause Files Fixed Fix
vitest 4 arrow-function-as-constructor network-collector, notification-manager, notification-boundary (33 tests) Replaced () => ({...}) with function () { return {...}; }
Hardcoded POSIX paths pdf-exporter, attachment-collector, prompt-builder (6 tests) Use path.join/path.resolve for cross-platform assertions
Integration test without server live-filter-integration (32 tests) Skip-gate on LIVE_FILTER_URL env var

Test Plan

  • npm run build — tsc clean, no errors
  • npm test — 846 passed, 0 failed, 34 skipped (integration tests correctly skip-gated)
  • npx vitest run src/benchmark.test.ts — FileStore 10k + cloud-drive latency simulation pass
  • npx vitest run src/connectors/connector-integration.test.ts — skip-gated without env vars
  • Screenshot capture script runs end-to-end: node scripts/capture-dashboard-screenshots.js
  • Dashboard boots and serves: npx evoveo-smart-reporter-dashboard --port 3000 --data-dir ./data
  • Seed data works: node dist/bin/seed-data.js --data-dir ./data --tenant acme
  • Reviewer: verify screenshots in images/leadership-dashboard/ match the actual dashboard UI
  • Reviewer: verify docs/leadership-dashboard-guide.md instructions are followable end-to-end

Generated with Devin

evoveotech and others added 14 commits August 9, 2026 10:46
Add planning artifacts for a multi-tenant aggregation layer on top of the
existing per-run reporter. The reporter already normalizes Playwright/JUnit/
TRX/Newman/etc into one schema; the new layer adds org-context-stamped
ingestion, a partitioned time-series store, and a leadership dashboard with
drilldown to the existing single-run HTML report.

User-confirmed scope: self-hosted + SaaS, 3yr retention, all four team
metrics (requires git + issue-tracker connectors), file-drop-only for legacy.

Artifacts:
- docs/ideas/leadership-dashboard.md (idea-refine one-pager)
- tasks/plan.md (implementation plan: 7 ADRs, 17 tasks, 4 phases)
- tasks/todo.md (task checklist / Loop Engineering spine)

No code yet; planning only.

Generated with [Devin](https://devin.ai)

Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
Add the foundation of the multi-tenant Test Intelligence Platform layer:

- Types (src/types.ts): OrgContext, IngestedRun, RollupSlice,
  TeamContribution, TrendPoint, EstateRollup, IngestPayload, IngestResult,
  Tenant, User, UserRole. (12 tests)
- Store (src/store/): Store interface + pure-JS FileStore (JSONL append log,
  zero native deps). Tenant isolation enforced at the store boundary --
  RunQuery.tenantId is required at the type level; no cross-tenant read is
  possible. (14 tests, 4 security-critical isolation tests)
- Ingest service (src/ingest/): IngestService validates OrgContext (ADR-005),
  routes raw artifacts through the existing adapter registry (ADR-001),
  computes RunSummary, stamps org context, persists. HTTP handler exposes
  POST /runs + GET /health. FileDropWatcher for legacy/air-gapped ingestion
  (ADR-007). (18 tests incl. real JUnit XML -> adapter -> store end-to-end)
- Bin (src/bin/ingest.ts): evoveo-smart-reporter-ingest -- HTTP server +
  optional file-drop watcher, zero new runtime deps.
- ADRs 001-007 recorded in docs/adr/.

44 new tests, all green. tsc --noEmit clean. No regressions: the 39
pre-existing failures in src/ai, src/collectors, src/notifiers, src/live
were verified to fail identically on main.

Generated with [Devin](https://devin.ai)

Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
- Aggregator (src/aggregator/): builds EstateRollup from the store --
  byClient/byProduct/byStack/byRunType slices with deltaPct vs previous
  period, team contribution (all four metrics, connectors layer populates
  testsAuthored/fixesLanded in Task 7b), and a daily trend series. Reuses
  HealthDigest period math. Tenant-scoped throughout. (8 tests)
- Dashboard API (src/dashboard/): REST endpoints -- /api/estate,
  /api/runs (filtered list), /api/runs/:id (detail), /api/runs/:id/report
  (serves the existing single-run HTML report, ADR-004), /api/me, /api/health.
  Pluggable AuthProvider interface with DevAuthProvider (header-based, local
  dev only) so Task 7's OIDC/SAML providers drop in. Every route resolves a
  Session and is tenant-scoped from it; no code path reads another tenant's
  data. (12 tests incl. auth denial, cross-tenant 404, report drilldown)

20 new tests, all green. tsc --noEmit clean.

Generated with [Devin](https://devin.ai)

Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
- OidcAuthProvider: validates bearer tokens against the IdP userinfo
  endpoint (protected-resource side of OIDC). Configurable claim mapping
  so enterprises can match their IdP's custom claims. Supports
  fixedTenantId for single-tenant self-hosted deployments. Uses Node's
  built-in https/http -- zero new runtime deps.
- SamlAuthProvider: trusts headers set by an external SAML gateway
  (mod_auth_mellon / Shibboleth / Keycloak gate). The gateway pattern is
  the standard enterprise deployment -- full SAML SP requires XML-signing
  libs that would break the zero-dep philosophy. Configurable header names.
- requireRole RBAC helper for admin-only routes.
- UsageMeter interface + FileUsageMeter (JSONL append) + NullUsageMeter.
  IngestService now optionally records a metering event per ingested run
  for SaaS billing (ADR-003).
- 16 new tests: OIDC token validation (valid/viewer/missing/rejected/
  no-tenant/fixed-tenant/custom-claims), SAML header resolution, RBAC
  allow/deny, meter append + no-op.

80 leadership tests total, all green. tsc --noEmit clean.

Generated with [Devin](https://devin.ai)

Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
Connectors (src/connectors/, ADR-006):
- VcsConnector / ItsConnector interfaces for pulling team-contribution
  data from external systems.
- GitHubConnector, GitLabConnector: REST API via Node built-in https,
  zero new deps. Fetches commits and maps test-file touches to
  testsAuthored per team.
- JiraConnector, LinearConnector: REST/GraphQL API via Node built-in
  https. Fetches resolved issues and maps to fixesLanded per team.
- TeamMapping config: maps VCS authors and ITS assignees to internal
  team names. Without this, contribution cannot be attributed.
- Pure functions computeTestsAuthored / computeFixesLanded tested with
  12 tests covering glob matching, team attribution, and edge cases.
- Glob matcher supports ** (multi-segment) and * (single-segment),
  with **/ matching zero or more path segments.

Retention job (src/retention/, ADR-002):
- runRetention(store, policy) archives runs older than hotTierDays (90)
  and permanently deletes runs older than retentionDays (1095 = 3yr).
- Store interface extended with archiveRun, deleteRun, listTenants.
- FileStore implements all three; rewriteRunsLog compacts the JSONL
  after archive/delete operations.
- IngestedRun gains an optional archived flag.
- 5 tests covering delete, archive, idempotent archive, multi-tenant,
  and empty-store cases.

97 leadership tests total, all green. tsc --noEmit clean.

Generated with [Devin](https://devin.ai)

Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
Dashboard SPA (src/dashboard/dashboard.html):
- Single-page app in vanilla JS, zero frontend dependencies. Dark theme
  matching enterprise dashboard aesthetics.
- Login view (dev mode: enter tenant/user/role; production: OIDC/SAML
  tokens handled by the auth provider).
- Three tabs: Estate Rollup (KPIs, trend chart, slices by client/product/
  stack/run-type with delta vs previous period), Team Contribution (all
  four metrics: runs, pass rate, flakiness, tests authored, fixes landed),
  Recent Runs (filterable list with click-through to single-run HTML
  report drilldown, ADR-004).
- SVG trend chart (pass rate over time) with zero charting library.
- XSS-safe: all user input is escaped via textContent/innerHTML pattern.

Dashboard bin (src/bin/dashboard.ts):
- evoveo-smart-reporter-dashboard: boots the entire platform in one
  command -- serves the SPA, REST API, and authenticated ingest endpoint
  in a single process.
- --auth dev|oidc|saml selects the auth provider (Phase 3).
- --metering-dir enables usage metering for SaaS billing.
- Build script copies dashboard.html to dist alongside the compiled JS.

Smoke-tested end-to-end: POST JUnit XML to /api/ingest -> 202 accepted ->
GET /api/estate -> 1 run, 50% pass rate. Full pipeline works.

Generated with [Devin](https://devin.ai)

Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
- 10k run benchmark (src/benchmark.test.ts): ingests 10,000 runs across
  5 clients / 3 teams / 4 stacks and builds an estate rollup. Results:
  ingest 3.5s, rollup 34ms, total 3.5s -- well under the 5s target.
  FileStore on local disk, zero native deps.
- Documentation (docs/leadership-platform.md): architecture diagram,
  quick start, component reference, auth modes, ADR index, benchmark
  results, and test suite summary.
- CI workflow (.github/workflows/leadership-ci.yml): typecheck + build +
  leadership test suite + 10k benchmark on Node 18/20/22.

98 tests total across 10 files, all green. tsc --noEmit clean. Build
clean. Full end-to-end smoke tested: POST JUnit XML -> ingest -> store ->
estate rollup -> dashboard.

Generated with [Devin](https://devin.ai)

Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
…res)

Enterprises that lock down Docker and have no Postgres infrastructure can
now use Microsoft 365 (OneDrive/SharePoint) or Google Workspace (Google
Drive) as the shared storage layer. The cloud drive IS the shared database.

Cloud OAuth (src/store/cloud-oauth.ts):
- buildAuthorizeUrl, exchangeCodeForTokens, refreshAccessToken,
  ensureValidToken helpers for both M365 and Google OAuth2.
- Uses Node built-in https -- zero new runtime deps.
- M365 scope: Files.ReadWrite offline_access
- Google scope: drive.file

OneDriveStore (src/store/onedrive-store.ts):
- Store implementation via Microsoft Graph API.
- Stores runs.jsonl, tenants.json, users.json in a OneDrive/SharePoint
  folder. Downloads on open, re-uploads on write.
- Token auto-refresh with config persistence callback.

GoogleDriveStore (src/store/googledrive-store.ts):
- Store implementation via Google Drive API.
- Same JSONL layout. File ID caching. Multipart upload for new files,
  media upload for updates.

StorageSettingsApi (src/dashboard/storage-settings.ts):
- GET /api/storage/config -- current config (tokens redacted)
- POST /api/storage/connect -- start OAuth flow (returns authorize URL)
- GET /api/storage/oauth/callback -- OAuth redirect (exchanges code)
- POST /api/storage/disconnect -- clear config
- Config persisted to <dataDir>/cloud-storage.json

Dashboard bin (src/bin/dashboard.ts):
- Auto-detects cloud storage config on startup. Uses OneDriveStore or
  GoogleDriveStore when configured, falls back to FileStore otherwise.
- Storage settings endpoints wired in (admin role required except OAuth
  callback which is public).

Dashboard UI (src/dashboard/dashboard.html):
- New Settings tab with "Connect Cloud Storage" flow.
- Provider selector (OneDrive / Google Drive), OAuth credential inputs,
  folder path, connect button that redirects to OAuth consent.
- Status display with disconnect button.
- "How Sharing Works" guide explaining the Director-shares-folder flow.

ADR-008: Cloud drive as shared storage for no-Docker enterprises.

14 new tests: OAuth URL generation, endpoint scopes, config round-trip,
token redaction, connect/disconnect, OAuth callback error handling.

112 tests total, all green. tsc --noEmit clean. Build clean.

Generated with [Devin](https://devin.ai)

Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
GAP 1 (CRITICAL): Per-user cloud storage connection
- StorageSettingsApi now stores per-user configs in
  <dataDir>/cloud-storage/<userId>.json instead of a single server file
- OAuth flow uses state parameter to track which user started the flow
- Both admin (director) and viewer (team member) can connect their own
  cloud storage — viewers are no longer blocked from the connect API
- New StoreResolver resolves the correct store per-request based on the
  session user's cloud config (OneDrive/GoogleDrive) or falls back to
  the shared local FileStore
- DashboardApi takes StoreResolver instead of a fixed Store + Aggregator
- Store interface gains open() method
- Dashboard UI Settings tab updated with per-user sharing instructions
- 22 storage settings tests (per-user isolation, path traversal sanitization,
  viewer connect, OAuth state parameter, token redaction)
- StoreResolver tests (cache, fallback to FileStore)

GAP 2 (HIGH): Wire connectors into aggregator
- Aggregator.estateRollup() accepts optional ConnectorData parameter
- teamContribution() uses connectorData instead of hardcoding to 0
- New ConnectorService fetches data from GitHub/GitLab (testsAuthored)
  and Jira/Linear (fixesLanded) with 5-minute cache TTL
- New ConnectorSettingsApi (admin-only) for configuring connectors
- Dashboard API calls ConnectorService before building the estate rollup
- Dashboard bin wires ConnectorService + ConnectorSettingsApi
- 3 new aggregator tests (connector data used, defaults to 0, partial data)
- 6 new ConnectorService tests (config round-trip, empty data, cache)

GAP 3 (LOW): Environment slice in estate rollup
- EstateRollup gains byEnvironment: RollupSlice[]
- Aggregator slices by environment
- Dashboard UI shows "By Environment" table
- Test updated to verify environment slice

129 tests total, all green. tsc --noEmit clean. Build clean.

Generated with [Devin](https://devin.ai)

Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
GAP A (MEDIUM): Validate folder access after OAuth
- OneDriveStore.validateFolderAccess() probes Graph API for the folder
  after token exchange, returns friendly error for 404/403
- GoogleDriveStore.validateFolderAccess() probes Drive API to verify
  token validity and access
- OAuth callback in storage-settings.ts calls validation after token
  exchange — shows "Connected, but folder access issue" warning if
  the folder isn't shared with the user, instead of silent failure
- Tokens are still saved so the user can retry after sharing is fixed

GAP B (LOW): Cross-provider validation
- New listTeamConfigs() method returns all configured users' provider
  + folderPath (tokens redacted, partial configs excluded)
- New GET /api/storage/team-configs endpoint exposes this to the UI
- POST /api/storage/connect returns a warning when a user picks a
  different provider than another user with the same folderPath
- Dashboard UI Settings tab shows "Team Configurations" card listing
  what other users have configured, so team members pick the same
  provider and folder path as their director
- 5 new tests: listTeamConfigs, team-configs endpoint, cross-provider
  warning on mismatch, no warning when providers match

134 leadership dashboard tests pass (up from 129). tsc clean. Build clean.

Generated with [Devin](https://devin.ai)

Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
…bs and search

Rebuilt dashboard.html to use the repo's rich design system from
html-generator.ts instead of flat colors and basic tables:

- 8 theme presets (dark, light, ocean, dracula, cyberpunk, forest,
  sunset, rose) with full CSS variable palette, switchable from top bar
- App shell layout: top bar + collapsible sidebar + main content
- SVG progress ring with glow effect showing estate pass rate
- Polished data grids: hover states, 12px rounded corners, 6 badge types
- 15+ hover transitions (translateY transforms, color transitions)
- Breadcrumbs in top bar: Tenant / View / Period (clickable navigation)
- Command-K search modal: searches clients, products, teams, stacks,
  run types, environments across the estate rollup
- Keyboard shortcuts: Cmd/Ctrl+K (search), Escape (close), Cmd/Ctrl+B
  (toggle sidebar)
- Team contribution cards with color-coded stat values
- Runs tab with filter bar (client, product, team, stack, run type)
- Settings tab with cloud storage form and team configurations

Also added seed-data bin (src/bin/seed-data.ts) that generates 500
realistic runs across 5 clients, 15 products, 8 stacks, 6 teams, 4
environments, and 4 run types over 30 days for demos and testing.

55 dashboard tests pass. tsc clean. Build clean.

Generated with [Devin](https://devin.ai)

Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
Stack categories (mobile/backend/web/legacy/bff/microservices):
- Added StackCategory type and STACK_CATEGORIES map to types.ts
- Added resolveStackCategory() helper for unknown stacks
- Added byStackCategory to EstateRollup
- Aggregator now computes byStackCategory slice
- Dashboard shows "By Stack Category" table in estate view

Drill-down endpoint:
- Added TeamDrillDown type (worstRuns, flakyRuns, byStack, byProduct)
- Added Aggregator.teamDrillDown() method
- Added GET /api/estate/drilldown?team=X&period= endpoint
- Dashboard team cards are now clickable — opens drill-down view
  showing worst 20 runs, flaky runs, and per-stack/product breakdowns

Individual contribution:
- Added IndividualContribution type (userId, team, runsExecuted,
  testsAuthored, fixesLanded, passRate)
- Added Aggregator.individualContributions() method
- Added GET /api/contributors endpoint
- Dashboard shows contributors table in Team Contribution tab

Trend endpoint:
- Added Aggregator.trendSeries() standalone method
- Added GET /api/trend?period= endpoint (separate from rollup)

Comparison view:
- Added PeriodComparison and ComparisonSlice types
- Added Aggregator.compare() method (current vs previous period)
- Added GET /api/compare?period= endpoint
- New "Compare" tab in dashboard with delta KPIs and comparison
  tables for clients, teams, and stacks

Mobile adapters (XCTest, Espresso, Appium):
- Created XCTestAdapter, EspressoAdapter, AppiumAdapter
- All wrap JUnitAdapter (same XML format) with framework-specific
  detection and labels
- Updated InputFormat type and adapter registry
- 23 new tests for mobile adapters

Alerting UI:
- Added alert thresholds card in Settings tab
- Pass rate and flaky rate thresholds with webhook URL
- Alerts persist in localStorage and check against current rollup
- Active alerts show red warning banner when thresholds are violated

Connector mock data:
- Added mockData field to ConnectorConfig for demos
- ConnectorService returns mock data when present (no API calls)
- seed-data bin now writes connectors.json with mock data so
  testsAuthored/fixesLanded are non-zero in demo

146 tests pass (up from 135). tsc clean. Build clean.

Generated with [Devin](https://devin.ai)

Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
…and Windows test fixes

Leadership Dashboard (Test Intelligence Platform):
- Multi-tenant aggregation: estate overview, team contribution, runs, period comparison, sync health
- Cloud-drive storage (OneDrive/Google Drive) — no Docker, no Postgres needed
- Auth: dev (login form), OIDC (Keycloak/Okta/Google), SAML (gateway delegation)
- Connectors: GitHub/GitLab (testsAuthored), Jira/Linear (fixesLanded)
- Pipeline sources: GitHub Actions + Azure DevOps sync with classification engine
- 10k benchmark: FileStore 1.5s, cloud-drive batched 7.9s (viable with batching)
- LatencySimulatingStore for cloud-drive benchmarking without OAuth credentials
- Connector integration tests (skip-gated on GITHUB_TOKEN/JIRA_API_TOKEN env vars)

Documentation:
- New leadership-dashboard-guide.md (509 lines) with screenshots of every view
- 8 screenshots captured via reproducible capture-dashboard-screenshots.js script
- README.md: leadership dashboard section with quick start, views, auth, ingest
- plan.md: stopping criteria revised to match shipped reality
- ADR-002: Postgres deferred; ADR-003: self-hosted first; ADR-009: pipeline sources
- leadership-platform.md: SAML documented honestly as gateway delegation
- Removed 7 implemented/historical docs (old plans, specs, investigation, release notes, idea one-pager)
- AGENTS.md: verification commands + Windows test gotchas
- CHANGELOG.md: [Unreleased] section with all changes

Windows test fixes (39 failures to 0):
- vitest 4 arrow-function-as-constructor: replaced arrow fn mocks with function syntax
- Hardcoded POSIX paths: use path.join/path.resolve for cross-platform assertions
- prompt-builder.ts: safeRelativePath normalizes path.sep to / in AI prompt output
- live-filter-integration.test.ts: skip-gates on LIVE_FILTER_URL env var

Test suite: 846 passed, 0 failed, 34 skipped (integration tests correctly skip-gated)

Generated with [Devin](https://devin.ai)

Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
…down)

vitest 4's rolldown dependency requires node:util.styleText, added in
Node 20.12+. Node 18 is EOL (April 2025) and fails with:
  SyntaxError: The requested module 'node:util' does not provide an
  export named 'styleText'

Also add engines field to package.json documenting the minimum Node version.

Generated with [Devin](https://devin.ai)

Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
@evoveotech
evoveotech merged commit 5ab6b13 into main Aug 9, 2026
8 checks passed
@evoveotech
evoveotech deleted the feat/leadership-dashboard branch August 9, 2026 03:17
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant