Skip to content

feat(services): dense services list — health, Δ7d baseline, issues, last-deploy#247

Merged
Makisuo merged 1 commit into
mainfrom
feat/services-dense-table
Jul 21, 2026
Merged

feat(services): dense services list — health, Δ7d baseline, issues, last-deploy#247
Makisuo merged 1 commit into
mainfrom
feat/services-dense-table

Conversation

@Makisuo

@Makisuo Makisuo commented Jul 21, 2026

Copy link
Copy Markdown
Collaborator

What

Redesigns the /services list to the approved "dense table+" direction (designed in Paper first): each row now carries a health signal, a P95 delta vs the trailing-7d baseline, an open-issues count, and a message-first Last deploy cell — replacing the raw commit-sha column.

How (data stays fleet-level — no N+1)

The page still issues a fixed number of fleet-level requests (verified in the network pane: overview, sparklines, facets, anomalies, baseline, issue counts):

  • Health — new useServiceHealthSummary hook derives per-(service, env) health from the already-fetched alert incidents + anomalies; shared by the table and the sidebar's new client-side Health facet, so counts and badges can't disagree. Shown as a quiet dot next to the name (degraded/unhealthy only) + a destructive left rail, not a dedicated column.
  • P95 · Δ7d — wires the existing fleet-level, hour-cached serviceHealthBaseline query (previously zero consumers); joined via the canonical baselineKey.
  • Issues — new GET /v2/error_issues/service_countsErrorsService.countOpenIssuesByService, one Postgres GROUP BY service_name over actionable, error-kind, non-archived issues. Name-scoped only (env scoping would require the warehouse fingerprint intersection; deliberately out of scope).
  • Last deployserviceOverviewQuery gains per-commit firstSeen: min(Timestamp) on the same scan; the cell derives rollout state (progress bar + breakdown tooltip) and an errors ↑ since flag (newest commit ≥2× older-commit error rate, ≥0.5pp, ≥50 spans both sides) client-side. Commit messages resolve lazily via the existing deduped per-sha commitQueryAtom — the one accepted soft fan-out, bounded by distinct live shas.

Reviewer notes

  • serviceOverview's cachedDirect policy is bumped to version 2 because rows gained firstSeen (stale cached rows would otherwise miss the field for one TTL window).
  • ServiceOverviewResponse is schema-open (Record<string, Unknown>), so no domain change was needed for the overview; the v2 OpenAPI surface test pins the new service_counts path.
  • Rows are extracted into a memoized ServiceRow; baseline/issues/messages are progressive enrichment (Result.isSuccess fallback) and never block first paint.
  • service.version was considered and skipped — it isn't materialized in ClickHouse (only CommitSha is); would need an MV column first.

Testing

  • bun run test green across all 24 packages (new: query-engine compile assertions incl. min(Timestamp) AS firstSeen, PGlite test for countOpenIssuesByService, updated v2 surface test); bun typecheck green.
  • Verified live against the dev stack: fleet-level request set confirmed, health filter + facet + footer tally work, columns render progressively, layout checked at 1280/1600px.

🤖 Generated with Claude Code


View with Codesmith Autofix with Codesmith
Need help on this PR? Tag /codesmith with what you need. Autofix is disabled.

… issues, and last-deploy columns

Redesigns the /services table per the approved "dense table+" direction while
keeping every data source fleet-level (no per-service fan-out):

- serviceOverviewQuery gains a per-commit `firstSeen: min(Timestamp)` on the
  same scan; CommitBreakdown now carries errorCount + firstSeen. The
  serviceOverview cachedDirect policy is bumped to version 2 so pre-upgrade
  cached rows (missing the field) can't be served.
- New GET /v2/error_issues/service_counts backed by
  ErrorsService.countOpenIssuesByService — one Postgres GROUP BY over
  actionable, error-kind, non-archived issues (name-scoped; env scoping would
  need the warehouse fingerprint intersection and is deliberately out).
- New useServiceHealthSummary hook derives per-(service, env) health from the
  already-fetched alert incidents + anomalies; shared by the table (name dot,
  destructive left rail, footer tally, health filter) and the sidebar's new
  client-side Health facet.
- P95 cell shows a tone-colored delta vs the trailing-7d baseline — first
  consumer of the existing fleet-level, hour-cached serviceHealthBaseline.
- "Commit" becomes "Last deploy": commit message first (lazy per-distinct-sha
  lookup), sha · age demoted, rollout progress bar with breakdown tooltip, and
  an "errors ↑ since" state when the newest commit errors ≥2× the older ones.
- Rows extracted into a memoized ServiceRow; baseline/issues/messages render
  progressively and never block first paint.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@pullfrog

pullfrog Bot commented Jul 21, 2026

Copy link
Copy Markdown
Contributor

Your Pullfrog Router balance is exhausted.

You have a card on file but auto-reload is disabled, so runs paused once your balance went past the overdraft buffer.

Top up balance → · Enable auto-reload →

Pullfrog  | ⚠️ this action is pinned to a commit SHA, which freezes the cleanup step — switch to @v0 or keep the SHA fresh with Dependabot | Rerun failed job ➔View workflow run | via Pullfrog | Using Claude Opus𝕏

@Makisuo
Makisuo merged commit 3ebce42 into main Jul 21, 2026
17 of 18 checks passed
@Makisuo
Makisuo deleted the feat/services-dense-table branch July 21, 2026 23:21
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