← Back to Release Manager
UX Specification

Release Manager

UX Research AzDO #4008

UX Research: Recipe Release Manager

2026-05-05
Contents
  1. 1. Design Goals
  2. 2. Where Does Release Manager Live?
  3. 3. Route Structure
  4. 4. Page Wireframes
  5. 5. User Flows (Mapped to IA Conventions)
  6. 6. Component Reuse & New Components
  7. 7. Responsive Behavior
  8. 8. Capability Gating
  9. 9. URL State Conventions
  10. 10. Edge Cases & Error Handling
  11. 11. Notifications & Real-time Updates
  12. 12. New Page Checklist (per IA §11)
  13. 13. Open Questions

UX Research: Recipe Release Manager

Date: 2026-05-05

Status: Draft

Spec: spec.md

Purpose: Explore how Release Manager surfaces in the UI — page structure, user flows, wireframes, and interaction patterns grounded in the existing Information Architecture.


1. Design Goals

| Goal | Rationale |
|------|-----------|
| **Confidence before release** | Users must clearly see what will be released, what passes/fails review, and why — before committing. |
| **Minimal clicks for the happy path** | Select recipe → review → release should be 3 actions max when everything is ready. |
| **Full traceability without clutter** | Release history is critical for compliance but must not overwhelm the primary release flow. |
| **Automation is configuration, not code** | Setting up auto-release and schedules must feel like filling a form, not programming a system. |
| **Consistent with existing IA** | Reuse app shell, workspace scoping, panel patterns, and component library — no new navigation paradigms. |

2. Where Does Release Manager Live?

Option A: Sidebar top-level item (Recommended)

Add a dedicated sidebar icon between Authoring and AI Tools:

┌──────┐
│ ◉ │ Home
├──────┤
│ ⊞ │ Dashboard
│ ✎ │ Authoring
│ 🚀 │ Release Manager ← NEW (capability-gated)
│ ✦ │ AI Tools [capability-gated]
├──────┤
│ ✉ │ Feedback
│ 👤 │ User avatar
└──────┘

Pros:

Cons:

Option B: Sub-section of Authoring

Accessible as a panel or tab within the Author View workbench.

Pros: Fewer sidebar items; stays contextual to content.

Cons: Overloads the Authoring page; release management has different data and flows than authoring; panel real estate is already tight.

Option C: Dashboard widget + dedicated page

Widget on Dashboard showing release status; clicking navigates to full page.

Pros: Surfaces release state on landing page.

Cons: Still needs a full page somewhere — widget alone is insufficient. Could be additive with Option A.

Recommendation

Option A as primary navigation. Optionally add a Dashboard widget (Option C) later for release status overview.


3. Route Structure

All routes workspace-scoped per IA convention:

/ws/:workspaceId/releases/
├── (index) → Release Manager landing (recipe list + quick actions)
├── review/:recipeId → Release Review detail for a recipe
├── history → Release history (cross-recipe, filterable)
├── history/:releaseId → Single release record detail
├── schedules → Schedule management
│ └── :scheduleId → Schedule detail + bindings
└── configuration → Release configuration (per-recipe settings)
 └── :recipeId → Recipe release configuration detail

Capability gate: All /releases/* routes require Recipe.Release capability. If the user lacks the capability, the sidebar item is hidden and direct URL access shows the standard access-denied state.


4. Page Wireframes

4.1 Release Manager Landing

Route: /ws/:workspaceId/releases/

Purpose: Overview of recipes and their release readiness. Primary entry point.

┌────────────────────────────────────────────────────────────────────┐
│ [Page header: "Release Manager" [+ Schedule] [⚙ Config] ] │
├────────────────────────────────────────────────────────────────────┤
│ │
│ [Search / filter bar] [Filter: All | Ready | Needs Review] │
│ │
│ ┌────────────────────────────────────────────────────────────┐ │
│ │ Recipe Name │ Last Review │ Status │ Last Released │ │
│ ├──────────────────┼─────────────┼───────────┼────────────────┤ │
│ │ Service Manual │ 2h ago │ ✅ Ready │ Jan 15, 2026 │ │
│ │ Safety Guide │ 1d ago │ ⚠ 2 issues│ Dec 20, 2025 │ │
│ │ Parts Catalog │ never │ — pending │ never │ │
│ │ Quick Start v3 │ 3h ago │ ✅ Ready │ Jan 14, 2026 │ │
│ └────────────────────────────────────────────────────────────┘ │
│ │
│ [Click row → navigates to /releases/review/:recipeId] │
│ │
│ ┌─────────────────────────────────────────────────┐ │
│ │ Quick Actions (on selected / hovered row): │ │
│ │ [▶ Review] [🚀 Release] [📋 History] │ │
│ └─────────────────────────────────────────────────┘ │
│ │
└────────────────────────────────────────────────────────────────────┘

States:

Columns:

| Column | Source | Sortable |
|--------|--------|----------|
| Recipe Name | Recipe metadata | Yes |
| Last Review | Cached from most recent review run | Yes |
| Status | Derived from last review: Ready / N issues / Pending | Yes |
| Last Released | Most recent `ReleaseRecord.ReleasedAt` | Yes |
| Release Mode | Config: Manual / Auto / Scheduled | No (filter only) |

4.2 Release Review Detail

Route: /ws/:workspaceId/releases/review/:recipeId

Purpose: Deep readiness view. Multi-facet breakdown. Primary decision surface for the release workflow.

This is the most complex page in the Release Manager. Its job is to answer two questions for the user: *"Is this recipe ready to release?"* and *"If not, exactly what is wrong and where?"*. The page is structured so the user gets the answer to the first question immediately (the left summary panel), and the second question on demand (the right detail area).

#### Overall layout

The page is a fixed two-zone horizontal split. The left panel is a persistent summary that stays in place while the user browses facets on the right.

┌────────────────────────────────────────────────────────────────────────┐
│ [Breadcrumb: Release Manager > Service Manual] │
│ [Page header: "Release Review — Service Manual v2.1" │
│ [🚀 Release] [↻ Re-run]] │
├────────────────────┬───────────────────────────────────────────────────┤
│ │ │
│ REVIEW SUMMARY │ FACET DETAIL │
│ ──────────────── │ ───────────────────────────────────────────── │
│ │ │
│ Overall: ⚠ FAIL │ [Tab bar: Status | Profiling | Metadata | │
│ │ Languages | Relations] │
│ ┌──────────────┐ │ │
│ │ ✅ Status │ │ ┌───────────────────────────────────────────┐ │
│ │ ✅ Profiling │ │ │ Object │ Status │ Required │ │
│ │ ⚠ Metadata │ │ ├─────────────────────┼──────────┼──────────┤ │
│ │ ✅ Languages │ │ │ chapter-1.dita │ Approved │ ✅ │ │
│ │ ❌ Relations │ │ │ safety-warning.dita │ Draft │ ❌ │ │
│ └──────────────┘ │ │ diagram-3.svg │ Approved │ ✅ │ │
│ │ └───────────────────────────────────────────┘ │
│ Recipe items: 47 │ │
│ Passing: 45 │ [Pagination / virtual scroll for large sets] │
│ Failing: 2 │ │
│ │ ┌───────────────────────────────────────────┐ │
│ ──────────────── │ │ Issue Detail (expandable): │ │
│ Target: │ │ "safety-warning.dita is in Draft status. │ │
│ [QA ▾] [Prod ▾] │ │ Required: Approved or Released." │ │
│ │ └───────────────────────────────────────────┘ │
│ ──────────────── │ │
│ Last release: │ │
│ Jan 15 @ 14:30 │ │
│ by J. Smith │ │
│ │ │
├────────────────────┴───────────────────────────────────────────────────┤
│ [Release action bar — sticky bottom] │
│ Target: [Digital Delivery ▾] Tier: [Production ▾] [🚀 Release] │
└────────────────────────────────────────────────────────────────────────┘

#### Left panel — Review Summary (~250px fixed)

This panel shows the aggregated result and never scrolls away. It contains:

The Target/Tier selectors in the left panel are the *source of truth* for both the review evaluation and the release action. The sticky bottom bar echoes them and does not have its own independent pickers — it reads from the left panel state.

#### Right panel — Facet Detail (fills remaining width)

The right panel is a tabbed area, one tab per facet. The active tab is driven by which facet is selected in the left panel. Each tab shows:

Each facet tab has a slightly different column structure suited to what it checks:

| Facet tab | Columns shown |
|-----------|---------------|
| **Status** | Object name, Current status, Required status |
| **Profiling** | Object name, Missing profiles (list), Required profiles |
| **Metadata** | Object name, Missing fields (list), Required fields |
| **Languages** | Object name, Available languages, Required languages, Missing |
| **Relations** | Source object, Link/reference, Target, Resolution result |

#### Page header actions

#### Sticky bottom action bar

A persistent bar at the very bottom of the page (not inside either scroll zone). It contains:

Target: [Digital Delivery ▾] Tier: [Production ▾] [🚀 Release]

The selectors here are synced with the left panel — changing one updates the other. The Release button label and state adapt based on the current review result and the selected tier:

| Review result | Tier | Force enabled | Button |
|---------------|------|---------------|--------|
| Pass | Any | Any | Primary: **Release** |
| Fail | QA | Always | Warning: **Force Release (QA)** |
| Fail | Production | Yes (config) | Warning: **Force Release** |
| Fail | Production | No (default) | Disabled — tooltip: "Resolve N issues before releasing" |
| Review in progress | Any | Any | Disabled — spinner |

#### Page states

| State | What the user sees |
|-------|--------------------|
| **Loading (first load)** | Left panel skeleton + right panel skeleton. Review begins automatically. |
| **Review running (re-run)** | Left panel shows previous result with a "Refreshing…" indicator. Right panel shows a progress indicator if evaluation is slow (e.g., "Evaluating 120 / 340 objects"). |
| **Review complete — pass** | Overall badge: ✅ READY. Release button enabled. |
| **Review complete — fail** | Overall badge: ❌ FAIL. Failing facets highlighted. Release button disabled or force-release variant based on tier + config. |
| **Review complete — N/A facets** | Facets that do not apply to the recipe's content types show as ⊘ N/A (not failed). For example, a recipe with no translations shows Languages as N/A. |
| **Error (review call failed)** | Standard error state with retry in the right panel. Left panel shows stale result if available, marked as "review failed — showing previous result". |

4.3 Release Confirmation Dialog

Trigger: Clicking "Release" or "Force Release" from the review page.

┌─────────────────────────────────────────────────────────┐
│ Release Confirmation [✕] │
├─────────────────────────────────────────────────────────┤
│ │
│ Recipe: Service Manual v2.1 │
│ Target: Digital Delivery │
│ Tier: Production │
│ Items: 47 objects + 1 recipe │
│ Review: ✅ Passed (or ⚠ Forced) │
│ │
│ [If forced release:] │
│ ┌───────────────────────────────────────────────┐ │
│ │ Reason for force release (required): │ │
│ │ ┌───────────────────────────────────────────┐ │ │
│ │ │ Customer deadline requires immediate... │ │ │
│ │ └───────────────────────────────────────────┘ │ │
│ └───────────────────────────────────────────────┘ │
│ │
│ ⚠ This will trigger the delivery pipeline. │
│ This action cannot be undone (but can be rolled back). │
│ │
│ [Cancel] [Confirm Release] │
└─────────────────────────────────────────────────────────┘

Component: Radix UI AlertDialog (destructive confirmation pattern per IA §4.5).

Force release reason: Required text input, minimum 10 characters, recorded in ReleaseRecord.ForceReleaseReason.


4.4 Release History

Route: /ws/:workspaceId/releases/history

Purpose: Cross-recipe traceability view. Filterable timeline.

┌────────────────────────────────────────────────────────────────────┐
│ [Page header: "Release History"] │
├────────────────────────────────────────────────────────────────────┤
│ │
│ [Filter bar] │
│ Recipe: [All ▾] Target: [All ▾] Tier: [All ▾] │
│ Date range: [Last 30 days ▾] Type: [All | Manual | Auto | Rollback] │
│ │
│ ┌────────────────────────────────────────────────────────────┐ │
│ │ Time │ Recipe │ Target │ Tier │ Type │ │
│ ├─────────────────┼────────────────┼─────────┼──────┼────────┤ │
│ │ Jan 15 14:30 │ Service Manual │ Digital │ Prod │ Manual │ │
│ │ Jan 15 14:25 │ Service Manual │ Digital │ QA │ Manual │ │
│ │ Jan 14 09:00 │ Quick Start v3 │ PDF │ Prod │ Sched. │ │
│ │ Jan 13 15:00 │ Parts Catalog │ Digital │ Prod │ Auto │ │
│ │ Jan 13 14:58 │ Safety Guide │ Digital │ Prod │ ❌ Dec. │ │
│ └────────────────────────────────────────────────────────────┘ │
│ │
│ [Click row → /releases/history/:releaseId detail view] │
│ │
│ [Toggle: Include decisions] (shows ReleaseDecisionRecords) │
│ │
└────────────────────────────────────────────────────────────────────┘

Visual differentiation:


4.5 Release Record Detail

Route: /ws/:workspaceId/releases/history/:releaseId

Purpose: Full audit detail for a single release.

┌────────────────────────────────────────────────────────────────────┐
│ [Breadcrumb: Release Manager > History > Release #abc123] │
│ [Page header: "Release — Service Manual v2.1" [↩ Rollback]] │
├────────────────────────────────────────────────────────────────────┤
│ │
│ ┌──────────────────────────────────────────────────────────┐ │
│ │ RELEASE CONTEXT │ │
│ │ ──────────────────────────────────────────── │ │
│ │ Recipe: Service Manual v2.1 │ │
│ │ Target: Digital Delivery │ │
│ │ Tier: Production │ │
│ │ Type: Manual │ │
│ │ Released at: Jan 15, 2026 14:30 UTC │ │
│ │ Released by: J. Smith │ │
│ │ Forced: No │ │
│ │ Pipeline: ✅ Initiated (correlation: xyz789) │ │
│ └──────────────────────────────────────────────────────────┘ │
│ │
│ ┌──────────────────────────────────────────────────────────┐ │
│ │ REVIEW SUMMARY AT TIME OF RELEASE │ │
│ │ ──────────────────────────────────────────── │ │
│ │ ✅ Status ✅ Profiling ✅ Metadata │ │
│ │ ✅ Languages ✅ Relations │ │
│ └──────────────────────────────────────────────────────────┘ │
│ │
│ ┌──────────────────────────────────────────────────────────┐ │
│ │ RELEASED ITEMS (48) [Search] │ │
│ │ ──────────────────────────────────────────── │ │
│ │ Object ID │ Type │ Version │ Revision │ │
│ │ chapter-1.dita │ DITA │ v2.1 │ rev-003 │ │
│ │ safety-warning.dita │ DITA │ v1.0 │ rev-012 │ │
│ │ diagram-3.svg │ Gfx │ v2.1 │ rev-001 │ │
│ │ ... (48 items, paginated) │ │
│ └──────────────────────────────────────────────────────────┘ │
│ │
│ [Rollback section — only if this is the latest release:] │
│ ┌──────────────────────────────────────────────────────────┐ │
│ │ [↩ Roll back to previous release] │ │
│ │ Previous: Release #def456 (Jan 14, 2026 09:00) │ │
│ └──────────────────────────────────────────────────────────┘ │
│ │
└────────────────────────────────────────────────────────────────────┘

Rollback button: Only shown when:

Clicking "Roll back" opens an AlertDialog confirmation.


4.6 Schedules Page

Route: /ws/:workspaceId/releases/schedules

Purpose: Manage recurring release schedules and their recipe bindings.

┌────────────────────────────────────────────────────────────────────┐
│ [Page header: "Release Schedules" [+ New Schedule]] │
├────────────────────────────────────────────────────────────────────┤
│ │
│ ┌────────────────────────────────────────────────────────────┐ │
│ │ Name │ Frequency │ Next Run │ Recipes │ │
│ ├──────────────────┼─────────────────┼──────────┼───────────┤ │
│ │ Daily 15:00 │ Weekdays 15:00 │ Tomorrow │ 3 bound │ │
│ │ Weekly Friday │ Fridays 18:00 │ Jan 17 │ 1 bound │ │
│ └────────────────────────────────────────────────────────────┘ │
│ │
│ [Empty state: "No schedules configured. Create one to │
│ automate recurring releases."] │
│ │
└────────────────────────────────────────────────────────────────────┘

4.6a Schedule Detail / Edit

Route: /ws/:workspaceId/releases/schedules/:scheduleId

┌────────────────────────────────────────────────────────────────────┐
│ [Breadcrumb: Release Manager > Schedules > Daily 15:00] │
│ [Page header: "Daily 15:00" [Enable/Disable toggle] [Delete]] │
├────────────────────────────────────────────────────────────────────┤
│ │
│ ┌──────────────────────────────────────────────┐ │
│ │ SCHEDULE SETTINGS │ │
│ │ ────────────────────── │ │
│ │ Name: [Daily 15:00 ] │ │
│ │ Days: [☑ Mon ☑ Tue ☑ Wed ☑ Thu ☑ Fri] │ │
│ │ Time: [15:00 ] │ │
│ │ Timezone: Europe/Berlin (workspace) │ │
│ │ Target: [Digital Delivery ▾] │ │
│ │ Tier: [Production ▾] │ │
│ │ │ │
│ │ [Save Changes] │ │
│ └──────────────────────────────────────────────┘ │
│ │
│ ┌──────────────────────────────────────────────────────────────┐ │
│ │ BOUND RECIPES [+ Bind] │ │
│ │ ────────────────────── │ │
│ │ Recipe │ Version Scope │ Enabled │ Actions │ │
│ │ Service Manual │ All versions │ ✅ │ [Edit][✕] │ │
│ │ Quick Start v3 │ v3.0 only │ ✅ │ [Edit][✕] │ │
│ │ Parts Catalog │ v2.0, v2.1 │ ⬚ │ [Edit][✕] │ │
│ └──────────────────────────────────────────────────────────────┘ │
│ │
│ ┌──────────────────────────────────────────────────────────────┐ │
│ │ RECENT RUNS │ │
│ │ ────────────────────── │ │
│ │ Jan 15 15:00 │ 2 released, 1 skipped │ [View details] │ │
│ │ Jan 14 15:00 │ 3 released │ [View details] │ │
│ │ Jan 13 15:00 │ ⚠ Missed (outage) │ │ │
│ └──────────────────────────────────────────────────────────────┘ │
│ │
└────────────────────────────────────────────────────────────────────┘

"+ Bind" action: Opens a dialog to:


4.7 Release Configuration Page

Route: /ws/:workspaceId/releases/configuration

Purpose: Per-recipe release mode and auto-release criteria setup.

┌────────────────────────────────────────────────────────────────────┐
│ [Page header: "Release Configuration"] │
├────────────────────────────────────────────────────────────────────┤
│ │
│ ┌────────────────────────────────────────────────────────────┐ │
│ │ Recipe │ Mode │ Auto Criteria │ Status │ │
│ ├───────────────────┼──────────────┼───────────────┼─────────┤ │
│ │ Service Manual │ Manual Only │ — │ Active │ │
│ │ Quick Start v3 │ Automatic │ 2 rules │ Active │ │
│ │ Parts Catalog │ Scheduled │ — │ Active │ │
│ └────────────────────────────────────────────────────────────┘ │
│ │
│ [Click row → /releases/configuration/:recipeId] │
│ │
└────────────────────────────────────────────────────────────────────┘

4.7a Recipe Configuration Detail

Route: /ws/:workspaceId/releases/configuration/:recipeId

┌────────────────────────────────────────────────────────────────────┐
│ [Breadcrumb: Release Manager > Configuration > Service Manual] │
│ [Page header: "Service Manual — Release Config" [Save]] │
├────────────────────────────────────────────────────────────────────┤
│ │
│ RELEASE MODE │
│ ───────────── │
│ (●) Manual Only — releases require explicit user action │
│ ( ) Automatic — release when change criteria are met │
│ ( ) Scheduled Only — release only via bound schedules │
│ │
│ [Shown when Automatic is selected:] │
│ ┌──────────────────────────────────────────────────────────┐ │
│ │ AUTO-RELEASE CRITERIA │ │
│ │ ────────────────────── │ │
│ │ Trigger when: │ │
│ │ ☑ A previously released object is updated │ │
│ │ ☑ New objects are added to the recipe │ │
│ │ ☐ New language translations become ready │ │
│ └──────────────────────────────────────────────────────────┘ │
│ │
│ READINESS REQUIREMENTS │
│ ────────────────────── │
│ Required status: [Approved ▾] │
│ Required languages: [EN ☑] [DE ☑] [FR ☐] [+ Add] │
│ │
└────────────────────────────────────────────────────────────────────┘

5. User Flows (Mapped to IA Conventions)

Flow A: Manual Release (Happy Path)

User clicks "Release Manager" (🚀) in sidebar
 → /ws/{workspaceId}/releases/
 → recipe list loads with review status
 → user clicks a recipe row (or "Review" quick action)
 → /ws/{workspaceId}/releases/review/{recipeId}
 → review runs automatically on page load
 → all facets pass → overall status: ✅ READY
 → user selects target (Digital Delivery) and tier (Production)
 → clicks [🚀 Release]
 → AlertDialog: confirmation with release summary
 → clicks [Confirm Release]
 → mutation fires → ReleaseRecord created → pipeline triggered
 → success toast: "Release initiated for Service Manual → Digital Delivery (Production)"
 → user stays on review page (updated to show "Last released: just now")
 → OR navigates to history automatically

Flow B: Failed Review → Fix → Re-review → Release

User opens review page for a recipe
 → review runs → 2 facets fail (Metadata, Relations)
 → left sidebar shows ⚠ Metadata, ❌ Relations
 → user clicks "Metadata" tab → sees which objects lack required fields
 → user notes the items, navigates to Authoring to fix them
 → fixes metadata on the objects
 → returns to /ws/{workspaceId}/releases/review/{recipeId}
 → clicks [↻ Re-run]
 → review re-evaluates → now passes
 → proceeds to release

Flow C: Force Release (Production, Enabled)

User opens review page → review fails
 → release button shows: [⚠ Force Release]
 → user clicks [⚠ Force Release]
 → AlertDialog with force-release reason field (required, min 10 chars)
 → user types: "Critical customer deadline — metadata fix scheduled for next week"
 → clicks [Confirm Force Release]
 → ReleaseRecord created with IsForcedRelease=true, ForceReleaseReason stored
 → success toast: "Force release initiated (reason recorded)"

Flow D: QA Release (Always Force-Allowed)

User opens review page → review fails
 → user switches tier selector to "QA"
 → release button shows: [Force Release (QA)] — always available
 → clicks → no reason required for QA
 → release completes to QA target

Flow E: Configure Auto-Release

User clicks "Configuration" in Release Manager sub-nav
 → /ws/{workspaceId}/releases/configuration
 → list of recipes with current mode
 → user clicks "Quick Start v3"
 → /ws/{workspaceId}/releases/configuration/{recipeId}
 → selects "Automatic" mode
 → auto-release criteria section appears
 → checks "Previously released object updated" + "New objects added"
 → clicks [Save]
 → configuration saved
 → when matching changes occur, system auto-evaluates and releases

Flow F: Create and Configure a Schedule

User clicks "Schedules" in Release Manager sub-nav
 → /ws/{workspaceId}/releases/schedules
 → clicks [+ New Schedule]
 → Dialog: schedule form
 → name: "Daily 15:00"
 → days: Mon–Fri checked
 → time: 15:00
 → target: Digital Delivery
 → tier: Production
 → clicks [Create]
 → schedule created → appears in list
 → clicks schedule row → detail page
 → clicks [+ Bind] in bound recipes section
 → Dialog: recipe search + select
 → selects "Service Manual"
 → version scope: "All versions"
 → clicks [Bind]
 → binding created → recipe appears in bound list

Flow G: Rollback a Release

User opens /ws/{workspaceId}/releases/history
 → finds the latest release for "Service Manual → Digital Delivery (Production)"
 → clicks row → /ws/{workspaceId}/releases/history/{releaseId}
 → sees release detail with rollback section
 → clicks [↩ Roll back to previous release]
 → AlertDialog: "Roll back to release from Jan 14, 2026 09:00?
 This will create a new rollback release record and
 trigger the delivery pipeline."
 → clicks [Confirm Rollback]
 → new ReleaseRecord (type: Rollback) created
 → pipeline triggered with previous snapshot
 → success toast: "Rollback release initiated"

Flow H: View Release History

User clicks "History" in Release Manager sub-nav
 → /ws/{workspaceId}/releases/history
 → filterable table loads
 → user sets filter: Recipe = "Service Manual", last 90 days
 → sees all releases + decisions for that recipe
 → toggles "Include decisions" to see no-release decision records
 → clicks a release row → detail view
 → sees full released item set with version identifiers

6. Component Reuse & New Components

Existing components to reuse

| Component | Used where |
|-----------|-----------|
| Page Header | All Release Manager pages (per IA §4.1) |
| Empty State | Recipe list when no recipes exist (per IA §4.2) |
| Error State | All data-fetching failure states (per IA §4.3) |
| Loading Skeletons | Each page and panel needs a skeleton (per IA §4.4) |
| AlertDialog | Release confirmation, rollback confirmation, force-release (per IA §4.5) |
| Dialog | Schedule create/edit, bind recipe, configuration edit (per IA §4.5) |
| Data tables | Recipe list, history list, released items list |
| Filter bar | History filters, recipe list filters |
| Breadcrumb | Navigation within Release Manager sub-pages |
| Capability gate | `Recipe.Release` on all `/releases/*` routes |

New components needed

| Component | Purpose |
|-----------|---------|
| `FacetStatusIndicator` | Pass/fail/warning icon + label for a review facet |
| `ReviewSummaryPanel` | Left sidebar aggregation of facet results + stats |
| `FacetDetailTab` | Tabbed content showing per-object status for one facet |
| `ReleaseTargetSelector` | Dropdown pair: delivery target + release tier |
| `ScheduleForm` | Day-of-week checkboxes + time picker + target/tier |
| `ScheduleBindingDialog` | Recipe search + version scope selector |
| `ReleaseModeRadioGroup` | Manual / Automatic / Scheduled radio with conditional criteria |
| `ForceReleaseReasonInput` | Required text input with minimum length validation |

7. Responsive Behavior

Per IA §9:

| Breakpoint | Layout |
|------------|--------|
| Desktop (≥768px) | Full two-zone layout on review page; table views with all columns |
| Mobile (<768px) | Single-column stacked; review summary collapses above facet detail; table columns reduced to name + status + action |

Mobile-specific adjustments:


8. Capability Gating

| Capability | Protects |
|------------|----------|
| `Recipe.Release` | All `/releases/*` routes and sidebar item visibility |

Pattern (per IA §7):


9. URL State Conventions

Per IA §8:

| State | Mechanism | Example |
|-------|-----------|---------|
| Active workspace | URL path | `/ws/:workspaceId/releases/` |
| Selected recipe (review) | URL path | `/releases/review/:recipeId` |
| Release record (detail) | URL path | `/releases/history/:releaseId` |
| Schedule detail | URL path | `/releases/schedules/:scheduleId` |
| History filters | URL search params | `?recipe=abc&tier=Production&from=2026-01-01` |
| Decisions toggle | URL search param | `?includeDecisions=true` |

History filter state in URL allows deep-linking filtered views (e.g., "show me all Production releases for Service Manual in the last 30 days").


10. Edge Cases & Error Handling

| Scenario | UX Behavior |
|----------|-------------|
| Concurrent release attempt | Toast error: "A release is already in progress for this recipe and target. Try again shortly." Release button temporarily disabled. |
| Pipeline initiation failure | Release record created, but warning banner: "Release recorded but delivery pipeline failed to start. Contact support." Pipeline status shown as ❌ in release detail. |
| Recipe references deleted object | Review facet "Relations" fails with: "Object {id} referenced by node {name} does not exist." |
| Release target unavailable | AlertDialog error when confirming: "Digital Delivery target is currently unavailable. Release cannot proceed." |
| Missed scheduled run | Schedule detail shows ⚠ "Missed" entry in recent runs with timestamp. Next run proceeds normally. |
| No previous release for rollback | Rollback button disabled with tooltip: "No previous release exists for this recipe and target." |
| Very large recipe (500+ objects) | Released items table uses virtual scrolling. Review runs with progress indicator ("Evaluating 347/500 objects..."). |
| Force release disabled + review fails | Release button disabled. Tooltip: "Resolve 3 issues to release. Force release is not enabled for this workspace." |

11. Notifications & Real-time Updates

| Event | Notification |
|-------|-------------|
| Release completed | Toast in-app + status bar update. SignalR push to other users viewing same recipe. |
| Scheduled release completed | Notification bell / banner for eligible users. |
| Scheduled release failed | Warning notification to eligible users. |
| Release review re-run complete | Review page updates in-place (no navigation). |
| Auto-release triggered | Toast: "Auto-release triggered for {recipe} → {target}" |

12. New Page Checklist (per IA §11)

For each page in the Release Manager:


13. Open Questions

| # | Question | Impact |
|---|----------|--------|
| 1 | Should the Release Manager landing also show a "dashboard" summary (releases today, pending reviews, upcoming schedules)? | Could add a summary cards row above the recipe table, similar to Dashboard widgets. |
| 2 | Should release review run automatically on page load, or require an explicit "Run Review" click? | Auto-run is faster for the happy path; explicit gives user control over when to evaluate (relevant if review is slow for large recipes). |
| 3 | Should there be a batch-release flow (select multiple recipes, release all at once)? | The spec supports single-recipe release. Batch release would need additional UX for partial failures. |
| 4 | Should the review page link directly to failing objects in Authoring (deep link to object-authoring)? | Would accelerate fix cycles. Requires building cross-feature deep links. |
| 5 | How should the release button behave while a release is in-flight? | Options: disabled + spinner until pipeline initiation confirmed; or optimistic (navigate away, notify on completion). |
| 6 | Should schedule configuration support cron expressions for power users, or only the day+time picker? | Cron is more flexible but harder to validate and explain. Day+time covers the stated use case. |
| 7 | Should the configuration page be merged into the review page as a side panel or tab? | Keeps everything in one place but adds complexity to the review page. |