diff --git a/docs/FlowAssist_Migration/FLOWPILOT-MIGRATION.md b/docs/FlowAssist_Migration/FLOWPILOT-MIGRATION.md
index 73fd3b89..eab4e541 100644
--- a/docs/FlowAssist_Migration/FLOWPILOT-MIGRATION.md
+++ b/docs/FlowAssist_Migration/FLOWPILOT-MIGRATION.md
@@ -2,7 +2,7 @@
> **Target:** Transform `/assistant` (ResolutionAssist) into the new unified `/pilot` (FlowPilot) surface.
> **Audience:** Claude Code (implementation) and Codex (review) reviewed by Michael (owner).
-> **Status:** Phases 0–8 implemented. Phase 8 replaced the task-lane `SuggestedFix` card CTA with a chat-composer-anchored `ProposalBanner`, added `ai_sessions.fix_outcome` column, `PATCH /outcome` endpoint, `[FIX_OUTCOME]` marker, and `EscalateInterceptDialog`. `tsc -b` and `npm run build` both clean.
+> **Status:** Phases 0–8 implemented. Phase 8 replaced the task-lane `SuggestedFix` card CTA with a chat-composer-anchored `ProposalBanner`, added six columns to `session_suggested_fixes` (`status`, `applied_at`, `verified_at`, `partial_notes`, `failure_reason`, `ai_outcome_proposal`), `PATCH /api/v1/ai-sessions/{session_id}/suggested-fixes/{fix_id}/outcome` endpoint, `[FIX_OUTCOME]` marker, and `EscalateInterceptDialog`. `tsc -b` and `npm run build` both clean.
> **Last updated:** April 23, 2026 (Phase 8 — Fix Outcome Banner — committed; handoff and migration spec updated)
---
@@ -900,15 +900,15 @@ git commit -m "feat(pilot): visual polish, empty/loading states, keyboard shortc
**What this phase does:** Removes the `SuggestedFix` card as the primary interaction point for fix application. Replaces it with a chat-composer-anchored slide-up banner (`ProposalBanner`) that stays visible at the bottom of the conversation column regardless of task-lane scroll depth. Addresses the user-reported discoverability problem: *"the task lane fills up pretty quick … the suggested fix … is easily missed."*
**Key backend additions:**
-- `ai_sessions.fix_outcome` VARCHAR column (values: `null` / `accepted` / `dismissed` / `escalated`)
-- `PATCH /api/v1/ai-sessions/{id}/outcome` endpoint to record the engineer's decision
+- Six new columns on `session_suggested_fixes`: `status`, `applied_at`, `verified_at`, `partial_notes`, `failure_reason`, `ai_outcome_proposal`
+- `PATCH /api/v1/ai-sessions/{session_id}/suggested-fixes/{fix_id}/outcome` endpoint to record the engineer's decision
- `[FIX_OUTCOME]` marker in the FlowPilot system prompt, parsed by `unified_chat_service.py` to trigger the banner
**Key frontend additions:**
- `ProposalBanner` component (`frontend/src/components/pilot/ProposalBanner.tsx`) — slide-up banner anchored above the chat composer; shows fix title, confidence, and Accept / Dismiss / Escalate actions; auto-collapses after session resolves
- `EscalateInterceptDialog` — intercepts the Escalate action when a fix proposal is active, asking whether the engineer wants to note that the fix was attempted before escalating
-**Commit range:** `6721b84` (Phase 8 Task 1 start) through `8582d24`
+**Commit range:** `cdd8bb0` (Phase 8 Task 1 start) through `8582d24`
```
git commit -m "feat(pilot): Phase 8 — fix outcome banner replaces task-lane SuggestedFix CTA"
diff --git a/docs/FlowAssist_Migration/mockups/05-resolve-cta-merge.html b/docs/FlowAssist_Migration/mockups/05-resolve-cta-merge.html
new file mode 100644
index 00000000..e952bdf0
--- /dev/null
+++ b/docs/FlowAssist_Migration/mockups/05-resolve-cta-merge.html
@@ -0,0 +1,679 @@
+
+
+
Option A — Suggested Fix merges into the Resolve CTA
+
+ Three versions of the same task lane. Today keeps Suggested Fix as a separate card that gets pushed down by a long facts list. Option A (armed) deletes the card — the Resolve button at the bottom becomes the proposal. Option A (waiting) is what the same bar looks like before the AI emits a proposal.
+
+
+
+
+
+
+
+
+
+
Today
+
Baseline
+
+
+
+
+
+
+
+ What we know
+ · 5 facts
+
+
+
+
+
User cannot authenticate to Outlook; repeated 401s from Exchange Online.
+
promoted 14:02 · from ticket
+
+
+
+
+
+
Cached credentials in Credential Manager reference a prior tenant the user migrated off six months ago.
+
promoted 14:07 · from chat
+
+
+
+
+
+
MFA prompt appears then fails silently — no authenticator notification, no error code surfaced to the user.
+
promoted 14:11 · from chat
+
+
+
+
+
+
Other devices under same account authenticate successfully, isolating the problem to this workstation.
+
promoted 14:14 · from chat
+
+
+
+
+
+
Office 365 client last updated three weeks ago; local profile not recreated since migration.
+
promoted 14:18 · from chat
+
+
+
+
+
+
+
+
+ Suggested fix
+ ·
+ 94% confidence
+
+
+
+
+
Clear cached credentials + rebuild Outlook profile
+
Remove stale entries from Credential Manager referencing the prior tenant, then rebuild the local Outlook profile so the client re-authenticates cleanly against the current tenant.
+
✓ Matches an existing Script Library template — click to use
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Baseline problem. The Suggested Fix card sits after What-we-know. With 5+ facts (common by mid-session) it's below the fold. The generic Resolve button at the bottom doesn't surface what would be resolved, so the engineer has to scroll up, read the card, then scroll back down to act.
+
+
+
+
+
+
+
+
Option A — armed
+
Proposal ready
+
+
+
+
+
+
+
+ What we know
+ · 5 facts
+
+
+
+
+
User cannot authenticate to Outlook; repeated 401s from Exchange Online.
+
promoted 14:02 · from ticket
+
+
+
+
+
+
Cached credentials in Credential Manager reference a prior tenant the user migrated off six months ago.
+
promoted 14:07 · from chat
+
+
+
+
+
+
MFA prompt appears then fails silently — no authenticator notification, no error code surfaced to the user.
+
promoted 14:11 · from chat
+
+
+
+
+
+
Other devices under same account authenticate successfully, isolating the problem to this workstation.
+
promoted 14:14 · from chat
+
+
+
+
+
+
Office 365 client last updated three weeks ago; local profile not recreated since migration.
+
promoted 14:18 · from chat
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ What changes. The Suggested Fix card is gone. Its content moved onto the Resolve button, which is always in view. One click = accept the fix + open the existing ResolutionNotePreview popover pre-filled. No card-then-button two-step.
+
+
+
+
+
+
+
+
Option A — waiting
+
No proposal yet
+
+
+
+
+
+
+ What we know
+ · 2 facts
+
+
+
+
+
User cannot authenticate to Outlook; repeated 401s from Exchange Online.
+
promoted 14:02 · from ticket
+
+
+
+
+
+
Cached credentials in Credential Manager reference a prior tenant.
+
promoted 14:07 · from chat
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Before confidence threshold. Same slot, disabled state. Amber pulse signals the AI is still reasoning. Below threshold or no proposal yet → same visual — the engineer can still use Escalate at any time.
+
+
+
+
+
+
+
+
+
Why this helps discoverability
+
+
Proposal is in the place the engineer looks to act, not in the scrolling lane above.
+
Resolve bar is already sticky at the bottom — no new sticky patterns needed (preserves the 8879f96 fix).
+
Accepting a fix and resolving the session collapse into one click instead of two.
+
+
+
+
What you give up
+
+
No space for secondary info on the button (reasoning, alternative fixes). Would need an expand/chevron or hover tooltip.
+
No standalone "dismiss this fix" affordance — need to decide where dismiss/reject lives (chevron menu? secondary button?).
+
If the AI proposes multiple candidates, only the top one fits the button. Need a "▾ 2 other candidates" menu.
Option C — Suggested Fix slides up from the chat composer
+
+ The AI's proposal docks as a persistent banner just above the chat composer — right where the engineer's eyes already are. Apply lives on the banner (warning amber). Resolve stays generic at the bottom of the task lane, so there's no false-resolve risk. The Suggested Fix card is removed from the task lane entirely.
+
+
+
+
+
+
+
+
+
+
Outlook won't authenticate after tenant migration
+
ticket #48213 · in progress · 14:22
+
+
+
+
+
+
+
+
+
+
AI
+
+
+ A few things we know line up with a stale-credential pattern rather than an MFA or network issue. Can you confirm whether the user has other Microsoft 365 services (Teams, SharePoint) working on the same workstation?
+
+
14:16
+
+
+
+
+
+
Teams works fine. SharePoint in browser is fine too. It's just Outlook.
+
14:17
+
+
ME
+
+
+
+
AI
+
+
+ That narrows it to the Outlook profile specifically. Given Credential Manager still has entries pointing at the prior tenant, the cleanest path is to clear those entries and rebuild the local Outlook profile — the client will re-auth against the current tenant from scratch.
+
+
14:22
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Suggested Fix
+ 94% confidence
+
+
Clear cached credentials + rebuild Outlook profile
+
+ Remove stale Credential Manager entries referencing the prior tenant, then rebuild the local Outlook profile so the client re-authenticates cleanly against the current tenant.
+
Ask a follow-up, paste an error, drop a screenshot…
+
+
+
+
+
+
+
+
+
+
Task lane
+
+
+
+
+
+ What we know
+ · 5 facts
+
+
+
User cannot authenticate to Outlook; repeated 401s from Exchange Online.
+
promoted 14:02 · from ticket
+
+
+
Credential Manager still references the prior tenant from six months ago.
+
promoted 14:07 · from chat
+
+
+
MFA prompt appears but fails silently — no authenticator notification.
+
promoted 14:11 · from chat
+
+
+
Other devices under same account authenticate successfully.
+
promoted 14:14 · from chat
+
+
+
Teams + SharePoint work on same workstation — isolated to Outlook.
+
promoted 14:22 · from chat
+
+
+
+
+
+
+
+
+
+
+
+
+ How it reads. Proposal arrives with a 320ms slide-up from below the composer, docks as a persistent banner until applied, dismissed, or replaced. Apply is amber (not accent-blue) so it visually belongs to the proposal, not the chat send button. Resolve in the task lane stays generic — there's no false-resolve risk because the two actions are spatially and visually separate.
+
+
+
+
Banner states
+
What the same region looks like in the other three states — collapsed to save chat space, after the engineer dismisses it, and when a new proposal replaces an existing one.
+ ~28px strip. Auto-collapses after 30s of no interaction, or when the engineer clicks the chevron. Title + confidence still visible. Click strip → expands. Apply still reachable via the expanded state.
+
+
+
+
+
+
Dismissed — parked in the task lane
+
+
chat unobstructed · banner gone
+
+
Type a message…
+
+
+
+
+
+
+ Dismissed proposals
+ · 1
+
+
+
+ Clear cached credentials…
+ restore ↺
+
+
+
+ Recoverable, out of the way. Dismissing the banner parks the proposal as a pill in the task lane. Clicking restore → banner slides back in. Prevents accidental loss.
+
+
+
+
+
+
Replaced — new proposal overrides old
+
+
+ previous: "Rebuild Outlook profile" — didn't resolve, new proposal below
+
+
+
+
+
+
+
+ New suggested fix
+ 78%
+
+
Reset Autodiscover registry entries for this user
+
+
+
+
+
Type a message…
+
+
+
+
+ Old proposal cross-fades out, new one slides in. 200ms cross-fade, same slot. A tiny footnote in chat ("previous didn't resolve") preserves the audit trail without re-stacking banners.
+
Post-apply outcome states — how we recognize whether a fix worked
+
+ Hero frame shows the Verifying state — what the banner becomes the moment the engineer clicks Apply. Below, four detail panels show the other outcome paths: Partial apply, AI-inferred outcome from chat, Escalate-intercept, and the Nudge that appears when the engineer keeps chatting without confirming.
+
+
+
+
+
+
+
+
+
+
Outlook won't authenticate after tenant migration
+
ticket #48213 · in progress · 14:26
+
+
+
+
+
+
AI
+
+
Given Credential Manager still has entries for the prior tenant, the cleanest path is to clear those and rebuild the local Outlook profile.
+
14:22
+
+
+
+
+
Okay, I'll run the script now.
+
14:24
+
+
ME
+
+
+
✓
+
+
Applied fix: Clear cached credentials + rebuild Outlook profile — script completed without errors at 14:24.
+
+
+
+
+
+
+
+
+
+
+
+
+ Verifying
+ Applied 14:24 · 2m ago
+
+
Did "Clear cached credentials + rebuild Outlook profile" work?
+
Mark the outcome so the AI can either close the session with this as the resolution, or propose something else.
+
+
+
+
+
+
+
+
+
+
Tell the AI what happened — or click an outcome above
+
+
+
+
+
+
+
+
+
Task lane
+
+
+
+
+
+ What we know
+ · 5 facts
+
+
+
User cannot authenticate to Outlook; repeated 401s from Exchange Online.
+
promoted 14:02 · from ticket
+
+
+
Credential Manager still references the prior tenant from six months ago.
+
promoted 14:07 · from chat
+
+
+
Teams + SharePoint work on same workstation — isolated to Outlook.
+
promoted 14:22 · from chat
+
+
+
+
+
+
+
+
+
+
+
+
+ How Verifying works. Clicking Apply transitions the banner into this state instead of dismissing it. No timeout — the banner stays pinned until the engineer marks Worked, Didn't work, or Partial (overflow). If they ignore it and keep chatting, the Nudge state (panel D below) appears after a few messages. If they hit the task lane's Resolve button without clicking either outcome, we auto-stamp applied_success. If they hit Escalate, panel C intercepts.
+
+
+
+
Outcome branches
+
Four paths from Verifying to a final status. Each one writes to session_suggested_fixes.status so the AI's next turn has ground truth about what's been tried.
+
+
+
+
+
+
A. Partial apply — "I did some of it"
+
+
…engineer picked "Mark partial…" from the verify banner's overflow menu
+
+
+
+
+
+
+ Partially applied
+ Parked
+
+
Clear cached credentials + rebuild Outlook profile
+
+ Note
+ Ran cred clear — skipped profile rebuild, user in a meeting. Back at 3:30.
+
+
+
+
+
+
+
+
+
+
Type a message…
+
+
+
+
+ Status:applied_partial, with partial_notes free-text. Not terminal — banner stays pinned until engineer marks a terminal outcome, or clicks Finish it to re-run the remainder and flip back to Verifying. AI treats partial as "tried but uncertain" — doesn't re-propose, but doesn't assume failure either.
+
+
+
+
+
+
B. AI-inferred outcome — from chat
+
+
+
Engineer: "yep that fixed it, thanks"
+
14:31 · user message triggered [FIX_OUTCOME]
+
+
+
+
+
+
+
+ AI detected outcome
+ Success · 92%
+
+
AI thinks the fix resolved the issue — confirm?
+
Based on your message at 14:31. One click closes the session with this fix as the documented resolution.
+
+
+
+
+
+
+
+
+
Type a message…
+
+
+
+
+ Triggered by the new [FIX_OUTCOME fix_id=… outcome=success] marker from the system prompt. Engineer stays in the loop — the AI proposes the outcome, doesn't set it. One-click accept fires the normal Resolve flow. Works for failure too ("still broken" → No, didn't work pre-selected, with the AI's reasoning shown).
+
+
+
+
+
+
C. Escalate-intercept — capture outcome before handoff
+
+
+
+
Before escalating — what happened with the fix?
+
"Clear cached credentials" is still in the Verifying state. Tag its outcome so the senior picking this up knows what's been tried.
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Fires when engineer clicks Escalate while a fix is in Verifying (or Partial). Defaults to Didn't work on Enter — common case. Escalating for another reason preserves success; Never applied flips to dismissed. Takes 1s and makes the escalation narrative honest for whoever picks it up.
+
+
+
+
+
+
D. Nudge — passive prompt after a few messages
+
+
+
"user is rebooting"
+
"okay it's back up, signing in now"
+
"going to try opening Outlook"
+
+
+
+ Did "Clear cached credentials" work?
+
+
+
+
+
+
Type a message…
+
+
+
+
+ Appears after ~3 post-apply engineer messages with no outcome click. Collapses the verify banner into this thin nudge strip above it so chat space isn't eaten. Passive — never auto-marks anything. Still checking silences the nudge for another 3 messages. Yes/No route to the normal Success / Failed flows.
+