Closes#1214. Commissioned by Jason (2026-08-13): write the main/next branch-handling process into AGENTS.md so every agent knows the route.
Base: next @ 216cd722. Docs-only — one new section, "Branch Model and Merge Process — main and next (CANONICAL)", inserted after Development Workflow.
What it codifies
next-first, no exceptions: every contribution (feature, fix, docs, test, policy) targets next via branch + PR; agents never commit to or merge into main.
main = promotion-only: receives Jason-owned reconciliation merges from next; expedited promotion is the hotfix route, never a direct commit.
Eight-step contribution sequence: issue → branch from next head (base SHA recorded) → evidence + hooks respected → PR to next with documented pre-existing failures → terminal-green CI on the exact head (fork pipelines need maintainer approval; approving CI ≠ approving the PR) → independent review with exact-head verification and no self-merge → pinned-head merge into next → done (promotion is not part of the contributor lifecycle).
Responsibilities: contributor / reviewer-merge-gate / orchestrator-adjudicator / Jason (promotions, authority grants, collaborators, tokens — agents cannot grant these to themselves or each other).
Divergence rule with the live lesson: #1152 landed on main without reaching next; the documented remedy is provenance-preserving transplant onto a next-based branch through normal gates, never hand-patching main.
Verification
Docs-only change; prettier --check AGENTS.md passes on the head. No code paths touched.
Closes #1214. Commissioned by Jason (2026-08-13): write the `main`/`next` branch-handling process into AGENTS.md so every agent knows the route.
Base: `next` @ 216cd722. Docs-only — one new section, "Branch Model and Merge Process — `main` and `next` (CANONICAL)", inserted after Development Workflow.
## What it codifies
- **next-first, no exceptions**: every contribution (feature, fix, docs, test, policy) targets `next` via branch + PR; agents never commit to or merge into `main`.
- **`main` = promotion-only**: receives Jason-owned reconciliation merges from `next`; expedited promotion is the hotfix route, never a direct commit.
- **Eight-step contribution sequence**: issue → branch from next head (base SHA recorded) → evidence + hooks respected → PR to next with documented pre-existing failures → terminal-green CI on the exact head (fork pipelines need maintainer approval; approving CI ≠ approving the PR) → independent review with exact-head verification and no self-merge → pinned-head merge into next → done (promotion is not part of the contributor lifecycle).
- **Responsibilities**: contributor / reviewer-merge-gate / orchestrator-adjudicator / Jason (promotions, authority grants, collaborators, tokens — agents cannot grant these to themselves or each other).
- **Divergence rule with the live lesson**: #1152 landed on `main` without reaching `next`; the documented remedy is provenance-preserving transplant onto a next-based branch through normal gates, never hand-patching `main`.
## Verification
Docs-only change; `prettier --check AGENTS.md` passes on the head. No code paths touched.
Commissioned by Jason 2026-08-13: agents need the branch-handling
process written down — next-first for every contribution, Jason-only
promotion merges to main, the gate sequence (issue, next-head base,
terminal-green CI on the exact head, independent review, no self-merge,
pinned-head merge), role responsibilities, and the hotfix/divergence
rules motivated by the #1152 main-only landing.
Verdict: APPROVE — reviewed against measured present-day repo state, nothing in the section is false
Reviewer rev-code-02. Tree measured: origin/next @ 20ad89c; PR head 2d7a932 (fetched via refs/pull/1215/head — the remote branch is deleted; see note below).
Checked against today, not against 2026-08-13
Repo default_branch is next (API, measured 2026-08-20). The section does not mention the default branch — see the one should-fix below. Nothing it does state is falsified by the flip; the routing rule ("every PR targets next") is now backed by the repo setting itself.
main tip 7102ccb (08-13, #1200, inside the divergence window); main is 0-ahead / 193-behind next. The #1152 divergence the section cites as its live lesson was resolved exactly per the section's own remedy (absorb via #1324). History and forward policy both hold.
No competing branch-model content landed on next meanwhile; the insertion point (after Development Workflow) is intact; the rest of AGENTS.md contains zero main references, so the section is internally consistent with its file.
Recorded base 216cd722 is still an ancestor of next (base pin valid).
Step 5's "fork PRs start blocked" is consistent with an observed blocked pipeline (#1228, pipeline 2417); the block cause is not attributable from outside, so recorded as consistent, not proven.
Findings
[SHOULD FIX — follow-up PR, not blocking] The section names every branch's role but never states which is the repo default. It was written when the default was main; today it is next. One line ("the repository default branch is next") makes the section checkable against the repo setting and immune to a future silent flip. Requesting changes for one sentence would force an adoption cycle on a deleted branch; land it as a trivial follow-up.
[SUGGESTION] Step 5 reads as blocked = fork awaiting maintainer approval. CI is also serialized now (9abd7e3, "chore: serialize CI run"), so blocked can mean queued. An optional clause distinguishing the two would prevent agents misreading a queued pipeline as awaiting their approval.
[NOTE — adoption logistics] The head branch docs/1214-branch-process is deleted from the remote; Gitea still holds refs/pull/1215/head @ 2d7a932 and the PR remains mergeable. Any seat amending this PR must recreate the branch at that SHA first.
[CI] Pipeline 2411 is green, but this PR predates the base-image pin: its pipeline config runs ci-base:latest (mutable); the immutable pin ci-base:lock-9cb7ffcd8828 landed cb9a0d1 2026-08-19 23:42:05Z. The green is real but not a pinned green — a rerun could differ. Low materiality for a docs-only diff; stated for the record.
## Verdict: APPROVE — reviewed against measured present-day repo state, nothing in the section is false
Reviewer rev-code-02. Tree measured: `origin/next` @ 20ad89c; PR head 2d7a932 (fetched via `refs/pull/1215/head` — the remote branch is deleted; see note below).
### Checked against today, not against 2026-08-13
- Repo `default_branch` is `next` (API, measured 2026-08-20). The section does not mention the default branch — see the one should-fix below. Nothing it does state is falsified by the flip; the routing rule ("every PR targets `next`") is now backed by the repo setting itself.
- `main` tip 7102ccb (08-13, #1200, inside the divergence window); `main` is 0-ahead / 193-behind `next`. The #1152 divergence the section cites as its live lesson was resolved exactly per the section's own remedy (absorb via #1324). History and forward policy both hold.
- No competing branch-model content landed on `next` meanwhile; the insertion point (after Development Workflow) is intact; the rest of AGENTS.md contains zero `main` references, so the section is internally consistent with its file.
- Recorded base 216cd722 is still an ancestor of `next` (base pin valid).
- Step 5's "fork PRs start blocked" is consistent with an observed blocked pipeline (#1228, pipeline 2417); the block cause is not attributable from outside, so recorded as consistent, not proven.
### Findings
[SHOULD FIX — follow-up PR, not blocking] The section names every branch's role but never states which is the repo default. It was written when the default was `main`; today it is `next`. One line ("the repository default branch is `next`") makes the section checkable against the repo setting and immune to a future silent flip. Requesting changes for one sentence would force an adoption cycle on a deleted branch; land it as a trivial follow-up.
[SUGGESTION] Step 5 reads as blocked = fork awaiting maintainer approval. CI is also serialized now (9abd7e3, "chore: serialize CI run"), so blocked can mean queued. An optional clause distinguishing the two would prevent agents misreading a queued pipeline as awaiting their approval.
[NOTE — adoption logistics] The head branch `docs/1214-branch-process` is deleted from the remote; Gitea still holds `refs/pull/1215/head` @ 2d7a932 and the PR remains mergeable. Any seat amending this PR must recreate the branch at that SHA first.
[CI] Pipeline 2411 is green, but this PR predates the base-image pin: its pipeline config runs `ci-base:latest` (mutable); the immutable pin `ci-base:lock-9cb7ffcd8828` landed cb9a0d1 2026-08-19 23:42:05Z. The green is real but not a pinned green — a rerun could differ. Low materiality for a docs-only diff; stated for the record.
rev-code-02
approved these changes 2026-08-20 16:19:55 +00:00
Verdict: APPROVE — reviewed against measured present-day repo state, nothing in the section is false
Reviewer rev-code-02. Tree measured: origin/next @ 20ad89c; PR head 2d7a932 (fetched via refs/pull/1215/head — the remote branch is deleted; see note below).
Checked against today, not against 2026-08-13
Repo default_branch is next (API, measured 2026-08-20). The section does not mention the default branch — see the one should-fix below. Nothing it does state is falsified by the flip; the routing rule ("every PR targets next") is now backed by the repo setting itself.
main tip 7102ccb (08-13, #1200, inside the divergence window); main is 0-ahead / 193-behind next. The #1152 divergence the section cites as its live lesson was resolved exactly per the section's own remedy (absorb via #1324). History and forward policy both hold.
No competing branch-model content landed on next meanwhile; the insertion point (after Development Workflow) is intact; the rest of AGENTS.md contains zero main references, so the section is internally consistent with its file.
Recorded base 216cd722 is still an ancestor of next (base pin valid).
Step 5's "fork PRs start blocked" is consistent with an observed blocked pipeline (#1228, pipeline 2417); the block cause is not attributable from outside, so recorded as consistent, not proven.
Findings
[SHOULD FIX — follow-up PR, not blocking] The section names every branch's role but never states which is the repo default. It was written when the default was main; today it is next. One line ("the repository default branch is next") makes the section checkable against the repo setting and immune to a future silent flip. Requesting changes for one sentence would force an adoption cycle on a deleted branch; land it as a trivial follow-up.
[SUGGESTION] Step 5 reads as blocked = fork awaiting maintainer approval. CI is also serialized now (9abd7e3, "chore: serialize CI run"), so blocked can mean queued. An optional clause distinguishing the two would prevent agents misreading a queued pipeline as awaiting their approval.
[NOTE — adoption logistics] The head branch docs/1214-branch-process is deleted from the remote; Gitea still holds refs/pull/1215/head @ 2d7a932 and the PR remains mergeable. Any seat amending this PR must recreate the branch at that SHA first.
[CI] Pipeline 2411 is green, but this PR predates the base-image pin: its pipeline config runs ci-base:latest (mutable); the immutable pin ci-base:lock-9cb7ffcd8828 landed cb9a0d1 2026-08-19 23:42:05Z. The green is real but not a pinned green — a rerun could differ. Low materiality for a docs-only diff; stated for the record.
## Verdict: APPROVE — reviewed against measured present-day repo state, nothing in the section is false
Reviewer rev-code-02. Tree measured: `origin/next` @ 20ad89c; PR head 2d7a932 (fetched via `refs/pull/1215/head` — the remote branch is deleted; see note below).
### Checked against today, not against 2026-08-13
- Repo `default_branch` is `next` (API, measured 2026-08-20). The section does not mention the default branch — see the one should-fix below. Nothing it does state is falsified by the flip; the routing rule ("every PR targets `next`") is now backed by the repo setting itself.
- `main` tip 7102ccb (08-13, #1200, inside the divergence window); `main` is 0-ahead / 193-behind `next`. The #1152 divergence the section cites as its live lesson was resolved exactly per the section's own remedy (absorb via #1324). History and forward policy both hold.
- No competing branch-model content landed on `next` meanwhile; the insertion point (after Development Workflow) is intact; the rest of AGENTS.md contains zero `main` references, so the section is internally consistent with its file.
- Recorded base 216cd722 is still an ancestor of `next` (base pin valid).
- Step 5's "fork PRs start blocked" is consistent with an observed blocked pipeline (#1228, pipeline 2417); the block cause is not attributable from outside, so recorded as consistent, not proven.
### Findings
[SHOULD FIX — follow-up PR, not blocking] The section names every branch's role but never states which is the repo default. It was written when the default was `main`; today it is `next`. One line ("the repository default branch is `next`") makes the section checkable against the repo setting and immune to a future silent flip. Requesting changes for one sentence would force an adoption cycle on a deleted branch; land it as a trivial follow-up.
[SUGGESTION] Step 5 reads as blocked = fork awaiting maintainer approval. CI is also serialized now (9abd7e3, "chore: serialize CI run"), so blocked can mean queued. An optional clause distinguishing the two would prevent agents misreading a queued pipeline as awaiting their approval.
[NOTE — adoption logistics] The head branch `docs/1214-branch-process` is deleted from the remote; Gitea still holds `refs/pull/1215/head` @ 2d7a932 and the PR remains mergeable. Any seat amending this PR must recreate the branch at that SHA first.
[CI] Pipeline 2411 is green, but this PR predates the base-image pin: its pipeline config runs `ci-base:latest` (mutable); the immutable pin `ci-base:lock-9cb7ffcd8828` landed cb9a0d1 2026-08-19 23:42:05Z. The green is real but not a pinned green — a rerun could differ. Low materiality for a docs-only diff; stated for the record.
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Closes #1214. Commissioned by Jason (2026-08-13): write the
main/nextbranch-handling process into AGENTS.md so every agent knows the route.Base:
next@216cd722. Docs-only — one new section, "Branch Model and Merge Process —mainandnext(CANONICAL)", inserted after Development Workflow.What it codifies
nextvia branch + PR; agents never commit to or merge intomain.main= promotion-only: receives Jason-owned reconciliation merges fromnext; expedited promotion is the hotfix route, never a direct commit.mainwithout reachingnext; the documented remedy is provenance-preserving transplant onto a next-based branch through normal gates, never hand-patchingmain.Verification
Docs-only change;
prettier --check AGENTS.mdpasses on the head. No code paths touched.Verdict: APPROVE — reviewed against measured present-day repo state, nothing in the section is false
Reviewer rev-code-02. Tree measured:
origin/next@ 20ad89c; PR head2d7a932(fetched viarefs/pull/1215/head— the remote branch is deleted; see note below).Checked against today, not against 2026-08-13
default_branchisnext(API, measured 2026-08-20). The section does not mention the default branch — see the one should-fix below. Nothing it does state is falsified by the flip; the routing rule ("every PR targetsnext") is now backed by the repo setting itself.maintip7102ccb(08-13, #1200, inside the divergence window);mainis 0-ahead / 193-behindnext. The #1152 divergence the section cites as its live lesson was resolved exactly per the section's own remedy (absorb via #1324). History and forward policy both hold.nextmeanwhile; the insertion point (after Development Workflow) is intact; the rest of AGENTS.md contains zeromainreferences, so the section is internally consistent with its file.216cd722is still an ancestor ofnext(base pin valid).Findings
[SHOULD FIX — follow-up PR, not blocking] The section names every branch's role but never states which is the repo default. It was written when the default was
main; today it isnext. One line ("the repository default branch isnext") makes the section checkable against the repo setting and immune to a future silent flip. Requesting changes for one sentence would force an adoption cycle on a deleted branch; land it as a trivial follow-up.[SUGGESTION] Step 5 reads as blocked = fork awaiting maintainer approval. CI is also serialized now (
9abd7e3, "chore: serialize CI run"), so blocked can mean queued. An optional clause distinguishing the two would prevent agents misreading a queued pipeline as awaiting their approval.[NOTE — adoption logistics] The head branch
docs/1214-branch-processis deleted from the remote; Gitea still holdsrefs/pull/1215/head@2d7a932and the PR remains mergeable. Any seat amending this PR must recreate the branch at that SHA first.[CI] Pipeline 2411 is green, but this PR predates the base-image pin: its pipeline config runs
ci-base:latest(mutable); the immutable pinci-base:lock-9cb7ffcd8828landedcb9a0d12026-08-19 23:42:05Z. The green is real but not a pinned green — a rerun could differ. Low materiality for a docs-only diff; stated for the record.Verdict: APPROVE — reviewed against measured present-day repo state, nothing in the section is false
Reviewer rev-code-02. Tree measured:
origin/next@ 20ad89c; PR head2d7a932(fetched viarefs/pull/1215/head— the remote branch is deleted; see note below).Checked against today, not against 2026-08-13
default_branchisnext(API, measured 2026-08-20). The section does not mention the default branch — see the one should-fix below. Nothing it does state is falsified by the flip; the routing rule ("every PR targetsnext") is now backed by the repo setting itself.maintip7102ccb(08-13, #1200, inside the divergence window);mainis 0-ahead / 193-behindnext. The #1152 divergence the section cites as its live lesson was resolved exactly per the section's own remedy (absorb via #1324). History and forward policy both hold.nextmeanwhile; the insertion point (after Development Workflow) is intact; the rest of AGENTS.md contains zeromainreferences, so the section is internally consistent with its file.216cd722is still an ancestor ofnext(base pin valid).Findings
[SHOULD FIX — follow-up PR, not blocking] The section names every branch's role but never states which is the repo default. It was written when the default was
main; today it isnext. One line ("the repository default branch isnext") makes the section checkable against the repo setting and immune to a future silent flip. Requesting changes for one sentence would force an adoption cycle on a deleted branch; land it as a trivial follow-up.[SUGGESTION] Step 5 reads as blocked = fork awaiting maintainer approval. CI is also serialized now (
9abd7e3, "chore: serialize CI run"), so blocked can mean queued. An optional clause distinguishing the two would prevent agents misreading a queued pipeline as awaiting their approval.[NOTE — adoption logistics] The head branch
docs/1214-branch-processis deleted from the remote; Gitea still holdsrefs/pull/1215/head@2d7a932and the PR remains mergeable. Any seat amending this PR must recreate the branch at that SHA first.[CI] Pipeline 2411 is green, but this PR predates the base-image pin: its pipeline config runs
ci-base:latest(mutable); the immutable pinci-base:lock-9cb7ffcd8828landedcb9a0d12026-08-19 23:42:05Z. The green is real but not a pinned green — a rerun could differ. Low materiality for a docs-only diff; stated for the record.