Generated from cat-harness/processes/sdlc/merge-base.bpmn by gen-processes-viz.ts — do not edit here. All processes

Merge the base branch in

Process_MergeBase · strict · 8 step(s)

Bring the base branch into a pull-request branch: merge, classify every conflicted path before resolving any, refuse the whole merge if one is authored or undeclared, otherwise resolve, regenerate and prove the result with the gate set. CALLED FROM Task_PrepareMerge in code-change-review.bpmn, and executed by bun run cat merge:main (cat-harness-tools/scripts/merge-base.ts). Bean y7b3, issue #1707. Owner, 2026-10-01: “put in merge process bpmn”.

MEASURED 2026-09-30 over 300 main-into-branch merges: 235 conflicted, 147 (63%) ONLY on generated files, each resolved the same mechanical way. The declared patterns, and why each is or is not automatic, are in the merge-conflict-patterns skill.

ALL OR NOTHING: every conflicted path is classified before any is touched, and one refusal aborts the merge and restores the tree. PROVED, NOT ASSUMED: regen derives every check/writer pair from the CI workflow, and an unrepaired check aborts too. Only what both gateways pass is committed.

BPMN diagram: Merge the base branch in

How it connects

Lanes — who acts

lanerolewhat it does here
merge:main commandbuild-pipelineMechanical. Decides nothing a declaration has not decided: a path no pattern names is refused, and the gate set, not this lane, judges the result.
Authoring agentauthoring-agentReached only when the command refused: an authored conflict, an undeclared path, or a resolution the gates could not reproduce. The refused paths are listed for it; what to do with an authored conflict is judgement.

Steps

2 of 8 step(s) carry no documentation — activity-documented lists them.

steplaneskill / sub-processwhat it does
Merge the base in, without committing
Task_Merge
merge:main commandprepare-mergegit merge --no-ff --no-commit origin/main on a clean tree (untracked files refuse too, so the final stage cannot sweep in a scratch file).
Classify every conflicted path against the declared patterns
Task_Classify
merge:main commandmerge-conflict-patternsThe first matching pattern decides: take-base, generated-regions, qa-sidecar, or refuse. A path no pattern names refuses.
Resolve each by its declared strategy
Task_Resolve
merge:main commandmerge-conflict-patternsqa-sidecar paths first, through qa:resolve-conflicts; take-base paths take the base’s copy; generated-regions files take the base’s side of each hunk, which lies inside a generated region by construction.
Regenerate, asking every CI gate
Task_Regen
merge:main commandprepare-mergebun run cat regen: every check/writer pair the CI workflow runs, repeated until the tree settles.
Commit the merge
Task_Commit
merge:main commandcontinual-progress—
Abort, restore the tree, list what was refused
Task_Abort
merge:main commandmerge-conflict-patternsgit merge --abort. Each refused path is listed with its pattern’s reason, or “no declared pattern”.
Resolve by hand, then regenerate
Task_ByHand
Authoring agentprepare-merge—
Report what the run found, once
Task_Report
merge:main commandci-healthEvery member’s verdict, in one table in the run’s summary: merged, already up to date, refused, an expected race, a repeat of a failure already reported, something new, or a member that could not say. cat-harness-tools/scripts/merge-main-comment.ts --aggregate.

Decisions

Every one of the 4 decision(s) is documented.

decisionwhat decides itbranches
Any conflict?
GW_Conflicts
none still regenerates: a CLEAN merge can produce an artefact neither side would emit (bean lxpq), so only the gates can say it is right.none → Regenerate, asking every CI gate
yes → Classify every conflicted path against the declared patterns
Every path resolvable?
GW_AllDeclared
no if even one path is refused: the merge is aborted whole, never half-resolved.yes → Resolve each by its declared strategy
no → Abort, restore the tree, list what was refused
Every gate reproduced?
GW_Proved
no when regen reports an unrepaired check, or one with no writer: a resolution the gates cannot reproduce is not a resolution.yes → Commit the merge
no → Abort, restore the tree, list what was refused
Anything new?
GW_News
new on three conditions and no others: a failure whose signature the PR’s own comment did not already report; a member that reported no verdict, or one it could not classify; and a systemic failure (every selected PR failed) unless every one of those failures is itself a repeat, in which case each PR’s comment already reports its own condition and the run that made it true was the loud one. A repeat of an identical failure on an unchanged head is already reported.new, changed or systemic → Run red: one email
already reported → Run green: recorded, not sent again

folio-assistant — code under the Apache License 2.0, documentation under CC BY 3.0. Generated schema and API references are rebuilt from source on every push to main.

deployed dev