Skip to main content
The contract file beside a component or an app. Its presence is what makes the thing discoverable, so an Agent can find it and open it.
Generated from design/_schema/manifest.schema.json, the same file the design lint validates against.

Example

design/acme/components/product-card/manifest.yaml
An app’s manifest is the whole envelope, and adds its state tree:
design/acme/apps/acme-chat/manifest.yaml

Fields

string
The definition name. Matches the folder (and the Ref), capitals included.
string
Display name.
string
What it is. The single home for this text — never duplicated in the definition envelope.
string
The text an Agent’s search is ranked against, so this is what decides whether the component is ever chosen. Write the words a person would actually say, outcome first, and disqualify by property rather than by naming a sibling. Getting it wrong fails silently: the component still works, it is just never picked. Full rules: Node discoverability, which applies to components and apps verbatim.
string
The job’s domain, used in discovery ranking. Name the work, never the build.
string
The definition’s version.
string
LEGACY arrival state (STATE MODEL v2). A component declares its arrival as the initial of its state.view tree; an app’s base is the first entry of states:. Kept only so unmigrated folders still read.
object
An app’s state tree. Top-level order IS the priority ladder, base first, and nesting is containment. Each state owns the layout that draws it.
string
APPS: the base arrangement (layouts/<value>) — the app’s resting state, and the first entry of states:.
object
APPS: the Studio walk. Each key is a state name. An ARRAY seeds that state with components; an OBJECT is authored app-state data — the fields the workflow would have echoed — so a state can be seen without a live run.
`conversation`
COMPONENTS: opt out of supersession (rule 5). An instance marked conversation is not replaced when a newer instance arrives in the same state — it stays for the whole conversation.
object
COMPONENTS: declaring this makes the component LATCHABLE — the conversation can be addressed AT this instance, so what the guest says next travels with its key (chatId:nodeId) and its current state, and the answer merges back into it rather than placing a new component. The composer shows a pill (icon + title + ✕); the ✕ is the only exit. There is at most ONE latch at a time and its holder is DERIVED, never stored: the highest-ranked latchable instance live in the store, by the app’s declared state order (STATE MODEL v2 rule 5). No block means never latchable. Spec: docs/MCP_COMPLETE_GUIDE.md §The Component Latch.
object[]
COMPONENTS: hooks that fire on a moment, not a URL. onEnterView runs when the instance enters one of the named states.
object
APPS: the JSON Schema of the app’s own input (what the calling agent sends to open it).
object
APPS: the workflow this app runs.
string
APPS: the transport the app needs, e.g. voice.
boolean
Whether the app fires its bound workflow on load, without waiting for a message.
boolean
APPS: the org’s landing app.
object
Legacy. Org scoping is the boundary now, so this no longer does anything.
string[]
The outbound hosts this folder may reach. Part of the manifest’s content hash.
string[]
Credential NAMES, resolved server-side from encrypted storage. A key never enters the folder.
object[]
COMPONENTS: declared analytics moments (docs/design/analytics.md). ONE rule: phase entries OBSERVE a state entry (onEnterView, scoped by layouts); action entries observe a SERVER action AND close the person’s lifecycle state (LIFECYCLE_STATES.md §7) under the same event name. The platform names nothing and stamps where automatically.

Next steps

Components

What the manifest sits beside, and how a component is built.

Apps

The state tree, the priority ladder, and how an app reacts.