parallel_flame_chase:git_pr
Chase three leads at once, the way a team works a repository: every lane has a clone of its own and opens pull requests, and a pull request reaches main only when a measurement shows it is better. There is no reviewer. Its setup is fixed to the one that did best in a twelve-hour experiment.
In hmz, open /flow → Flowverses → official and install parallel_flame_chase, which brings parallel_flame_chase with it. Or run the release without installing anything:
hmz exec -f 'git+https://github.com/humanfia/parallel-flame-chase-flow@v0.1.3#parallel_flame_chase:git_pr' …- repository
- humanfia/parallel-flame-chase-flow
- release
- v0.1.3 · commit
f93127f - earlier
- v0.1.2 · v0.1.1 · v0.1.0
- licence
- Apache-2.0
Read from humanfia/flowverse when this site was built.
❯ $parallel_flame_chase:git_pr get the solver under 10 s on every benchmark in bench/hmz exec -f parallel_flame_chase:git_pr \
-a orchestrator=codex/gpt-5.6-sol:max \
-a lane_1_actor_a=codex/gpt-5.6-sol:max,lane_1_actor_b=claude/claude-opus-5:max \
-a lane_2_actor_a=claude/claude-opus-5:max,lane_2_actor_b=codex/gpt-5.6-sol:max \
-a lane_3_actor_a=claude/claude-opus-5:max,lane_3_actor_b=codex/gpt-5.6-sol:max \
-p budget.duration=12h,budget.cost=500 "$(cat TASK.md)"The whole run, at rest. Step through it with the buttons, or drag the bar.
No reviewer: a pull request reaches main when its receipt shows an improvement, and the repository refuses any main that is not the tree that was measured.
The run, turn by turn
- orchestrator — plans three lanes; a session opened for this turn; hands lane_1_actor_a as words: lane 1; hands lane_2_actor_a as words: lane 2; hands lane_3_actor_a as words: lane 3
- lane_1_actor_a — a turn; a session opened for this turn; hands lane_1_actor_b in the tree: the clone
- lane_2_actor_a — a turn; a session opened for this turn; hands lane_2_actor_b in the tree: the clone
- lane_3_actor_a — a turn; a session opened for this turn; hands lane_3_actor_b in the tree: the clone
- lane_1_actor_b — a turn; a session opened for this turn
- lane_2_actor_b — pfc evaluate, PR ready; a session opened for this turn; hands main in the tree: a PR and its receipt
- lane_3_actor_b — a turn; a session opened for this turn
- main — beats main: merged; no turn of a model; hands lane_1_actor_a as words: pr_merged; hands lane_3_actor_a as words: pr_merged
- lane_1_actor_a — on the new main; a session opened for this turn
- lane_3_actor_a — on the new main; a session opened for this turn
Then round again: each lane alternates a and b; main moves only for a measured improvement.
It ends when the budget runs out, or you stop it.
When to use it
When the task has a number to beat, such as a benchmark, a score or a size, and a command that measures it. Nothing here asks a model whether a change is good: the measurement decides. If the task has no such number, use parallel_flame_chase, where one lane writes your tree and the other two report to it.
How a change reaches main
- A lane may keep many drafts, but only one pull request ready at a time. A ready pull request is frozen, and a newer one from the same lane replaces it.
- The lane measures it with
pfc evaluate -- <command>, which runs your evaluator on a clean tree and keeps a receipt of the result that cannot be changed. - The best candidate is merged only if its receipt improves on
main. The repository itself refuses amainthat is not exactly the tree that was measured.
What lanes learn from each other is their reports, and the flow's own reports of what was merged and what was refused.
Roles and params
| Role | What it is | How it is filled | |
|---|---|---|---|
orchestrator | agent, required | -a orchestrator=… | Plans the three lanes, once. |
lane_1_actor_a · lane_1_actor_b | agent, required | -a lane_1_actor_a=…,lane_1_actor_b=… | Lane 1, taking turns in fresh sessions, in a clone of its own. |
lane_2_actor_a · lane_2_actor_b | agent, required | -a lane_2_actor_a=…,lane_2_actor_b=… | Lane 2, the same. |
lane_3_actor_a · lane_3_actor_b | agent, required | -a lane_3_actor_a=…,lane_3_actor_b=… | Lane 3, the same. |
human | you | filled by humanize; no -a | Asked only to confirm copying a very large workspace. |
workspace | environment, local | the directory you start in; no -e | Your tree, from which the run makes a central repository and a clone per lane. |
Each agent role takes one -a role=CLI[@PROVIDER]/MODEL[:EFFORT]; several roles may share one -a, comma-separated. There is no -e to give: workspace is a local environment, the directory you start the run in, and an -e naming it is refused. See Command-line specs.
Any backend can fill any role. The lane actors may also write outside their clone, which is how they push to the run's central repository.
| Param | Default | |
|---|---|---|
rest_seconds | 1.0 | Seconds the scheduler rests between passes, 0.05 to 60. |
resume_mode | auto | auto picks up a compatible earlier run; fresh starts another. |
confirm_large_workspace_copies | false | Ask before making the copies of a very large workspace. Under hmz exec nobody answers, so the run does not start. |
workspace_file_warning_threshold | 5000 | Files that make a workspace very large. |
workspace_copy_warning_threshold_bytes | 1073741824 | Bytes of copies that make it very large (1 GiB): the lanes' clones, the planning tree and the git objects. |
Five more params are fixed, so that a launch cannot turn the measured setup into a different one: git_pr_enabled is true, and global_knowledge_enabled, experiment_memory_enabled, token_efficient_enabled and main_update_monitor_enabled are false.
What ends it
The budget, or you. The lanes go on for as long as the run does, so give it budget.duration. When it runs out, the turns under way finish and are recorded, and the run stops.
Picking it up
--resume picks up the central repository, the receipts, the artifacts and the reports, and carries on. -p resume_mode=fresh starts another run instead. See Picking a run up.
Leave your source tree alone while a run holds it. Only one run may hold a source tree at a time, whether of this flow or of parallel_flame_chase: a second one refuses to start.
See also
- parallel_flame_chase: the same lanes, with one writer and two private copies
- Many turns at once: why the lanes run side by side, not in a queue