# A cell that resists an invariant

> This section covers the walk over the grid that plans coverage, shown in [the walk], and the step in it where a cell resists an invariant.

Page: Architecture · Coverage
Canonical: https://banes-lab.com/software-architecture/coverage#a-cell-that-resists-an-invariant

This section is stop 70 of 102 in the learning route. Previous: [02 - What can drift, seen through how it drifts](https://banes-lab.com/software-architecture/coverage/what-can-drift-seen-through-how-it-drifts.md). Next: [04 - The honest gaps](https://banes-lab.com/software-architecture/coverage/the-honest-gaps.md). It builds on [02 - What can drift, seen through how it drifts](https://banes-lab.com/software-architecture/coverage/what-can-drift-seen-through-how-it-drifts.md).

This section covers the walk over the grid that plans coverage, shown in [C1·a the walk](https://banes-lab.com/software-architecture/coverage#a-cell-that-resists-an-invariant-panel-a), and the step in it where a cell resists an invariant.

### Walk the grid

Checks accumulate by incident, so the covered cells are the ones that already failed and the uncovered ones are the ones that will. A team adds a check after every outage, the check count grows, and the failure that ships next lives in a cell the outages never happened to touch. A rule set built by incident has a shape decided by which incidents happened, and the drift classes that never produced an incident are exactly the ones with nothing watching them.

For this reason a cell that resists an invariant is an undecided intent rather than a missing rule. Authoring stops when a cell resists, and the design is decided before the check, because the cell is saying the convention it would enforce was never chosen. In practice, the grid is walked with the checks that exist, and every empty cell is treated as a question rather than a gap. Where the invariant states itself, the predicate is authored. The unwatched cells are recorded with their reasons, so the unassessed set stays countable and a later reader can tell a decision from an oversight.

To check this, find an empty cell and try to state its invariant in one sentence that could be false. If the sentence comes, you were missing a check. If it does not, you are missing a decision, and no check can be written until it is made. A cell whose predicate nothing could ever disagree with is not authored. It is held with the forgone property written down, for the reason described in [the check comes first](https://banes-lab.com/disciplined-methodology/build/the-check-comes-first.md) on the methodology page.

### Two invariants of the walk

Two invariants keep this a method rather than a rule pile. The first is that no rule exists without a consuming failure mode. A rule earns its place only if a real drift class fires it, because a rule nothing can violate is ceremony, and ceremony costs the same review attention as a real rule, which is how a rule set stops being read.

The second is that the rule set is derived while the judgement that authored it is not. Which cells need watching is a deterministic function of the architecture's declared invariants, whether an invariant was worth declaring is a decision, and the [determinism](https://banes-lab.com/records/arch/determinism.md) stays in the predicate rather than in the deciding.

### The walk in the canon

The [walk itself](https://banes-lab.com/records/algo/surface-grid-walk.md) and the [gap it derives](https://banes-lab.com/records/algo/uncovered-gap-derivation.md) are records in the canon, and the cells the canon has not yet covered are [listed rather than assumed away](https://banes-lab.com/ontology/reasoning/the-uncovered-cells.md).

[Gap analysis](https://banes-lab.com/records/arch/gap-analysis.md) is the activity, and a resisting cell is its most useful output. A cell whose invariant states itself was a missing rule. A cell whose invariant will not state itself is an [architecture review](https://banes-lab.com/records/arch/architecture-review.md) waiting to happen, and an [architecture decision record](https://banes-lab.com/records/arch/architecture-decision-records.md) is where its answer lands, so the next walk finds a decision rather than the same empty cell.

C1·a the walk

```mermaid
flowchart TB
enumerate["Enumerate the checks that exist"]
map["Map each to its cell · dimension by lens"]
walk["Walk the grid"]
empty{"Empty cell?"}
name["Name the invariant that should hold there"]
decide{"Can the invariant be stated?"}
author["Author the predicate, or record the cell as deliberately unwatched"]
undecided["An undecided intent · the finding is the design, never the rule"]
enumerate --> map --> walk --> empty
empty -- yes --> name --> decide
decide -- yes --> author
decide -- no --> undecided
```

## Links to

- [The check comes first](https://banes-lab.com/disciplined-methodology/build/the-check-comes-first.md)
- [Determinism](https://banes-lab.com/records/arch/determinism.md)
- [Surface Grid Walk](https://banes-lab.com/records/algo/surface-grid-walk.md)
- [Uncovered Gap Derivation](https://banes-lab.com/records/algo/uncovered-gap-derivation.md)
- [The uncovered cells](https://banes-lab.com/ontology/reasoning/the-uncovered-cells.md)
- [Gap Analysis](https://banes-lab.com/records/arch/gap-analysis.md)
- [Architecture Review](https://banes-lab.com/records/arch/architecture-review.md)
- [Architecture Decision Records (ADR)](https://banes-lab.com/records/arch/architecture-decision-records.md)

## Linked from

- [Coverage is derived](https://banes-lab.com/disciplined-methodology/verify/coverage-is-derived.md)
