Skip to content

Migrate pace.config.yaml to v3

v3 introduced two breaking changes — the platform section in pace.config.yaml and the plan.yaml schema. Every other v3 change is additive and safe to ignore until you need the feature.

This guide covers the two breaking changes first, then lists all additive fields, then walks through the full migration procedure step by step.

Time to complete: 10–20 minutes for a typical sprint plan.


Breaking change 1 — platform section

The platform.type key was replaced by platform.ci. The value set is identical — only the key name changed.

Before (v1/v2):

platform:
type: github

After (v3):

platform:
ci: github
tracker: github # optional — defaults to the value of ci

Migration: open pace/pace.config.yaml and replace type: with ci: under the platform: block. That is the entire change.

Add tracker: only if you want issues filed in a different system than the one running CI. For example, if you use GitHub Actions for CI but track issues in Jira:

platform:
ci: github
tracker: jira

Valid values for ci and tracker:

ValuePlatform
githubGitHub Actions / GitHub Issues
gitlabGitLab CI/CD / GitLab Issues
bitbucketBitbucket Pipelines / Jira
jenkinsJenkins
jiraJira (tracker only)
localLocal execution, no CI integration

Breaking change 2 — plan.yaml schema

v3 replaced the days: list format with a flat stories: list. The sprint metadata block (sprint:) was also removed from plan.yamlduration_days moves to pace.config.yaml.

Before (v2 days format)

sprint:
goal: "Add catalog service"
duration_days: 5
days:
- day: 1
theme: "Product model"
stories:
- title: "Product struct and repository"
acceptance_criteria:
- "Product has id, name, price fields"
- "go test ./... exits 0"
- day: 2
theme: "HTTP layer"
stories:
- title: "GET /products endpoint"
acceptance_criteria:
- "Returns 200 with JSON array"
- "go test ./... exits 0"
- day: 3
theme: "Write operations"
human_gate: true
stories:
- title: "POST /products endpoint"
acceptance_criteria:
- "Returns 201 with created product"
- "go test ./... exits 0"

After (v3 stories format)

release: v1.0
stories:
- id: story-1
title: "Product struct and repository"
status: pending
acceptance_criteria:
- "Product has id, name, price fields"
- "go test ./... exits 0"
- id: story-2
title: "GET /products endpoint"
status: pending
acceptance_criteria:
- "Returns 200 with JSON array"
- "go test ./... exits 0"
- id: story-3
title: "POST /products endpoint"
status: pending
human_gate: true
acceptance_criteria:
- "Returns 201 with created product"
- "go test ./... exits 0"

What changed

v2 fieldv3 equivalentNotes
sprint.goal(removed)Use product.description in pace.config.yaml
sprint.duration_dayssprint.duration_days in pace.config.yamlMoves to the config file
days[].day(removed)PACE runs stories in list order
days[].theme(removed)Use the story title instead
days[].human_gatestories[].human_gateMoves from day level to story level
days[].stories[].titlestories[].titleUnchanged
days[].stories[].acceptance_criteriastories[].acceptance_criteriaUnchanged
(new)stories[].idRequired — must be story-N
(new)stories[].statusRequired — pending, shipped, or skipped
(new)releaseRequired at top level — e.g., v1.0

sprint.duration_days in pace.config.yaml:

pace/pace.config.yaml
sprint:
duration_days: 5

Additive changes (no migration required)

These v3 fields are optional. You can add them at any time without touching your existing config — they will not affect a working v2 setup.

FieldPurpose
platform.trackerSeparate issue tracker from CI platform
releasesNamed release definitions
cronScheduled run configuration
updatesPACE auto-update settings
notificationsSlack, Teams, or email channels
alertsEvent-based notification rules
pluginsPlugin discovery configuration
trainingTraining data export configuration

Step-by-step migration procedure

Terminal window
# Step 1: Back up your current config and plan
cp pace/pace.config.yaml pace/pace.config.yaml.v2.bak
cp plan.yaml plan.yaml.v2.bak
# Step 2: Update the platform section in pace/pace.config.yaml
# Open the file and change:
# platform:
# type: github
# to:
# platform:
# ci: github
# Step 3: Migrate plan.yaml
# Option A — use the migration helper:
python pace/migrations/v3_context_versioning.py
# Option B — migrate manually following the schema table above
# Step 4: Add sprint.duration_days to pace.config.yaml if you had it in plan.yaml
# (Only needed if your v2 plan.yaml had sprint.duration_days)
# Step 5: Validate the new config
python pace/config_tester.py --strict
# Step 6: Run Day 0 to verify the full pipeline loads cleanly
python pace/orchestrator.py --day 0

Validating after migration

Run the config tester in strict mode to surface any remaining issues before you run a real day:

Terminal window
python pace/config_tester.py --strict

Common errors after migration

ErrorCauseFix
platform adapter not foundplatform.type still present in configReplace type: with ci:
plan.yaml: required field 'id' missingStill using days: formatMigrate to flat stories: list with id: story-N
story status must be one of pending/shipped/skippedOld format used different status valuesSet status: pending on all unshipped stories
sprint.duration_days not setRemoved sprint: block from plan.yaml without moving itAdd sprint.duration_days to pace.config.yaml
release field requiredplan.yaml missing top-level release keyAdd release: v1.0 at the top of plan.yaml

Context document migration (v3 context versioning)

v3 introduced context versioning for .pace/context/ documents. If you have pre-existing context documents from a v2 run, they use the old format and SCRIBE will reject them.

Run the migration helper to archive the old documents and let SCRIBE regenerate them:

Terminal window
python pace/migrations/v3_context_versioning.py

This does two things:

  1. Moves all existing .pace/context/ documents to .pace/context/archive/v2/
  2. Writes a version marker so the next SCRIBE run regenerates fresh v3-format documents

The archived v2 documents are preserved — they are never deleted. You can inspect or restore them from .pace/context/archive/v2/ at any time.