2 minutes read

Migration plans

offing plan turns a scan into waves of independent migration tasks. Each task names the files it is expected to edit (its touch set), a suggested branch, and the finding to migrate. Tasks in the same wave never share a touched path, so a host can start them as parallel agent sessions without two agents editing the same file.

# From a clone of Offing:
npm ci
npm run build
demo="$(node dist/tools/examples.js demo)"
npx @velella/offing plan "$demo"
npx @velella/offing plan "$demo" --json
npx @velella/offing plan "$demo" --wave 0

The JSON form is the versioned offing.plan.v1 document. The local MCP tool plan_migrations returns the same object. Offing builds the plan and stops: it does not create branches, worktrees, or agent sessions, and it never runs a migration command.

Touch sets

A task's touch set is the repository-relative paths a migration for that finding is expected to change: the finding's declaration file, every usage the scan recorded, and — for a dependency finding — the lockfile that resolves the same manifest. Two findings that share a lockfile therefore conflict, even when their declaration lines differ.

Waves

Waves are a greedy colouring of those touch sets. Tasks are ordered by severity (highest first) then id; each task joins the first wave that does not already hold a conflicting path, or starts a new wave when every existing wave conflicts. Waves run in ascending index order. Inside one wave the tasks are independent, so a coordinating host can hand them out at the same time.

Dispatch without Offing running anything

The example at examples/plan-dispatch/dispatch.mjs reads offing plan --json from stdin and, for each task, prints a git worktree add command plus the name of the migrate-finding prompt. It prints only; it never runs a command.

npm ci
npm run build
npm run --silent example -- demo plan --json | node examples/plan-dispatch/dispatch.mjs

A host that wants parallel sessions creates each printed worktree itself, then runs the migrate-finding prompt in that tree with the task's finding id. See Local MCP server for the prompt and Migration packets for the context each session receives.

View Markdown

Use with an agent
View Markdown

Open in