← Back to Review tool
UX Specification

Review tool

2 documents
UX Specification AzDO #4024

UX Specification: Review Assignment & Orchestration

049-review-assignment-orchestration2026-05-13Scope: Content manager orchestration flows only. Reviewer-facing experience (per-Object feedback, reviewer dashboard) is covered by Spec B/D.
Contents
  1. 1. Feature Placement in Information Architecture
  2. 2. Pages & Components Affected
  3. 3. Work Package Detail — Review Rounds Tab
  4. 4. Review Groups Management (Admin Portal)
  5. 5. Delegation Flow (Reviewer-Initiated)
  6. 6. Notification Touchpoints
  7. 7. UI States (5-State Model)
  8. 8. Capability Gating
  9. 9. URL State
  10. 10. Interaction Patterns Summary
  11. 11. Responsive Behavior
  12. 12. Integration with Existing Patterns
  13. 13. Data Fetching
  14. 14. Out of Scope (Spec B/D — Reviewer Experience)

UX Specification: Review Assignment & Orchestration

Spec: 049-review-assignment-orchestration

Created: 2026-05-13

Status: Draft

Scope: Content manager orchestration flows only. Reviewer-facing experience (per-Object feedback, reviewer dashboard) is covered by Spec B/D.


1. Feature Placement in Information Architecture

Review orchestration surfaces in two distinct locations:

| Surface | Route | Purpose | Capability |
|---------|-------|---------|------------|
| Review Rounds | `/ws/:workspaceId/work-packages/:workPackageId` (Review Rounds tab) | Create, configure, activate, close/cancel review rounds within a Work Package | `ReviewRound.Manage` |
| Review Groups | `/c/:customerId/ws/:workspaceId/review-groups` | Workspace-level persistent reviewer groups with metadata criteria | `ReviewGroup.Manage` |

Navigation entry points:

Relationship to Work Package page (from WP UX research):


2. Pages & Components Affected

| Page | Route | Impact |
|------|-------|--------|
| Work Package Detail | `/ws/:workspaceId/work-packages/:workPackageId` | Gains "Review Rounds" tab in tab bar |
| Work Package List | `/ws/:workspaceId/work-packages` | Review round status badge on WP cards (active round count) |
| Admin Portal — Review Groups | `/c/:customerId/ws/:workspaceId/review-groups` | New Review Groups configuration page in Admin Portal Configuration group (capability-gated) |
| Author View (Workbench) | `/ws/:workspaceId/authoring` | Objects in active review scope show review badge/indicator |
| (Future) Reviewer Dashboard | Spec B/D | Not in scope — mentioned for integration awareness |

3. Work Package Detail — Review Rounds Tab

3.1 Entry Point

The user navigates to a Work Package via the Work Packages page (/ws/:workspaceId/work-packages) — accessible from the sidebar (📋 icon). Clicking a Work Package row navigates to its detail page.

The Work Package detail page has a tab bar. The "Review Rounds" tab is added alongside existing tabs:

┌────────────────────────────────────────────────────────────────────┐
│ ← Back to list Work Package: "Q3 Safety Documentation Review" │
│ Status: ● In Progress Template: Work on Content │
│ Created by: content.manager@company.com | Due: 2026-06-15 │
├────────────────────────────────────────────────────────────────────┤
│ [Overview] [Actors] [Review Rounds] [Navigator] [Blockers] [Events]│
├────────────────────────────────────────────────────────────────────┤
│ │
│ ← Tab content renders here │
│ │
└────────────────────────────────────────────────────────────────────┘

The "Review Rounds" tab is visible only when the user has ReviewRound.Manage or a read-level review capability.

Quick access from the Work Package list:

On the Work Packages list page, each WP card/row shows a badge when active review rounds exist (e.g., "2 active rounds"). Clicking this badge deep-links to the Review Rounds tab directly.

┌──────────────────────────────────────────────────────────────────────┐
│ Title │ Status │ Template │ Reviews │ Updated│
├──────────────────────────────────────────────────────────────────────┤
│ Q3 Safety Review │ ● In Progress │ Work on Con │ 2 active│ 2h ago │
│ Translate Manual │ ● In Progress │ Translation │ — │ 1d ago │
│ Migrate PLM Data │ ○ Context Asm. │ Migration │ — │ 3d ago │
└──────────────────────────────────────────────────────────────────────┘

3.2 Review Rounds List (Tab Content)

┌─────────────────────────────────────────────────────────────────┐
│ Review Rounds [+ New Round] │
├─────────────────────────────────────────────────────────────────┤
│ │
│ ┌────────────────────────────────────────────────────────────┐ │
│ │ ● Active "Safety Content Review — DE" │ │
│ │ Scope: 12 Objects · 3 Reviewers · Due May 20 │ │
│ │ [View] [Close] │ │
│ └────────────────────────────────────────────────────────────┘ │
│ │
│ ┌────────────────────────────────────────────────────────────┐ │
│ │ ○ Pending "Hydraulic Procedures Review" │ │
│ │ Scope: 8 Objects · 2 Reviewers · Starts May 18 │ │
│ │ [View] [Activate] [Cancel] │ │
│ └────────────────────────────────────────────────────────────┘ │
│ │
│ ┌────────────────────────────────────────────────────────────┐ │
│ │ ✓ Closed "Initial Content Review" │ │
│ │ Closed May 10 · 5 Objects · 2/2 Reviewers completed │ │
│ │ [View] │ │
│ └────────────────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────┘

States:

Card status indicators:

| State | Indicator | Color |
|-------|-----------|-------|
| Pending | ○ hollow circle | Neutral/gray |
| Active | ● filled circle | Blue/primary |
| Closed | ✓ checkmark | Green/success |
| Cancelled | ✕ cross | Muted/gray |

Actions per state:

| State | Available Actions |
|-------|-------------------|
| Pending | View, Activate, Edit, Cancel |
| Active | View, Close, Cancel, Add Reviewers |
| Closed | View (read-only) |
| Cancelled | View (read-only) |

3.3 Create Review Round Dialog

Trigger: "+ New Round" button in Review Rounds tab

Component: Radix UI Dialog (modal), multi-step form

┌─────────────────────────────────────────────────────────────┐
│ Create Review Round [✕ Close] │
├─────────────────────────────────────────────────────────────┤
│ │
│ Step indicator: ① Scope ─ ② Assignment ─ ③ Schedule │
│ │
├─────────────────────────────────────────────────────────────┤
│ │
│ ┌─── STEP 1: SCOPE ─────────────────────────────────────┐ │
│ │ │ │
│ │ Round Name * │ │
│ │ ┌──────────────────────────────────────────────────┐ │ │
│ │ │ e.g. "Safety Content Review — DE" │ │ │
│ │ └──────────────────────────────────────────────────┘ │ │
│ │ │ │
│ │ Status Filter * │ │
│ │ ┌──────────────────────────────────────────────────┐ │ │
│ │ │ Review ▾ (select) │ │ │
│ │ └──────────────────────────────────────────────────┘ │ │
│ │ ⓘ Objects in this status will be included in scope │ │
│ │ │ │
│ │ Language Variant (optional) │ │
│ │ ┌──────────────────────────────────────────────────┐ │ │
│ │ │ Source language (default) ▾ (select) │ │ │
│ │ └──────────────────────────────────────────────────┘ │ │
│ │ │ │
│ │ Navigation Recipe (optional) │ │
│ │ ┌──────────────────────────────────────────────────┐ │ │
│ │ │ Inherit from Work Package ▾ (select) │ │ │
│ │ └──────────────────────────────────────────────────┘ │ │
│ │ ⓘ Provides reviewers with a structured tree view │ │
│ │ │ │
│ │ ☐ Enable status hold │ │
│ │ Prevents in-scope Objects from leaving the filter │ │
│ │ status while the round is active. │ │
│ │ │ │
│ │ Scope Preview: 12 Objects currently match │ │
│ │ [Show matching Objects ▸] │ │
│ │ │ │
│ └────────────────────────────────────────────────────────┘ │
│ │
├─────────────────────────────────────────────────────────────┤
│ [Cancel] [Next: Assignment →] │
└─────────────────────────────────────────────────────────────┘

Step 2: Assignment

┌─────────────────────────────────────────────────────────────┐
│ Create Review Round [✕ Close] │
├─────────────────────────────────────────────────────────────┤
│ Step indicator: ✓ Scope ─ ② Assignment ─ ③ Schedule │
├─────────────────────────────────────────────────────────────┤
│ │
│ ┌─── STEP 2: ASSIGNMENT ────────────────────────────────┐ │
│ │ │ │
│ │ Assignment Mode │ │
│ │ ┌────────────────────┐ ┌──────────────────────────┐ │ │
│ │ │ ○ Full-round │ │ ○ Per-Object │ │ │
│ │ │ All reviewers │ │ Assign specific │ │ │
│ │ │ see all Objects │ │ Objects to reviewers │ │ │
│ │ └────────────────────┘ └──────────────────────────┘ │ │
│ │ │ │
│ │ ── Direct Assignments ────────────────────────────── │ │
│ │ │ │
│ │ Add Reviewers │ │
│ │ ┌──────────────────────────────────────────────────┐ │ │
│ │ │ 🔍 Search users or groups... │ │ │
│ │ └──────────────────────────────────────────────────┘ │ │
│ │ │ │
│ │ ┌─ Assigned ────────────────────────────────────────┐ │ │
│ │ │ 👤 Anna Karlsson All Objects [✕] │ │ │
│ │ │ 👤 Björn Lindqvist All Objects [✕] │ │ │
│ │ └───────────────────────────────────────────────────┘ │ │
│ │ │ │
│ │ ── Review Groups (optional) ──────────────────────── │ │
│ │ │ │
│ │ ┌──────────────────────────────────────────────────┐ │ │
│ │ │ 🔍 Search review groups... │ │ │
│ │ └──────────────────────────────────────────────────┘ │ │
│ │ │ │
│ │ ┌─ Selected Groups ─────────────────────────────────┐ │ │
│ │ │ 👥 Safety Department criteria: reviewArea = │ │ │
│ │ │ "safety" [✕] │ │ │
│ │ │ ⓘ Will match ~8 Objects at activation │ │ │
│ │ └───────────────────────────────────────────────────┘ │ │
│ │ │ │
│ │ ⚠ 2 Objects have no reviewer assigned │ │
│ │ │ │
│ └────────────────────────────────────────────────────────┘ │
│ │
├─────────────────────────────────────────────────────────────┤
│ [← Back] [Cancel] [Next: Schedule →] │
└─────────────────────────────────────────────────────────────┘

Per-Object Assignment Mode (alternate view when "Per-Object" is selected):

┌─── Per-Object Assignment ─────────────────────────────────────┐
│ │
│ ┌─────────────────────────────────────────────────────────┐ │
│ │ Object │ Assigned Reviewer │ │
│ ├─────────────────────────────┼───────────────────────────┤ │
│ │ safety-warning.dita │ Anna Karlsson ▾ │ │
│ │ maintenance-proc.dita │ Anna Karlsson ▾ │ │
│ │ hydraulic-overview.dita │ Björn Lindqvist ▾ │ │
│ │ torque-specs.dita │ — Unassigned — ▾ │ │
│ └─────────────────────────────┴───────────────────────────┘ │
│ │
│ ⚠ 1 Object has no reviewer assigned │
│ │
└────────────────────────────────────────────────────────────────┘

Step 3: Schedule

┌─────────────────────────────────────────────────────────────┐
│ Create Review Round [✕ Close] │
├─────────────────────────────────────────────────────────────┤
│ Step indicator: ✓ Scope ─ ✓ Assignment ─ ③ Schedule │
├─────────────────────────────────────────────────────────────┤
│ │
│ ┌─── STEP 3: SCHEDULE ──────────────────────────────────┐ │
│ │ │ │
│ │ Start Date (optional) │ │
│ │ ┌──────────────────────────────────────────────────┐ │ │
│ │ │ 📅 Not set (activate manually) │ │ │
│ │ └──────────────────────────────────────────────────┘ │ │
│ │ ⓘ If set, round auto-activates at this date │ │
│ │ │ │
│ │ Due Date * │ │
│ │ ┌──────────────────────────────────────────────────┐ │ │
│ │ │ 📅 2026-05-20 │ │ │
│ │ └──────────────────────────────────────────────────┘ │ │
│ │ │ │
│ │ Reminder │ │
│ │ ┌──────────────────────────────────────────────────┐ │ │
│ │ │ 2 days before deadline ▾ (select) │ │ │
│ │ └──────────────────────────────────────────────────┘ │ │
│ │ │ │
│ │ On Expiry │ │
│ │ ┌────────────────────┐ ┌───────────┐ ┌────────────┐ │ │
│ │ │ ○ Auto-close │ │ ○ Escalate│ │ ○ No action│ │ │
│ │ └────────────────────┘ └───────────┘ └────────────┘ │ │
│ │ │ │
│ │ Escalation Recipient (if Escalate selected) │ │
│ │ ┌──────────────────────────────────────────────────┐ │ │
│ │ │ 🔍 Search users... │ │ │
│ │ └──────────────────────────────────────────────────┘ │ │
│ │ │ │
│ └────────────────────────────────────────────────────────┘ │
│ │
├─────────────────────────────────────────────────────────────┤
│ │
│ ┌─ Summary ──────────────────────────────────────────────┐ │
│ │ "Safety Content Review — DE" │ │
│ │ Scope: 12 Objects in "Review" status (DE) │ │
│ │ Reviewers: 3 (2 direct + Safety Dept group) │ │
│ │ Due: May 20, 2026 · Reminder: 2 days before │ │
│ │ Status hold: Enabled │ │
│ └────────────────────────────────────────────────────────┘ │
│ │
├─────────────────────────────────────────────────────────────┤
│ [← Back] [Cancel] [Create Round (Pending)] │
└─────────────────────────────────────────────────────────────┘

3.4 Review Round Detail View

Trigger: Clicking "View" on a review round card

Renders in: Replaces the Review Rounds list within the tab (inline navigation, URL updates with &round=id). Back button returns to the list.

┌─────────────────────────────────────────────────────────────────┐
│ ← Back to Rounds "Safety Content Review — DE" │
│ │
│ State: ● Active Due: May 20, 2026 (5 days remaining) │
│ Status hold: Enabled │
├─────────────────────────────────────────────────────────────────┤
│ [Scope] [Assignments] [Activity] │
├─────────────────────────────────────────────────────────────────┤
│ │
│ ┌─── SCOPE ─────────────────────────────────────────────────┐ │
│ │ │ │
│ │ Filter: Status = "Review" · Language = DE │ │
│ │ Recipe: "Safety Manual 2026" (navigation context) │ │
│ │ │ │
│ │ In-Scope Objects (12) │ │
│ │ ┌──────────────────────────────────────────────────────┐ │ │
│ │ │ Name │ Reviewer │ Status │ │ │
│ │ ├──────────────────────────┼─────────────────┼─────────┤ │ │
│ │ │ safety-warning.dita │ Anna K. │ — │ │ │
│ │ │ maintenance-proc.dita │ Anna K. │ — │ │ │
│ │ │ hydraulic-overview.dita │ Björn L. │ — │ │ │
│ │ │ torque-specs.dita │ Björn L. │ — │ │ │
│ │ │ ... │ │ │ │ │
│ │ └──────────────────────────┴─────────────────┴─────────┘ │ │
│ │ │ │
│ │ ⓘ Live scope — Objects leaving "Review" status are │ │
│ │ removed automatically (status hold prevents this) │ │
│ │ │ │
│ └────────────────────────────────────────────────────────────┘ │
│ │
├─────────────────────────────────────────────────────────────────┤
│ Actions: [Add Reviewers] [Close Round] [Cancel Round] │
└─────────────────────────────────────────────────────────────────┘

Assignments sub-tab:

┌─── ASSIGNMENTS ─────────────────────────────────────────────────┐
│ │
│ Direct Assignments │
│ ┌────────────────────────────────────────────────────────────┐ │
│ │ 👤 Anna Karlsson 6 Objects assigned Source: Direct│ │
│ │ 👤 Björn Lindqvist 4 Objects assigned Source: Direct│ │
│ └────────────────────────────────────────────────────────────┘ │
│ │
│ Group Assignments (resolved at activation) │
│ ┌────────────────────────────────────────────────────────────┐ │
│ │ 👥 Safety Department │ │
│ │ → 👤 Erik Holm 8 Objects (criteria match) │ │
│ └────────────────────────────────────────────────────────────┘ │
│ │
│ Delegations │
│ ┌────────────────────────────────────────────────────────────┐ │
│ │ 👤 Anna Karlsson → delegated 2 Objects to 👤 Maja Svensson│ │
│ │ Delegated: May 14, 2026 │ │
│ └────────────────────────────────────────────────────────────┘ │
│ │
│ ⚠ 2 Objects have no reviewer assigned │
│ │
│ [+ Add Reviewer] │
│ │
└──────────────────────────────────────────────────────────────────┘

Activity sub-tab:

┌─── ACTIVITY ─────────────────────────────────────────────────────┐
│ │
│ ┌─ Timeline ──────────────────────────────────────────────────┐ │
│ │ May 15, 10:32 Round activated by Content Manager │ │
│ │ May 15, 10:32 Notifications sent to 3 reviewers │ │
│ │ May 14, 15:00 Anna K. delegated 2 Objects to Maja S. │ │
│ │ May 16, 09:15 Object "torque-specs.dita" left scope │ │
│ │ (status changed from Review → Approved) │ │
│ │ May 16, 09:15 Notification sent to round manager │ │
│ └──────────────────────────────────────────────────────────────┘ │
│ │
└───────────────────────────────────────────────────────────────────┘

3.5 Activate Review Round Confirmation

Trigger: "Activate" button on a Pending review round

Component: Radix UI AlertDialog

┌─────────────────────────────────────────────────────────────┐
│ Activate Review Round? │
├─────────────────────────────────────────────────────────────┤
│ │
│ "Safety Content Review — DE" will become Active. │
│ Assigned reviewers will be notified immediately. │
│ │
│ Scope: 12 Objects match the current filter │
│ Reviewers: 3 assigned │
│ │
│ ⚠ 2 Objects have no reviewer assigned: │
│ • torque-specs.dita │
│ • fluid-levels.dita │
│ These Objects will not be reviewed unless you add │
│ assignments after activation. │
│ │
├─────────────────────────────────────────────────────────────┤
│ [Cancel] [Activate Round] │
└─────────────────────────────────────────────────────────────┘

Error case — empty scope:

┌─────────────────────────────────────────────────────────────┐
│ Cannot Activate │
├─────────────────────────────────────────────────────────────┤
│ │
│ ✕ No Objects currently match the scope filter. │
│ The round cannot be activated with an empty scope. │
│ │
│ Filter: Status = "Review" · Language = DE │
│ Matching Objects: 0 │
│ │
│ Adjust the scope filter or wait for Objects to enter │
│ "Review" status before activating. │
│ │
├─────────────────────────────────────────────────────────────┤
│ [Dismiss] │
└─────────────────────────────────────────────────────────────┘

3.6 Close / Cancel Review Round Confirmation

Trigger: "Close Round" or "Cancel Round" button

Component: Radix UI AlertDialog (destructive confirmation)

┌─────────────────────────────────────────────────────────────┐
│ Close Review Round? │
├─────────────────────────────────────────────────────────────┤
│ │
│ "Safety Content Review — DE" will be permanently closed. │
│ Assigned reviewers will be notified. │
│ │
│ Participation Summary: │
│ ✓ Anna Karlsson — completed │
│ ✓ Björn Lindqvist — completed │
│ ⚠ Maja Svensson — did not participate │
│ │
│ Status hold will be released. Objects will resume normal │
│ status transitions. │
│ │
├─────────────────────────────────────────────────────────────┤
│ [Cancel] [Close Round] (destructive)│
└─────────────────────────────────────────────────────────────┘

3.7 Add Reviewers to Active Round (Side Sheet)

Trigger: "+ Add Reviewer" button on an Active round's Assignments sub-tab

Component: Radix UI Sheet (slides from right)

┌──────────────────────────────────────────┐
│ Add Reviewers [✕] │
├──────────────────────────────────────────┤
│ │
│ Search users or groups │
│ ┌────────────────────────────────────┐ │
│ │ 🔍 Search... │ │
│ └────────────────────────────────────┘ │
│ │
│ ┌─ Results ──────────────────────────┐ │
│ │ ☐ 👤 Lars Andersson │ │
│ │ ☐ 👤 Sofia Berg │ │
│ │ ☐ 👥 Electrical Systems Team │ │
│ └────────────────────────────────────┘ │
│ │
│ Assignment Scope │
│ ○ Full round (all Objects) │
│ ○ Specific Objects │
│ ┌──────────────────────────────────┐ │
│ │ ☐ safety-warning.dita │ │
│ │ ☐ maintenance-proc.dita │ │
│ │ ☐ hydraulic-overview.dita │ │
│ └──────────────────────────────────┘ │
│ │
├──────────────────────────────────────────┤
│ [Cancel] [Assign] │
└──────────────────────────────────────────┘

Constraint: Only additions are allowed on active rounds. The sheet does not offer a "remove" action.


4. Review Groups Management (Admin Portal)

4.1 Entry Point

In the Admin Portal, Review Groups appears as a new item in the Configuration sidebar group for users with ReviewGroup.Manage capability:

┌─────────────────────────────────────────────────────┐
│ ─ Configuration ─ │
│ 📄 Metadata [workspace-scoped] │
│ 🌐 Terminology [workspace-scoped] │
│ 🔗 Knowledge [workspace-scoped] │
│ 🌳 Object Types [workspace-scoped] │
│ 📦 Templates [workspace-scoped] │
│ 🔄 Lifecycle [workspace-scoped] │
│ ⚙ Workflows [workspace-scoped] │
│ 🔧 Settings [workspace-scoped] │
│ 👥 Review Groups [workspace-scoped, cap-gated] │
│ 📥 Staging Area [workspace-scoped] │
│ 📋 Work Packages [workspace-scoped] │
└─────────────────────────────────────────────────────┘

Clicking "Review Groups" navigates to /c/:customerId/ws/:workspaceId/review-groups.


4.2 Review Groups List Page

Route: /c/:customerId/ws/:workspaceId/review-groups

┌─────────────────────────────────────────────────────────────────┐
│ ← Configuration Review Groups [+ New Group] │
├─────────────────────────────────────────────────────────────────┤
│ │
│ ┌────────────────────────────────────────────────────────────┐ │
│ │ Name │ Reviewers │ Criteria │ Actions│ │
│ ├─────────────────────┼───────────┼─────────────────┼────────┤ │
│ │ Safety Department │ 3 users │ reviewArea = │ [⋯] │ │
│ │ │ │ "safety" │ │ │
│ │ Electrical Systems │ 2 users │ reviewArea = │ [⋯] │ │
│ │ │ 1 group │ "electrical" │ │ │
│ │ Legal Compliance │ 1 user │ compliance = │ [⋯] │ │
│ │ │ │ "required" │ │ │
│ └─────────────────────┴───────────┴─────────────────┴────────┘ │
│ │
└─────────────────────────────────────────────────────────────────┘

States:

Context menu (⋯):


4.3 Create / Edit Review Group Dialog

Trigger: "+ New Group" button or "Edit" from context menu

Component: Radix UI Dialog (modal)

┌─────────────────────────────────────────────────────────────┐
│ Create Review Group [✕ Close] │
├─────────────────────────────────────────────────────────────┤
│ │
│ Group Name * │
│ ┌──────────────────────────────────────────────────────┐ │
│ │ e.g. "Safety Department" │ │
│ └──────────────────────────────────────────────────────┘ │
│ │
│ ── Reviewers ──────────────────────────────────────────── │
│ │
│ ┌──────────────────────────────────────────────────────┐ │
│ │ 🔍 Search users, groups, or enter email... │ │
│ └──────────────────────────────────────────────────────┘ │
│ │
│ ┌─ Members ────────────────────────────────────────────┐ │
│ │ 👤 Erik Holm (Entra ID) [✕] │ │
│ │ 👤 anna.external@partner.com (email) [✕] │ │
│ │ 👥 Safety-Reviewers (Entra group) [✕] │ │
│ └──────────────────────────────────────────────────────┘ │
│ │
│ ── Matching Criteria ──────────────────────────────────── │
│ ⓘ Objects matching ALL criteria will be assigned to this │
│ group's reviewers. Uses AND logic. │
│ │
│ ┌─ Criterion 1 ────────────────────────────────────────┐ │
│ │ Domain: Review Area ▾ Value: Safety ▾ [✕] │ │
│ └──────────────────────────────────────────────────────┘ │
│ ┌─ Criterion 2 ────────────────────────────────────────┐ │
│ │ Domain: Product Line ▾ Value: Hydraulic ▾ [✕] │ │
│ └──────────────────────────────────────────────────────┘ │
│ [+ Add Criterion] │
│ │
├─────────────────────────────────────────────────────────────┤
│ [Cancel] [Create Group / Save] │
└─────────────────────────────────────────────────────────────┘

Criteria builder:


5. Delegation Flow (Reviewer-Initiated)

> Note: The reviewer dashboard is in Spec B/D scope. This section describes only the delegation interaction pattern for integration awareness.

Trigger: Reviewer clicks "Delegate" on their assignment (from their review context — Spec B/D surface)

Component: Radix UI Dialog (modal)

┌─────────────────────────────────────────────────────────────┐
│ Delegate Review Assignment [✕ Close] │
├─────────────────────────────────────────────────────────────┤
│ │
│ Delegate to │
│ ┌──────────────────────────────────────────────────────┐ │
│ │ 🔍 Search users... │ │
│ └──────────────────────────────────────────────────────┘ │
│ │
│ Scope │
│ ○ Entire assignment (all my Objects) │
│ ○ Specific Objects │
│ ┌──────────────────────────────────────────────────┐ │
│ │ ☐ safety-warning.dita │ │
│ │ ☐ maintenance-proc.dita │ │
│ └──────────────────────────────────────────────────┘ │
│ │
│ ⓘ You will remain assigned. The delegated reviewer will │
│ be added alongside you. │
│ │
│ ⚠ Delegation depth: 1 of 2 (workspace limit) │
│ │
├─────────────────────────────────────────────────────────────┤
│ [Cancel] [Delegate] │
└─────────────────────────────────────────────────────────────┘

Error states:


6. Notification Touchpoints

Notifications integrate with the existing platform notification infrastructure (persistent inbox + SignalR push).

| Event | Recipient | Notification Content |
|-------|-----------|---------------------|
| Round activated | All assigned reviewers | "You have been assigned to review round '{name}' — {n} Objects to review. Due: {date}" |
| Reminder | Reviewers who haven't completed | "Reminder: review round '{name}' is due in {n} days" |
| Round closed | All assigned reviewers | "Review round '{name}' has been closed" |
| Round cancelled | All assigned reviewers | "Review round '{name}' has been cancelled" |
| Object left scope | Round manager | "Object '{name}' left scope of review round '{roundName}' (status changed)" |
| Unassigned Objects warning | Content manager (at activation) | "Review round '{name}' activated with {n} unassigned Objects" |
| Delegation received | Delegated reviewer | "You have been delegated a review by {delegator} in round '{name}'" |
| Deadline expired (escalate) | Escalation recipient | "Review round '{name}' has passed its deadline" |
| Auto-activation failed | Content manager | "Scheduled activation of '{name}' failed: scope is empty" |

Notification format: Each notification is a clickable item in the notification inbox that deep-links to the relevant review round detail view.


7. UI States (5-State Model)

Each panel/view follows the standard 5-state model:

| State | Review Rounds List | Review Round Detail | Review Groups List |
|-------|-------------------|--------------------|--------------------|
| **Loading** | 3 skeleton cards | Skeleton header + table | Table skeleton (3 rows) |
| **Empty** | Illustration + CTA | N/A (always has data if accessible) | Illustration + CTA |
| **Error** | Error state + retry | Error state + retry | Error state + retry |
| **Populated** | Card list | Full detail with tabs | Table with rows |
| **Partial** | Cards + warning banner (e.g., "Some rounds failed to load") | Detail with degraded data warning | Rows + partial load warning |

8. Capability Gating

| Capability | Protects | UI Behavior When Missing |
|------------|----------|--------------------------|
| `ReviewRound.Manage` | Create, activate, close, cancel review rounds | "Review Rounds" tab hidden in WP detail; actions disabled |
| `ReviewRound.Read` | View review rounds (read-only) | Tab visible, all mutation buttons hidden |
| `ReviewGroup.Manage` | CRUD on review groups | "Review Groups" item hidden in Admin Portal Configuration sidebar |

Pattern: Follows the existing requiredCapability route guard + ProtectedRoute component pattern. In-page elements are hidden or disabled based on capability presence in InitDataContext.


9. URL State

| State | Mechanism | Example |
|-------|-----------|---------|
| Work Package detail | Route segment | `/ws/:workspaceId/work-packages/:workPackageId` |
| Review Rounds tab | URL search param | `/ws/:workspaceId/work-packages/:workPackageId?tab=review-rounds` |
| Review Round detail | URL search param | `/ws/:workspaceId/work-packages/:workPackageId?tab=review-rounds&round=def456` |
| Review Round sub-tab | URL search param | `...&round=def456§ion=assignments` |
| Review Groups page | Route segment | `/c/:customerId/ws/:workspaceId/review-groups` |
| Review Group edit | URL search param | `/c/:customerId/ws/:workspaceId/review-groups?edit=ghi789` |

All URLs are deep-linkable and shareable. The canonical URL normalizer applies standard rules (lowercase IDs, strip empty params). Notification deep-links use the full path to navigate directly to a specific review round detail view.


10. Interaction Patterns Summary

| Interaction | Pattern | Component |
|-------------|---------|-----------|
| Create review round | Multi-step modal dialog (3 steps) | Radix Dialog |
| Activate round | Destructive confirmation with summary | Radix AlertDialog |
| Close / Cancel round | Destructive confirmation with participation summary | Radix AlertDialog |
| Add reviewers to active round | Side sheet (slides from right) | Radix Sheet |
| Create / Edit review group | Modal dialog | Radix Dialog |
| Delete review group | Destructive confirmation | Radix AlertDialog |
| Delegate assignment | Modal dialog | Radix Dialog |
| Scope preview | Inline expandable section within dialog | Collapsible |
| Assignment warnings | Inline warning banners (⚠) | Alert component |

11. Responsive Behavior

| Breakpoint | Behavior |
|------------|----------|
| Desktop (≥ 768px) | Full layout — Review Rounds tab in WP detail page, dialogs and sheets at standard widths |
| Mobile (< 768px) | Review Rounds list as full-page view; multi-step create dialog becomes full-screen sheet wizard; per-Object assignment table scrolls horizontally; WP detail tabs stack vertically or use horizontal scroll |

12. Integration with Existing Patterns

Work Package Page Integration

Work Package Creation Integration

Author View Integration

Notification Integration

Admin Portal Integration


13. Data Fetching

| Endpoint | Hook | Caching |
|----------|------|---------|
| List review rounds for WP | `useFetch` | Workspace-scoped, invalidated on mutations |
| Get review round detail | `useFetch` | Per-round, invalidated on state change |
| Scope preview (matching Objects) | `useFetch` | Short-lived cache, re-fetched on filter change |
| List review groups | `useFetch` | Workspace-scoped |
| Search users/groups | `useFetch` (debounced) | No cache (live search) |
| Activate / Close / Cancel round | `useMutate` | Invalidates round list + detail |
| Create review round | `useMutate` | Invalidates round list |
| Create / Edit review group | `useMutate` | Invalidates group list |

All data fetching uses useFetch / useMutate — never raw fetch().


14. Out of Scope (Spec B/D — Reviewer Experience)

The following are explicitly NOT designed in this UX spec:

These surfaces will reference the review round data designed here but will have their own UX specification.



UX Specification AzDO #4024

UX Specification: Review Scope & Content Status

051-review-scope-content-status2026-05-22
Contents
  1. 1. Feature Summary
  2. 2. Where This Feature Lives
  3. 3. Route Additions
  4. 4. Profile Set Extension to 049 Create Dialog (Content Manager)
  5. 5. Review Round Page (Platform App — Reviewer)
  6. 6. Object Review Detail (Right Panel)
  7. 7. Sign-Off Interaction
  8. 8. Contextual Visibility (Per-Object Assignments)
  9. 9. Progress & Status Bar
  10. 10. Notification Integration
  11. 11. Empty, Loading & Error States
  12. 12. User Flows
  13. 13. Responsive Behavior
  14. 14. Keyboard & Accessibility
  15. 15. Integration with Existing Patterns
  16. 16. Capability Gating
  17. 17. URL State Conventions
  18. 18. Data Fetching Strategy
  19. 19. Conventions Checklist (New Page)
  20. 20. Relationship to 049 UX Surfaces (Cross-Reference)

UX Specification: Review Scope & Content Status

Spec: 051-review-scope-content-status

Created: 2026-05-22

Status: Draft

Depends on: 049 (Review Assignment & Orchestration)


1. Feature Summary

This UX spec defines how content managers and reviewers interact with review scope resolution, content status indicators, baseline diffs, profile-filtered views, review sign-off, and contextual visibility. These capabilities live within the existing Work Package and Review Round model established by 049.


2. Where This Feature Lives

This spec builds on the 049 UX Research (review-assignment-orchestration-ux-research.md) which defines the content-manager orchestration surface. 049 owns the Work Package detail page (review round CRUD, assignment, activation, close/cancel). This spec (051) adds the reviewer-facing experience — the page where reviewers actually do their review work.

Relationship to 049 Surfaces

| Surface | Owner | Route | Purpose |
|---------|-------|-------|----------|
| Review Rounds tab (WP detail) | 049 | `/ws/:workspaceId/work-packages/:wpId?tab=review-rounds` | Content managers create, configure, activate, close rounds |
| Review Groups (Admin Portal) | 049 | `/c/:customerId/ws/:workspaceId/review-groups` | Workspace-level persistent reviewer groups |
| **Review Round Page** | **051 (this spec)** | `/ws/:workspaceId/review/:reviewRoundId` | **Reviewers view scope, read content, sign off** |

Platform App — New Dedicated Page

The reviewer experience lives on a new standalone page at /ws/:workspaceId/review/:reviewRoundId/. This is a purpose-built review workspace — it is not embedded within the Author View or the Work Package detail page.

How reviewers get here:

The Author View (/authoring) is unaffected. 049 already defines that Objects in active review scope show a subtle review badge/indicator in the Object List — this spec does not modify that.

Content Manager Configuration (049 Extension)

Content managers configure review rounds via the existing Work Package detail → Review Rounds tab (defined by 049 UX Research, Sections 3.1–3.6). This spec extends 049's create dialog with a Profile Set step (see Section 4).


3. Route Additions

/ws/:workspaceId/
├── authoring → (existing) Author View — no changes from this spec
├── work-packages/:wpId → (existing, 049) — Review Rounds tab for content managers
└── review/
 └── :reviewRoundId/ → ReviewRoundPage (reviewer workspace) ← NEW
 ├── (index) → Scope overview + status indicators
 └── object/:objectId → Object review detail (content + diff + sign-off)

Navigation from 049 surfaces:


4. Profile Set Extension to 049 Create Dialog (Content Manager)

The 049 UX Research (Section 3.3) defines a 3-step create dialog: ① Scope → ② Assignment → ③ Schedule. This spec extends Step 1 (Scope) with a Profile Set section. All other steps remain as defined by 049.

4.1 Extension to Step 1: Profile Set Assignment

Inserted below the existing Scope fields (status filter, language variant, recipe, status hold) in 049's Step 1:

│ │ │ │
│ │ ── Profile Set (optional) ─────────────────────────── │ │
│ │ │ │
│ │ Assign profiles to this review round: │ │
│ │ ┌──────────────────────────────────────────────────┐ │ │
│ │ │ &#128269; Search profiles... │ │ │
│ │ └──────────────────────────────────────────────────┘ │ │
│ │ │ │
│ │ ┌─ Applied ─────────────────────────────────────────┐ │ │
│ │ │ [Product A ✕] [US Market ✕] │ │ │
│ │ └───────────────────────────────────────────────────┘ │ │
│ │ │ │
│ │ ⓘ All reviewers in this round will see content │ │
│ │ filtered through these profiles. Conditional │ │
│ │ boundaries will be marked in the review view. │ │
│ │ │ │
│ │ ☐ No profile set (reviewers see full unfiltered │ │
│ │ content) │ │
│ │ │ │

Interaction:

4.2 Extension to 049 Scope Preview

049's scope preview (Section 3.3, "Show matching Objects") already shows the resolved Object list. This spec extends that table with a Content Status column showing the review status indicators (Section 5.2) when a prior closed round exists in the workspace:

┌──────────────────────────────────────────────────────────────────────┐
│ Scope Preview [Close ✕] │
├──────────────────────────────────────────────────────────────────────┤
│ Filter: Status = "Review" · Language = DE │
│ Profile: Product A, US Market │
│ Resolved: 47 Objects │
├──────────────────────────────────────────────────────────────────────┤
│ │
│ Object Name │ Type │ Content Status │ Reviewer(s) │
│ ─────────────────────────────────────────────────────────────────── │
│ replace-oil-filter.dita │ DITA │ &#128308; NEW │ Anna K. │
│ safety-warnings.dita │ DITA │ &#128993; MODIFIED │ ⚠ Unassigned│
│ hydraulic-diagram.svg │ Gfx │ &#128994; UNCHANGED │ Safety Group│
│ torque-specs.dita │ DITA │ &#128309; DIFF CONTEXT │ Björn L. │
│ ... │
│ │
├──────────────────────────────────────────────────────────────────────┤
│ ⚠ 3 Objects have no reviewer assigned │
│ ℹ Scope is live — Objects will enter/leave as their status changes │
│ ℹ Content status based on prior sign-offs in this workspace │
└──────────────────────────────────────────────────────────────────────┘

This gives content managers visibility into review burden before activation.


5. Review Round Page (Platform App — Reviewer)

5.1 Page Layout

Route: /ws/:workspaceId/review/:reviewRoundId

Purpose: The focused review workspace where reviewers see their scope, content status indicators, and perform sign-offs. This is the reviewer-facing complement to 049's content-manager round detail (Section 3.4).

Entry points:

┌──────────────────────────────────────────────────────────────────────┐
│ [Page header: Round name │ WP name │ Deadline badge │ Progress bar] │
│ [Recipe context: "Safety Manual 2026" (navigation tree)] │
│ [Actions: Delegate... │ View in Work Package] │
├──────────────┬───────────────────────────────────────────────────────┤
│ SCOPE NAV │ CONTENT DETAIL │
│ ────────── │ ────────────── │
│ [Filter ▾] │ ┌─────────────────────────────────────────────────┐ │
│ [View: &#127795;▾] │ │ Object: replace-oil-filter.dita │ │
│ │ │ Status: &#128993; Modified since last review │ │
│ ┌────────┐ │ │ Recipe path: Safety Manual > Maintenance > Oil │ │
│ │▾ Maint │ │ │ │ │
│ │ &#128308; obj│ │ │ [Content View] [Diff View] [History] │ │
│ │ &#128993; obj│ │ │ │ │
│ │────────│ │ │ ┌────────────────────────────────────────────┐ │ │
│ │▸ Safety│ │ │ │ │ │ │
│ │────────│ │ │ │ (Rendered content / diff output) │ │ │
│ │▸ Specs │ │ │ │ │ │ │
│ │────────│ │ │ └────────────────────────────────────────────┘ │ │
│ │ &#128065; Ctxt│ │ │ │ │
│ │ obj-5 │ │ │ ┌────────────────────────────────────────────┐ │ │
│ └────────┘ │ │ │ [✓ Sign Off] [Add Comment] │ │ │
│ │ │ └────────────────────────────────────────────┘ │ │
│ │ └─────────────────────────────────────────────────┘ │
│ │ │
├──────────────┴───────────────────────────────────────────────────────┤
│ [Status bar: "12 of 47 signed off │ 3 invalidated │ Due in 5 days"]│
└──────────────────────────────────────────────────────────────────────┘

5.2 Content Status Indicators (Color Legend)

| Color | Badge | Status | Meaning |
|-------|-------|--------|---------|
| &#128308; | `NEW` | New to review | No prior sign-off exists for this Object in any closed round |
| &#128993; | `MOD` | Modified since last review | Content changed since most recent sign-off |
| &#128994; | `OK` | Previously reviewed (unchanged) | Same content, same profile context as prior sign-off |
| &#128309; | `CTX` | Reviewed under different context | Same content, but prior sign-off used different profile set |
| &#128065; | `VIEW` | Context only | Visible for reference (per-Object assignment); cannot sign off |

Status determination logic (displayed as tooltip on hover):

No prior sign-off → &#128308; NEW
Prior sign-off exists:
 └─ Content revision changed since sign-off → &#128993; MODIFIED
 └─ Content unchanged:
 └─ Same profile set ID → &#128994; UNCHANGED
 └─ Different profile set ID → &#128309; DIFFERENT CONTEXT

5.3 Scope Navigation Panel (Left Column)

The left column serves as the reviewer's navigation. Its presentation depends on whether a recipe was assigned to the review round (per 049 FR-001):

A toggle in the panel header switches between the two views when a recipe is assigned.

#### 5.3a Recipe Tree View (Primary — when recipe is assigned)

The recipe tree provides the publication structure that reviewers are evaluating content within. Objects appear as leaf nodes under their recipe-defined position. Status indicators appear inline.

┌─────────────────────────────────────────────────────────────┐
│ [&#128269; Search Objects...] │
│ │
│ View: [&#127795; Recipe Tree ▾ │ &#128203; Flat List] │
│ Filter: [All ▾ │ New │ Modified │ Unchanged │ ...] │
│ │
│ Recipe: "Safety Manual 2026" │
│ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ │
│ │
│ ▾ 1. Introduction │
│ │ &#128994; OK product-overview.dita ✓ │
│ │ &#128309; CTX regulatory-context.dita ☐ │
│ │ │
│ ▾ 2. Maintenance Procedures │
│ │ ▾ 2.1 Oil System │
│ │ │ &#128308; NEW replace-oil-filter.dita ☐ │
│ │ │ &#128993; MOD oil-level-check.dita ☐ │
│ │ │ │
│ │ ▾ 2.2 Hydraulics │
│ │ │ &#128993; MOD hydraulic-assembly.dita ☐ │
│ │ │ &#128994; OK hydraulic-bleeding.dita ✓ │
│ │ │ │
│ │ ▸ 2.3 Electrical (4 Objects — 2 &#128993;, 2 &#128994;) │
│ │ │
│ ▾ 3. Safety Warnings │
│ │ &#128993; MOD safety-warnings.dita ⚠ │
│ │ &#128308; NEW hazard-symbols.dita ☐ │
│ │ │
│ ▸ 4. Specifications (6 Objects — 1 &#128308;, 5 &#128994;) │
│ │
│ ── CONTEXT (not in recipe, visible for reference) (3) ── │
│ ┌───────────────────────────────────────────────────────┐ │
│ │ &#128065; warranty-terms.dita │ │
│ │ &#128065; parts-catalog-reference.dita │ │
│ │ &#128065; compliance-matrix.dita │ │
│ └───────────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────┘

Recipe tree behaviors:

Progress per branch:

#### 5.3b Flat List View (Fallback — no recipe, or toggled manually)

┌─────────────────────────────────────────────────────┐
│ [&#128269; Search Objects...] │
│ │
│ View: [&#128203; Flat List ▾] (no recipe assigned) │
│ Filter: [All ▾ │ New │ Modified │ Unchanged │ │
│ Different Context │ Needs re-review] │
│ Sort: [Status priority ▾ │ Name │ Modified date] │
│ │
│ ── MY ASSIGNMENTS (27) ── │
│ ┌───────────────────────────────────────────────┐ │
│ │ &#128308; NEW replace-oil-filter.dita ☐ │ │
│ │ &#128993; MOD safety-warnings.dita ☐ │ │
│ │ &#128993; MOD hydraulic-assembly.dita ☐ │ │
│ │ &#128994; OK torque-specifications.dita ✓ │ │
│ │ &#128309; CTX product-overview.dita ☐ │ │
│ │ ... │ │
│ └───────────────────────────────────────────────┘ │
│ │
│ ── CONTEXT (visible, not assigned) (20) ── │
│ ┌───────────────────────────────────────────────┐ │
│ │ &#128065; VIEW maintenance-schedule.dita │ │
│ │ &#128065; VIEW warranty-terms.dita │ │
│ │ ... │ │
│ └───────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────┘

Flat list behaviors:

5.4 Scope List — Out-of-Scope / Re-entered Objects

┌───────────────────────────────────────────────────┐
│ ── OUT OF SCOPE (2) ── │
│ ┌─────────────────────────────────────────────┐ │
│ │ ⊘ removed-procedure.dita (left scope) │ │
│ │ ⊘ deprecated-warning.dita (left scope) │ │
│ └─────────────────────────────────────────────┘ │
│ │
│ ── RE-ENTERED (1) ── │
│ ┌─────────────────────────────────────────────┐ │
│ │ &#128308; NEW re-entered-topic.dita (baseline │ │
│ │ captured at re-entry) │ │
│ └─────────────────────────────────────────────┘ │
└───────────────────────────────────────────────────┘

Behaviors:


6. Object Review Detail (Right Panel)

6.1 Content View (Default Tab)

The primary view renders the Object content with profile filtering applied. When a recipe is assigned to the round, the Object's position within the recipe structure is shown as a breadcrumb — this gives reviewers context about where this content sits in the publication:

┌──────────────────────────────────────────────────────────────────────┐
│ Object: safety-warnings.dita │
│ Recipe path: Safety Manual 2026 › 3. Safety Warnings │
│ Status: &#128993; Modified since last review │
│ Last sign-off: Round "Q1 Safety Review" (2026-03-15) by Jane D. │
│ Profile: Product A, US Market │
├──────────────────────────────────────────────────────────────────────┤
│ [Content View] [Diff View] [Sign-off History] │
├──────────────────────────────────────────────────────────────────────┤
│ │
│ ┌────────────────────────────────────────────────────────────────┐ │
│ │ │ │
│ │ <title>Safety Warnings</title> │ │
│ │ │ │
│ │ <section> │ │
│ │ ┌─────────────────────────────────────────────────────┐ │ │
│ │ │ US Market content visible │ │ │
│ │ └─────────────────────────────────────────────────────┘ │ │
│ │ </section> │ │
│ │ │ │
│ │ ┌ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ┐ │ │
│ │ │ ⊟ Conditional content hidden (EU Market) [Reveal] │ │ │
│ │ └ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ┘ │ │
│ │ │ │
│ │ <section> │ │
│ │ Shared content (no profile condition) │ │
│ │ </section> │ │
│ │ │ │
│ └────────────────────────────────────────────────────────────────┘ │
│ │
│ ☐ Show full unfiltered content │
│ │
├──────────────────────────────────────────────────────────────────────┤
│ [✓ Sign Off] [&#128172; Add Comment] │
└──────────────────────────────────────────────────────────────────────┘

Profile filtering behaviors:

6.2 Diff View Tab

Shows changes between the baseline revision and current revision for Modified Objects:

┌──────────────────────────────────────────────────────────────────────┐
│ [Content View] [Diff View ●] [Sign-off History] │
├──────────────────────────────────────────────────────────────────────┤
│ │
│ Comparing: Baseline (captured 2026-04-01) → Current (rev 7) │
│ │
│ ┌────────────────────────────────────────────────────────────────┐ │
│ │ │ │
│ │ <title>Safety Warnings</title> │ │
│ │ │ │
│ │ ┌─── REMOVED ────────────────────────────────────────────┐ │ │
│ │ │ - Old warning text about hydraulic pressure limits │ │ │
│ │ └────────────────────────────────────────────────────────┘ │ │
│ │ │ │
│ │ ┌─── ADDED ──────────────────────────────────────────────┐ │ │
│ │ │ + Updated warning text with new PSI thresholds │ │ │
│ │ │ + Additional caution note for cold-weather operation │ │ │
│ │ └────────────────────────────────────────────────────────┘ │ │
│ │ │ │
│ │ Unchanged content continues... │ │
│ │ │ │
│ └────────────────────────────────────────────────────────────────┘ │
│ │
│ ── Compare against other baselines ── │
│ [Prior same-profile sign-off (2026-01-10) ▾] [Load diff] │
│ │
└──────────────────────────────────────────────────────────────────────┘

Diff behaviors:

6.3 Sign-off History Tab

┌──────────────────────────────────────────────────────────────────────┐
│ [Content View] [Diff View] [Sign-off History ●] │
├──────────────────────────────────────────────────────────────────────┤
│ │
│ ── SIGN-OFF HISTORY FOR THIS OBJECT ── │
│ │
│ Round │ Reviewer │ Profile Set │ Rev │ Date │
│ ─────────────────────────────────────────────────────────────────── │
│ Q2 2026 Tech Review │ You │ Product A, US │ r7 │ (now) │
│ Q1 2026 Safety Review │ Jane D. │ Product A, EU │ r5 │ Mar 15 │
│ 2025 Annual Review │ John S. │ (unfiltered) │ r3 │ Nov 02 │
│ │
│ [Compare rev 5 → rev 7] ← link to diff between specific revisions │
│ │
│ ℹ Status derived from most recent sign-off (Q1 Safety, r5): │
│ Content: r5 → r7 (changed) → &#128993; MODIFIED │
│ │
└──────────────────────────────────────────────────────────────────────┘

Behaviors:


7. Sign-Off Interaction

7.1 Sign-Off Action

┌──────────────────────────────────────────────────────────────────────┐
│ ┌────────────────────────────────────────────────────────────────┐ │
│ │ [✓ Sign Off] │ │
│ │ │ │
│ │ Clicking confirms you have reviewed this Object. │ │
│ │ Current revision: r7 (2026-05-20) │ │
│ │ Profile context: Product A, US Market │ │
│ └────────────────────────────────────────────────────────────────┘ │
└──────────────────────────────────────────────────────────────────────┘

Sign-off button states:

| State | Appearance | Action |
|-------|------------|--------|
| Not signed off | Primary button `[✓ Sign Off]` | Click to sign off |
| Signed off (valid) | Success badge `✓ Signed off (r7)` | No action needed |
| Signed off (invalidated) | Warning badge `⚠ Sign-off invalidated — content changed` + `[Re-sign]` | Click to re-sign |
| Context Object | Disabled/hidden sign-off button | `[&#128172; Comment only]` available |

7.2 Sign-Off Invalidation (Real-time)

When content changes while a reviewer has the round open:

┌──────────────────────────────────────────────────────────────────────┐
│ ⚠ SIGN-OFF INVALIDATED │
│ ───────────────────────── │
│ The content of "safety-warnings.dita" was modified after your │
│ sign-off (new revision r8 created by Author X on May 21). │
│ │
│ Your sign-off on revision r7 is no longer valid. │
│ Please review the changes and re-sign if appropriate. │
│ │
│ [View Changes (r7 → r8)] [Re-sign on r8] │
└──────────────────────────────────────────────────────────────────────┘

Behaviors:

7.3 Sign-Off for Multi-Language Rounds

When the round targets multiple language variants:

┌──────────────────────────────────────────────────────────────────────┐
│ Language Variants: │
│ │
│ [EN (source)] ← currently viewing ✓ Signed off (r7) │
│ [DE] ☐ Not signed off │
│ [FR] ⚠ Invalidated (content changed)│
│ │
│ Sign-off is per-language-variant. Each must be reviewed separately. │
└──────────────────────────────────────────────────────────────────────┘

8. Contextual Visibility (Per-Object Assignments)

8.1 Assigned vs Context Distinction

For reviewers with per-Object assignments, the scope list clearly separates:

┌─────────────────────────────────────────────────────────────┐
│ ── MY ASSIGNMENTS (3 of 10 in scope) ── │
│ ┌───────────────────────────────────────────────────────┐ │
│ │ &#128308; NEW topic-a.dita [✓] │ │
│ │ &#128993; MOD topic-b.dita [✓] │ │
│ │ &#128994; OK topic-c.dita [✓] │ │
│ └───────────────────────────────────────────────────────┘ │
│ │
│ ── CONTEXT (7 Objects — read-only) ── [▾ Expand] │
│ ┌───────────────────────────────────────────────────────┐ │
│ │ &#128065; topic-d.dita [&#128172; Comment] │ │
│ │ &#128065; topic-e.dita [&#128172; Comment] │ │
│ │ &#128065; topic-f.dita [&#128172; Comment] │ │
│ │ ... │ │
│ └───────────────────────────────────────────────────────┘ │
│ │
│ ℹ Context Objects are visible for reference. │
│ You can view and comment but cannot sign off. │
└─────────────────────────────────────────────────────────────┘

8.2 Full-Round Assignment View

For reviewers with full-round assignment (no per-Object restriction):

┌─────────────────────────────────────────────────────────────┐
│ ── ALL IN SCOPE (47 Objects) ── │
│ ┌───────────────────────────────────────────────────────┐ │
│ │ &#128308; NEW topic-a.dita [✓] │ │
│ │ &#128993; MOD topic-b.dita [✓] │ │
│ │ &#128994; OK topic-c.dita [✓] │ │
│ │ &#128309; CTX topic-d.dita [✓] │ │
│ │ ... │ │
│ └───────────────────────────────────────────────────────┘ │
│ │
│ (No "context" section — full-round reviewers own all) │
└─────────────────────────────────────────────────────────────┘

9. Progress & Status Bar

9.1 Round Progress Header

┌──────────────────────────────────────────────────────────────────────┐
│ Q2 2026 Technical Review │ Work Package: Spring Release │
│ Recipe: "Safety Manual 2026" │ Profile: Product A, US Market │
│ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━░░░░░░░ 65% signed off │
│ Due: May 30, 2026 (8 days remaining) │ 12/18 assigned │ 3 invalidated │
└──────────────────────────────────────────────────────────────────────┘

9.2 Status Bar Integration

The app status bar shows active review context:

┌──────────────────────────────────────────────────────────────────────┐
│ Review: "Q2 Tech Review" │ 12/18 signed off │ ⚠ 3 need re-review │
└──────────────────────────────────────────────────────────────────────┘

10. Notification Integration

049 UX Research (Section 6) already defines notifications for: round activated, reminder, round closed/cancelled, Object left scope, unassigned Objects warning, delegation received, deadline expired, auto-activation failed. Those notifications deep-link to the content-manager view (/work-packages/:wpId?tab=review-rounds&round=...).

This spec adds reviewer-facing notifications that deep-link to the Review Round Page (/review/:roundId):

10.1 New Notification Types (051-specific)

| Event | Recipient | Notification Content | Deep-link |
|-------|-----------|---------------------|------------|
| Sign-off invalidated | Reviewer who signed off | "Your sign-off on safety-warnings.dita was invalidated (content changed)" | `/review/:roundId/object/:objectId?tab=diff` |
| Object re-entered scope | Assigned reviewer + round manager | "hydraulic-diagram.svg re-entered scope (new baseline captured)" | `/review/:roundId` |
| Scope became empty | Round manager | "Review round Q2 Tech Review: all Objects have left scope" | `/work-packages/:wpId?tab=review-rounds&round=...` (049 link) |

10.2 Modified 049 Notifications (Reviewer Deep-Links)

The following 049 notifications are sent to reviewers and should deep-link to the Review Round Page rather than the content-manager WP detail:

| 049 Notification | Reviewer deep-link (modified) |
|-----------------|-------------------------------|
| Round activated ("You have been assigned...") | `/ws/:workspaceId/review/:roundId` |
| Reminder ("Review due in N days") | `/ws/:workspaceId/review/:roundId` |
| Delegation received | `/ws/:workspaceId/review/:roundId` |

Content-manager notifications (Object left scope, unassigned warning, auto-activation failed) continue to link to the 049 WP detail view.

10.3 Real-Time Updates (SignalR)


11. Empty, Loading & Error States

11.1 Empty State — No Active Reviews

┌────────────────────────────────────────────────────────┐
│ [Review icon] │
│ "No active review assignments" │
│ You have no review rounds assigned to you in this │
│ workspace. When a content manager assigns you to a │
│ review, it will appear here. │
│ │
│ [Go to Dashboard] │
└────────────────────────────────────────────────────────┘

11.2 Empty State — Round with Empty Scope

┌────────────────────────────────────────────────────────┐
│ [Empty scope icon] │
│ "No Objects currently in scope" │
│ All Objects have left the configured status filter. │
│ Objects will appear here when they return to │
│ "Review" status. │
│ │
│ ── Previously in scope (3) ── │
│ ⊘ topic-a.dita (left scope May 20) │
│ ⊘ topic-b.dita (left scope May 21) │
│ ⊘ topic-c.dita (left scope May 21) │
└────────────────────────────────────────────────────────┘

11.3 Loading Skeleton

┌──────────────┬───────────────────────────────────────────┐
│ ░░░░░░░░░░ │ ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ │
│ ░░░░░░░░░░ │ ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ │
│ ░░░░░░░░ │ │
│ ░░░░░░░░░░ │ ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ │
│ ░░░░░░░░░░ │ ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ │
│ ░░░░░░░░ │ ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ │
│ ░░░░░░░░░░ │ ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ │
│ ░░░░░░░░░░ │ │
│ │ ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ │
└──────────────┴───────────────────────────────────────────┘

11.4 Error State

┌────────────────────────────────────────────────────────┐
│ [Error icon] │
│ "Failed to load review scope" │
│ The review round data could not be retrieved. │
│ [Retry] │
└────────────────────────────────────────────────────────┘

12. User Flows

Flow 1: Content Manager Sets Up Review Scope with Profile Filtering

Content manager opens Work Package detail → Review Rounds tab (049 surface)
 → clicks [+ New Round] (049 Section 3.2)
 → 3-step dialog opens (049 Section 3.3)
 → Step 1 (Scope): selects status filter "Review", language "DE"
 → Step 1 (Profile Set — 051 extension): adds "Product A", "US Market"
 → Step 2 (Assignment): assigns reviewers (049 pattern)
 → Step 3 (Schedule): sets deadline (049 pattern)
 → Summary shown → clicks [Create Round (Pending)]
 → round appears in Review Rounds tab as Pending card
 → content manager clicks [Activate] on card
 → 049 activation confirmation dialog (Section 3.5)
 → round transitions to Active
 → baseline revisions captured for all 47 Objects (051)
 → reviewers receive notification → links to /review/:roundId

Flow 2: Reviewer Opens Review and Prioritizes Work

Reviewer receives notification "You have been assigned to review round 'Q2 Tech Review'"
 → clicks notification → deep-links to /ws/:workspaceId/review/:roundId
 → Review Round Page loads (Section 5.1)
 → Recipe "Safety Manual 2026" assigned → tree view is default
 → Scope Navigation shows recipe structure with status indicators:
 Chapter 1 (2 Objects: 1 &#128994;, 1 &#128309;)
 Chapter 2 (8 Objects: 2 &#128308;, 4 &#128993;, 2 &#128994;) ← most work here
 Chapter 3 (2 Objects: 1 &#128993;, 1 &#128308;)
 → Reviewer expands Chapter 2 → sees section breakdown
 → filters to "New + Modified" → tree shows only matching Objects
 → clicks first &#128308; NEW Object under "2.1 Oil System"
 → URL updates to /review/:roundId/object/:objectId
 → Content Detail loads with profile-filtered content
 → Recipe breadcrumb shows: Safety Manual > Maintenance > Oil System
 → reviewer reads content in publication context
 → clicks [✓ Sign Off]
 → badge changes to "✓ Signed off (r7)"
 → progress ring on "2.1 Oil System" updates (1/2)
 → moves to next Object in same section (reading order)

Flow 3: Reviewer Encounters Invalidated Sign-Off

Reviewer has signed off on topic-b.dita (r5)
 → Author updates topic-b.dita → new revision r6 created
 → System automatically invalidates sign-off
 → SignalR pushes update to reviewer's open session
 → Toast: "Sign-off on topic-b.dita invalidated"
 → Scope List: topic-b.dita changes from ✓ to ⚠
 → Status: changes to &#128993; MODIFIED (needs re-review)
 → Reviewer clicks topic-b.dita
 → sees "⚠ Sign-off invalidated" banner
 → clicks [View Changes (r5 → r6)]
 → Diff View shows what changed
 → Reviewer reads changes
 → clicks [Re-sign on r6]
 → sign-off updated to r6
 → status returns to ✓

Flow 4: Object Dynamically Leaves and Re-enters Scope

Object topic-x.dita is in "Review" status → in scope
 → Author changes status to "Draft" (for edits)
 → Object dynamically leaves scope
 → Scope List: topic-x moves to "Out of Scope" section (dimmed)
 → Round manager notified
 → Progress recalculated (excluded from denominator)
 → Author finishes edits, returns to "Review" status
 → Object re-enters scope
 → New baseline captured at re-entry time
 → Scope List: topic-x reappears in main list
 → Status: &#128308; NEW (fresh baseline, diffs from re-entry only)
 → Round manager notified of re-entry

Flow 5: Reviewer Views Content with Different Profile Context

Reviewer opens review round (profile: Product A, US Market)
 → sees topic-d.dita with status &#128309; DIFFERENT CONTEXT
 → clicks topic-d.dita
 → Content Detail shows:
 "Last reviewed by Jane D. in Q1 Safety Review
 under profile: Product A, EU Market (different context)"
 → Content View shows US Market-filtered content
 → Reviewer clicks [Sign-off History] tab
 → sees prior sign-offs with different profiles
 → clicks [Compare rev 5 → rev 7] to see content diff
 → even though status says "unchanged," reviewer can
 verify the content they see (US) vs what was reviewed (EU)
 → signs off → status for future US-profile rounds
 will be &#128994; UNCHANGED (same profile now recorded)

Flow 6: Per-Object Reviewer Uses Contextual Visibility

Reviewer has per-Object assignment (3 of 10 Objects)
 → Review Round Page loads
 → Scope List shows:
 "MY ASSIGNMENTS (3)" section with sign-off buttons
 "CONTEXT (7 Objects)" section (collapsed)
 → Reviewer clicks assigned topic-a.dita → can sign off
 → Reviewer expands Context section
 → clicks context topic-d.dita
 → Content Detail loads (read-only indicator)
 → Sign-off button is hidden
 → [&#128172; Add Comment] button is available
 → Reviewer adds comment for context
 → comment saved with reviewRoundId
 → Reviewer attempts to sign off on context Object → action not available

Flow 7: Content Manager Reviews Scope Preview Before Activation

Content manager creates review round via 049 dialog with status filter "Review"
 → Step 1: "Scope Preview: 0 Objects currently match" (049 inline preview)
 → Dialog shows: "0 Objects match. Round can be created but not activated yet."
 → Creates round in Pending state (round card appears in Review Rounds tab)
 → later, author moves 12 Objects to "Review" status
 → Content manager returns to WP detail → Review Rounds tab
 → clicks [View] on Pending round → Detail view (049 Section 3.4)
 → Scope tab shows 12 Objects now matching (with 051 status column)
 → clicks [Activate]
 → 049 activation confirmation (Section 3.5)
 → baselines captured for 12 Objects
 → round goes Active
 → reviewer notifications sent

13. Responsive Behavior

| Breakpoint | Layout |
|---|---|
| Desktop (≥ 1024px) | Split-pane: Scope List (300px) + Content Detail (fluid) |
| Tablet (768–1023px) | Scope List collapses to slim icon list; Content Detail fills width |
| Mobile (< 768px) | Single column — Scope List as full page, tap navigates to Content Detail as separate view; back button returns to list |

14. Keyboard & Accessibility

| Action | Shortcut |
|--------|----------|
| Next Object in scope list | `↓` / `J` |
| Previous Object | `↑` / `K` |
| Sign off current Object | `Ctrl+Enter` |
| Toggle diff view | `D` |
| Toggle filter panel | `F` |
| Expand/collapse context section | `C` |

15. Integration with Existing Patterns

| Pattern | How This Feature Uses It |
|---------|--------------------------|
| Split-Pane (A4.3) | Scope List + Content Detail follows the Search + Detail pattern |
| Page Header (4.1) | Round name, WP reference, deadline badge, progress |
| Empty State (4.2) | Custom empty states per section (no assignments, empty scope) |
| Error State (4.3) | Standard retry pattern for failed data fetches |
| Loading Skeleton (4.4) | Dedicated skeleton mirroring the split-pane layout |
| Status Bar (4.7) | Shows active review context and progress |
| Context Menu | Right-click Object in scope list → "View in Authoring", "Open diff" |
| Toast Notifications | Sign-off success, invalidation alerts |
| Confirmation Dialog | Used for bulk sign-off actions (if reviewing multiple unchanged Objects) |

Integration with 049 Surfaces

| 049 Surface | Integration Point |
|-------------|-------------------|
| WP detail → Review Rounds tab | "Open in Review" action on each Object in Scope sub-tab links to this page |
| Activation confirmation (Section 3.5) | After activation, reviewer notifications link to this page |
| Round detail → Assignments sub-tab | Shows which reviewers have signed off (progress data from 051) |
| Round detail → Activity sub-tab | Shows sign-off events, invalidation events (audit from 051) |
| Delegation dialog (Section 5) | Reused directly — "Delegate..." action in page header opens 049's dialog |
| Author View review badge | Clicking a review badge on an Object can link to `/review/:roundId/object/:objectId` |

16. Capability Gating

049 defines ReviewRound.Manage (round CRUD) and ReviewRound.Read (view rounds). This spec adds a reviewer-facing capability:

| Capability | Owner | Protects |
|---|---|---|
| `ReviewRound.Manage` | 049 | Creating, activating, closing review rounds (content manager) |
| `ReviewRound.Read` | 049 | Viewing review round detail (read-only, content manager) |
| `ReviewGroup.Manage` | 049 | CRUD on review groups (workspace admin) |
| `ReviewRound.Participate` | **051** | Accessing the Review Round Page, signing off, commenting |

Pattern:


17. URL State Conventions

| State | Mechanism | Example |
|---|---|---|
| Active workspace | URL path segment | `/ws/:workspaceId/` |
| Review round | URL path segment | `/review/:reviewRoundId/` |
| Selected Object | URL path segment | `/review/:roundId/object/:objectId` |
| Active tab (content/diff/history) | URL search param | `?tab=diff` |
| Filter selection | URL search param | `?filter=new,modified` |
| Sort order | URL search param | `?sort=status` |

All URLs are deep-linkable. Sharing a URL loads the exact view (round, Object, tab, filter).


18. Data Fetching Strategy

| Query | Trigger | Invalidation |
|-------|---------|--------------|
| Round scope (Object list + statuses) | Page load | SignalR scope-change event |
| Object content (profile-filtered) | Object selection | Content revision event |
| Diff (baseline → current) | Diff tab selection | Content revision event |
| Sign-off history | History tab selection | Sign-off mutation |
| Progress stats | Page load + periodic | Sign-off events, scope changes |

19. Conventions Checklist (New Page)


20. Relationship to 049 UX Surfaces (Cross-Reference)

This spec complements — not replaces — the 049 UX Research. The two specs serve different personas:

| Concern | 049 (Content Manager) | 051 (Reviewer) |
|---------|----------------------|----------------|
| Round CRUD | ✓ WP detail → Review Rounds tab | — (read-only header info) |
| Scope preview | ✓ Inline in create dialog | Extended with content status column |
| Activation confirmation | ✓ AlertDialog with warnings | — |
| Close/Cancel | ✓ AlertDialog with summary | — |
| Assignment management | ✓ Side sheet (add reviewers) | — |
| Delegation | ✓ Dialog (Section 5) | Reused — reviewer triggers from this page |
| Review Groups | ✓ Admin Portal Configuration | — |
| **Scope list with status indicators** | — | ✓ Split-pane left column |
| **Content view + profile filtering** | — | ✓ Content detail panel |
| **Diff view (baseline → current)** | — | ✓ Diff tab |
| **Sign-off action + invalidation** | — | ✓ Per-Object action |
| **Contextual visibility** | — | ✓ Assigned vs context sections |
| **Progress tracking (reviewer POV)** | — | ✓ Header progress bar |

Delegation integration: When a reviewer clicks "Delegate" on the Review Round Page, it opens the delegation dialog defined by 049 Section 5. This spec does not redefine that interaction.