FabricFabricPlatform
Composable application standard

The standard

What a team has to get right to build a composable application on Fabric Platform, and which of those things the build refuses to let them get wrong.

This is the standard for building an application on top of the capability plane. It covers the layers above the semantic layer: the shell, the design system, server-driven screens, federated packaging, and the path a read or a mutation takes to reach a governed host.

Most of it is enforced rather than advised. Where a rule is checked by a build gate or a conformance suite, this standard names the check, because a rule nothing enforces is a rule that survives until the first tight deadline.

What Fabric owns, and what you own

Fabric owns artifacts and the gates that validate them. It owns no renderer, no compositor, no content system and no shell. There is no createRoot, no ReactDOM and no renderToString anywhere in the platform, and that is a design position rather than an omission.

ConcernFabric ownsYou own
Server-driven screensThe document, release and digest, and validateSduiReleaseAuthoring, composition, rendering
Design systemRenderer-neutral token sets, the DTCG port, component rolesThe components and the brand
Federated packagingThe locked remote: entry, integrity, exposed modulesThe bundler and the loader
ShellVerified actor claims, the channel vocabularyNavigation, routing, layout

If Fabric owned the renderer there would be one implementation, and three surfaces would fork it within two releases. If Fabric owned nothing above the capability, whoever shapes a document would decide what it reaches, and the content system would quietly become the authorization surface.

The rule that everything else rests on

A promoted release is the only render ingress. A document is renderable only as part of a promoted, digest-verified release. Grants, enumerated variants and locked remotes all get their meaning from validateSduiRelease, which runs at promotion, so a renderer that accepts composed JSON directly inherits none of it.

sduiChannelChecks() certifies this for any channel, including one you write. See ADR 0016.

Where the trust boundary falls

Read this before designing anything in the sections that follow.

Client-side verification catches accidents. Server-side gates stop attacks.

Verifying a release, checking a remote's integrity and narrowing grants are all worth doing in a client: they catch a stale cache, a bad deploy, a CDN mismatch, and a release served to the wrong tenant. None of them prevents a hostile client from widening authority, because a hostile client does not run them.

The guarantees that hold under attack are server-side. PlatformHost re-checks authority at the moment of execution, and ProjectionHost authorizes every query. Neither is reachable from a browser in any case; both import Node built-ins.

Nothing you build should describe a client-side check as enforcement. The predictable failure is someone skipping a server-side check later because the client "already validated it".

Certify rather than trust

Every seam in this standard ships an executable definition of correct, so an implementation you write is certified rather than taken on faith.

SuiteCertifies
sduiChannelChecksA channel refuses anything that is not a promoted, verified release
mfeLoaderChecksA transport verifies the bytes it executes
componentPackChecksA resolver is bound to its manifest
experienceGatewayChecksMutations reach PlatformHost, reads reach ProjectionHost
identityPortChecksA credential resolves to claims, and nothing else does

Run them in CI. A suite that exists and is never run certifies nothing.

On this page