# Roll-up

URL: /code/views/roll-up · Id: `page:code/views/roll-up`

> A view over many scopes shows a distribution and its named exceptions, so its size follows what is wrong, not how many members it has.

Roll-up turns many scopes into one view. A set renders as its distribution plus its named exceptions, so a [Studio](/business/nouns/studio) view is the same size at 40 [Startups](/business/nouns/startup) or 40,000.

## Exceptions, not members
A member is named when it is off pace, outside its noise band, owned by the reader's [Role](/business/nouns/role), or waiting above a stakes tier. The band comes from the number's own history, and members inside it compress to a count.

```md
Outside revenue · 112 Startups · p50 $3.1k/wk · ▲4% wk [m:outside-revenue]
- chairside.app · $0 for 3 wk · was $2.4k · outside band [s:chairside.app]
- permitfeed.dev · ▲61% wk · outside band [s:permitfeed.dev]
+109 inside band [rest]
```

The view grows with the number of things wrong, never with the number of members.

## How numbers combine
Each [Metric](/business/nouns/metric) declares how it combines, once. Every [Dashboard](/business/nouns/dashboard) that rolls it up follows that declaration, so one Metric never sums two ways.

| Additivity | Across scopes | Across time | Example |
| --- | --- | --- | --- |
| Additive | Sum | Sum | Outside revenue |
| Semi-additive | Sum | Last value | Cash on hand |
| Non-additive | Recompute from parts | Recompute from parts | Activation rate |

A ratio never averages. Activation across a [Portfolio](/business/nouns/portfolio) divides total activated [Customers](/business/nouns/customer) by total new Customers, so a Startup with ten signups cannot outweigh one with ten thousand.

Lists without a Metric declare their own rule. [`TaskInbox`](/code/ui/components/task-inbox) and [`PendingFeed`](/code/ui/components/pending-feed) merge items and rank them by window close. [`DataTable`](/code/ui/components/data-table) adds a scope column, and [`GoalTree`](/code/ui/components/goal-tree) re-roots at the scope.

## Goals roll up by support
Each [Goal](/business/nouns/goal) names the Goal it supports, and that edge is the drill path. A parent [Key Result](/business/nouns/key-result) declares how it reads its children: their sum, how many meet target, their minimum, or a weighted sum.

Pace is derived, never typed in. A Key Result's weekly threshold is the distance left divided by the weeks left. The tree shows which children carry a parent, which Goals support nothing, and which Key Results nothing supports.

## Cohort percentiles
Across a Portfolio, every number becomes a percentile. [`Benchmark`](/code/ui/components/benchmark) shows the 10th, 50th and 90th percentiles of a peer set, and each member's rank within it. Peers share a [Product Template](/business/nouns/product-template) and a [Motion](/business/nouns/motion).

Each Startup's own view carries one benchmark line, such as `Acquisition payback p23 among 41 b2d Dataset APIs`. A sibling that sells a function as a [Service](/business/nouns/service) reads its clients through these views, scoped by its [Outcome Contract](/business/nouns/outcome-contract).

## Reviews roll up bottom-up
The weekly [Role review](/workflows/processes/role-review) reads each week view as of its close. The review ends in a variance packet: each exception with a one-sentence cause, an owner, and any asks of the scope above.

Packets climb in a fixed order: Role, [Team](/business/nouns/team), Startup, Portfolio, Studio. A parent's week view shows its own Key Results plus its children's packets, so every level reviews causes, not raw numbers. The order is a [Setting](/business/nouns/setting) on the Studio.