# The board and the venue

> Two surfaces with opposite lifetimes share one transport, as shown in two surfaces].

Page: Methodology · Collaborate
Canonical: https://banes-lab.com/disciplined-methodology/collaborate#the-board-and-the-venue

This section is stop 77 of 102 in the learning route. Previous: [38 - Coordination is software](https://banes-lab.com/disciplined-methodology/collaborate/coordination-is-software.md). Next: [40 - Posting and waiting are one operation](https://banes-lab.com/disciplined-methodology/collaborate/posting-and-waiting-are-one-operation.md). It builds on [38 - Coordination is software](https://banes-lab.com/disciplined-methodology/collaborate/coordination-is-software.md).

Two surfaces with opposite lifetimes share one transport, as shown in [D1·a two surfaces](https://banes-lab.com/disciplined-methodology/collaborate#the-board-and-the-venue-panel-a). The board carries coordination state, meaning who owns what and what is directed at whom, and it is swept, because it holds current truth only and an item that no seat drains is a cost every seat pays every round. One seat's part of it is shown in [D1·c a seat's record](https://banes-lab.com/disciplined-methodology/collaborate#the-board-and-the-venue-panel-c), and [D1·b an item's closure](https://banes-lab.com/disciplined-methodology/collaborate#the-board-and-the-venue-panel-b) shows how an item leaves it. The venue carries an argument and accumulates until the argument converges, because a position stands until it is read and dissent survives to the end, through the orderings shown in [D1·d convergence](https://banes-lab.com/disciplined-methodology/collaborate#the-board-and-the-venue-panel-d) and the schedule typed in [D1·e a venue schedule](https://banes-lab.com/disciplined-methodology/collaborate#the-board-and-the-venue-panel-e). The [coordination templates](https://banes-lab.com/pag/templates/templates-coordination.md) on the grammar page carry both shapes, and the seats that write them are partitioned as described in [composing a collaboration](https://banes-lab.com/pag/orchestration/composing-a-workflow.md).

### Swept and accumulated

One surface asked to hold both coordination state and an argument reports one state and hides the other. A converged venue is removed from disk as soon as it is signed, which satisfies every ordering the closure checks, and every position id the accumulator cites then points at nothing. Only the handler knows an item is handled, and only the writer was permitted to remove it, so the knowledge and the permission sat in different seats and the item stayed.

For this reason the board is swept and the venue accumulates, and the two share only their transport. The surfaces are split by lifetime rather than by topic, so a swept surface and an accumulating one never share a record. In practice, the board holds current truth only: it is overwritten in place, a resolved item is deleted outright, and every append is paired with a drain of whatever is already absorbed. Each seat's record is enclosed in a delimiter naming its writer, and each addressed item in a fence keyed to an id the tool allocates, with its kind on the marker. An edit then has a span to anchor to, a removal takes the span rather than a matched line, and the closure is chosen by the kind rather than judged. The seat that handled an item removes it, never the seat that wrote it, and extracts its durable half first. Positions are written to an open venue, the build is held while the venue stands, and the venue is archived whole once its outcome is built.

To check this, read the board for an item that argues rather than states, and read the archive for a venue whose reasoning is missing. Either one is a lifetime applied to the wrong surface. A venue can be written by the tool but never drained by it, and once archived it takes on [immutability](https://banes-lab.com/records/arch/immutability.md) as an [append-only log](https://banes-lab.com/records/arch/append-only-log.md) of the argument. Nothing in an open venue is closed or compressed, since draining a discussion would delete the argument it exists to hold. Leaving the active tree and leaving the repository are different operations, and a word like deleted blurs the two.

### Fences, kinds and the sweep

The delimiter is not decoration. A seat revising its own record needs a span it can match exactly, one that no other seat's content occupies. Without it, the only thing left to match is the whole file, so the seat reaches for a whole-file write, which succeeds, reports success to the party that overwrote, and says nothing to the party that was overwritten. A template that has to contain a record shape in order to describe one fences the specimen, because a fenced specimen is a record mentioned, while an unfenced one is a record claimed; this is the confusion between use and mention, appearing on the write side.

An item's kind sits on its marker and selects its closure, which the grammar page describes as [handoff signals](https://banes-lab.com/pag/orchestration/handoff-signals.md): typed items with closures that can be checked. An artifact item asks for something that can exist, so it closes with a typed reference that has to resolve. A reference whose kind names no corpus would resolve vacuously and read exactly like one that passed, which is why the set of kinds is closed. A judgement item asks for a reading, so it closes when its declared acknowledger signs it off, with no reference, because there is nothing for a reference to point at; the acknowledger is required or forbidden by kind rather than optional. An artifact item that carries nothing durable closes with a reference declared empty, and the tool then publishes the classes already filed, so declaring nothing durable becomes a lookup a peer can contest rather than an oversight that stays invisible.

The sweep is the mechanical drain, and it is gated on delivery: an item is a message on a [message queue](https://banes-lab.com/records/arch/message-queue.md) whose consumers are named, and it leaves the queue once every consumer has taken delivery. On every write, the tool sweeps the items that every addressee has both written after and been handed in a delivered read, extracting each one whole into the accumulator before removing it. It holds any item an addressee has not received, because having written after an item says something about that party's writing and nothing about its reading. Durability and delivery are independent, and archiving an item that no addressee received preserves the first while destroying the second. An argument is refused on the swept surface by its shape: a body carrying the declared fields of a position, derived from the venue template rather than listed, is turned back with the instruction to name the venue.

### A venue converges or holds the build

A venue declares its own exit condition, or it becomes an indefinite halt. While it stands, its presence fails the pipeline, and that red result is intended, because building around an open question produces work that gets rewritten. Its fields are its own: where each seat stands and what it still needs before it can sign. An empty list of needs across every convened seat is what convergence looks like, rather than something a seat judges. A position is posted through the tool into the seat's own fenced record, so the fence, the id, the addressing and the compare-and-swap apply on a venue just as on the board. A position ends with a signed line as its one structural end mark, because a body cut short at a blank line reaches the argument already short, and the signature detects what the boundary would hide. A signature is refused while the same seat states an open need, since an unmet need and a signature are contradictory claims by one party.

Convergence is a walk over [event ordering](https://banes-lab.com/records/arch/event-ordering.md), with each ordering encoded as a refusal rather than a note, because an ordering recorded in prose is rediscovered by collision, while one encoded in the operation cannot be broken. The general form is stated under [orchestration invariants](https://banes-lab.com/pag/orchestration/orchestration-invariants.md) on the grammar page, and how a seat writes one is described in [stating an invariant](https://banes-lab.com/disciplined-methodology/collaborate/stating-an-invariant.md). The convened set is the intersection of the board's active seats and the venue's participants, and a venue that no seat is party to is reported as failing rather than passing vacuously, because a filter over an empty set holds over nothing. Convergence certifies agreement and says nothing about the tree, so the outcome is distributed as a checklist with an owner for each item, and it lands before the venue moves. The move creates the archived name, failing if that name already exists, before it removes the source, so a failure leaves the venue where it was.

### The schedule is a graph

A successor is declared by name against a schedule rather than derived from an ordinal, because an ordinal is a position in a total order, while the real edges are partial and include forward dependencies: a [directed acyclic graph](https://banes-lab.com/records/arch/directed-acyclic-graph.md) rather than a list. The declaration is checked at the moment it is written. A deferral names its receiver on the same line and is refused unless the receiver is an active seat, a venue on disk or a planned row, and a venue that defers nothing records that as a third state, distinct from unfilled. The schedule has one author, resolved by concern and handed on rather than shared, because a schedule with several authors stops being derivable from any single reading.

The record and the schedule are the two shapes worth holding in mind, because every check on the surface derives from one of them. The state column is computed on every run unless a row declares a state with a reason, so the set of rows is the plan, and nothing in it records what happened. Both shapes ship as templates, and the checks read their contracts from those templates, as described in [the drop-in](https://banes-lab.com/disciplined-methodology/start/onboarding.md).

D1·a two surfaces

```mermaid
flowchart TB
subgraph board["The board · current truth only"]
b1["Who owns what · what is directed at whom"]
b2["Swept · a resolved item is deleted, never marked"]
b3["Read whole, every round"]
end
subgraph venue["The venue · an argument"]
v1["Where each seat stands · what it still needs"]
v2["Accumulates until it converges · dissent survives"]
v3["Holds the build while open · that red is intended"]
end
transport["One transport · fenced records, tool-allocated ids, compare-and-swap"]
board -.-> transport
venue -.-> transport
venue -- converged, absorbed, then archived whole --> archive["The archive · the reasoning survives"]
board -- absorbed items extract first --> history["The history accumulator · the only home history has"]
```

D1·b an item's closure

```mermaid
flowchart TB
posted["An item is posted · a fenced span, an allocated id, a kind, a stamp, its addressees"]
kind{"Which kind?"}
artifact["Artifact · asks for something that can exist"]
judgement["Judgement · asks for a reading"]
ref["Closes with a typed reference that must resolve"]
ack["Closes by its acknowledger, with no reference"]
handler["Closed by a seat in its reader set · never its author"]
ledger["Held while a named recipient has not marked it read"]
extract["Its durable half extracted to the accumulator first"]
dropped["The span is dropped, never a matched line"]
posted --> kind
kind -- artifact --> artifact --> ref --> handler
kind -- judgement --> judgement --> ack --> handler
handler --> ledger --> extract --> dropped
```

D1·c a seat's record

```text
┌─── <record> <seat> ─── one writer: <seat> · others cite, never edit · a span edit only, never a whole-file write
<seat> — <state from the closed set>
<field>:   <the concerns this seat claims, by concern and never by directory>
<field>:   <the current unit and its state>
<field>:
┌─── <item> <seat>-<allocated id> ─── kind:<artifact | judgement> at:<stamp> to:<seats | *>
To <seat> — the argument, across as many lines as it needs.
└─── END <item> <seat>-<allocated id>
<field>:   <typed pointers, each naming a declared kind>
└─── END <record> <seat>
```

D1·d convergence

```mermaid
flowchart TB
open["Open · the venue declares its own exit condition and holds the build"]
needs["Every convened seat states its needs"]
signed["Every convened seat has signed · a signature with an open need is refused"]
durable["Every seat's durable half resolves in the accumulator"]
deferred["Every deferred question has a destination that resolves"]
directives["Every directive is discharged"]
absorbed["The outcome is absorbed · the distribution checklist carries no open item"]
inherited["Every clause the successor inherits was deferred here"]
archive["Moved whole into the archive · never deleted"]
open --> needs --> signed --> durable --> deferred --> directives --> absorbed --> inherited --> archive
```

D1·e a venue schedule

```typescript
export const SCHEDULE_STATES = ["planned", "created", "open", "archived"] as const;
export type ScheduleState = (typeof SCHEDULE_STATES)[number];

export interface ScheduleRow {
readonly ordinal: string;
readonly invariant: string;
readonly establishes: string;
readonly merged?: string;
readonly declaredState?: ScheduleState;
readonly declaredBecause?: string;
}

export const schedule: readonly ScheduleRow[] = [
{ ordinal: "1", invariant: "<invariant>", establishes: "<what establishing it settles>" },
{ ordinal: "2", invariant: "<invariant>", establishes: "<what establishing it settles>" },
{ ordinal: "2a", invariant: "<invariant deferred here by 2>", establishes: "<what establishing it settles>", declaredState: "planned", declaredBecause: "<why the tree cannot derive it yet>" },
];
```

## Links to

- [Coordination templates](https://banes-lab.com/pag/templates/templates-coordination.md)
- [Composing a collaboration](https://banes-lab.com/pag/orchestration/composing-a-workflow.md)
- [Immutability](https://banes-lab.com/records/arch/immutability.md)
- [Append-Only Log](https://banes-lab.com/records/arch/append-only-log.md)
- [Handoff signals](https://banes-lab.com/pag/orchestration/handoff-signals.md)
- [Message Queue](https://banes-lab.com/records/arch/message-queue.md)
- [Event Ordering](https://banes-lab.com/records/arch/event-ordering.md)
- [Orchestration invariants](https://banes-lab.com/pag/orchestration/orchestration-invariants.md)
- [Stating an invariant](https://banes-lab.com/disciplined-methodology/collaborate/stating-an-invariant.md)
- [Directed Acyclic Graph (DAG)](https://banes-lab.com/records/arch/directed-acyclic-graph.md)
- [The drop-in](https://banes-lab.com/disciplined-methodology/start/onboarding.md)

## Linked from

- [Orchestration as declared structure](https://banes-lab.com/pag/orchestration/declared-structure.md)
- [Shared surfaces](https://banes-lab.com/pag/orchestration/shared-surfaces.md)
- [Handoff signals](https://banes-lab.com/pag/orchestration/handoff-signals.md)
- [Coordination templates](https://banes-lab.com/pag/templates/templates-coordination.md)
