State & persistence
vibe-flow persists state so runs survive crashes, context compression, and session restarts.
.vibe-flow.yaml
Per-repo config, committed to the repo. Controls project_id, concurrency,
budget, status mapping, notifications. See
.vibe-flow.example.yaml
for all fields.
.vibe-flow/state.json
Live run state, usually gitignored (may contain PR URLs, workspace IDs, cost totals). Shape:
{
"version": 1,
"project_id": "<uuid>",
"runs": [
{
"run_id": "r-2026-04-24-1",
"started_at": "2026-04-24T09:12:00Z",
"spec": "...",
"issues": [
{
"issue_id": "<uuid>",
"simple_id": "ISSUE-42",
"status": "pr_open | approved | review_critical | merged",
"pr_url": "...",
"workspace_id": "<uuid>",
"tier": "T2",
"cost_usd": 0.34
}
]
}
]
}
Every transition (dispatch, link, review, merge) writes a fresh snapshot before claiming the step succeeded.
.vibe-flow/runs/<run-id>.log
Optional streaming log per run. Useful for debugging long runs.
Resume
If a run is interrupted, /vibe-flow:vibe-flow resume picks up where it left
off — reading state.json, re-verifying each in-flight issue against reality
(PR still open? CI still green?), and continuing.
Two sources of truth
vibe-kanban board status and state.json must agree. The skills always write
to both atomically:
vibe-link→ issuein_review+ statepr_openvibe-reviewapprove → stateapproved(board staysin_review)vibe-merge→ boarddone+ statemerged
If they disagree, vibe-status flags the inconsistency.