diff --git a/src/figures/conversation.svg b/src/figures/conversation.svg
new file mode 100644
index 0000000..8899f6b
--- /dev/null
+++ b/src/figures/conversation.svg
@@ -0,0 +1,454 @@
+
+
diff --git a/src/glossary.md b/src/glossary.md
index 115f299..139ad7d 100644
--- a/src/glossary.md
+++ b/src/glossary.md
@@ -1,67 +1,683 @@
# Glossary
## Action
+[Actions]: #action
+[Action]: #action
+
+In the [Syndicated Actor Model][], an *action* may be performed by an [actor][] during a
+[turn][]. Actions are quasi-transactional, taking effect only if their containing turn is
+committed.
+
+Four core varieties of action, each with a matching variety of [event][], are offered across
+all realisations of the [SAM][]:
+
+ - An *assertion* action publishes an [assertion][] at a [target entity][]. A unique [handle][]
+ names the assertion action so that it may later be retracted. For more detail, [see below on
+ Assertions][assertion].
+
+ - A *retraction* action withdraws a previously-published assertion from the target entity.
+
+ - A *message* action sends a [message][] to a target entity.
+
+ - A *synchronization* action carries a local [entity reference][] to a target entity. When it
+ eventually reaches the target, the target will (by default) immediately reply with a simple
+ acknowledgement to the entity reference carried in the request. For more detail, [see below
+ on Synchronization][Synchronization].
+
+Beside the core four actions, many individual implementations offer action variants such as the
+following:
+
+ - A *spawn* action will, when the containing turn commits, create a new actor running
+ alongside the acting party. In many implementations, spawned actors may optionally be
+ [linked][link] to the spawning actor.
+
+ - *Replacement* of a previously-established assertion, "altering" the target entity reference
+ and/or [payload][]. This proceeds, conventionally, by establishment of the new assertion
+ followed immediately by retraction of the old.
+
+Finally, implementations may offer pseudo-actions whose effects are local to the acting party:
+
+ - Creation of a new [facet][].
+
+ - Creation of a new [entity reference][] associated with the [active facet][] denoting a
+ freshly-created local [entity][].
+
+ - Shutdown (stopping) of the [active facet][] or any other [facet][] within the acting party.
+
+ - Stopping of the current actor, either gracefully or with a simulated crash.
+
+ - Creation of a new [field/cell/dataflow variable][dataflow variable].
+
+ - Creation of a new [dataflow block][dataflow block].
+
+ - Creation of a new [linked task][] associated with the [active facet][].
+
+ - Scheduling of a new one-off or periodic [alarm][].
+
+## Active Facet
+[Active Facet]: #active-facet
+
+The [facet][] associated with the [event][] currently being processed in an active [turn][].
+
## Actor
+[Actors]: #actor
+[Actor]: #actor
+
+In the [Syndicated Actor Model][], an *actor* is an isolated thread of execution. An actor
+repeatedly takes [events][] from its [mailbox][], handling each in a [turn][]. In many
+implementations of the [SAM][], each actor is internally structured as a tree of [facets][].
+
+## Alarm
+[Alarm]: #alarm
+See [timeout][].
+
## Assertion
+[Assertion]: #assertion
+[Assertions]: #assertion
+
+ - *verb.* To *assert* (or to *publish*) a value is to choose a [target entity][] and perform
+ an [action][] conveying an *assertion* to that entity.
+
+ - *noun.* An *assertion* is a [value][] carried as the payload of an assertion [action][],
+ denoting a relevant portion of a public aspect of the conversational state of the sending
+ party that it has chosen to convey to the recipient entity.
+
+ The [value][] carried in an assertion may, in some implementations, depend on one or more
+ [dataflow variables][]; in those implementations, when the contents of such a variable
+ changes, the assertion is automatically withdrawn, recomputed, and re-published (with a
+ fresh [handle][]).
+
## Attenuation
+[Attenuation]: #attenuation
+[Attenuated]: #attenuation
+
+To *attenuate* a [capability][] (yielding an *attenuated capability*), a sequence of filters is
+prepended to the possibly-empty list of filters attached to an existing capability. Each filter
+either discards, rewrites, or accepts unchanged any [payload][] directed at the underlying
+capability. A special pattern language exists in the [Syndicate network protocol][] for
+describing filters; many implementations also allow in-memory capabilities to be filtered by
+the same language.
+
## Capability
+[Capability]: #capability
+[Cap]: #capability
-a.k.a. Cap
+(a.k.a. **Cap**) Used roughly interchangeably with "[reference][]", connoting a security-,
+access-control-, or privacy-relevant aspect.
-Pointer or handle denoting a live, stateful [entity](#entity) running within an
-[actor](#actor). The entity accepts [Preserves](#preserves)-format [messages](#message) and/or
-[assertions](#assertion). The capability may be [attenuated](#attenuation) to restrict the
-messages and assertions that may be delivered to the denoted entity by way of this particular
-handle.
+## Cell
+[Cell]: #cell
+See [dataflow variable][].
## Compositional
+[Compositional]: #compositional
+
+To quote the [Stanford Encyclopedia of
+Philosophy](https://plato.stanford.edu/entries/compositionality/#Clar), the "principle of
+compositionality" can be understood to be that
+
+> The meaning of a complex expression is determined by its structure and the meanings of its
+> constituents.
+
+People often implicitly intend "... *and nothing else*." For example, when I claim that the
+[object-capability model][] is a compositional approach to system security, I mean that the
+access conveyed by an assemblage of capabilties can be understood in terms of the access
+conveyed by each individual capability taken in isolation, *and nothing else*.
+
## Configuration Scripting Language
+
+The `syndicate-server` program includes a scripting language, used for configuration of the
+server and its clients, population of initial dataspaces for the system that the
+`syndicate-server` instance is part of, and scripting of simple behaviours in reaction to
+appearance of assertions or transmission of messages.
+
+The scripting language is [documented here](./operation/scripting.md).
+
## Conversational State
+[Conversational State]: #conversational-state
+[Conversational Frame]: #conversational-state
+
+The collection of facts and knowledge held by a component participating in an ongoing
+conversation about some task that the component is undertaking:
+
+> The conversational state that accumulates as part of a collaboration among components can be
+> thought of as a collection of facts. First, there are those facts that define the *frame* of
+> a conversation. These are exactly the facts that identify the task at hand; we label them
+> “framing knowledge”, and taken together, they are the “conversational frame” for the
+> conversation whose purpose is completion of a particular shared task. Just as tasks can be
+> broken down into more finely-focused subtasks, so can conversations be broken down into
+> sub-conversations. In these cases, part of the conversational state of an overarching
+> interaction will describe a frame for each sub-conversation, within which corresponding
+> sub-conversational state exists. The knowledge framing a conversation acts as a bridge
+> between it and its wider context, defining its “purpose” in the sense of the [Gricean
+> Cooperative Principle]. [The following figure] schematically depicts these relationships.
+>
+> ![Figure 2 from Garnock-Jones 2017](./figures/conversation.svg)
+>
+> Some facts define conversational frames, but *every* shared fact is contextualized *within*
+> some conversational frame. Within a frame, then, some facts will pertain directly to the task
+> at hand. These, we label “domain knowledge”. Generally, such facts describe global aspects of
+> the common problem that remain valid as we shift our perspective from participant to
+> participant. Other facts describe the knowledge or beliefs of particular components. These,
+> we label “epistemic knowledge”.
+>
+> — Excerpt from [Chapter 2 of (Garnock-Jones
+> 2017)](https://syndicate-lang.org/tonyg-dissertation/html/#x_2_2_0_0_1). The quoted
+> section continues [here](https://syndicate-lang.org/tonyg-dissertation/html/#x_2_2_0_0_7).
+
+In the [Syndicated Actor Model][], there is often a one-to-one correspondence between a
+[facet][] and a conversational frame, with [fate-sharing][] employed to connect the lifetime of
+the one with the lifetime of the other.
+
+
+## Dataflow
+[Dataflow]: #dataflow
+
+A programming model in which changes in stored state automatically cause re-evaluation of
+computations depending on that state. The results of such re-evaluations are themselves often
+used to update a store, potentially triggering further re-computation.
+
+In the [Syndicated Actor Model][], dataflow appears in two guises: first, at a coarse
+granularity, among actors and entities in the form of changes in published [assertions][]; and
+second, at fine granularity, many implementations include [dataflow variables][] and [dataflow
+blocks][] for *intra*-actor dataflow-based management of [conversational state][] and related
+computation.
+
+## Dataflow Block
+[Dataflow block]: #dataflow-block
+[Dataflow blocks]: #dataflow-block
+
+Implementations of the [Syndicated Actor Model][] often include some language feature or
+library operation for marking a portion of code as participating in [dataflow][], where changes
+in observed [dataflow variables][] cause re-evaluation of the code block.
+
+For example, in [a Smalltalk implementation of the
+SAM](https://syndicate-lang.org/code/#squeak),
+
+```smalltalk
+a := Turn active cell: 1.
+b := Turn active cell: 2.
+sum := Turn active cell: 0.
+Turn active dataflow: [sum value: a value + b value].
+```
+
+Later, as `a` and `b` have their values updated, `sum` will automatically be updated by
+re-evaluation of the block given to the `dataflow:` method.
+
+Analogous code can be written in TypeScript:
+
+```typescript
+field a: number = 1;
+field b: number = 2;
+field sum: number = 0;
+dataflow {
+ sum.value = a.value + b.value;
+}
+```
+
+in Racket:
+
+```racket
+(define-field a 1)
+(define-field b 2)
+(define/dataflow sum (+ (a) (b)))
+```
+
+in Python:
+
+```python
+a = turn.field(1)
+b = turn.field(2)
+sum = turn.field(0)
+@turn.dataflow
+def maintain_sum():
+ sum.value = a.value + b.value
+```
+
+and in Rust:
+
+```rust,noplayground
+turn.dataflow(|turn| {
+ let a_value = turn.get(&a);
+ let b_value = turn.get(&b);
+ turn.set(&sum, a_value + b_value);
+})
+```
+
+## Dataflow Variable
+[Dataflow Variable]: #dataflow-variable
+[Dataflow Variables]: #dataflow-variable
+
+(a.k.a. **Field**, **Cell**) A *dataflow variable* is a store for a single value, used with
+[dataflow blocks][] in [dataflow][] programming.
+
+When the value of a dataflow variable is read, the active [dataflow block][] is marked as
+*depending* on the variable; and when the value of the variable is updated, the variable is
+marked as *damaged*, leading eventually to re-evaluation of dataflow blocks depending on that
+variable.
+
## Dataspace
+[Dataspaces]: #dataspace
+[Dataspace]: #dataspace
+
+In the [Syndicated Actor Model][], a *dataspace* is a particular class of [entity][] with
+prescribed behaviour. Its role is to route and replicate published [assertions][] according to
+the [declared interests][observe] of its peers.
+
+See [here](./syndicated-actor-model.md#dataspaces) for a full explanation of dataspaces.
+
## Dataspace Pattern
+[Dataspace Pattern]: #dataspace-pattern
+
+In the [Syndicated Actor Model][], a *dataspace pattern* is a structured [value][] describing a
+pattern over other values.
+
+TODO: link to documentation
+
## E
+[E language]: #e
+[E]: #e
+
+The E programming language is an [object-capability model][] Actor language that has strongly
+influenced the [Syndicated Actor Model][].
+
+Many good sources exist describing the language and its associated philosophy, including:
+
+ - [The ERights.org website](http://www.erights.org/), the home of E
+
+ - [E (programming language)](https://en.wikipedia.org/wiki/E_(programming_language)) on
+ Wikipedia
+
+ - Miller, Mark S. “Robust Composition: Towards a Unified Approach to Access Control and
+ Concurrency Control.” PhD, Johns Hopkins University, 2006.
+ [[PDF]](http://www.erights.org/talks/thesis/markm-thesis.pdf)
+
+ - Miller, Mark S., E. Dean Tribble, and Jonathan Shapiro. “Concurrency Among Strangers.” In
+ Proc. Int. Symp. on Trustworthy Global Computing, 195–229. Edinburgh, Scotland, 2005.
+ [[DOI]](https://dl.acm.org/doi/10.5555/1986262.1986274)
+ [[PDF]](http://www.erights.org/talks/promises/paper/tgc05.pdf)
+
## Embedded References
+[Embedded References]: #embedded-references
+
+In the [Syndicated Actor Model][], the [values][] carried by [assertions][] and [messages][]
+may include [references][] to [entities][]. Because the SAM uses [Preserves][] as its data
+language, the Preserves concept of an *embedded value* is used in the SAM to reliably mark
+portions of a datum referring to SAM entities.
+
+Concretely, in [Preserves text
+syntax](https://preserves.gitlab.io/preserves/preserves.html#textual-syntax), embedded values
+appear prepended with `#!`. In messages transferred across links using the [Syndicate network
+protocol][], references might appear as `#![0 123]`, `#![1 555]`, etc. etc.
+
## Entity
+[Target Entity]: #entity
+[Entities]: #entity
+[Entity]: #entity
+
+In the [Syndicated Actor Model][], an *entity* is a stateful programming-language construct,
+located within an [actor][], that is the target of [events][]. Each entity has its own
+behaviour, specifying in code how it responds to incoming events.
+
+An entity is the SAM analogue of "object" in [E][]-style languages: an addressable construct
+logically contained within and [fate-sharing][] with an [actor][]. The concept of "entity"
+differs from "object" in that entities are able to respond to [assertions][], not just
+[messages][].
+
+In many implementations of the [SAM][], entities [fate-share][] with individual [facets][]
+within their containing actor rather than with the actor as a whole: when the facet associated
+with an entity is stopped, the entity becomes unresponsive.
+
+## Erlang
+[Erlang]: #erlang
+
+[Erlang](https://www.erlang.org/) is a process-style Actor language that has strongly
+influenced the [Syndicated Actor Model][]. In particular, Erlang's approach to
+failure-handling, involving [supervisors][] arranged in [supervision trees][] and processes
+(actors) connected via [links and monitors][links], has been influential on the SAM. In the
+SAM, links and monitors become special cases of [assertions][], and Erlang's approach to
+process [supervision][] is used directly and is an important aspect of SAM system organisation.
+
## Event
+[Event]: #event
+[Events]: #event
+
+In the [Syndicated Actor Model][], an *event* is processed by an [entity][] during a [turn][],
+and describes the outcome of an [action][] taken by some other [actor][].
+
+Events come in four varieties corresponding to the four core [actions][] in the [SAM][]:
+
+ - An *assertion* event notifies the recipient entity of an [assertion][] published by some
+ peer. A unique [handle][] names the event so that later retraction of the assertion can be
+ correlated with the assertion event.
+
+ - A *retraction* event notifies the recipient entity of withdrawal of a previously-published
+ assertion.
+
+ - A *message* event notifies the recipient entity of a [message][] sent by some peer.
+
+ - A *synchronization* event, usually not handled explicitly by an entity, carries an [entity
+ reference][]. The recipient should arrange for an acknowledgement to be delivered to the
+ referenced entity once previously-received events that might modify the recipient's state
+ (or the state of a remote entity that it is proxy for) have been completely processed. For
+ more detail, [see below on Synchronization][Synchronization].
+
## Facet
+[Facet]: #facet
+[Facets]: #facet
+
+In many implementations of the [Syndicated Actor Model][], a *facet* is a programming-language
+construct representing a *conversation* and corresponding to a [conversational frame][]. Facets
+are similar to the "nested threads" of Martin Sústrik's idea of [Structured
+Concurrency](https://250bpm.com/blog:71/) (see also
+[Wikipedia](https://en.wikipedia.org/wiki/Structured_concurrency)).
+
+Every [actor][] is structured as a tree of facets. (Compare and contrast with [the diagram in
+the entry for Conversational State](#fig:conversation).)
+
+Every facet is either "running" or "stopped". Each facet is the logical owner of zero or more
+[entities][] as well as of zero or more published [assertions][]. A facet's entities and
+published assertions [share its fate][fate-sharing]. While a facet is running, its associated
+entities are responsive to incoming events; when it stops, its entities become permanently
+unresponsive. A stopped facet never starts running again. When a facet is stopped, all its
+assertions are retracted and all its subfacets are also stopped.
+
+Facets may have *stop handlers* associated with them: when a facet is stopped, its stop
+handlers are executed, one at a time. The stop handlers of each facet are executed before the
+stop handlers of its parent and before its assertions are withdrawn.
+
+Facets may be explicitly stopped by a stop [action][], or implicitly stopped when an actor
+crashes. When an actor crashes, its stop handlers are not run: stop handlers are for orderly
+processing of conversation termination. Instead, many implementations allow actors to have
+associated *crash handlers* which run only in case of an actor crash. In the limit, of course,
+even crash handlers cannot be guaranteed to run, because the underlying hardware or operating
+system may suffer some kind of catastrophic failure.
+
+## Fate-sharing
+[Fate-sharing]: #fate-sharing
+[Fate-share]: #fate-sharing
+
+A design principle from large-scale network engineering, due to David Clark:
+
+> The fate-sharing model suggests that it is acceptable to lose the state information
+> associated with an entity if, at the same time, the entity itself is lost.
+>
+> — David D. Clark, “The Design Philosophy of the DARPA Internet Protocols.” ACM SIGCOMM
+> Computer Communication Review 18, no. 4 (August 1988): 106–14.
+> [[DOI]](https://doi.org/10.1145/52325.52336)
+
+In the [Syndicated Actor Model][], fate-sharing is used in connecting the lifetime of
+[conversational state][] with the programming language representation of a conversational
+frame, a [facet][].
+
+## Field
+[Field]: #field
+See [dataflow variable][].
+## Handle
+[Handle]: #handle
+
+In the [Syndicated Actor Model][], every [assertion][] [action][] (and the corresponding
+[event][]) includes a [scope][]-lifetime-unique *handle* that denotes the specific action/event
+concerned, for purposes of later correlation with a retraction action.
+
+Handles are, in many cases, implemented as unsigned integers, allocated using a simple
+scope-wide counter.
+
## Initial OID
+[Initial OID]: #initial-oid
+
+In the [Syndicate network protocol][], the initial OID is a special [OID][] value understood by
+prior arrangement to denote an [entity][] (specified by the "[initial ref][]") owned by some
+remote peer across some network medium. The initial OID of a session is used to bootstrap
+activity within that session.
+
## Initial Ref
+[Initial Ref]: #initial-ref
+
+In the [Syndicate network protocol][], the initial ref is a special [entity reference][]
+associated by prior arrangement with an [initial OID][] in a session in order to bootstrap
+session activity.
+
+## Linked Actor
+[Links]: #linked-actor
+[Link]: #linked-actor
+[Linked Actor]: #linked-actor
+[Linked Actors]: #linked-actor
+
+Many implementations of the [Syndicated Actor Model][] offer a feature whereby an [actor][] can
+be spawned so that its root [facet][] is *linked* to the spawning facet in the spawning actor,
+so that when one terminates, so does the other (by default).
+
+```ditaa
++-Actor 1---------------------------+
+| +----------+ |
+| |root facet| |
+| | (1) | |
+| ++--------++ |
+| | | |
+| +----++ ++----------+ |
+| |sub– | |sub–facet | |
+| |facet| |(1.3) | |
+| |(1.2)| +-+--------++ |
+| +-----+ | | | +-Actor 6------------+
+| +-----+--+ ++-------+| presence| +----------+ |
+| |sub–sub–| |sub–sub–+-------------->|root facet| |
+| |facet | |facet |<--------------+ (6) | |
+| |(1.3.4) | |(1.3.5) || presence ++--------++ |
+| +--------+ +--------+| | | | |
+| | |+----++ ++----+|
++-----------------------------------+ ||sub– | |sub– ||
+ ||facet| |facet||
+ ||(6.7)| |(6.8)||
+ |+-----+ +-----+|
+ +--------------------+
+```
+
+Links are implemented as a pair of "presence" [assertions][], atomically established at the
+time of the [spawn action][action], each indicating to a special entity with "stop on
+retraction" behaviour the presence of its peer. When one of these assertions is withdrawn, the
+targetted entity stops its associated [facet][], automatically terminating any subfacets and
+executing any stop handlers.
+
+This allows a "parent" actor to react to termination of its child, perhaps releasing associated
+resources, and the corresponding "child" actor to be automatically terminated when the facet in
+its parent that spawned the actor terminates.
+
+This idea is inspired by [Erlang][], whose
+"[links](https://www.erlang.org/doc/reference_manual/processes.html#links)" are symmetric,
+bidirectional, failure-propagating connections among Erlang processes (actors) and whose
+"[monitors](https://www.erlang.org/doc/reference_manual/processes.html#monitors)" are
+unidirectional connections similar to the individual "presence" assertions described above.
+
+## Linked Task
+[Linked Tasks]: #linked-task
+[Linked Task]: #linked-task
+
+Many implementations of the [Syndicated Actor Model][] offer the ability to associate a facet
+with zero or more native threads, coroutines, objects, or other language-specific
+representations of asynchronous activities. When such a facet stops (either by explicit [stop
+action][action] or by crash-termination of the facet's actor), its linked tasks are also
+terminated. By default, the converse is also the case: a terminating linked task will trigger
+termination of its associated actor. This allows for resource management patterns similar to
+those enabled by the related idea of [linked actors][].
+
## Macaroon
+A *macaroon* is an access token for authorization of actions in distributed systems. Macaroons
+were introduced in the paper:
+
[*“Macaroons: Cookies with Contextual Caveats for Decentralized Authorization in the
Cloud.”*](https://research.google/pubs/pub41892/), by Arnar Birgisson, Joe Gibbs Politz, Úlfar
Erlingsson, Ankur Taly, Michael Vrable, and Mark Lentczner. In Proc. Network and Distributed
System Security Symposium (NDSS), 2014. [[PDF]](https://research.google/pubs/pub41892.pdf)
+In the [Syndicated Actor Model][], a variation of the macaroon concept is used to represent
+"sturdyrefs". A sturdyref is a long-lived token authorizing interaction with some entity, which
+can be upgraded to a live [entity reference][] by presenting it to a gatekeeper entity (TODO:
+link) across a session of the [Syndicate network protocol][]. (The term "sturdyref" is lifted
+directly from the [E language][] and associated ecosystem.)
+
+## Mailbox
+[Mailbox]: #mailbox
+
+Every [actor][] notionally has a *mailbox* which receives [events][] resulting from its peers'
+[actions][]. Each actor spends its existence waiting for an incoming event to appear in its
+mailbox, removing the event, taking a [turn][] to process it, and repeating the cycle.
+
## Membrane
+[Membrane]: #membrane
+
+A *membrane* is a structure used in implementations of the [Syndicate network protocol][] to
+keep track of [wire symbols][].
+
## Message
+[Messages]: #message
+[Message]: #message
+
+In the [Syndicated Actor Model][], a *message* is a [value][] carried as the payload or *body*
+of a message [action][] (and associated [event][]), conveying transient information from some
+sending [actor][] to a recipient [entity][].
+
## Network
+[Networks]: #network
+[Network]: #network
-A network is a group of peers, plus a medium of communication, an addressing model, and an
-associated [scope](#scope).
+A network is a group of peers ([actors][]), plus a medium of communication (a [transport][]),
+an addressing model ([references][]), and an associated [scope][].
+
+## Object-Capability Model
+[Object-Capability Model]: #object-capability-model
+
+The [Object-capability model](https://en.wikipedia.org/wiki/Object-capability_model) is a
+compositional means of expressing access control in a distributed system. It has its roots in
+operating systems research stretching back decades, but was pioneered in a programming language
+setting by the [E language][] and the Scheme dialect
+[W7](http://mumble.net/~jar/pubs/secureos/secureos.html).
+
+In the [Syndicated Actor Model][], object-capabilities manifest as potentially-[attenuated][]
+[entity references][].
-## Object Capability Model
## Observe
+[Observe]: #observe
+[Observation]: #observe
+
+In the [Syndicated Actor Model][], [assertion][] of an `Observe` record at a [dataspace][]
+declares an *interest* in receiving notifications about matching [assertions][] and
+[messages][] as they are asserted, retracted and sent through the dataspace.
+
+Each `Observe` record contains a [dataspace pattern][] describing a structural predicate over
+assertion and message [payloads][], plus an [entity reference][] to the [entity][] which should
+be informed as matching events appear at the dataspace.
+
## OID
+[OID]: #oid
+
+An *OID* is an "object identifier", a small, session-unique integer acting as an [entity
+reference][] across a [transport][] link in an instance of the [Syndicate network protocol][].
+
+## Publishing
+
+To *publish* something is to *assert* it; see [assertion][].
+
## Preserves
+[Preserves]: #preserves
+
+Many implementations of the [SAM][] use *Preserves*, a programming-language-independent
+language for data, as the language defining the possible [values][] that may be exchanged among
+[entities][] in [assertions][] and [values][].
+
+See the [chapter on Preserves](./guide/preserves.md) in this manual for more information.
+
## Record
-a Preserves record
+
+The [Preserves][] data language defines the notion of a *record*, a tuple containing a *label*
+and zero or more numbered *fields*. The [dataspace pattern][] language used by [dataspaces][]
+allows for patterns over records as well as over other compound data structures.
+
## Reference
-a.k.a. "Ref", "Entity Reference"
+[Entity References]: #reference
+[Entity Reference]: #reference
+[References]: #reference
+[Reference]: #reference
+[Ref]: #reference
+[Refs]: #reference
+
+(a.k.a. **Ref**, **Entity Reference**, **[Capability][]**) A *reference* is a pointer or handle
+denoting a live, stateful [entity][] running within an [actor][]. The entity accepts
+[Preserves][]-format [messages][] and/or [assertions][]. The capability may be [attenuated][]
+to restrict the messages and assertions that may be delivered to the denoted entity by way of
+this particular reference.
+
+## Retraction
+[Retraction]: #retraction
+
+In the [Syndicated Actor Model][], a *retraction* is an [action][] (and corresponding
+[event][]) which withdraws a previous [assertion][]. Retractions can be explicitly performed
+within a [turn][], or implicitly performed during [facet][] shutdown or [actor][] termination
+(both normal termination and crash stop).
+
+The [SAM][] guarantees that an actor's assertions will be retracted when it terminates, no
+matter whether an orderly shutdown or an exceptional or crashing situation was the cause.
+
## Relay
+[Relays]: #relay
+[Relay]: #relay
+
+A *relay* connects [scopes][], allowing [references][] to denote [entities][] resident in
+remote [networks][], making use of the [Syndicate network protocol][] to do so.
+
+See the [Syndicate network protocol][] for more on relays.
+
## Relay Entity
+[Relay Entity]: #relay-entity
+
+A *relay entity* is a local proxy for an [entity][] at the other side of a [relay][] link. It
+forwards [events][] delivered to it across its [transport][] to its counterpart at the other
+end.
+
+See the [Syndicate network protocol][] for more on relay entities.
+
## S6
+
+[S6, "Skarnet's Small Supervision Suite"](https://skarnet.org/software/s6/), is
+
+> a small suite of programs for UNIX, designed to allow process [supervision][] (a.k.a service
+> supervision), in the line of daemontools and runit, as well as various operations on
+> processes and daemons.
+>
+> — [The S6 website](https://skarnet.org/software/s6/)
+
+Synit uses [`s6-log`](https://skarnet.org/software/s6/s6-log.html) to capture standard error
+output from [the root system bus](./operation/system-bus.md#the-root-system-bus).
+
## Schema
+[Schema]: #schema
+
+A *schema* defines a mapping between [values][] and host-language types in various programming
+languages. The mapping describes how to parse values into host-language data, as well as how to
+unparse host-language data, generating equivalent values. Another way of thinking about a
+schema is as a specification of the allowable shapes for data to be used in a particular
+context.
+
+Synit, and many programs making use of the [Syndicated Actor Model][], uses [Preserves][]'
+[schema language](https://preserves.gitlab.io/preserves/preserves-schema.html) to define
+schemas for many different applications.
+
+For more, see [the section on schemas in the chapter on
+Preserves](http://zip.kpn:3000/guide/preserves.html#schemas).
+
## Scope
+[Scopes]: #scope
+[Scope]: #scope
-A *scope* maps [refs](#reference) to the [entities](#entity) they denote. Scopes exist in
-one-to-one relationship to [networks](#network). Because [message bodies](#message) and
-[asserted values](#assertion) contain [embedded references](#embedded-references), each message
-and assertion transmitted via some network is also inseparable from its scope.
+A *scope* maps [refs][] to the [entities][] they denote. Scopes exist in one-to-one
+relationship to [networks][]. Because [message bodies][message] and [asserted
+values][assertion] contain [embedded references][], each message and assertion transmitted via
+some network is also inseparable from its scope.
-Most [actors](#actor) will participate in a single scope. However, [relay](#relay) actors
-participate in two or more scopes, translating refs back and forth as messages and assertions
-traverse the relay.
+Most [actors][] will participate in a single scope. However, [relay][] actors participate in
+two or more scopes, translating refs back and forth as messages and assertions traverse the
+relay.
**Examples.**
@@ -71,34 +687,169 @@ traverse the relay.
references.
2. A TCP/IP socket (or serial link, or WebSocket, or Unix socket, etc.) is a scope for values
- travelling between two connected processes: [refs on the wire](#wire-symbol) denote
+ travelling between two connected processes: [refs on the wire][wire symbol] denote
entities owned by one or the other of the two participants. The "network" for a socket's
scope is exactly the two connected peers (NB. and is *not* the underlying TCP/IP network,
HTTP network, or Unix kernel that supports the point-to-point link).
3. An ethernet segment is a scope for values broadcast among stations: the embedded refs are
- (MAC address, [OID](#oid)) pairs. The network is the set of participating peers.
+ (MAC address, [OID][]) pairs. The network is the set of participating peers.
4. A running web page is a scope for the JavaScript objects it contains: both local and remote
entities are represented by JavaScript objects. The "network" is the JavaScript heap.
+## Subscription
+See [observation][].
## Supervision tree
+[Supervision trees]: #supervision-tree
+[Supervision tree]: #supervision-tree
+
+A *supervision tree* is a concept borrowed from [Erlang][], where a root [supervisor][]
+supervises other supervisors, which in turn supervise worker [actors][] engaged in some task.
+As workers fail, their supervisors restart them; if the failures are too severe or too
+frequent, their direct supervisors fail in turn, and the supervisors' supervisors take action
+to recover from the failures.
+
## Supervisor
+[Supervisors]: #supervisor
+[Supervisor]: #supervisor
+[Supervision]: #supervisor
+
+A *supervisor* is an [actor][] or [facet][] whose role is to monitor the state of some service,
+taking action to ensure its availability to other portions of a complete system. When the
+service fails, the supervisor is able to restart it. If the failures are too severe or too
+frequent, the supervisor can take an alternative action, perhaps pausing for some time before
+retrying the service, or perhaps even terminating itself to give its own supervisor in a
+[supervision tree][] a chance to get things back on track.
+
+Synit uses supervisors extensively to monitor system daemons and other system services.
+
## Sync Peer Entity
+
+The *sync peer entity* is the [entity reference][] carried in a [synchronization][] [action][]
+or [event][].
+
## Synchronization
-(`sync` action)
+[Synchronization]: #synchronization
+
+An [actor][] may *synchronize* with an [entity][] by scheduling a *synchronization* [action][]
+targeted at that entity. The action will carry a local [entity reference][] acting as a
+continuation. When the target entity eventually responds, it will transmit an acknowledgement
+to the continuation entity reference carried in the request.
+
+An entity receiving a synchronization [event][] should arrange for an acknowledgement to be
+delivered to the referenced continuation entity once previously-received events that might
+modify the recipient's state (or the state of a remote entity that it is proxy for) have been
+completely processed.
+
+Most entities do not explicitly include code for responding to synchronization requests. The
+default code, which simply replies to the continuation immediately, usually suffices. However,
+sometimes the default is not appropriate. For example, when [relay entity][] is proxying for
+some remote entity via a [relay][] across a [transport][], it should react to synchronization
+events by forwarding them to the remote entity. When the remote entity receives the forwarded
+request, it will reply to its local proxy for the continuation entity, which will in turn
+forward the reply back across the transport.
+
+## Syndicate Protocol
+[Syndicate Network Protocol]: #syndicate-protocol
+[Syndicate Protocol]: #syndicate-protocol
+[Protocol]: #syndicate-protocol
+
+The Syndicate Protocol (a.k.a the **Syndicate Network Protocol**) allows [relays][] to proxy
+entities from remote [scopes][] into the local scope.
+
+For more, see [the protocol specification document](./protocol.md).
+
## Syndicated Actor Model
+[Syndicated Actor Model]: #syndicated-actor-model
+[SAM]: #syndicated-actor-model
-Often abbreviated **SAM**.
+**Main article: [The Syndicated Actor Model](./syndicated-actor-model.md)**
-Source [entities](#entity) running within an [actor](#actor) publish [assertions](#assertion)
-and send [messages](#message) to target entities, possibly in other actors.
+The *Syndicated Actor Model* (often abbreviated **SAM**) is the model of concurrency and
+communication underpinning Synit. The SAM offers a “conversational” metaphor: programs meet and
+converse in virtual locations, building common understanding of the state of their shared
+tasks.
-Essential idea: state replication is more useful than message-passing. (Message-passing
-protocols usually end up simulating it, badly, anyway.)
+In the SAM, source [entities][] running within an [actor][] publish [assertions][] and send
+[messages][] to target entities, possibly in other actors. The essential idea of the SAM is
+that state replication is more useful than message-passing; message-passing protocols often end
+up simulating state replication.
+
+[A thorough introduction to the Syndicated Actor Model](./syndicated-actor-model.md) is
+available.
## System Layer
+
+The *system layer* is an essential part of an operating system, mediating between user-facing
+programs and the kernel. It provides the technical foundation for many qualities relevant to
+system security, resilience, connectivity, maintainability and usability.
+
+The concept of a system layer has only been recently recognised—the term itself was [coined by
+Benno Rice in a 2019 conference
+presentation](https://2019.linux.conf.au/schedule/presentation/156/)—although many of the ideas
+it entails have a long history.
+
+The hypothesis that the Synit system explores is that the [Syndicated Actor model][] provides a
+suitable theoretical and practical foundation for a system layer. The system layer demands, and
+the SAM supplies, well-integrated expression of features such as service naming, presence,
+discovery and activation; security mechanism and policy; subsystem isolation; and robust
+handling of partial failure.
+
## System Dataspace
+
+The *system dataspace* in Synit is the primary dataspace entity, owned by an [actor][] running
+within [the root system bus](./operation/system-bus.md#the-root-system-bus), and (selectively)
+made available to daemons, system services, and user programs.
+
+## Timeout
+[Timeout]: #timeout
+
+Many implementations of the [Syndicated Actor Model][] offer [actions][] for establishing
+*timeouts*, i.e. one-off or repeating alarms. Timeouts are frequently implemented as [linked
+tasks][].
+
## Transport
+[Transport]: #transport
+
+A *transport* is the underlying medium connecting one [relay][] to its counterpart(s) in an
+instance of the [Syndicate network protocol][]. For example, a TLS-on-TCP/IP socket may connect
+a pair of relays to one another, or a UDP multicast socket may connect an entire group of
+relays across an ethernet.
+
## Turn
+[Turn]: #turn
+
+Each time an [event][] arrives at an [actor][]'s [mailbox][], the actor takes a *turn*. A turn
+is the process of handling the triggering event, from the moment of its withdrawal from the
+mailbox to the moment of the completion of its interpretation.
+
+In the [SAM][], a turn comprises
+
+ - the [event][] that triggers the turn,
+ - the [entity][] addressed by the event,
+ - the [facet][] owning the targeted entity, and
+ - the collection of pending [actions][] produced during execution.
+
+If a turn proceeds to completion without an exception or other crash, its pending actions are
+*committed* (finalised and/or delivered to their target entities). If, on the other hand, the
+turn is aborted for some reason, its pending actions are *rolled back* (discarded), the actor
+is terminated, its assertions [retracted][retraction], and all its resources released.
+
+## Value
+[Values]: #value
+[Value]: #value
+[Payloads]: #value
+[Payload]: #value
+
+A [Preserves][] `Value` with embedded data. The embedded data are often [embedded references][]
+but, in some implementations, may be other kinds of datum. Every [message][] body and every
+[assertion][] payload is a value.
+
## Wire Symbol
+[Wire Symbols]: #wire-symbol
+[Wire Symbol]: #wire-symbol
+
+A *wire symbol* is a structure used in implementations of the [Syndicate network protocol][] to
+maintain a connection between an in-memory [entity reference][] and the equivalent name for the
+entity as used in packets sent across the network.