diff --git a/apps/loopover-miner-ui/src/app.test.tsx b/apps/loopover-miner-ui/src/app.test.tsx
index 0aa1e532d6..0c1069b334 100644
--- a/apps/loopover-miner-ui/src/app.test.tsx
+++ b/apps/loopover-miner-ui/src/app.test.tsx
@@ -39,6 +39,18 @@ describe("OverviewView (#4853)", () => {
expect(statValue("Done")).toBe("2");
expect(statValue("Active")).toBe("3");
expect(statValue("Total recorded")).toBe("4");
+ // Oldest-queued age is omitted when null (empty queue), matching the CLI (#6185).
+ expect(screen.queryByText("Oldest queued")).toBeNull();
+ });
+
+ it("renders the oldest-queued age in CLI-parity minutes when the queue has one (#6185)", () => {
+ const portfolioWithAge: PortfolioQueueResult = {
+ ok: true,
+ summary: { total: 3, byStatus: { queued: 3, in_progress: 0, done: 0 }, repos: [], oldestQueuedAgeMs: 5_400_000 },
+ };
+ render();
+ // 5_400_000ms / 60000 = 90m, matching portfolio-dashboard.js's `Math.round(oldestQueuedAgeMs / 60000)m`.
+ expect(statValue("Oldest queued")).toBe("90m");
});
it("shows an independent loading message per card before data arrives", () => {
diff --git a/apps/loopover-miner-ui/src/routes/index.tsx b/apps/loopover-miner-ui/src/routes/index.tsx
index 0975a3a001..7821daa92a 100644
--- a/apps/loopover-miner-ui/src/routes/index.tsx
+++ b/apps/loopover-miner-ui/src/routes/index.tsx
@@ -81,6 +81,12 @@ export function OverviewPortfolioCard({ portfolio }: { portfolio: PortfolioQueue
+ {/* Deliver the CLI/web-UI parity the portfolio-queue data path promises (#6185): the CLI's `queue
+ dashboard` renders "oldest-queued: Xm" (portfolio-dashboard.js), and the same minutes-rounded age
+ is shown here. Omitted (like the CLI) when the queue is empty and the age is null. */}
+ {portfolio.summary.oldestQueuedAgeMs !== null && (
+
+ )}
>
)}