March 24 / Controlled rolloutWorkspace / Ops editorial
Risk remains contained because support is quiet and rollback guardrails are staged.
Cadence / Release operations board
The launch is calm enough to move fast, but only if routing stays disciplined.
This workspace treats release ops like an editorial desk: one narrative,
one routing owner, one quiet signal loop. The goal is not to ship more
controls. The goal is to keep a high-stakes rollout readable.
Current signal blend
Canary checks: stable for 28 minutes.
Support queue: zero new escalations in the current pass.
Legal note: one copy footnote remains under review.
Queue the first wave after engineering and support both stay green.
Legal is the only lane still holding a sentence-level note.
{quietMode
? "The board is almost empty, which is when routing discipline matters most."
: "Support is quiet, but the customer note should stay staged until the next check."}
OverviewRoutingAudience
One workspace for the story, the gate, and the next decision.
Release narrative
The migration is technically ready, but the customer story should still feel measured.
10% wave pending
Engineering has reduced the technical risk. What remains is message
discipline: route the launch through one owner, keep the customer
note staged, and avoid turning a calm rollout into a noisy one.
{timelineStops.map((item) => (
{item.title}
{item.window}
{item.note}
))}
{quietMode ? (
Quiet shiftNo escalations are waiting on this desk.
Keep the board sparse, hold the customer note, and use the next
quiet cycle to confirm routing before the wave is queued.
) : (
Support pulse
The queue is calm, but not calm enough to go unsupervised.
Customer note
Staged
Keep the note unpublished until the canary stays quiet for one
more cycle.
Macro pack
Ready
Support copy aligns with the release narrative and rollback path.
EscalationsNo active escalations
Stay disciplined anyway. Quiet boards are where rushed launches
usually create avoidable noise.
)}
Routing principle
Keep one owner visible, one fallback explicit, and one customer note staged.
{visibleRoutingRows.length} visible lanes
The routing desk stops being narrative-only here. Search narrows the live
lane list, sorting reshapes the order of attention, selection supports a
quiet multi-lane brief, and row actions keep deeper edits in overlays
instead of forcing the table to become an app inside itself.
Watching and holding lanes should stay visible until the next quiet cycle clears.
{selectedRoutingCount > 0
? `${nextOwner} currently anchors the first selected lane.`
: "Use row selection to brief multiple owners without leaving the desk."}
Routing lanes
One table for owners, notes, gates, and the next quiet-cycle decision.
Search, sort, select, paginateRow actions stay out of the grid
No visible routing lanesThe current desk view is intentionally sparse.
Clear the search or switch the lane filter if you need a wider view before queueing.
}
getRowId={(row: RoutingLaneRow) => row.id}
loading={routingLoading}
onSearchValueChange={setRoutingSearch}
onSelectionChange={setRoutingSelection}
onSortingChange={setRoutingSorting}
pageSize={4}
pageSizeOptions={[4]}
searchLabel="Search routing lanes"
searchPlaceholder="Search lanes, owners, notes"
selectionLabel={(selectedRows) =>
`${selectedRows.length} lane${selectedRows.length === 1 ? "" : "s"} selected for a quiet-cycle brief.`
}
selectionActions={() => (
<>
>
)}
enableSelection
renderRowActions={(row: RoutingLaneRow) => (
{
showToast(
`${targetRow.lane} digest sent`,
`${targetRow.owner} now has the latest routing note and quiet-cycle gate in their inbox.`
);
}}
row={row}
/>
)}
rows={visibleRoutingRows}
searchValue={routingSearch}
selection={routingSelection}
sorting={routingSorting}
toolbarActions={
<>
>
}
/>
Audience framing
The internal narrative should be more detailed than the external one.
Internal viewers
Mention rollback thresholds, reviewer routing, and support macro timing.
Customers
Keep the message short, calm, and reversible. Explain the value, not the pipeline.
Presenter note
If the launch feels quiet in this tab, that is success. The board should
only get louder when a decision actually changes.
{
setSheetOpen(open);
if (!open) {
setActiveLane(null);
}
}}
open={sheetOpen}
>
{activeLane ? `${activeLane.lane} lane settings` : "Routing lane settings"}
{activeLane
? `Update the owner, note, and digest posture for ${activeLane.audience.toLowerCase()} before the next gate.`
: "Keep the lane owner explicit and the customer note disciplined before the wave is queued."}
{toastCopy.title}{toastCopy.description}Open desk
);
}
const meta = {
title: "Scenes/Release Workspace",
component: ReleaseWorkspaceScene,
parameters: {
docs: {
description: {
component:
"Release Workspace is a realistic composition story that shows how Cadence UI behaves when the design system stops being a component shelf and becomes an actual operations surface. It now uses a real routing table workflow to test search, sorting, selection, pagination, row actions, and overlay handoffs inside one believable release desk."
}
},
layout: "fullscreen"
},
tags: ["autodocs"]
} satisfies Meta;
export default meta;
type Story = StoryObj;
export const Playground: Story = {};
export const QuietShift: Story = {
args: {
quietMode: true
}
};