Parallel wave execution lets multiple sprints in an epic run at the same time — each in its own isolated Git worktree — when they touch different parts of the codebase and have no data dependencies on each other. RepoKernel’s wave scheduler groups sprints by their dependency graph, checks path overlap before starting each wave, and merges results back into the epic branch once reviews are accepted. The result is faster wall-clock time on large epics without risking scope collisions or merge chaos.Documentation Index
Fetch the complete documentation index at: https://mintlify.com/xantorres/repokernel/llms.txt
Use this file to discover all available pages before exploring further.
When to use parallel execution
Use parallel execution when:- Sprints touch non-overlapping parts of the codebase
- Sprints have no data or code dependencies on each other
- You want to reduce wall-clock time for large epics
Enabling parallel execution
Setexecution_strategy: parallel in the epic frontmatter:
allowed_paths is required for parallel sprints
Each sprint declares the paths it is allowed to modify:
--allow-overlap is explicitly passed (see below).
How waves are built
The run loop groups sprints into dependency waves:- Wave 1 — sprints with no
depends_on, or whose dependencies are alreadyshipped - Wave 2 — sprints whose
depends_onentries were all in wave 1 - And so on
allowed_paths run concurrently. The parallel-epic example has two waves:
Previewing with --dry-run
- Resolved worktree paths for each sprint
- Branch names (
rk/sprint/<epic-id>/<sprint-id>) - Wave groupings
- Any path conflicts detected
rk wave:
Running a parallel epic
--concurrency 2 caps sprints per wave. If a wave has 5 sprints and --concurrency 2 is set, the first 2 run, then the next 2, then the last 1.
Concurrency configuration
Set global concurrency limits inrepokernel.config.yaml. The parallel-epic example uses:
maxConcurrentSprints is a hard upper bound on how many sprints may run within a single wave. Set it to match your agent budget and machine capacity. To temporarily cap concurrency for a single invocation without changing config, use --concurrency N on the command line.
What happens during a wave
For each sprint in the wave:- A sprint worktree is created at
<worktrees.root>/<repo-directory-name>/<epic-id>-sprints/<sprint-id>/on branchrk/sprint/<epic-id>/<sprint-id>. - The sprint is transitioned to
activeand the agent is invoked. - Agent results are validated — changed files are checked against
allowed_paths. - The sprint is transitioned to
review.
- The run pauses with halt reason
awaiting_reviews. - You review and accept each sprint’s review.
- On resume, each sprint’s branch is merged into the epic worktree (
rk/epic/<epic-id>). - The sprints are closed (
shipped). - Sprint worktrees are removed.
- The next wave starts.
Reviewing a parallel wave
The run pauses after a wave completes and all sprints are inreview. Set verdicts for each:
The --allow-overlap flag
By default, sprints with overlapping allowed_paths are blocked from running in the same wave. To allow overlap explicitly — useful when you know two sprints touch the same file in non-conflicting ways — first enable the override in config:
How merge works after parallel waves
RepoKernel uses a custom Git merge driver for.repokernel/registry.json. When two branches both modify the registry (the common case in a parallel run), the driver:
- Unions sprints, epics, and reviews by id
- Picks the more-progressed status symmetrically (
shipped > review > active > ...) - Surfaces real conflicts (diverged sprint title, lane, gate) as machine-readable
MergeConflict[]rather than leaving JSON conflict markers - Re-derives
health.blockedfrom the merged finding set
rk init via a .gitattributes entry and local git config. Hosted web merges (GitHub’s UI merge button, GitLab merge) do not execute the local driver — for those, prefer local merges or run rk validate in CI to catch any registry drift.
Review gates between waves
You can declare agate field on sprints to create checkpoints within an epic. All sprints sharing the same gate value must be accepted before any downstream sprint can run:
rk gate subcommand surface.