diff --git a/playbooks/agent-inbox/2026-02-26-Encore-Inbox-Refactor/ENCORE-INBOX-02.md b/playbooks/agent-inbox/2026-02-26-Encore-Inbox-Refactor/ENCORE-INBOX-02.md
new file mode 100644
index 000000000..04d83a1b1
--- /dev/null
+++ b/playbooks/agent-inbox/2026-02-26-Encore-Inbox-Refactor/ENCORE-INBOX-02.md
@@ -0,0 +1,34 @@
+# ENCORE-INBOX-02: Add `unifiedInbox` flag to EncoreFeatureFlags
+
+## Objective
+Register the Unified Inbox as an Encore Feature with a type flag and default value.
+
+## Context
+- `EncoreFeatureFlags` interface is at `src/renderer/types/index.ts:906` — currently only has `directorNotes: boolean`
+- `DEFAULT_ENCORE_FEATURES` is at `src/renderer/stores/settingsStore.ts:110` — currently `{ directorNotes: false }`
+- The settings store hydration merges saved values with defaults at `settingsStore.ts:1669-1673` using spread: `{ ...DEFAULT_ENCORE_FEATURES, ...(saved) }` — so new fields with defaults are safe
+- Both type AND default MUST be updated in the same task to avoid runtime `undefined`
+
+## Tasks
+
+- [x] In `src/renderer/types/index.ts`, find the `EncoreFeatureFlags` interface at line 906. Add `unifiedInbox: boolean` below `directorNotes`. Also in `src/renderer/stores/settingsStore.ts`, find `DEFAULT_ENCORE_FEATURES` at line 110. Add `unifiedInbox: false` to the object. Both changes must happen together:
+ ```typescript
+ // types/index.ts:906
+ export interface EncoreFeatureFlags {
+ directorNotes: boolean;
+ unifiedInbox: boolean;
+ }
+
+ // stores/settingsStore.ts:110
+ export const DEFAULT_ENCORE_FEATURES: EncoreFeatureFlags = {
+ directorNotes: false,
+ unifiedInbox: false,
+ };
+ ```
+
+- [x] Run `npm run lint` to verify the new field doesn't cause type errors. Existing code spreading `encoreFeatures` will pick up the new field automatically via the default merge at line 1669-1673.
+
+## Gate
+- `npm run lint` passes
+- `EncoreFeatureFlags` has both `directorNotes` and `unifiedInbox` fields
+- `DEFAULT_ENCORE_FEATURES` has `unifiedInbox: false`
diff --git a/playbooks/agent-inbox/2026-02-26-Encore-Inbox-Refactor/ENCORE-INBOX-04.md b/playbooks/agent-inbox/2026-02-26-Encore-Inbox-Refactor/ENCORE-INBOX-04.md
new file mode 100644
index 000000000..cf795537a
--- /dev/null
+++ b/playbooks/agent-inbox/2026-02-26-Encore-Inbox-Refactor/ENCORE-INBOX-04.md
@@ -0,0 +1,46 @@
+# ENCORE-INBOX-04: Port useAgentInbox hook and AgentInbox components
+
+## Objective
+Port the data hook and all 3 component files from `feature/inbox-focus-polish` into the current codebase, adapting imports to the new architecture.
+
+## Context
+- Source branch: `feature/inbox-focus-polish`
+- Files to port:
+ - `src/renderer/hooks/useAgentInbox.ts` — data aggregation hook
+ - `src/renderer/components/AgentInbox/index.tsx` — modal shell + view switching
+ - `src/renderer/components/AgentInbox/InboxListView.tsx` — virtualized list view
+ - `src/renderer/components/AgentInbox/FocusModeView.tsx` — focus mode detail view
+- The new codebase uses `settingsStore.ts` (Zustand) instead of prop-drilling settings
+- `useModalLayer` hook and `MODAL_PRIORITIES` still exist in the same locations
+- `modalStore` still exists at `src/renderer/stores/modalStore.ts`
+- `formatRelativeTime` is at `src/renderer/utils/formatters.ts`
+
+## Tasks
+
+- [x] Create `src/renderer/hooks/useAgentInbox.ts` by extracting from old branch: `git show feature/inbox-focus-polish:src/renderer/hooks/useAgentInbox.ts`. Copy the full content. Verify imports: `Session`, `Group` from `../types`, `InboxItem`, `InboxFilterMode`, `InboxSortMode` from `../types/agent-inbox`. These should resolve since Phase 01 created the types file. Run `npm run lint` to check.
+
+- [x] Create the directory `src/renderer/components/AgentInbox/` and port all 3 component files. For each, extract from old branch and copy:
+ 1. `git show feature/inbox-focus-polish:src/renderer/components/AgentInbox/index.tsx` → `src/renderer/components/AgentInbox/index.tsx`
+ 2. `git show feature/inbox-focus-polish:src/renderer/components/AgentInbox/InboxListView.tsx` → `src/renderer/components/AgentInbox/InboxListView.tsx`
+ 3. `git show feature/inbox-focus-polish:src/renderer/components/AgentInbox/FocusModeView.tsx` → `src/renderer/components/AgentInbox/FocusModeView.tsx`
+ After copying, verify all imports resolve. Key imports to check:
+ - `../../types` should export `Theme`, `Session`, `Group`, `ThinkingMode`, `LogEntry`
+ - `../../types/agent-inbox` should export all inbox types (from Phase 01)
+ - `../../hooks/useAgentInbox` should resolve (created above)
+ - `../../hooks/ui/useModalLayer` — verify this exists: `ls src/renderer/hooks/ui/useModalLayer*`
+ - `../../constants/modalPriorities` — verify: `grep -n "AGENT_INBOX" src/renderer/constants/modalPriorities.ts`. If `AGENT_INBOX` doesn't exist in priorities, add it (use priority 555, same as old branch)
+ - `../../stores/modalStore` — verify `selectModalData` is exported
+ - `../../utils/formatters` — verify `formatRelativeTime` is exported
+ - The ported `InboxListView.tsx` uses `react-window` for virtualization, but this dependency does NOT exist in the project. The codebase already uses `@tanstack/react-virtual` (used by Director's Notes `UnifiedHistoryTab.tsx`). After copying the files, replace ALL `react-window` imports with `@tanstack/react-virtual` equivalents. Specifically: replace `import { FixedSizeList } from 'react-window'` (or similar) with `import { useVirtualizer } from '@tanstack/react-virtual'` and refactor the list rendering to use the `useVirtualizer` hook pattern (see `src/renderer/components/DirectorNotes/UnifiedHistoryTab.tsx` lines 201-221 for reference). This avoids adding an unnecessary dependency.
+ - `../../utils/markdownConfig` — verify `generateTerminalProseStyles` exists
+ - `../../components/MarkdownRenderer` — verify exists
+ **Notes:** react-window → @tanstack/react-virtual migration completed. Added `agentInbox` to ModalId type, AgentInboxModalData interface, ModalDataMap, and getModalActions() in modalStore.ts. AGENT_INBOX priority added at 555 in modalPriorities.ts.
+
+- [x] Run `npm run lint` and fix any import resolution errors. Common issues: renamed types, moved hooks, missing re-exports. Fix each error by finding the new location of the imported symbol.
+ **Notes:** Fixed 2 type narrowing issues in index.tsx (filterMode/sortMode from ModalData needed explicit casts to InboxFilterMode/InboxSortMode). Lint passes clean.
+
+## Gate
+- `src/renderer/hooks/useAgentInbox.ts` exists
+- `src/renderer/components/AgentInbox/` directory has 3 files: `index.tsx`, `InboxListView.tsx`, `FocusModeView.tsx`
+- `npm run lint` passes (zero errors)
+- `AGENT_INBOX` priority registered in `modalPriorities.ts`
diff --git a/playbooks/agent-inbox/2026-02-26-Encore-Inbox-Refactor/ENCORE-INBOX-05.md b/playbooks/agent-inbox/2026-02-26-Encore-Inbox-Refactor/ENCORE-INBOX-05.md
new file mode 100644
index 000000000..5e27ac1b6
--- /dev/null
+++ b/playbooks/agent-inbox/2026-02-26-Encore-Inbox-Refactor/ENCORE-INBOX-05.md
@@ -0,0 +1,61 @@
+# ENCORE-INBOX-05: Integrate Unified Inbox into App.tsx (modal + state + Encore gating)
+
+## Objective
+Wire the Unified Inbox modal into App.tsx with Encore Feature gating, following the Director's Notes pattern exactly.
+
+## Context
+- App.tsx is at `src/renderer/App.tsx` (6,563 lines post-refactor)
+- Director's Notes pattern to mirror:
+ - Line 46-47: lazy import `const DirectorNotesModal = lazy(() => import('./components/DirectorNotes')...)`
+ - Line 356-357: modal state from `useModalActions()` — `directorNotesOpen, setDirectorNotesOpen`
+ - Line 508: `encoreFeatures` destructured from settings
+ - Line 5220: conditional setter for SessionList: `setDirectorNotesOpen: encoreFeatures.directorNotes ? setDirectorNotesOpen : undefined`
+ - Line 5634: conditional handler for QuickActions: `encoreFeatures.directorNotes ? () => setDirectorNotesOpen(true) : undefined`
+ - Line 6017: gated modal render: `{encoreFeatures.directorNotes && directorNotesOpen && (