fai-manifest.json
The fai-manifest.json is the "package.json for AI solution plays". It wires together context, primitives, infrastructure, toolkit configuration, and guardrails into a single declarative manifest.
Every solution play must have a fai-manifest.json at its root. It is the single source of truth for what a play contains and how it connects to the FrootAI ecosystem.
To scaffold a play with a pre-populated fai-manifest.json, run npx frootai scaffold <play-id>. See CLI Commands.
Top-Level Fieldsโ
| Field | Type | Required | Description |
|---|---|---|---|
play | string | โ | Play identifier โ format NN-kebab-case |
version | string | โ | Semver version (e.g., 1.0.0) |
context | object | โ | Knowledge, WAF alignment, prerequisites |
primitives | object | โ | Agents, instructions, skills, hooks, workflows |
infrastructure | object | โ | Cloud provider, services, IaC config |
toolkit | object | โ | DevKit / TuneKit / SpecKit flags |
guardrails | object | โ | AI quality thresholds |
playโ
The unique play identifier. Format: NN-kebab-case where NN is a zero-padded number.
"play": "01-enterprise-rag"
versionโ
Semantic version of the play. Bump when primitives, infrastructure, or config change.
"version": "1.0.0"
contextโ
Declares what knowledge the play carries, which WAF pillars it aligns to, and what prerequisites it assumes.
context.knowledgeโ
Array of knowledge file paths referenced by the play. These are loaded into the AI context.
"knowledge": [
"copilot-instructions.md",
"docs/architecture.md"
]
context.wafโ
Array of Well-Architected Framework pillars the play aligns to. Valid values:
reliabilitysecuritycost-optimizationoperational-excellenceperformance-efficiencyresponsible-ai
"waf": ["reliability", "security", "cost-optimization", "responsible-ai"]
context.assumesโ
Array of prerequisites the play requires. These are checked during validation.
"assumes": [
"azure-subscription",
"azure-openai",
"azure-ai-search",
"node-20"
]
primitivesโ
Maps each primitive type to an array of relative file paths within the play directory.
primitives.agentsโ
"agents": [
"./agent.md",
"./.github/agents/builder.agent.md",
"./.github/agents/reviewer.agent.md",
"./.github/agents/tuner.agent.md"
]
primitives.instructionsโ
"instructions": [
"./.github/instructions/rag-patterns.instructions.md",
"./.github/instructions/azure-security.instructions.md"
]
primitives.skillsโ
"skills": [
"./.github/skills/rag-indexing/SKILL.md",
"./.github/skills/rag-retrieval/SKILL.md"
]
primitives.hooksโ
"hooks": [
"./.github/hooks/content-safety/hooks.json"
]
primitives.workflowsโ
"workflows": [
"./.github/workflows/deploy.yml",
"./.github/workflows/evaluate.yml"
]
All paths are relative to the play root where fai-manifest.json lives. Use ./ prefix for clarity.
infrastructureโ
Declares the cloud infrastructure required by the play.
| Field | Type | Description |
|---|---|---|
provider | string | "azure", "aws", or "gcp" |
services | string[] | Service identifiers used |
iac | object | Infrastructure-as-Code configuration |
iac.type | string | "bicep" or "terraform" |
iac.entrypoint | string | Path to main IaC file |
"infrastructure": {
"provider": "azure",
"services": [
"azure-openai",
"azure-ai-search",
"azure-app-service",
"azure-cosmos-db",
"azure-key-vault"
],
"iac": {
"type": "bicep",
"entrypoint": "./infra/main.bicep"
}
}
toolkitโ
Flags indicating which toolkit layers are included in the play.
| Field | Type | Description |
|---|---|---|
devkit | boolean | Developer toolkit โ agents, skills, instructions |
tunekit | boolean | Tuning toolkit โ config/openai.json, config/guardrails.json |
speckit | boolean | Spec toolkit โ metadata, docs, fai-manifest.json |
"toolkit": {
"devkit": true,
"tunekit": true,
"speckit": true
}
guardrailsโ
AI quality thresholds for the evaluation pipeline. All values are floats between 0 and 1.
| Metric | Description | Typical Threshold |
|---|---|---|
groundedness | Response grounded in provided context | 0.8 |
relevance | Response relevant to the query | 0.7 |
coherence | Logical consistency of response | 0.7 |
fluency | Language quality | 0.8 |
safety | Content safety score | 0.9 |
"guardrails": {
"thresholds": {
"groundedness": 0.8,
"relevance": 0.7,
"coherence": 0.7,
"fluency": 0.8,
"safety": 0.9
}
}
Use the MCP run_evaluation tool or npx frootai evaluate to check scores against these thresholds automatically.
Complete Example โ Play 01 (Enterprise RAG)โ
{
"play": "01-enterprise-rag",
"version": "1.0.0",
"context": {
"knowledge": [
"copilot-instructions.md",
"docs/rag-architecture.md"
],
"waf": [
"reliability",
"security",
"cost-optimization",
"operational-excellence",
"performance-efficiency",
"responsible-ai"
],
"assumes": [
"azure-subscription",
"azure-openai",
"azure-ai-search",
"azure-cosmos-db",
"node-20"
]
},
"primitives": {
"agents": [
"./agent.md",
"./.github/agents/builder.agent.md",
"./.github/agents/reviewer.agent.md",
"./.github/agents/tuner.agent.md"
],
"instructions": [
"./.github/instructions/rag-patterns.instructions.md",
"./.github/instructions/azure-security.instructions.md"
],
"skills": [
"./.github/skills/rag-indexing/SKILL.md",
"./.github/skills/rag-retrieval/SKILL.md",
"./.github/skills/rag-evaluation/SKILL.md"
],
"hooks": [
"./.github/hooks/content-safety/hooks.json"
],
"workflows": [
"./.github/workflows/deploy.yml",
"./.github/workflows/evaluate.yml"
]
},
"infrastructure": {
"provider": "azure",
"services": [
"azure-openai",
"azure-ai-search",
"azure-app-service",
"azure-cosmos-db",
"azure-key-vault",
"azure-monitor"
],
"iac": {
"type": "bicep",
"entrypoint": "./infra/main.bicep"
}
},
"toolkit": {
"devkit": true,
"tunekit": true,
"speckit": true
},
"guardrails": {
"thresholds": {
"groundedness": 0.8,
"relevance": 0.7,
"coherence": 0.7,
"fluency": 0.8,
"safety": 0.9
}
}
}
fai-manifest.json vs fai-context.jsonโ
:::info Relationship between manifest and context
fai-manifest.json is the play-level manifest โ it lives at the root of a solution play and wires everything together: context, all primitives, infrastructure, toolkit, and guardrails. There is exactly one per play.
fai-context.json is a primitive-level context block โ a lightweight "LEGO piece" that any individual primitive (agent, skill, hook) can carry to declare its own assumptions, WAF alignment, and compatible plays. There can be many per play, one alongside each primitive.
When the FAI Engine loads a play, it merges all fai-context.json blocks from referenced primitives into the play's unified context, with fai-manifest.json as the authoritative root.
See the JSON Schemas page for the fai-context.json field reference.
:::
Validationโ
Validate your manifest locally:
npm run validate:primitives
The validator checks:
playmatchesNN-kebab-caseformatversionis valid semvercontext.wafvalues are valid pillar namesguardrails.thresholdsvalues are between 0 and 1- All file paths in
primitivesresolve to existing files
See CLI Commands for additional validation options.