Semantic Events as Platform Primitive
A platform contract for declared events. Less analytics, more nervous system.
ajao.studioWe already paid for the declarations.
Who can approve what. Which thing belongs to which project. What counts as a valid state transition.
Then we bolt on AI and ask a model to infer the world from prose. We ignore what we already know. That is the mistake.
An event is a durable record.
Not a log line. Not a screenshot. Not a support ticket.
A platform event has a stable ID and a shape third parties can rely on. Name a field and you can traverse it. Leave it unnamed and you are always inferring.
9 fields. Endless provenance.
-
event_id— the permanent receipt -
event_type— the vocabulary of your platform -
timestamp— always UTC -
actor— who did it -
target— what it happened to -
decision— what the system concluded -
evidence— what the system looked at -
causality— the chain -
access_boundary— the permission context
Not just who sent it.
Whose authority legitimizes it.
An AI agent can send a request. The principal behind that agent is the human whose authority it acts under. A scheduled job can trigger an event. The principal is the service account whose permissions were explicitly granted.
Three endpoints. An ecosystem.
-
GET /events— traverse the declared past -
GET /events/{id}/why— explain any decision -
GET /decisions— current state, no replaying
Context debt.
The distance between what your platform has already declared and what your model is forced to guess.
If you want less debt, you need more declarations.
Traverse before you generate.
Start from tables, not PDFs. Start from event IDs, not screenshots. Start from a permission resolver, not a dozen permission copies.
Then, and only then, use a model to fill the genuinely missing parts.
The full essay, with interactive examples.
ajao.studio/studio/principles/declared-compositionInteractive field explorer · Policy resolver diagram · Principal hierarchy in plain English