Dossier Schema Specification
Version: 1.0.0 Status: Stable Last Updated: 2025-11-05
Table of Contents
- Overview
- Motivation
- Schema Format
- Field Reference
- Examples
- Validation
- Migration Guide
- Best Practices
Overview
The Dossier Schema is a JSON-based frontmatter format that provides deterministic, machine-readable metadata for dossiers. It is what makes a dossier more than a plain skill: the metadata carries the signature, version, and discovery information a skill needs to be trusted, pinned, and distributed through a registry.
Key Benefits
- Deterministic Parsing: LLMs and tools extract metadata reliably without natural language interpretation
- Trust: checksum + signature fields let tools verify integrity and authorship before execution
- Versioning: explicit version fields make skills pinnable and upgradeable
- Searchability: programmatic discovery by category, tags, tools, dependencies β the basis of the registry
- Fast Validation: schema validation fails fast before expensive LLM execution
- Tooling Foundation: enables CLI tools, IDEs, registries, and automation systems
Motivation
The Problem: Inconsistency and Ambiguity
Without a schema, LLM agents interpret Dossiers based on training and context. This creates brittleness:
- Model Updates Break Execution: New LLM versions may interpret instructions differently
- Ambiguous Dependencies: Relationships between Dossiers are implicit in prose
- Unpredictable Tooling: Canβt know required tools until execution begins
- Poor Discoverability: Canβt search or categorize Dossiers programmatically
The Solution: Structured Metadata
The Dossier Schema provides:
Pure Markdown (Status Quo) β With Schema (Goal State)
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
Ambiguous (LLM infers metadata) β Deterministic (explicit metadata)
Brittle (model changes break it) β Robust (validated before execution)
Isolated (hard to search/organize) β Integrated (tooling-ready)
Schema Format
Frontmatter Structure
Dossier Schema metadata is embedded at the top of the Markdown file using JSON in a YAML-style code fence:
---dossier
{
"dossier_schema_version": "1.0.0",
"title": "Deploy Application to AWS",
"version": "1.2.0",
"protocol_version": "1.0",
"status": "Stable",
"objective": "Deploy a containerized application to AWS ECS with automated rollback capability",
"category": ["devops", "deployment"],
"tags": ["aws", "ecs", "docker", "terraform"],
"tools_required": [
{
"name": "terraform",
"version": ">=1.0.0",
"check_command": "terraform --version"
}
],
"risk_level": "high",
"relationships": {
"preceded_by": [
{
"dossier": "setup-aws-infrastructure",
"condition": "required",
"reason": "Infrastructure must exist before deployment"
}
]
},
"inputs": {
"required": [
{
"name": "environment",
"description": "Target environment (dev, staging, production)",
"type": "string",
"validation": "^(dev|staging|production)$"
}
]
},
"outputs": {
"files": [
{
"path": "terraform.tfstate",
"description": "Terraform state file",
"required": true
}
]
}
}
---
# Deploy Application to AWS
[Rest of Markdown content follows...]
Key Rules
- Delimiter: Use
---dossierto open and---to close the frontmatter block - Format: JSON only (not YAML or TOML)
- Position: Must be the very first content in the file (before any Markdown)
- Validation: Must conform to
dossier-schema.json - Required Fields:
dossier_schema_version,title,version,protocol_version,status,objective
Field Reference
Core Metadata
dossier_schema_version (required)
- Type: String (semver)
- Description: Version of the Dossier Schema specification
- Example:
"1.0.0" - Validation: Must be
"1.0.0"for this specification version
title (required)
- Type: String (3-200 characters)
- Description: Human-readable title of the Dossier
- Example:
"Deploy Application to AWS ECS"
version (required)
- Type: String (semver)
- Description: Version of this specific Dossier
- Example:
"1.2.0","2.0.0-beta.1"
protocol_version (required)
- Type: String (major.minor)
- Description: Dossier Protocol version this adheres to
- Example:
"1.0"
status (required)
- Type: Enum
- Values:
"Draft","Stable","Deprecated","Experimental" - Description: Lifecycle status
last_updated
- Type: String (ISO 8601 date)
- Description: Last update date
- Example:
"2025-11-05"
objective (required)
- Type: String (10-500 characters)
- Description: Clear, single-purpose statement (1-3 sentences)
- Example:
"Deploy a containerized application to AWS ECS with blue-green deployment strategy and automated rollback capability"
Organization & Discovery
category
- Type: Array of strings
- Description: Primary categories for organization
- Values:
devops,database,development,data-science,security,testing,deployment,maintenance,setup,migration,monitoring,infrastructure,ci-cd,documentation,git,review,skills,workflow,orchestration - Example:
["devops", "deployment"]
tags
- Type: Array of strings
- Description: Free-form tags for searchability
- Example:
["aws", "ecs", "docker", "terraform", "blue-green"]
tools_required
- Type: Array of objects
- Description: Tools/commands that must be available
- Fields:
name(required): Tool name (e.g.,"docker")version: Minimum version (e.g.,">=20.0.0")check_command: Command to verify availability (e.g.,"docker --version")install_url: URL to installation instructions
Example:
"tools_required": [
{
"name": "terraform",
"version": ">=1.0.0",
"check_command": "terraform --version",
"install_url": "https://www.terraform.io/downloads"
},
{
"name": "aws-cli",
"version": ">=2.0.0",
"check_command": "aws --version"
}
]
External References
content_scope
- Type: Enum
- Values:
"self-contained","references-external" - Description: Whether the dossier body is self-contained or references external URLs. Set to
"references-external"when the body contains any external URLs (the linter enforces this).
external_references
- Type: Array of objects
- Description: Manifest of all external resources referenced in the dossier body. Required when
content_scopeis"references-external". - Fields:
url(required): URL or URL prefix of the external resourcedescription(required): What this external resource is used fortype(required): Type of resource β"download","api","documentation","script","config","image","dossier", or"other"trust_level(required): Trust level β"trusted","user-verified", or"unknown"required(required): Whether this external resource is required for execution
Example:
"content_scope": "references-external",
"external_references": [
{
"url": "https://registry.npmjs.org",
"description": "NPM registry for package installation",
"type": "download",
"trust_level": "trusted",
"required": true
},
{
"url": "https://raw.githubusercontent.com/org/repo/main/setup.sh",
"description": "Bootstrap script fetched during setup",
"type": "script",
"trust_level": "user-verified",
"required": false
}
]
Linter rule: external-references-declared (default severity: error) scans the body for URLs and cross-references them against declared external_references. Placeholder URLs (example.com, localhost, ${VAR}) are automatically excluded. URLs from tools_required[].install_url, homepage, repository, and authors[].url are auto-exempt.
Agent behavior: See PROTOCOL.md β External Reference Handling for the full agent behavior table and detection rules.
Risk & Duration
risk_level
- Type: Enum
- Values:
"low","medium","high","critical" - Description: Risk level of execution
- Example:
"high"for production deployments,"low"for documentation generation
risk_factors
- Type: Array of enum values
- Values:
modifies_files,deletes_files,modifies_directory_structure,modifies_cloud_resources,requires_credentials,network_access,executes_external_code,database_operations,system_configuration,creates_pull_request,merges_code,incurs_cost - Description: What the dossier does that carries risk. This is a controlled vocabulary describing actions with consequences, not mitigations β a dossier that performs extra safety checks does not declare that here.
- Example:
["modifies_files", "creates_pull_request", "incurs_cost"]
estimated_duration
- Type: Object
- Fields:
min_minutes: Minimum duration in minutesmax_minutes: Maximum duration in minutes
- Example:
"estimated_duration": {
"min_minutes": 15,
"max_minutes": 45
}
Relationships
relationships
- Type: Object
- Description: Relationships with other Dossiers
relationships.preceded_by
- Type: Array of objects
- Description: Dossiers that should run before this one
- Fields:
dossier(required): Name or path of preceding Dossiercondition:"required","optional", or"suggested"reason: Why this prerequisite exists
Example:
"preceded_by": [
{
"dossier": "setup-aws-infrastructure",
"condition": "required",
"reason": "VPC and ECS cluster must exist before deployment"
},
{
"dossier": "configure-secrets-manager",
"condition": "suggested",
"reason": "Secrets management improves security posture"
}
]
relationships.followed_by
- Type: Array of objects
- Description: Dossiers that should run after this one
- Fields:
dossier(required): Name or path of following Dossiercondition:"required"or"suggested"purpose: Purpose of the follow-up
Example:
"followed_by": [
{
"dossier": "configure-monitoring",
"condition": "suggested",
"purpose": "Set up CloudWatch alarms for the deployed service"
}
]
relationships.alternatives
- Type: Array of objects
- Description: Alternative Dossiers for similar goals
- Fields:
dossier(required): Name or pathwhen_to_use: When to use the alternative
Example:
"alternatives": [
{
"dossier": "deploy-to-kubernetes",
"when_to_use": "When targeting Kubernetes instead of ECS"
}
]
relationships.conflicts_with
- Type: Array of objects
- Description: Dossiers that conflict with this one
- Fields:
dossier(required): Conflicting Dossierreason(required): Why they conflict
Example:
"conflicts_with": [
{
"dossier": "deploy-with-serverless-framework",
"reason": "Cannot use both ECS and Lambda for the same service"
}
]
relationships.can_run_parallel_with
- Type: Array of strings
- Description: Dossiers that can be executed simultaneously
Example:
"can_run_parallel_with": [
"setup-monitoring-stack",
"configure-backup-policies"
]
Inputs
inputs
- Type: Object
- Description: Input parameters required or accepted
inputs.required
- Type: Array of objects
- Description: Required inputs
- Fields:
name(required): Parameter namedescription(required): Descriptiontype: Data type (e.g.,"string","number","file","array")validation: Validation rules or regex patternexample: Example value
Example:
"required": [
{
"name": "environment",
"description": "Target deployment environment",
"type": "string",
"validation": "^(dev|staging|production)$",
"example": "production"
},
{
"name": "docker_image",
"description": "Docker image URI",
"type": "string",
"validation": "^[a-z0-9.-]+/[a-z0-9-]+:[a-z0-9.-]+$",
"example": "123456789.dkr.ecr.us-west-2.amazonaws.com/myapp:v1.2.0"
}
]
inputs.optional
- Type: Array of objects
- Description: Optional inputs with defaults
- Fields: Same as
required, plus:default: Default value if not provided
Example:
"optional": [
{
"name": "desired_count",
"description": "Number of tasks to run",
"type": "number",
"default": 2,
"example": "3"
}
]
inputs.from_dossiers
- Type: Array of objects
- Description: Inputs sourced from other Dossiersβ outputs
- Fields:
source_dossier(required): Source Dossier nameoutput_name(required): Name of the outputusage: How this input is used
Example:
"from_dossiers": [
{
"source_dossier": "setup-aws-infrastructure",
"output_name": "ecs_cluster_name",
"usage": "ECS cluster ARN for deployment target"
}
]
Outputs
outputs
- Type: Object
- Description: Outputs produced by this Dossier
outputs.files
- Type: Array of objects
- Description: Files created or modified
- Fields:
path(required): File path (may include variables)description(required): Descriptionrequired: Whether always created (default:true)format: File format (e.g.,"json","yaml")
Example:
"files": [
{
"path": "terraform.tfstate",
"description": "Terraform state file tracking deployed resources",
"required": true,
"format": "json"
},
{
"path": "deployment-${ENVIRONMENT}.log",
"description": "Deployment execution log",
"required": false,
"format": "text"
}
]
outputs.configuration
- Type: Array of objects
- Description: Configuration values produced
- Fields:
key(required): Configuration keydescription(required): Descriptionconsumed_by: Array of Dossiers that consume thisexport_as: How to export (e.g.,"env_var","terraform_output")
Example:
"configuration": [
{
"key": "service_endpoint",
"description": "HTTPS endpoint of the deployed service",
"consumed_by": ["configure-monitoring", "run-integration-tests"],
"export_as": "env_var"
}
]
outputs.state_changes
- Type: Array of objects
- Description: State changes made
- Fields:
description(required): Description of changeaffects: What is affectedreversible: Whether it can be rolled back
Example:
"state_changes": [
{
"description": "ECS service updated to new task definition",
"affects": "Production ECS cluster",
"reversible": true
}
]
outputs.artifacts
- Type: Array of objects
- Description: Generated artifacts (scripts, reports, logs)
- Fields:
path(required): Artifact pathpurpose(required): Purposetype: Type (e.g.,"script","log","report")
Example:
"artifacts": [
{
"path": "rollback-${TIMESTAMP}.sh",
"purpose": "Automated rollback script for this deployment",
"type": "script"
}
]
Coupling
coupling
- Type: Object (required fields:
level) - Description: Coupling level with other systems
coupling.level
- Type: Enum
- Values:
"None","Loose","Medium","Tight" - Description: Degree of coupling
coupling.details
- Type: String
- Description: Explanation of coupling
Example:
"coupling": {
"level": "Medium",
"details": "Requires AWS infrastructure (VPC, ECS cluster) but can adapt to different configurations"
}
Prerequisites
prerequisites
- Type: Array of objects
- Description: Prerequisites that must exist
- Fields:
description(required): Descriptionvalidation_command: Command to validatetype: Type ("file","directory","tool","service","permission","environment")
Example:
"prerequisites": [
{
"description": "AWS credentials configured",
"validation_command": "aws sts get-caller-identity",
"type": "permission"
},
{
"description": "Docker daemon running",
"validation_command": "docker info",
"type": "service"
}
]
Validation
validation
- Type: Object
- Description: Success criteria and verification
validation.success_criteria
- Type: Array of strings
- Description: Verifiable criteria for success
Example:
"success_criteria": [
"ECS service is in ACTIVE state",
"All tasks pass health checks",
"Service endpoint returns 200 OK"
]
validation.verification_commands
- Type: Array of objects
- Description: Commands to verify success
- Fields:
command(required): Command to runexpected(required): Expected resultdescription: What this verifies
Example:
"verification_commands": [
{
"command": "aws ecs describe-services --cluster ${CLUSTER} --services ${SERVICE}",
"expected": "status: ACTIVE, runningCount: desiredCount",
"description": "Verify service is running with correct task count"
},
{
"command": "curl -I https://${SERVICE_ENDPOINT}/health",
"expected": "HTTP/1.1 200 OK",
"description": "Verify service responds to health check"
}
]
Rollback
rollback
- Type: Object
- Description: Rollback capability information
- Fields:
supported: Whether rollback is supportedprocedure: Description of rollback procedureautomated: Whether rollback can be automatedbackup_required: Whether backup is needed before execution
Example:
"rollback": {
"supported": true,
"procedure": "Execute generated rollback script to revert to previous task definition",
"automated": true,
"backup_required": false
}
MCP Integration
mcp_integration (Optional)
Type: Object
Description: MCP (Model Context Protocol) server integration metadata. Enables dossiers to declare MCP server requirements and fallback behavior when MCP is not available.
Purpose:
- Machine-readable MCP requirements for LLMs
- Enables automatic detection and guided setup
- Supports graceful degradation
- Maintains backwards compatibility
Properties:
required (boolean, default: false)
Whether the dossier MCP server is required for execution.
true: Block execution if MCP not available (rare)false: Allow fallback to manual execution (recommended)
server_name (string, default: β@ai-dossier/mcp-serverβ)
npm package name of the required MCP server.
min_version (string, semver format)
Minimum MCP server version required (e.g., β1.0.0β). Optional but recommended for version-dependent features.
features_used (array of strings)
List of MCP tools and resources this dossier uses. Values: βverify_dossierβ, βread_dossierβ, βlist_dossiersβ, βvalidate_dossierβ, βdossier://protocolβ, βdossier://securityβ, βdossier://conceptβ
Helps LLMs understand which MCP capabilities are needed.
fallback (string, enum, default: βmanual_executionβ)
Behavior when MCP server is not available:
- βmanual_executionβ: Continue with manual verification (recommended)
- βdegradedβ: Reduced functionality, continue execution
- βerrorβ: Block execution, require MCP setup (rare)
benefits (array of strings)
Human-readable list of benefits when using MCP for this dossier. Shown to users when offering setup.
Examples:
High-risk dossier, MCP optional but recommended:
{
"mcp_integration": {
"required": false,
"server_name": "@ai-dossier/mcp-server",
"min_version": "1.0.0",
"features_used": ["verify_dossier"],
"fallback": "manual_execution",
"benefits": [
"Automatic security verification",
"Signature validation",
"Clear risk assessment"
]
}
}
Bootstrap/setup dossier (no MCP needed):
{
"mcp_integration": {
"required": false,
"fallback": "manual_execution",
"benefits": [
"This dossier sets up MCP integration (does not require it)"
]
}
}
Dossier requiring MCP (very rare):
{
"mcp_integration": {
"required": true,
"server_name": "@ai-dossier/mcp-server",
"min_version": "1.0.0",
"features_used": ["validate_dossier", "dossier://registry"],
"fallback": "error",
"benefits": [
"This dossier requires MCP for automated registry parsing"
]
}
}
Best Practices:
For Dossier Authors:
- Default to
required: false- Most dossiers can work without MCP - Use
manual_executionfallback - Best user experience - Document benefits clearly - Help users understand value
- Test without MCP - Ensure fallback actually works
- Only use
errorfallback when truly impossible without MCP
For LLM Agents:
- Check MCP availability before execution (see PROTOCOL.md)
- Respect fallback preferences
- Offer setup guidance when MCP missing
- Use MCP tools when available
See Also:
- PROTOCOL.md Β§ MCP Server Integration
- SPECIFICATION.md Β§ MCP Integration Examples
- examples/setup/setup-dossier-mcp.ds.md
Additional Metadata
authors
- Type: Array of objects
- Fields:
name,email,url
license
- Type: String (SPDX identifier)
- Example:
"MIT","Apache-2.0"
homepage
- Type: String (URL)
- Example:
"https://docs.example.com/dossiers/deploy-aws"
repository
- Type: String (URL)
- Example:
"https://github.com/org/dossiers"
custom
- Type: Object
- Description: Custom fields for extensions
- Note: In Markdown, prefix custom sections with
X-
Examples
Example 1: Simple Development Setup
---dossier
{
"dossier_schema_version": "1.0.0",
"title": "Setup Node.js Project",
"version": "1.0.0",
"protocol_version": "1.0",
"status": "Stable",
"last_updated": "2025-11-05",
"objective": "Initialize a new Node.js project with TypeScript, ESLint, and Jest testing",
"category": ["development", "setup"],
"tags": ["nodejs", "typescript", "jest", "eslint"],
"tools_required": [
{
"name": "node",
"version": ">=18.0.0",
"check_command": "node --version"
},
{
"name": "npm",
"version": ">=9.0.0",
"check_command": "npm --version"
}
],
"risk_level": "low",
"estimated_duration": {
"min_minutes": 5,
"max_minutes": 10
},
"inputs": {
"required": [
{
"name": "project_name",
"description": "Name of the project",
"type": "string",
"validation": "^[a-z][a-z0-9-]+$",
"example": "my-awesome-app"
}
],
"optional": [
{
"name": "author",
"description": "Project author name",
"type": "string",
"default": "Current git user"
}
]
},
"outputs": {
"files": [
{
"path": "package.json",
"description": "NPM package manifest",
"required": true,
"format": "json"
},
{
"path": "tsconfig.json",
"description": "TypeScript configuration",
"required": true,
"format": "json"
}
]
},
"coupling": {
"level": "None",
"details": "Self-contained project initialization"
}
}
---
# Setup Node.js Project
[Rest of Dossier content...]
Example 2: High-Risk Database Migration
---dossier
{
"dossier_schema_version": "1.0.0",
"title": "Database Schema Migration",
"version": "2.1.0",
"protocol_version": "1.0",
"status": "Stable",
"last_updated": "2025-11-05",
"objective": "Execute a database schema migration with automatic backup, dry-run validation, and rollback procedure",
"category": ["database", "migration"],
"tags": ["postgresql", "mysql", "mongodb", "schema", "migration"],
"tools_required": [
{
"name": "pg_dump",
"check_command": "pg_dump --version"
},
{
"name": "psql",
"check_command": "psql --version"
}
],
"risk_level": "critical",
"estimated_duration": {
"min_minutes": 30,
"max_minutes": 120
},
"relationships": {
"preceded_by": [
{
"dossier": "database-backup",
"condition": "required",
"reason": "Backup must be verified before schema changes"
}
],
"followed_by": [
{
"dossier": "verify-data-integrity",
"condition": "required",
"purpose": "Ensure migration did not corrupt data"
}
],
"conflicts_with": [
{
"dossier": "database-restore",
"reason": "Cannot migrate and restore simultaneously"
}
]
},
"inputs": {
"required": [
{
"name": "migration_script",
"description": "SQL migration script file",
"type": "file",
"validation": "\\.sql$",
"example": "migrations/001_add_user_profiles.sql"
},
{
"name": "database_url",
"description": "Database connection string",
"type": "string",
"example": "postgresql://user:pass@localhost:5432/mydb"
}
]
},
"outputs": {
"files": [
{
"path": "backup-${TIMESTAMP}.sql",
"description": "Pre-migration backup",
"required": true,
"format": "sql"
},
{
"path": "migration-${TIMESTAMP}.log",
"description": "Migration execution log",
"required": true,
"format": "text"
}
],
"artifacts": [
{
"path": "rollback-${TIMESTAMP}.sql",
"purpose": "Rollback script for this migration",
"type": "script"
}
],
"state_changes": [
{
"description": "Database schema updated to new version",
"affects": "All database tables and indexes",
"reversible": true
}
]
},
"coupling": {
"level": "Tight",
"details": "Tightly coupled to database schema; migration must match current schema version"
},
"prerequisites": [
{
"description": "Database is accessible",
"validation_command": "psql ${DATABASE_URL} -c 'SELECT 1'",
"type": "service"
},
{
"description": "Migration script exists",
"validation_command": "test -f ${MIGRATION_SCRIPT}",
"type": "file"
}
],
"validation": {
"success_criteria": [
"Migration script executed without errors",
"All tables exist with correct schema",
"Sample queries return expected results"
],
"verification_commands": [
{
"command": "psql ${DATABASE_URL} -c '\\dt'",
"expected": "All expected tables listed",
"description": "Verify all tables exist"
}
]
},
"rollback": {
"supported": true,
"procedure": "Execute generated rollback SQL script to revert schema changes",
"automated": true,
"backup_required": true
}
}
---
# Database Schema Migration
[Rest of Dossier content...]
Validation
Programmatic Validation
Use JSON Schema validators to ensure compliance:
Node.js with Ajv:
const Ajv = require('ajv');
const schema = require('./dossier-schema.json');
const dossierFrontmatter = require('./my-dossier-frontmatter.json');
const ajv = new Ajv();
const validate = ajv.compile(schema);
const valid = validate(dossierFrontmatter);
if (!valid) {
console.error('Validation errors:', validate.errors);
}
Python with jsonschema:
import json
from jsonschema import validate, ValidationError
with open('dossier-schema.json') as f:
schema = json.load(f)
with open('my-dossier-frontmatter.json') as f:
dossier = json.load(f)
try:
validate(instance=dossier, schema=schema)
print("Valid!")
except ValidationError as e:
print(f"Validation error: {e.message}")
Pre-Execution Validation Workflow
1. Parse Dossier file
β
2. Extract JSON frontmatter
β
3. Validate against dossier-schema.json
β
4. Check tools_required availability
β
5. Verify prerequisites
β
6. [PASS] β Execute Dossier
[FAIL] β Report errors, exit
Validation Levels
- Syntax Validation: JSON is well-formed
- Schema Validation: Conforms to
dossier-schema.json - Semantic Validation: Relationships reference existing Dossiers
- Environment Validation: Required tools are available
- Prerequisite Validation: Prerequisites are met
Migration Guide
Migrating Existing Dossiers
Step 1: Extract Metadata from Markdown
Identify existing metadata sections in your Dossier:
## Metadata
### Version
- **Dossier**: v1.2.0
- **Protocol**: v1.0
### Relationships
- **Preceded by**: setup-infrastructure (required)
Step 2: Convert to JSON
Create a JSON object with the same information:
{
"dossier_schema_version": "1.0.0",
"title": "[Extract from H1]",
"version": "1.2.0",
"protocol_version": "1.0",
"status": "Stable",
"objective": "[Extract from Objective section]",
"relationships": {
"preceded_by": [
{
"dossier": "setup-infrastructure",
"condition": "required"
}
]
}
}
Step 3: Add Frontmatter
Place the JSON at the top of the file:
---dossier
{
"dossier_schema_version": "1.0.0",
...
}
---
# [Original Dossier Title]
[Original content...]
Step 4: Validate
Run schema validation to ensure compliance.
Step 5: Optionally Remove Redundant Markdown
You may choose to remove the Markdown metadata sections (like ## Metadata) since theyβre now in the frontmatter, or keep them for human readability.
Backward Compatibility
- Legacy Dossiers: Dossiers without schema frontmatter are still valid and can be executed by LLMs
- Gradual Adoption: Add schema to new Dossiers first; migrate old ones over time
- Dual Format: You can keep both JSON frontmatter and Markdown metadata sections during transition
Best Practices
1. Always Include Core Fields
Ensure these required fields are always present:
dossier_schema_versiontitleversionprotocol_versionstatusobjective
2. Be Specific with Relationships
Instead of:
"preceded_by": [{"dossier": "setup"}]
Use:
"preceded_by": [
{
"dossier": "setup-aws-infrastructure",
"condition": "required",
"reason": "VPC and ECS cluster must exist before deployment"
}
]
3. Document All Tools
List every command-line tool your Dossier uses:
"tools_required": [
{"name": "terraform", "version": ">=1.0.0", "check_command": "terraform --version"},
{"name": "aws-cli", "version": ">=2.0.0", "check_command": "aws --version"},
{"name": "docker", "version": ">=20.0.0", "check_command": "docker --version"}
]
4. Define Clear Validation
Make success criteria measurable:
"validation": {
"success_criteria": [
"Service responds to health checks",
"All tasks are running",
"Endpoint returns 200 OK"
],
"verification_commands": [
{
"command": "curl -f https://${ENDPOINT}/health",
"expected": "HTTP 200 OK",
"description": "Health check passes"
}
]
}
5. Set Appropriate Risk Levels
- Low: Documentation, setup, read-only operations
- Medium: Development tooling, non-production deployments
- High: Production deployments, configuration changes
- Critical: Database migrations, destructive operations
6. Version Semantically
Follow semver for version:
- Major: Breaking changes (e.g., incompatible input changes)
- Minor: New features (e.g., new decision points)
- Patch: Bug fixes (e.g., typo corrections)
7. Use Tags Liberally
Tags improve discoverability:
"tags": [
"aws",
"ecs",
"docker",
"terraform",
"blue-green",
"rolling-deployment",
"automated-rollback"
]
8. Document Coupling Honestly
Donβt understate coupling:
"coupling": {
"level": "Tight",
"details": "Requires specific Terraform modules and AWS account structure; not portable without modification"
}
Future Enhancements
Planned for future schema versions:
- Conditional Execution:
"conditions": {"os": "linux", "arch": "x64"} - Cost Estimates:
"estimated_cost": {"min": 10, "max": 50, "currency": "USD"} - Dependency Graphs: Machine-readable DAG of relationships
- Output Contracts: Formal contracts for Dossier outputs
- Testing Metadata: Test coverage, test commands
- Observability: Monitoring and alerting configuration
References
- JSON Schema Specification: json-schema.org
- Semantic Versioning: semver.org
- Dossier Protocol: See
PROTOCOL.md - Dossier Specification: See
SPECIFICATION.md
Questions or Feedback?
Open an issue at: https://github.com/imboard-ai/ai-dossier/issues
Document Version: 1.0.0 License: Same as Dossier project (see LICENSE file)
Rendered from docs/reference/schema.md in the repository. Edit it there.