One page per session, addressable and reload-safe. The stepper maps the four
forward-only BuildStatus values a user can watch — launching → building → deploying →
deployed — with requested folded into launching. The real work happens in FuzeAgent, so
the primary action is the deep link there; the secondary is Cancel.
Building into Acme Corp · started 4 min ago
Let team members log expenses with a receipt photo, amount, currency and category. Managers approve or reject with a comment…
Deploying to Acme Corp. Cancelling now stops tracking here but can't undo a rollout already in progress.
“Expense tracker” will stop here and be marked cancelled. This can't be resumed — start a new build to try again.
FuzeAgent isn't told to stop. If it reports later, that report is ignored and no app is added from this session.
Updates. The contract has no push channel for sessions, so the flow polls
GET /build-sessions/{id} while the status is in-flight (requested,
launching, building, deploying): every 5 s for the first minute, then
backing off to 30 s, paused while the tab is hidden, stopped on a terminal status. The status pill and
stepper announce changes through aria-live="polite".
Agent deep link. Rendered only when agentSessionUrl is non-null and resolves to the
shell's own origin (/app/fuzeagent/…); it navigates in-shell. A cross-origin or malformed URL is
not rendered as a link — fail-closed against an open redirect.
Cancel. Shown to the requester and org managers while in-flight. A 409 on cancel means the
session reached a terminal state first: refetch and render that state (frame d), no error toast.
Test hooks: [data-frame='03-build-progress'] · [data-panel='build-session'] ·
[data-panel='build-stepper'] · [data-session-status='building'] ·
[data-session-status='launching'] · [data-session-status='deploying'] ·
[data-step-state='current'] · [data-action='open-agent-session'] ·
[data-state='agent-link-pending'] · [data-action='cancel-build'] ·
[data-action='confirm-cancel-build'] · [data-state='loading'].