prose-dev Atlas OpenProse docs bound to the contracts they describe
144 documents

Author a contract that actually wakes

Write Maintains, Continuity, and facets so memoization, quiescence, and commit gating engage instead of cron plus a prompt.

Facets — the named-parts rule

A facet is a named part of a maintained truth, and authors declare facets simply by naming the parts: a #### {name} sub-heading inside ### Maintains is a facet, and its body describes that part's fields and which are material — in prose. Name no parts and the node has one truth: the atomic facet, the free default that costs nothing. Atomic-only — no #### parts — is the v1 default and the leaf-node case; the ####-part lowering in compiler/ir-v0.md says the same thing from the compiler's side.

The name an author writes is the same name in three places at once (the named-parts rule):

  1. Fingerprint unit — the compiled canonicalizer emits one token per #### part, plus the always-on atomic token over the whole truth. A part moves only its token; fields that sit outside any part move only the atomic token.
  2. Subscription symbol — a consumer names the part in ### Requires, and the reconciler wakes that consumer only when that part's token moves. The join is Requires.<facet> ↔ Maintains.<facet> (in the compiled topology of compiler/ir-v0.md, an edge is subscriber.Requires.<facet-contract> → producer.Maintains.<facet>).
  3. World-model subtree — the part is a named region of the content-addressed artifact, published/<facet>/…, so "the directory structure is the state" shows the facets literally (state/filesystem.md).

Faceting therefore adds no new grammar: it reuses the heading hierarchy the format already has (#### = structure inside a ### section), the Requires↔Maintains join already specified, and the directory store. Structure is subscription. Material/immaterial and normalization stay prose inside each part, lowered at compile time into that part's facet name + material field-paths; a part subscribed without a structured backing is a lint (the structured-backing rule, above).

Worked example — the competitor-activity monitor maintains three subscribable parts:

### Maintains

A current, corroborated view of each tracked competitor. Each competitor carries
a stable `name` and a `last_corroborated` field; `fetched_at` and source
request-ids are immaterial everywhere. Postcondition: every competitor cites a
corroborating source.

#### funding
Funding events per competitor — round, amount, date. Material: the event set
(unordered) and each event's round/amount/date.

#### hiring
Open-role activity — the department set and the open-role count (exact).

#### product-launches
Announced or shipped products — the launch set; a ship-date slipping past today
flips `shipped`, which is material.

A downstream that ### Requires funding wakes only when #### funding's fingerprint moves — not when hiring or launches move. The shared name / last_corroborated sit outside any part, so they move only the atomic token. This is React's selector boundary made authorable.

The symmetry is total: a producer's #### funding part under ### Maintains is exactly the symbol a subscriber names in its ### Requires (Requires.funding ↔ Maintains.funding). The memo key is unchanged — (contract_fingerprint, input_fingerprints); facet granularity lives in which input-fingerprints a subscriber consumes (one per subscribed facet), not in the key shape.