Scoreboard Feature - Implementation Summary
Overview
Section titled “Overview”The Scoreboard feature provides a public dashboard of pipeline execution results. Data is aggregated in the backend, stored in pipeline_scoreboard_cache, and rendered in the webapp as a paginated table with rich entity display.
Features Delivered
Section titled “Features Delivered”Backend
Section titled “Backend”GET /api/pipeline/scoreboard/{namespace}— per-tenant pipeline statsPOST /api/pipeline/scoreboard/save-results— refresh the PocketBase cachePOST /api/pipeline/scoreboard/aggregate/start— start or schedule aggregationDELETE /api/pipeline/scoreboard/aggregate/schedule/{schedule_id}— cancel a scheduleAggregateScoreboardWorkflow— Temporal workflow that merges namespace stats- Unit/integration tests in
pkg/internal/apis/handlers/scoreboard_test.go
Frontend
Section titled “Frontend”Public Scoreboard (/scoreboard)
Section titled “Public Scoreboard (/scoreboard)”- Paginated TanStack table backed by
pipeline_scoreboard_cache - Sortable columns and entity display components
- Links to Hub pipeline pages
Homepage Section
Section titled “Homepage Section”- Random sample of scoreboard rows on the public landing page
- Pipeline success summary and related entities
Shared module (webapp/src/lib/scoreboard)
Section titled “Shared module (webapp/src/lib/scoreboard)”loadData()PocketBase query helperScoreboardTablecontroller class- Column definitions and
EntityDisplayhelpers
Documentation
Section titled “Documentation”SCOREBOARD.md— API, data model, and frontend usageARCHITECTURE.md— system diagram and data flowsSUMMARY.md— this file
Removed
Section titled “Removed”/my/scoreboardauthenticated route/my/scoreboard/[type]/[id]detail route- Legacy tabbed scoreboard components (
ScoreboardTableTabbed,OTelDetails) - Frontend dependency on
/api/my/resultsand/api/all-results
File Inventory
Section titled “File Inventory”Backend
Section titled “Backend”pkg/internal/apis/handlers/├── scoreboard.go├── scoreboard_test.go└── scoreboard_handler.go (legacy OTel code, commented out)
pkg/workflowengine/workflows/├── scoreboard.go└── scoreboard_test.goFrontend
Section titled “Frontend”webapp/src/lib/scoreboard/├── index.ts├── functions.ts├── types.ts├── table.svelte├── table.svelte.ts├── columns/├── entity-display/└── extras/pipeline-content-summary.svelte
webapp/src/routes/├── (public)/scoreboard/│ ├── +page.ts│ └── +page.svelte└── (public)/_partials/scoreboard-section.svelteIntegration Guide
Section titled “Integration Guide”Quick Start
Section titled “Quick Start”- Start the backend and webapp (
make dev) - Open the public scoreboard:
https://your-domain/scoreboard - Refresh cache (internal):
POST /api/pipeline/scoreboard/aggregate/start
Testing
Section titled “Testing”# Backendgo test -tags=unit ./pkg/internal/apis/handlers/ -run Scoreboard
# Frontendcd webapp && bun run checkConclusion
Section titled “Conclusion”The scoreboard is a PocketBase-backed public read model with Temporal-driven aggregation. The legacy authenticated /my/scoreboard experience and OpenTelemetry tabbed UI have been removed in favor of the unified $lib/scoreboard module used by /scoreboard and the homepage section.