diff --git a/docs/content/metrics_reports/dashboards/PRO__command_center.md b/docs/content/metrics_reports/dashboards/PRO__command_center.md index 0ed6e142161..325528af3e6 100644 --- a/docs/content/metrics_reports/dashboards/PRO__command_center.md +++ b/docs/content/metrics_reports/dashboards/PRO__command_center.md @@ -8,20 +8,62 @@ slug: command-center --- Note: the Command Center is a DefectDojo Pro feature in beta. It builds on [Customizable Dashboards](../custom-dashboards/) and is off by default. A superuser can turn on the command_center flag from Settings > Feature Flags (it requires the dashboard_v2 flag). -The Command Center expands DefectDojo Pro's customizable dashboards into a full security command center: one screen that answers, in fixed zones, **what's on fire**, **are we winning**, and **is the machine healthy**. It is not a new page: it ships as a family of preset layouts plus new widget types on the same dashboard system, so everything stays customizable, shareable, cloneable, exportable, and drivable from the [dashboards REST API](../custom-dashboards-api/). +The Command Center is one composed screen that answers, in fixed zones, **what's on fire**, **are we winning**, and **is the machine healthy**. Sources stream in from the left, the flow narrows through three numbers wrapped in the posture score, and the outcomes fan out on the right, with the numbers a leader asks for along the bottom. Behind it sits the same dashboard system as [Customizable Dashboards](../custom-dashboards/): a customizable grid preset, new widget types, and the [dashboards REST API](../custom-dashboards-api/), so everything the scene shows can also be laid out, shared, cloned and exported your own way. > **💡 Tip:** In DefectDojo Pro, **Assets** were formerly called **Products** and **Organizations** were formerly **Product Types**. The UI follows your instance's naming setting. +## The scene + +![The Command Center scene](images/command_center_scene.png) + +With the flag on, **Home** lands on the scene, which has its own page at `/command-center`. It is read left to right: + +* **The brief**: up to three grounded sentences as outlined cards across the top of the scene itself, every card a door to its evidence. When nothing changed since the previous snapshot, the row says so. +* **Sources**: one row per scanner or connector with its volume in the window, its state, and its change against the previous window. Each row stacks its volume over the tool's name, right-aligned to a gap before its ribbon, inside a faint dashed, unfilled box under a bold **Top sources** title (the rail keeps the twelve largest sources and folds the rest into one row), mirroring the two family boxes on the right. Each ribbon is a dashed line of short, rounded dashes, every line the same weight (volume is carried by the beam's glow, below), dim neutral gray on the sources side (raw volume is not a signal), the accent blue on the outcomes side. A source that has stopped reporting draws as dashes that fade along their length; a source whose last run failed fades in the down color, and a source with failed imports draws in the warning color. The screen shows when it is blind rather than letting silence read as clean. +* **The flow**: three nested rings for **ingested**, **unique after dedupe** and **actionable now**, sized by the square root of their counts so a dominant stage does not blank the others, with the 0 to 1000 [posture score](../posture-score/) as the outer ring. The score ring is split into its five published components, each a band outlined at full strength over a translucent fill (the way the Insights charts draw a bar), gray for the component's full weight and the band color for the points it earned, with the value and its 30-day change on the rim. Each component's caption follows its arc just outside the ring, points earned over weight then its name ("37/300 open severity burden"), so the whole formula reads around the ring. Hovering a sector brings it into focus: it takes more of the ring and its band grows outward while the others give way, and a card beside it says the points it earned and is leaving on the table, the input it was scored on, the move that would raise it most with the points that move is worth, and the formula's own sentence about it. The **Why this score** drawer carries the full breakdown and every lever, and says when it is loading or could not load. The screen carries one continuous motion: a beam through the ribbons, from the sources into the ring and out to the outcomes, the way the data itself moves. The rings beat with it: as the lit window passes through the centre, the score ring, the three flow rings and the ground behind them brighten together and settle as it leaves, so the whole instrument pulses once per pass of the data rather than on a clock of its own. The beam is a lit window that sweeps the stage left to right once every few seconds: as it passes, each line's own dashes brighten (white on the sources side, the accent's bright tone on the outcomes side) under a glow, then settle back to dim. Nothing is added to the line; the line itself lights up. Volume is the glow: the line carrying the most on its side burns widest and brightest as the beam passes, a line carrying a tenth of that barely warms, and a source with nothing in the window, or one whose last run failed, carries none. Each ring carries a second line saying what it counts: **all sources**, **after dedupe**, **ready to work**, and each tells a story in arcs around its circumference. The ingested ring divides by source (who fed the window, and how unevenly), in the neutral gray family; hovering a source in the rail lights its arc. The unique ring divides by severity, Critical to Low in the severity colors, so the ring itself shows how much red mass came in new this window. The actionable ring divides by risk band, Urgent then Needs Action, so it shows how urgent what is ready to work is. Every arc is a door onto its own slice of the ring's list (that source's findings, new findings of that severity, actionable findings in that band). Hovering an arc brings it into focus the way a score sector does, with a card beside it naming the ring and the slice, the count, its share of the ring and where its door opens; while any segment of any ring is in focus, the other rings stand aside in grey. A ring with nothing to divide draws whole, and a replayed day draws its rings whole because the breakdowns come from the live findings. A ring whose count is zero draws quiet in the track color rather than glowing as if it carried volume, and hovering a source in the rail lights that source's share of the ingested ring as an arc. The score names its band next to the value (Strong, Needs attention, At risk) and, above it, the component costing it the most points. When the scene arrives, and whenever the window, scope or replayed day changes, the counts ease to their values and the rings and ribbons grow into shape rather than jumping (a source that leaves the window counts down and goes, one that arrives counts up, and a window with no imports says so in the sources rail); the beam and the beat it drives are the only continuous motion, and a reduced motion preference snaps the transitions and turns them off. +* **Receipts**: the two gaps in the flow are itemized under the rings. "Matched existing on import" is the importer's own dedupe and opens the import receipts export; "removed by rules" opens the rules receipts. The rules receipt is shown only when the instance has the rules engine switched on. When the ledgers describe different populations the remainder reads "unattributed", never an invented number. +* **Automation**: a card in the strip. Its number is the share of work the rules handled; under it, what the rules engine did in the window, by action (closed, marked duplicate, status changed, updated, created, reopened, notified), each a door to the rules receipts for that action, and the total by rules. "Marked duplicate" counts rules that marked a finding as a duplicate; the importer's dedupe is not a rule action and shows under the rings as matched existing on import, so the two numbers are different ledgers and are not expected to agree. +* **Outcomes**: **Needs attention** (open, past SLA, Critical or High, plus any open known-exploited finding), **In progress** (under review, with a claimed review, or with a ticket), **Mitigated with controls** (risk acceptances with a Mitigate decision), **Resolved** (mitigated in the window), and **Accepted risk**, which carries a clock: how many acceptances expire within 30 days and how many are already past their date and unhandled, in the warning color, never severity red. The five read as two families first, **Active** (Needs attention, In progress) and **Mitigated** (Mitigated with controls, Resolved, Accepted risk): each bucket has its own ribbon from the ring, and each family sits in its own dashed, unfilled box on the stack, headed, with the ribbons ending where the box begins, and with the family's findings by severity as a row of tags gathered at the foot of the box (a union counted once, so a finding that is both past SLA and under review counts one). Severity is always drawn the same way on this screen: the first letter in a small tag of the severity's color (Low in the blue the rest of the app gives it), the count beside it in plain text. Counts start a gap after the ribbons end, under an Outcomes title centred on the stack. The headings carry no number, because a sum would mix findings with acceptances and would have no single list to open. +* **The strip**: five outlined cards: vulnerable assets (with never-scanned assets as their own hollow segment, never green and never merged with zero findings), active findings with severity chips, median time to remediate, automation (above), and assets scanned within 30 days. + +Every number on the screen carries a delta against the previous equivalent window, and every number is a door. Every delta names its window. A number the ledgers cannot support is a dash, never a zero. + +### Every number is a door + +Clicking a number lands on the matching list with the filter chips visible, so what you see is exactly what the number counted. Hovering (or focusing with the keyboard) shows how a number is made up; the parts are doors too. The rings are one keyboard group: up and down move between them, Enter opens. + +| Door | Lands on | With these chips | +|---|---|---| +| A source | Findings | the tool, the window's discovery dates | +| Ingested, Unique | Findings | the window's discovery dates (Unique adds not duplicate) | +| Actionable | Findings | active, not duplicate, not false positive, not out of scope, not risk accepted, not mitigated; risk Urgent or Needs Action; the window | +| Matched existing, removed by rules, the automation counts | Receipts export | the scene's window, over what you can see (a rule action narrows the rules receipts) | +| The score ring | Why this score | the component breakdown and the counterfactual levers | +| Needs attention | Findings | active, past SLA, severity Critical or High (the known-exploited half is its own door) | +| In progress | Findings | active, under review (claimed and ticketed are their own doors) | +| Mitigated with controls, Accepted risk | Risk acceptances | decision Mitigate or Accept; the expiry clock adds the expiration dates | +| Resolved, MTTR | Findings | mitigated, with the window's mitigation dates | +| Vulnerable assets, never scanned, scanned within 30 days | Assets | findings count at least one; never scanned; last scanned after the window start | +| Active findings and its severity chips | Findings | active, not duplicate (plus the severity) | + +### Window and history + +The scene always shows what you are authorized to see, so every door lands on a list that adds up to its number. The list's breadcrumb says where you came from and what you are looking at: **Command Center** (a link back to the scene) then the door's own words, with the scene's window spelled out ("New findings in the last 30 days"). The window picker sets 7, 30, 90 or 365 days; every number and every delta follows it. The history scrubber replays any day in the last year from the daily snapshot ledger: drag it, or press left and right, and the whole scene re-renders as of that day with a badge saying so. A day the ledger reconstructed rather than observed is marked "reconstructed, no live state", and the parts of the screen the ledger did not carry that day read as dashes. Today is the live end stop. These settings are remembered per browser; they are never part of the page address. + +### The customizable grid + +The grid preset that used to be called Command Center is now **Command Center (custom)**: the same layout, with its widgets, that you can clone and rearrange. It is a preset like any other, so new users are still handed **Default Dashboard** on first login. **Customize** in the scene header opens it, and it stays under **Dashboards** in the sidebar. Its "Within SLA" gauge has become a big KPI of the SLA breach count, in line with the design rule that the Command Center uses no gauges. + ## The preset family Turning the flag on publishes four seeded, cloneable layouts under the **Command Center** group of the Shared Templates picker: -* **Command Center** (the new starter): the flagship screen. New users land on it; existing users keep their current dashboards and defaults, and can clone it whenever they like. +* **Command Center (custom)**: the customizable grid behind the scene. Existing users keep their current dashboards and defaults, and can clone it whenever they like. * **Exec Brief**: the board-facing view. The posture score with its why panel, the quarter's trajectory, risk acceptance debt, fix durability, and a fairness-normalized team scorecard. * **Ops Triage**: queue first. Your work, what breaches next, this week's intake funnel, live activity, backlog aging. * **Platform Health**: the machinery deep dive. The pipeline funnel at full width, the sensors rail, automation throughput, coverage freshness, license headroom. -With the flag on, the sidebar **Home** entry lands on your default customizable dashboard; the classic dashboard stays reachable as **Legacy Dashboard** while your team migrates. +With the flag on, the sidebar has two dashboard entries: **Home** lands on the scene, and **Dashboards** opens the customizable grids. ## The daily snapshot backbone @@ -37,7 +79,7 @@ The coverage freshness widget buckets assets by days since their last scan, with ## TV / wall mode -Any dashboard (or a playlist of several) can run full screen on a wall monitor: open the **Present on TV** dialog from the dashboard toolbar, pick the layouts and cadences, and bookmark the generated URL on the wall box. The kiosk auto-cycles with a dwell indicator, refreshes data on its own cadence, pins the wall for 90 seconds when a new Critical arrives, reloads itself every 8 hours, shows when its numbers were last true, and says so plainly when the connection is lost. Sign the wall box in as a dedicated read-only user: the screen shows exactly what that user is authorized to see, and nothing more. +The scene, any dashboard, or a playlist of several can run full screen on a wall monitor: open the **Present on TV** dialog from the scene header or the dashboard toolbar, pick what the wall should show (the scene is offered first) and the cadences, and bookmark the generated URL on the wall box. On the wall the scene fills the screen with the brief line above it, at a type size meant to be read from across a room. The kiosk auto-cycles with a dwell indicator, refreshes data on its own cadence, pins the wall for 90 seconds when a new Critical arrives, reloads itself every 8 hours, shows when its numbers were last true, and says so plainly when the connection is lost. Sign the wall box in as a dedicated read-only user: the screen shows exactly what that user is authorized to see, and nothing more. ## The scheduled executive pack diff --git a/docs/content/metrics_reports/dashboards/images/command_center_scene.png b/docs/content/metrics_reports/dashboards/images/command_center_scene.png new file mode 100644 index 00000000000..e4a71e6344e Binary files /dev/null and b/docs/content/metrics_reports/dashboards/images/command_center_scene.png differ