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.
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:
Recipe.Release) — only shown to eligible usersCons:
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.
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.
Option A as primary navigation. Optionally add a Dashboard widget (Option C) later for release status overview.
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.
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:
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:
#### 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:
#### Page states
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.
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:
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.
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."] │
│ │
└────────────────────────────────────────────────────────────────────┘
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:
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] │
│ │
└────────────────────────────────────────────────────────────────────┘
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] │
│ │
└────────────────────────────────────────────────────────────────────┘
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
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
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)"
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
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
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
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"
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
Per IA §9:
Mobile-specific adjustments:
Pattern (per IA §7):
requiredCapability: "Recipe.Release" to route definitionsProtectedRoute handles redirect for unauthorized direct URL accessPer IA §8:
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").
For each page in the Release Manager:
/ws/:workspaceId/releases/*ErrorState with retryRecipe.Release on route definitionPageHeader patternuseWorkspacePath() for linksuseFetch / useMutate patternlazyComponents.ts