# Limits

> This section covers what a document cannot do and how it says so.

Page: PAG · Validation
Canonical: https://banes-lab.com/pag/validation#limitations

This section is stop 51 of 102 in the learning route. Previous: [01 - Validation gates](https://banes-lab.com/pag/validation/validation-gates.md). Next: [01 - A system is a graph](https://banes-lab.com/software-architecture/model/a-system-is-a-graph.md). It builds on [03 - Semantic operations](https://banes-lab.com/pag/guide/tool-invocation.md).

This section covers what a document cannot do and how it says so. The limits a document declares are written in [B1·a declared limits](https://banes-lab.com/pag/validation#limitations-panel-a), and [B1·d what it never reaches](https://banes-lab.com/pag/validation#limitations-panel-d) shows what lies beyond a document's reach. A slot resolves to one of three states, as written in [B1·b slot states](https://banes-lab.com/pag/validation#limitations-panel-b) and shown in [B1·e three states](https://banes-lab.com/pag/validation#limitations-panel-e), and a reading larger than one session is split as shown in [B1·c size and time](https://banes-lab.com/pag/validation#limitations-panel-c). Each limit is one to design for rather than a flaw to route around.

### Declared, never assumed

A directive names a capability the harness may not have. A workflow declares a parallel group and a watch on a surface, the harness has neither, both branches run against a guess, and the workflow reports every gate green over work that never happened. A branch runs against a value unless the adapter declares there is none, so a missing declaration reads as a value.

For this reason an absence is declared where it would otherwise be assumed, and a slot with no analogue is marked absent rather than faked. An adapter that resolves everything is refused, and each branch is routed by the slot's declared state rather than by whether a value happens to exist. In practice, each limit is declared beside the mechanism a reader would otherwise expect to cover it. A document that exceeds one reading is split into nodes the reader takes one at a time, and only what a directive persists to a surface is carried across sessions.

To check this, find the state of each slot a document names in its adapter. A slot with no state is a branch running against a guess, and the repair is a declaration rather than a value. Declaring a limit does not remove it. Stating that output is probabilistic is the reason the gates exist, so the declaration is not a disclaimer.

The limits divide by what a document can and cannot reach. A document reaches the input a reasoning loop reads, and nothing past that. Output is a sample from a distribution on every run, so [reproducibility](https://banes-lab.com/records/arch/reproducibility.md) is not on offer, and the model's confidence is not observable from outside, so a gate cannot condition on it. A document that names its model has written a claim into a slot the harness owns.

The states other than resolved keep a document from running against a guess. An adapter is a [capability declaration](https://banes-lab.com/records/arch/capability-declaration.md), and one that resolves every slot is claiming at least one capability its harness does not have. Size and time are facts about the model reading the document. Its context is bounded, so what crosses a node boundary is the output the next contract reads rather than the whole history, and its session ends, so what the next session needs is persisted rather than remembered.

B1·a declared limits

```pag
# what a document cannot do · declared where a reader would otherwise assume it
LIMIT <execution>:      "a document has no runtime · a reasoning loop walks it and an adapter performs its effects"
LIMIT <determinism>:    "the same document may produce different results across runs"
LIMIT <introspection>:  "a gate checks an outcome · never the model's confidence"
LIMIT <portability>:    "a document written for one model behaves differently under another"
LIMIT <persistence>:    "nothing survives a session unless a directive writes it"
LIMIT <concurrency>:    "a parallel group declares independence · the harness decides what runs together"
LIMIT <availability>:   "an operation assumes the adapter resolves it · an absent resolution is declared, never assumed"
LIMIT <feedback>:       "a document describes a linear or branching flow · watching for change needs a tool"
```

B1·b slot states

```pag
# a slot resolves to one of three states, and the third is the load-bearing one
SLOT {toolchain.watch}:    ABSENT    "this harness cannot block on a surface · the branch does not run"
SLOT {toolchain.parallel}: RESOLVED  "the harness runs a parallel group together"
SLOT {project.checkpoint}: DEFERRED  "a reversible checkpoint will exist · the branch is blocked, not skipped"

WHEN <a directive names a slot>:
IF <slot> is ABSENT:   DECLARE the absence · SKIP the branch
IF <slot> is DEFERRED: DECLARE the deferral · BLOCK the branch
IF <slot> is RESOLVED: RUN the branch
```

B1·c size and time

```pag
# a bounded context is a limit, not a surprise
WHEN <document> exceeds <what one reading consumes>:
SPLIT <document> INTO <nodes the reader takes one at a time>
CARRY <the output the next node's contract reads> · never the whole history

WHEN <a workflow runs longer than one session>:
PERSIST_ARTIFACT <what the next session reads> TO <a surface>
READ_RESOURCE <it> at the start of the next · the document itself remembers nothing
```

B1·d what it never reaches

```mermaid
flowchart TB
doc["A document"]
reaches["Reaches · the input the loop reads"]
not["Does not reach"]
exec["Execution · the binding performs the effects"]
out["Output · a sample, every run"]
inner["The model's confidence"]
other["Another model's behaviour"]
doc --> reaches
doc -. never .-> not
not --> exec
not --> out
not --> inner
not --> other
```

B1·e three states

```mermaid
flowchart LR
slot["A slot a directive names"]
adapter{"What does the adapter say?"}
resolved["RESOLVED · the branch runs"]
absent["ABSENT · declared, the branch does not run"]
deferred["DEFERRED · declared, the branch is blocked"]
faked["Nothing declared · the branch runs against a guess"]
slot --> adapter
adapter -- a value --> resolved
adapter -- absent --> absent
adapter -- deferred --> deferred
adapter -. no declaration .-> faked
```

## Links to

- [Reproducibility](https://banes-lab.com/records/arch/reproducibility.md)
- [Capability Declaration](https://banes-lab.com/records/arch/capability-declaration.md)

## Linked from

- [What PAG is](https://banes-lab.com/pag/introduction/what-is-pag.md)
- [PAG and the method](https://banes-lab.com/pag/introduction/pag-and-the-method.md)
- [Semantic operations](https://banes-lab.com/pag/guide/tool-invocation.md)
- [Writing constraints](https://banes-lab.com/pag/guide/writing-constraints.md)
- [Validation gates](https://banes-lab.com/pag/validation/validation-gates.md)
- [Template families](https://banes-lab.com/pag/templates/templates-families.md)
