Skip to main content

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.

tip

To scaffold a play with a pre-populated fai-manifest.json, run npx frootai scaffold <play-id>. See CLI Commands.


Top-Level Fieldsโ€‹

FieldTypeRequiredDescription
playstringโœ…Play identifier โ€” format NN-kebab-case
versionstringโœ…Semver version (e.g., 1.0.0)
contextobjectโœ…Knowledge, WAF alignment, prerequisites
primitivesobjectโœ…Agents, instructions, skills, hooks, workflows
infrastructureobjectโŒCloud provider, services, IaC config
toolkitobjectโŒDevKit / TuneKit / SpecKit flags
guardrailsobjectโŒ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:

  • reliability
  • security
  • cost-optimization
  • operational-excellence
  • performance-efficiency
  • responsible-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"
]
warning

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.

FieldTypeDescription
providerstring"azure", "aws", or "gcp"
servicesstring[]Service identifiers used
iacobjectInfrastructure-as-Code configuration
iac.typestring"bicep" or "terraform"
iac.entrypointstringPath 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.

FieldTypeDescription
devkitbooleanDeveloper toolkit โ€” agents, skills, instructions
tunekitbooleanTuning toolkit โ€” config/openai.json, config/guardrails.json
speckitbooleanSpec 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.

MetricDescriptionTypical Threshold
groundednessResponse grounded in provided context0.8
relevanceResponse relevant to the query0.7
coherenceLogical consistency of response0.7
fluencyLanguage quality0.8
safetyContent safety score0.9
"guardrails": {
"thresholds": {
"groundedness": 0.8,
"relevance": 0.7,
"coherence": 0.7,
"fluency": 0.8,
"safety": 0.9
}
}
tip

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:

  • play matches NN-kebab-case format
  • version is valid semver
  • context.waf values are valid pillar names
  • guardrails.thresholds values are between 0 and 1
  • All file paths in primitives resolve to existing files

See CLI Commands for additional validation options.