developers.cogni.build
Where it sitsIN PLACE
Act 01

Where it sits in an app you already have

The host here is Meridian, a newsroom CMS that already has editors, articles, brand-scoped permissions and its own search. It does not become an AI product. It gains a surface, and everything behind that surface is the framework. Click any block for what it owns — and, more usefully, what it deliberately does not.

Meridian CMSthe host · unchanged
COGNI.BUILDthe framework
trust boundary
Outsideadapters only
Boundary

What crosses, per topology

Same shape

Other hosts, same placement

Nothing above is newsroom-specific. The nouns change; the layer each one lands in does not.

Framework conceptNewsroom CMSSupport deskClinical ops
PrincipalEditor, with desk + brandAgent, with queueClinician, with unit
Scope predicatebrand = metro-deskregion = emeaward IN (…)
CorpusStyle guide, archiveRunbooks, past ticketsProtocols, formulary
Subject recordThe article being editedThe ticket open on screenThe chart in view
READ toolPrior coverage lookupEntitlement checkInteraction check
MUTATE toolFile a correctionIssue a creditDraft an order
Ambient surfaceHeadline suggestionsSuggested replyCoding hints
The thing that must never happenQuoting an embargoed draftRevealing another tenant's ticketSurfacing another patient's chart
Act 02

The surface, and what happens behind it

Left is what an editor sees. Right is every step the framework takes to produce it, layer by layer. Pick a prompt — including the ones designed to be refused. The trace is generated from the configuration in Act 03, so revoking a grant there changes what happens here.

Meridian · Article draftalice · metro desk

City council delays vote on transit levy

DRAFT · story #4471 · metro · updated 14:02

The council postponed a decision on the transit levy for a third time on Tuesday, citing unresolved questions about the funding formula…

Assistantindexed through 14:20
control path
Choose a prompt on the left. Each step names the class and method that ran, the layer it lives in, and what it decided — click any step for the data it passed on.
The one to try first: ask it to file a correction. The tool is declared effect MUTATE, so RunLoop returns Outcome::Proposed instead of executing — the author never wrote that branch. Then go to Act 03, revoke the grant, and ask again: the tool is no longer in the composed registry, so the refusal happens before the model is even asked.
Act 03

Standing it up on the hosted offering

Six steps from an empty tenant to a working assistant. Everything you set here is real state — go back to Act 02 afterwards and the trace changes to match.

What that showed

The host never hands over authority. It supplies identity, the record in view, placement and brand — and is refused if it tries to supply grants, scope or a tool list. That refusal is the whole reason a second surface costs days rather than another integration.