Hierarchical semantics: application, then topology
The DSL is layered. Every declaration belongs to exactly one of two layers, and each layer is meaningful on its own:
The governing rule is: L0 says what application machine exists and what properties it requires. L1 says how invocations and persistent data are arranged in a particular runtime realization of that machine.
L1 is optional. An L0-only model is complete, structurally valid, and analyzable. Removing L1 from a valid model never makes it invalid: it only makes proofs that consumed runtime facts unavailable. The verifier records the scope of every proof it produces:
l0_only when no L1 fact was required, or runtime_dependent when at least one was necessary.
A
runtime_dependent proof is not weaker in kind; it is conditional on the declared realization, and must be re-examined when that realization changes.The seven L0 root collections
A model root contains these top-level keys:services: Logical ownership and grouping boundaries for operations. Kinds are descriptive only (backend,frontend,worker,job); a service does not imply a process boundary, network hop, replica count, or trust boundary.schemas: Canonical and fragment schemas that describe the logical shape of values. Includes scalar types, lists, optional flags, and field-path shorthand.data_models: Logical transactional state boundaries containing persistent objects and outboxes.topics: Logical message channels that declare which schemas they may carry and what identifies one logical message. See Topics and messaging.state_machines: Legal states and transitions for a persistent object field. Each transition may declare shared side-effect contracts.operations: Logical units of application behavior with inputs, a single acausal program, and requirements. See Operations.revision: An opaque numeric revision marker for the model snapshot. The current DSL assigns no ordering, compatibility, or migration semantics beyond numeric identity.
What belongs in L1
Whenruntime is present, it may contain:
topics:TopicRuntimedeclarations with optionalgroupingandordering.subscriptions:SubscriptionRuntimedeclarations per(operation, input)pair, coveringdelivery,grouping,ordering, anddispatch.outboxes:OutboxRuntimedeclarations per(operation, input)pair, coveringdelivery,partitioning,ordering,dispatch, andbatching.execution_pools: Logical populations of interchangeable runtime members withmember_concurrency.routers: Request routing from a boundary to a pool, with an optional semantic routing key.storage_layouts: Physical partition identity for aDataObject.
Grouping and ordering are declared at exactly one of two scopes for a given topic: either once at the topic runtime, or independently at each subscription runtime. They are never declared at both. There is no inheritance, no override, and no fallback chain. See Topic and subscription runtime.
Semantic categories
Independently of layer, a declaration belongs to one of three categories:
A structurally valid model is therefore not necessarily a safe model. Validation establishes that declarations are coherent and references are meaningful. Verification establishes whether the declared requirements follow from the declared facts and architecture.
unspecified is epistemic
Across the DSL, unspecified means:
The model provides no fact from which the corresponding property may be inferred.It does not mean that the property is false, and it does not mean the implementation is allowed to violate a requirement. It means the verifier must treat the fact as unknown. An unknown fact cannot be used as evidence for a proof. For example,
ordering: unspecified does not prove messages are unordered. concurrency: unspecified does not prove concurrent execution exists. idempotency: unspecified does not prove an external effect is non-idempotent.