Documentation
project.yml schema
The Zod-derived schema for .vibestrate/project.yml. Defaults are the values Vibestrate fills in when the key is missing.
Every field on this page is derived from the runtime Zod schemas that validate project.yml on every load. When you edit the YAML by hand, Vibestrate runs these schemas against it; broken configs fail at load time, not mid-run.
To edit safely, use vibe config get and vibe config set - both go through the same schema.
project
object
project.name
string
project.type
string (optional)
default:
"generic" git
object (optional)
default:
{"mainBranch":"main","branchPrefix":"vibestrate/","worktreeDir":"../.vibestrate-worktrees","requireCleanMain":false,"allowAutoMerge":false,"allowAutoPush":false} git.mainBranch
string (optional)
default:
"main" git.branchPrefix
string (optional)
default:
"vibestrate/" git.worktreeDir
string (optional)
default:
"../.vibestrate-worktrees" git.requireCleanMain
boolean (optional)
default:
false git.allowAutoMerge
boolean (optional)
default:
false git.allowAutoPush
boolean (optional)
default:
false git.linkEnvironment
enum (optional)
values:
auto | off
default:
"auto" git.snapshotRetentionRuns
number (optional)
default:
0 workflow
object (optional)
default:
{"id":"default-plan-build-review","maxReviewLoops":null,"requireHumanMerge":true} workflow.id
string (optional)
default:
"default-plan-build-review" workflow.maxReviewLoops
number | null (optional)
default:
null workflow.requireHumanMerge
boolean (optional)
default:
true execution
object (optional)
default:
{"backend":"local-worktree"} execution.backend
enum (optional)
values:
local-worktree | docker | remote-sandbox | cloud-runner
default:
"local-worktree" execution.isolation
enum (optional)
values:
off | sandboxed
default:
"off" execution.container
object (optional)
default:
{} execution.container.image
string (optional)
default:
"node:22-bookworm-slim" execution.container.readonlyRoot
boolean (optional)
default:
true execution.container.pidsLimit
number (optional)
default:
512 providers
record<string, unknown>
profiles
record<string, unknown> (optional)
default:
{} crews
record<string, object> (optional)
default:
{} defaultCrew
string (optional)
default:
"default" defaultFlow
string | null (optional)
default:
null personas
record<string, object> (optional)
default:
{} defaultPersona
string (optional)
default:
"staff-engineer" projectPolicies
array<unknown> (optional)
default:
[] flowSizing
enum (optional)
values:
off | deterministic | assisted
default:
"deterministic" adaptiveSpecUp
enum (optional)
values:
off | auto
default:
"auto" ponytail
boolean (optional)
default:
true budget
object (optional)
default:
{"spendCapDailyUsd":null,"capAction":"stop","warnThresholdPct":0.8} budget.spendCapDailyUsd
number | null (optional)
default:
null budget.capAction
enum (optional)
values:
stop | downgrade-model | reduce-effort
default:
"stop" budget.warnThresholdPct
number (optional)
default:
0.8 budget.fallbackProfile
string (optional)
budget.maxTurnsPerRun
number | null (optional)
default:
null budget.maxWallClockMinPerRun
number | null (optional)
default:
null budget.maxTurnsPerDay
number | null (optional)
default:
null budget.maxWallClockMinPerDay
number | null (optional)
default:
null budget.onLimit
enum (optional)
values:
stop | pause
default:
"stop" supervised
object (optional)
default:
{} supervised.maxSpendUsd
number | null (optional)
default:
null supervised.maxSteps
number | null (optional)
default:
20 supervised.supervisor
object (optional)
default:
{} supervised.supervisor.enabled
boolean (optional)
default:
true supervised.supervisor.profile
string | null (optional)
default:
null supervised.supervisor.roleId
string (optional)
default:
"reviewer" resilience
object (optional)
default:
{} resilience.enabled
boolean (optional)
default:
true resilience.onExhausted
enum (optional)
values:
fail | pause
default:
"fail" resilience.autoFallback
enum (optional)
values:
off | crew | any
default:
"crew" resilience.rateLimit
object (optional)
default:
{"maxRetries":5,"baseDelayMs":2000,"maxDelayMs":120000,"respectRetryAfter":true,"patterns":[]} resilience.rateLimit.maxRetries
number
resilience.rateLimit.baseDelayMs
number
resilience.rateLimit.maxDelayMs
number
resilience.rateLimit.patterns
array<string> (optional)
default:
[] resilience.rateLimit.fallbackProfile
string | null (optional)
default:
null resilience.rateLimit.respectRetryAfter
boolean (optional)
default:
true resilience.transient
object (optional)
default:
{"maxRetries":4,"baseDelayMs":1000,"maxDelayMs":60000,"patterns":[]} resilience.transient.maxRetries
number
resilience.transient.baseDelayMs
number
resilience.transient.maxDelayMs
number
resilience.transient.patterns
array<string> (optional)
default:
[] resilience.transient.fallbackProfile
string | null (optional)
default:
null resilience.usageLimit
object (optional)
default:
{} resilience.usageLimit.action
enum (optional)
values:
stop | wait | fallback
default:
"stop" resilience.usageLimit.maxWaitMin
number (optional)
default:
60 resilience.usageLimit.maxWaits
number (optional)
default:
2 resilience.usageLimit.fallbackProfile
string | null (optional)
default:
null resilience.usageLimit.patterns
array<string> (optional)
default:
[] session
object (optional)
default:
{} session.maxReuseTurns
number (optional)
default:
0 commands
object (optional)
default:
{"validate":[]} commands.validate
array<string> (optional)
default:
[] commands.scopeValidationByChange
boolean (optional)
default:
true commands.validationProfiles
record<string, object> (optional)
default:
{} permissions
object (optional)
default:
{"profiles":{}} permissions.profiles
record<string, object> (optional)
default:
{} policies
object (optional)
default:
{"forbidMainBranchWrites":true,"forbidSecretsAccess":true,"forbidAutoPush":true,"forbidAutoMerge":true,"preserveArtifacts":true,"requireApprovalAtStages":[],"allowInteractiveTerminal":false} policies.defaultPermissionMode
enum (optional)
values:
read-only | ask | accept-edits | auto
default:
"auto" policies.forbidMainBranchWrites
boolean (optional)
default:
true policies.forbidSecretsAccess
boolean (optional)
default:
true policies.forbidAutoPush
boolean (optional)
default:
true policies.forbidAutoMerge
boolean (optional)
default:
true policies.preserveArtifacts
boolean (optional)
default:
true policies.requireApprovalAtStages
array<enum> (optional)
default:
[] policies.allowInteractiveTerminal
boolean (optional)
default:
false policies.strictApplyOnly
boolean (optional)
default:
false policies.hardenReadOnlySeats
boolean (optional)
default:
false policies.unattendedApprovalTimeoutMs
number (optional)
default:
0 policies.protectedPaths
array<string> (optional)
default:
[] policies.unprotectedPaths
array<string> (optional)
default:
[] posture
object (optional)
default:
{"autoApplySandbox":false,"autoApplyApproval":false} posture.autoApplySandbox
boolean (optional)
default:
false posture.autoApplyApproval
boolean (optional)
default:
false scheduler
object (optional)
default:
{"maxConcurrentRuns":1,"maxConcurrentWriteRoles":1,"conflictPolicy":"warn","queuePolicy":"fifo","sourceQuotas":{}} scheduler.maxConcurrentRuns
number (optional)
default:
1 scheduler.maxConcurrentWriteRoles
number (optional)
default:
1 scheduler.conflictPolicy
enum (optional)
values:
warn | block
default:
"warn" scheduler.queuePolicy
enum (optional)
values:
fifo | priority | fair
default:
"fifo" scheduler.sourceQuotas
record<string, number> (optional)
default:
{} scheduler.defaultSourceConcurrency
number (optional)
editor
object (optional)
default:
{"enabled":false,"command":"code","args":["--goto","{file}:{line}:{column}"]} editor.enabled
boolean (optional)
default:
false editor.command
string (optional)
default:
"code" editor.args
array<string> (optional)
default:
["--goto","{file}:{line}:{column}"] commits
object (optional)
default:
{"coAuthor":true,"coAuthorName":"Vibestrate","coAuthorEmail":"[email protected]"} commits.coAuthor
boolean (optional)
default:
true commits.coAuthorName
string (optional)
default:
"Vibestrate" merge
object (optional)
default:
{} merge.advisor
object (optional)
default:
{} merge.advisor.suggestIntegrationBranchWhen
object (optional)
default:
{"filesTouched":25,"protectedPaths":true,"behindMain":50} merge.advisor.suggestIntegrationBranchWhen.filesTouched
number (optional)
default:
25 merge.advisor.suggestIntegrationBranchWhen.protectedPaths
boolean (optional)
default:
true merge.advisor.suggestIntegrationBranchWhen.behindMain
number (optional)
default:
50