# The ceiling moves by cost

> This section covers how the ceiling on parties moves.

Page: Architecture · Scale
Canonical: https://banes-lab.com/software-architecture/scale#the-ceiling-moves-by-cost

This section is stop 98 of 102 in the learning route. Previous: [01 - A concern is a component](https://banes-lab.com/software-architecture/scale/a-concern-is-a-component.md). Next: [03 - Above one tier, reduction](https://banes-lab.com/software-architecture/scale/above-one-tier-reduction.md). It builds on [01 - A concern is a component](https://banes-lab.com/software-architecture/scale/a-concern-is-a-component.md).

This section covers how the ceiling on parties moves. A reader who takes the bound as fixed reaches for the wrong lever, and the expensive one, because the rate at which a claim goes stale has one writer while its cost has every reader, as shown in [B1·a rate and cost](https://banes-lab.com/software-architecture/scale#the-ceiling-moves-by-cost-panel-a) and plotted in [B1·b the two terms](https://banes-lab.com/software-architecture/scale#the-ceiling-moves-by-cost-panel-b).

### The cost, not the rate

The bound on parties is read as fixed, so the only lever a team reaches for is fewer parties. A team that keeps tripping over stale claims removes a seat, the remaining seats trip at the same rate, and the work that seat owned now has no owner. Staleness looks like a rate problem because it is felt as a rate, but the rate has one writer, and what actually grows with the population is how many parties pay for each stale claim.

For this reason the ceiling on fan-in moves with the cost of a stale claim, not with the rate at which claims go stale. The ceiling is raised by cutting what a stale claim costs, never by cutting who reads it. In practice, the two terms are separated before the headcount is touched. The rate is left alone, because one writer and one composer set it and no number of readers changes it. The cost is attacked instead, by marking every claim with the state of the surface it rested on when it was written, so a claim whose surface has since moved costs its readers a glance where an unmarked one costs every party a read and a reply. The fan-in is measured again after the marker is in place, and the ceiling rises only by what the measurement shows.

To check this, take any stale claim and count who read it and who answered it. If the count is the population, the cost is the term to attack, and if the claim went stale faster than one writer could produce it, you have found a second writer. Two limits apply. Added parties never answer a claim that something is absent, because they produce agreement rather than coverage, and only a refusal that publishes its criterion turns an unanswerable absence into an ordinary read. The bound also does not move where the cost of a stale claim is dominated by the work already built on it, because no marker makes that work cheaper to redo.

### The marker

A mechanism that records when a claim's cited surface was observed reduces no staleness, only what staleness costs, so it raises the ceiling without touching the partition.

The marker is a [correlation id](https://banes-lab.com/records/arch/correlation-id.md) for reasoning, because it joins a claim to the state it was made against, the way a correlation id joins a log line to the request that produced it. [Causal consistency](https://banes-lab.com/records/arch/causal-consistency.md) is the property it buys, since a reader can tell whether a claim happened before or after the surface it rests on moved, without a clock and without asking.

### What the lever leaves alone

The lever changes one thing. The partition stays what the forcing relation derived, the seats stay what the floor demanded, and what changes is how expensive it is for the parties to be wrong about each other for a moment.

[Eventual consistency](https://banes-lab.com/records/arch/eventual-consistency.md) between parties is the state the marker makes affordable. Each party holds a view that may lag, and the lag is visible rather than argued. Consensus is the expensive alternative, every party agreeing before any proceeds, and it is the right mechanism only where a stale claim costs more than a halt.

B1·a rate and cost

```mermaid
flowchart LR
rate["The rate a claim goes stale · set by one writer and one composer"]
cost["The cost of a stale claim · multiplied by every reader"]
marker["A claim marked with the surface state it rested on"]
glance["A glance instead of an argument"]
ceiling["The ceiling rises"]
rate -. unchanged by headcount .-> ceiling
cost --> marker --> glance --> ceiling
```

B1·b the two terms

```mermaid
xychart-beta
title "A stale claim: the rate has one writer, the cost has every reader"
x-axis "parties" [1, 2, 3, 4, 5, 6, 7, 8]
y-axis "cost of one stale claim" 0 --> 16
line "unmarked claim · argued by every reader" [1, 2, 4, 6, 8, 10, 12, 14]
line "marked claim · a glance per reader" [1, 1, 2, 2, 3, 3, 4, 4]
line "rate of going stale · one writer" [1, 1, 1, 1, 1, 1, 1, 1]
```

## Links to

- [Correlation ID](https://banes-lab.com/records/arch/correlation-id.md)
- [Causal Consistency](https://banes-lab.com/records/arch/causal-consistency.md)
- [Eventual Consistency](https://banes-lab.com/records/arch/eventual-consistency.md)

## Linked from

- [Composing a collaboration](https://banes-lab.com/pag/orchestration/composing-a-workflow.md)
- [Scale follows from structure](https://banes-lab.com/disciplined-methodology/ship/scale-follows-from-structure.md)
