Merge a bug fix once. A GitLab Duo agent carries it to every release branch you name. A script, not the model, accepts each backport only if the fix’s regression test fails before it, passes after it, and nothing that passed before breaks.
History staged by a script so every outcome appears.
!50 merged on main security: reject upload names that escape the root
release/1.2fails beforepasses afterProvenrelease/1.1fails beforepasses afterProven, adaptedrelease/1.0cannot run hereRefusedrelease/0.9passes without the fixSkippedOpen a row to see each step or the flow run.
Failed: DID NOT RAISE ValueError CI re-probeFinal judge: proven, existing tests 12/12
bp:repro Bug reproduced before backport (expected) successbp:verify Regression test passes, existing tests still pass successbp:integrity Test unchanged or a valid mechanical port successSAST Static analysis of the backport successSecret detection No secrets in the backport successFailed: DID NOT RAISE ValueError CI re-probesrc/core/paths.pyKept upload_path_for name and its leading-slash stripping.
Kept upload_path_for name and its leading-slash stripping; added realpath/commonpath ValueError traversal check from the fix; ported test renamed resolve_upload_path->upload_path_for.
Integrity check: valid port, with resolve_upload_path → upload_path_for renamed in the test.
Compare on GitLab: the fix, !50 and the port, !52.
Final judge: proven-adapted, existing tests 11/11
bp:repro Bug reproduced before backport (expected) successbp:verify Regression test passes, existing tests still pass successbp:integrity Test unchanged or a valid mechanical port successSAST Static analysis of the backport successSecret detection No secrets in the backport successRefused on purpose. No core.paths or path-resolving function exists on 1.0 (logic is inline in UploadStore.__init__); test would need to construct UploadStore instead, changing what it checks.
Not affected. bug not present (introducing commit 1ca73c66 not on this branch)
test passes unpatched flow runbp judge decidesA script with no LLM runs the test before and after, and every test that passed before.Seven rules hold every time. Open one to see the code that enforces it and the test that checks it.
Enforced in tools/bp/publish.py, tested by test_agent_claims_are_ignored.
Enforced in tools/bp/integrity.py, tested by test_changed_literal_is_invalid.
Enforced in tools/bp/judge.py, tested by test_editing_tools_or_other_tests_fails.
Enforced in tools/bp/judge.py, tested by test_attempts_are_capped_but_final_judge_still_runs.
Enforced in tools/bp/ci.py, tested by test_ci_gates_fail_when_the_backport_is_tampered.
Enforced in ci/backport.yml, tested by test_ci_gates_pass_on_a_published_backport.
Enforced in tools/bp/plan.py, tested by test_parse_rejects_tokens_that_are_not_branches_or_test_ids.
Try the real-code test: marshmallow-backports.
To install DuoBack on a project:
ci/backport.yml from the DuoBack project in your .gitlab-ci.yml.Backport-to:, Fixes: and Bp-Test: lines in the commit message.tools/bp/; the adapted backport’s MR pipeline..gitlab/duo/flows/backport.yml; the flow run that did it.docs/validation.md; its proof, live.tools/bp/integrity.py; the job that reproduced the bug.README.md; the proof table on the fix MR.Bp-Test). No test, no proof.