80% this lands Mar 3–12>}
+ overline={forecast ? 'Backlog · open scope' : 'Milestone · Beta'}
+ title={
+ forecast ? (
+ <>80% of the open backlog lands by {forecast.rangeLabel}>
+ ) : (
+ <>80% this lands Mar 3–12>
+ )
+ }
actions={}
>
-
+
- The cone has narrowed since Friday. I’m quietly pleased.
+ {forecast
+ ? `${forecast.scope} open ${forecast.scope === 1 ? 'issue' : 'issues'} in scope. Cold-start priors — the cone tightens as the team closes work.`
+ : 'The cone has narrowed since Friday. I’m quietly pleased.'}
diff --git a/apps/desktop/src/renderer/src/components/shell/app-shell.tsx b/apps/desktop/src/renderer/src/components/shell/app-shell.tsx
index 48c9790..7ab83ed 100644
--- a/apps/desktop/src/renderer/src/components/shell/app-shell.tsx
+++ b/apps/desktop/src/renderer/src/components/shell/app-shell.tsx
@@ -2,7 +2,7 @@ import React, { useEffect, useState } from 'react'
import logoIcon from '../../design/assets/logo-icon.png'
import type { IssueRef } from '../../data/fixtures.js'
-import { issuesToBoardColumns, scheduleFocus } from '../../lib/backlog.js'
+import { forecastBacklog, issuesToBoardColumns, scheduleFocus } from '../../lib/backlog.js'
import { useBacklog } from '../../lib/use-backlog.js'
import { PrimitivesGallery } from '../gallery.js'
import { BoardScreen } from '../screens/board-screen.js'
@@ -88,6 +88,8 @@ export function AppShell() {
const backlog = useBacklog()
const boardColumns = backlog.status === 'ready' ? issuesToBoardColumns(backlog.issues) : undefined
const focus = backlog.status === 'ready' ? scheduleFocus(backlog.issues, backlog.deps) : undefined
+ const forecast =
+ backlog.status === 'ready' ? (forecastBacklog(backlog.issues, backlog.deps) ?? undefined) : undefined
useEffect(() => {
document.documentElement.setAttribute('data-theme', dark ? 'dark' : 'light')
@@ -158,7 +160,7 @@ export function AppShell() {
const renderScreen = () => {
switch (view) {
case 'focus':
- return