Problem
packages/loopover-miner/lib/attempt-log.ts maintains a real, structured, append-only per-attempt event trace (attemptId, actionClass, provider, costUsd, tokensUsed, timestamps) and pr-outcome.ts maintains a local merged/closed record with rejection reason — both real, already-written data. Neither has an API exposure: the existing pattern (vite-ledgers-api.ts, vite-run-state-api.ts, vite-portfolio-queue-api.ts) aggregates a local store into a safe read-only summary, but no equivalent exists for these two stores. apps/loopover-miner-ui/src/routes/run-history.tsx only shows current per-repo state (idle/discovering/planning/preparing), not a log of individual past attempts.
Area
packages/loopover-miner/lib/, apps/loopover-miner-ui/.
Proposal
Add a vite-attempt-log-api.ts (or equivalent) plugin, and a dashboard view/route consuming it — a real per-attempt history (not just current state), with cost/tokens/outcome per attempt.
⚠️ Required pattern — read apps/loopover-miner-ui/vite-ledgers-api.ts before starting. The new plugin must follow that file's exact structure (local-store aggregation → safe read-only summary object). A PR that builds a differently-shaped API plugin, skips the aggregation step, or exposes the raw store data directly does not satisfy this issue.
Deliverables
Test Coverage Requirements
apps/loopover-miner-ui/** — confirm this package's current coverage.include scoping before assuming src/**'s 99% patch gate applies identically; match whatever this package's existing vite-*-api.ts test files already do for their own coverage target.
Resources
packages/loopover-miner/lib/attempt-log.ts, packages/loopover-miner/lib/pr-outcome.ts
apps/loopover-miner-ui/vite-ledgers-api.ts (the required pattern)
apps/loopover-miner-ui/src/routes/run-history.tsx, apps/loopover-miner-ui/src/lib/run-history.ts
Boundaries
Self-host miner-ui only — does not presuppose the hosted-dashboard architecture (#5963 is still deciding whether miner-ui becomes a Cloudflare Worker).
Contributor-eligible. Reuse the exact pattern named above — a PR that invents a new API-exposure mechanism instead of extending the cited one does not satisfy this issue.
Problem
packages/loopover-miner/lib/attempt-log.tsmaintains a real, structured, append-only per-attempt event trace (attemptId, actionClass, provider, costUsd, tokensUsed, timestamps) andpr-outcome.tsmaintains a local merged/closed record with rejection reason — both real, already-written data. Neither has an API exposure: the existing pattern (vite-ledgers-api.ts,vite-run-state-api.ts,vite-portfolio-queue-api.ts) aggregates a local store into a safe read-only summary, but no equivalent exists for these two stores.apps/loopover-miner-ui/src/routes/run-history.tsxonly shows current per-repo state (idle/discovering/planning/preparing), not a log of individual past attempts.Area
packages/loopover-miner/lib/,apps/loopover-miner-ui/.Proposal
Add a
vite-attempt-log-api.ts(or equivalent) plugin, and a dashboard view/route consuming it — a real per-attempt history (not just current state), with cost/tokens/outcome per attempt.Deliverables
vite-ledgers-api.ts's pattern exactly (same aggregation shape, same plugin registration style).Test Coverage Requirements
apps/loopover-miner-ui/**— confirm this package's currentcoverage.includescoping before assumingsrc/**'s 99% patch gate applies identically; match whatever this package's existingvite-*-api.tstest files already do for their own coverage target.Resources
packages/loopover-miner/lib/attempt-log.ts,packages/loopover-miner/lib/pr-outcome.tsapps/loopover-miner-ui/vite-ledgers-api.ts(the required pattern)apps/loopover-miner-ui/src/routes/run-history.tsx,apps/loopover-miner-ui/src/lib/run-history.tsBoundaries
Self-host miner-ui only — does not presuppose the hosted-dashboard architecture (#5963 is still deciding whether miner-ui becomes a Cloudflare Worker).
Contributor-eligible. Reuse the exact pattern named above — a PR that invents a new API-exposure mechanism instead of extending the cited one does not satisfy this issue.