plan: endgame — the whole platform (store/events/orders) as a typed domain
Some checks failed
Test, Build, and Deploy / test-build-deploy (push) Failing after 23s

The metamodel targets the entire rose-ash domain model, not just the blog — the finish
line of the host-on-sx strangler off Quart: define the domain schema as data instead of
porting each service's bespoke models. Records the three honest additions store/events
surface beyond a/b/c+d: (1) typed scalar ATTRIBUTES (datatype properties: price:Money,
stock:Int) alongside entity relations — a real addition, likely Slice 8; (2) behaviour/
lifecycle composes from the substrate loops (flow/commerce/events), not reinvented;
(3) integrations (payments/federation/media) stay referenced services. Structure+validation
from the metamodel, behaviour from substrates, integrations as services.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-06-30 09:31:23 +00:00
parent b3363a8631
commit 82c0978da6

View File

@@ -36,6 +36,35 @@ Sequence: finish the schema language (Slices 67) → the two UI surfaces + re
data and define a real domain through the UI. The slices below are the schema language; this is data and define a real domain through the UI. The slices below are the schema language; this is
what it's *for*. what it's *for*.
### Endgame — the whole platform as a typed domain (the strangler's finish line)
Not just the blog: the entire rose-ash platform — **store, events, orders, cart, …** — is
expressible as type + relation definitions in this one metamodel. `Product`, `Event`, `Order`,
`Ticket` are types; "cart has line-items", "order for an event", "ticket of an event" are
relations with signatures (cardinality = a cart has many line-items, a ticket belongs to one
event). This is the completion of the host-on-sx strangler off Quart (`[[project_host_on_sx]]`):
define the domain schema as data instead of porting each service's bespoke models.
Three honest additions store/events surface (the blog didn't need them):
1. **Typed scalar ATTRIBUTES, not just entity relations.** A `Product` needs `price: Money`,
`sku: String`, `stock: Int`; these are *values*, not edges to posts. We've built RDF
*object properties* (edges to resources); this needs *datatype properties* (literals with
value-types + validation). So a type declares **fields** `{field, value-type, card, required,
validation}` alongside relations; instances carry typed values; value-types (`Money`, `Int`,
`DateTime`) are primitive types. Same shape as a role — a role points at a *type*, a field
holds a *value-type*. **This is a real addition to a/b/c+d** and likely Slice 8.
2. **Behaviour / lifecycle** (order `pending→paid→shipped`) is NOT structure — it's the
substrate loops: `[[project_flow_on_sx]]` (durable workflows), `[[project_commerce_on_sx]]`,
`[[project_events_on_sx]]`. The metamodel *attaches behaviour to types by composing those*,
not reinventing them.
3. **Integrations** (SumUp payments, ActivityPub federation, artdag media) — types *reference*
these services; they don't dissolve into posts.
So the complete picture: the metamodel expresses **structure + validation** of the whole
platform's domain model uniformly; **behaviour composes from the substrate loops**;
**integrations stay referenced services**. It's the convergence point of every loop in the repo.
## Why (the wrinkle that started this) ## Why (the wrinkle that started this)
Candidates for `is-a`/`subtype-of` were `instances-of("type")` — the *instances* that are Candidates for `is-a`/`subtype-of` were `instances-of("type")` — the *instances* that are