Skip to content

Commit bb3554f

Browse files
committed
docs: name GitHub's stacked pull requests preview with links; point 4.x readers at the 5.0.0 entry
Claude-Session: https://claude.ai/code/session_01JFYv5JtK8HAsshpWRAT5YL
1 parent cec94af commit bb3554f

5 files changed

Lines changed: 15 additions & 5 deletions

File tree

CHANGELOG.md

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,23 +2,25 @@
22

33
All notable changes to the flow-next.
44

5+
Flow-Next changed shape with 5.0.0. One command, `/flow-next:flow`, reads whatever you have and picks the route, and `flow --auto` runs the same route unattended. If you are arriving from 4.x, start with [the 5.0.0 entry](#flow-next-500---2026-09-12) and [the flow skill](plugins/flow-next/skills/flow-next-flow/SKILL.md) before reading the items below.
6+
57
## Unreleased
68

79
## [flow-next 5.3.0] - 2026-09-14
810

9-
Teams whose specs depend on each other stop waiting on merges. A dependent spec used to sit until its parent's pull request landed, so every layer of a dependency chain cost one human merge before the next could start and the build loop idled in between. Now the dependent spec builds as soon as its parent is built, its pull request shows only its own layer, GitHub links the layers into a stack, and land drains the chain from the bottom without a hand rebase. Nothing is configured: the dependency graph a plan already records is the only input, and a spec with no dependencies behaves exactly as before.
11+
Teams whose specs depend on each other stop waiting on merges. A dependent spec used to sit until its parent's pull request landed, so every layer of a dependency chain cost one human merge before the next could start and the build loop idled in between. Now the dependent spec builds as soon as its parent is built, its pull request shows only its own layer, GitHub links the layers into one of its [stacked pull requests](https://docs.github.com/en/pull-requests/get-started/about-stacked-prs) (in public preview since 2026-07-30, [announcement](https://github.blog/changelog/2026-07-30-stacked-pull-requests-are-now-in-public-preview/)), and land drains the chain from the bottom without a hand rebase. Off GitHub, or when the preview is unavailable on a repository, the same chain works as plain dependent PRs; only the stack map and GitHub's own retarget are GitHub-only. Nothing is configured: the dependency graph a plan already records is the only input, and a spec with no dependencies behaves exactly as before.
1012

1113
The reviewer's journey changes in one place. Instead of one large PR after a serial wait, they get a chain of small ones, each with its own cognitive-aid body and a stack map in the merge box, reviewed and merged from the bottom up. Merge judgment stays theirs: nothing in this release merges on its own, and land still needs its existing consent and gates. The release's own two pull requests, #432 and #433, were the first live chain, built on 2026-09-13, linked into GitHub stack #434, and merged from the stack UI.
1214

1315
### Added
1416

1517
- **Dependent specs build on their parent's branch instead of waiting for its merge (fn-152).** When a parent spec's tasks are all done and its branch is on origin, the dependent spec becomes selectable in `flow --auto` (ready and backlog mode), in the attended ladder, and under a direct `/flow-next:work`. Work forks the spec branch from the parent's remote tip, make-pr opens the PR against the parent's branch and, on GitHub, links it into the parent's stack, and chained layers with nothing open are created ready so a human can merge them from the stack UI. A spec whose parent is still in progress, a spec with two open parents, or a second child of an already-chained parent parks with a stated reason and no strike. Linear chains only; no configuration key.
16-
- **Land drains chains and GitHub stacks one frontier at a time (fn-149).** A dependent PR, with or without a GitHub stack over it, no longer breaks land or gets closed when its parent merges. Each tick classifies every PR from GitHub's stack object and its base ref and merges only the lowest open layer. On a stack it uses GitHub's asynchronous stack merge with a server-enforced head pin (a stale pin is refused before anything merges, verified live). A review verdict survives a rebase when the stable patch-id of the diff is unchanged, so a reviewer's clean comment on the original head keeps counting through GitHub's retargets and land's own. Above a merged parent on a plain chain, land rewrites the open layers bottom-up in a prepare-then-publish cascade with a leased push per layer and a resumable record, and it never deletes a merged branch while an open PR still targets it, which was the 2026-08-27 failure. Standalone PRs keep byte-identical verdicts, merge arguments, tail order, and ledger writes.
18+
- **Land drains chains and GitHub stacks one frontier at a time (fn-149).** A dependent PR, with or without a GitHub stack over it, no longer breaks land or gets closed when its parent merges. Each tick classifies every PR from GitHub's stack object and its base ref and merges only the lowest open layer. On a stack it uses GitHub's [asynchronous stack merge](https://docs.github.com/en/rest/pulls/pulls#merge-a-pull-request-asynchronously) with a server-enforced head pin (a stale pin is refused before anything merges, verified live). A review verdict survives a rebase when the stable patch-id of the diff is unchanged, so a reviewer's clean comment on the original head keeps counting through GitHub's retargets and land's own. Above a merged parent on a plain chain, land rewrites the open layers bottom-up in a prepare-then-publish cascade with a leased push per layer and a resumable record, and it never deletes a merged branch while an open PR still targets it, which was the 2026-08-27 failure. Standalone PRs keep byte-identical verdicts, merge arguments, tail order, and ledger writes.
1719

1820
### Under the hood
1921

2022
- One read-only predicate, `flowctl spec chain <id>`, owns chain eligibility (parent open, all tasks done, branch on origin, linear, one `git ls-remote` at most, a failed remote read never reported as an absent branch); flowctl's spec-level task-admission gate (`ready --spec`, `next`, `ready --all`) treats the chain parent as satisfied, and every skill consumer calls the predicate instead of duplicating it. `pilot-log append` gains an optional `--reason` so the backlog decision-log row carries the `chained on <parent>; ` prefix.
21-
- Make-pr detects a chain from history, the merge-base of HEAD with the parent's branch tip or merged-PR head, never from a scratch file; a merged parent is rewritten onto the chain base from that boundary on a create run only (`--dry-run` and `--update` never rewrite); stack linking uses the stacks REST API with integer-typed payloads and degrades to a plain chain layer with one stderr line on 404, 409, 422, or a transport error.
23+
- Make-pr detects a chain from history, the merge-base of HEAD with the parent's branch tip or merged-PR head, never from a scratch file; a merged parent is rewritten onto the chain base from that boundary on a create run only (`--dry-run` and `--update` never rewrite); stack linking uses the [stacks REST API](https://docs.github.com/en/rest/pulls/stacks) with integer-typed payloads (the [gh-stack extension](https://github.com/github/gh-stack) is never required) and degrades to a plain chain layer with one stderr line on 404, 409, 422, or a transport error.
2224
- Land's ledger gains one evidence binding per PR (verdict head, base, patch-id, window anchor), a pending merge-async uuid, a top-level `pending_branch_deletes` map swept at the start of every tick, and a `cascade` record that survives a lost lease or a lost write; an unread children count keeps the branch. The Codex mirror and the glossary (`chain`, `stack`, `layer`, `frontier`) are updated; the 2026-08-27 recovery memory now points at the chain rules. Details: [`chains-and-stacks.md`](plugins/flow-next/skills/flow-next-land/references/chains-and-stacks.md).
2325
- Tests: flowctl chain states and admission gates over a bare origin; fence fixtures for every consumer under `set -e` with a stubbed `gh`; land fixtures for every shape, a three-layer chain with multi-commit squash parents, lease and lost-write resumption, the stale pin, and the janitor across four ticks; the merge-fence shell test now states its children count.
2426

plugins/flow-next/codex/docs/flow-next/README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ The repo's strategic intent is [`STRATEGY.md`](https://github.com/gmickel/flow-n
7979

8080
## Notable updates
8181

82-
- **5.3.0: dependent specs chain on their parent, land drains the chain.** A spec whose parent is built but unmerged now builds on the parent's branch, opens its PR against it, and joins a GitHub stack; land merges the bottom layer first, carries review verdicts across a rebase when the patch is unchanged, and never deletes a branch a child still targets. Enable: nothing, the dependency graph decides. Details: [chains and stacks](../../skills/flow-next-land/references/chains-and-stacks.md), [orchestration](orchestration.md), [CHANGELOG](https://github.com/gmickel/flow-next/blob/main/CHANGELOG.md).
82+
- **5.3.0: dependent specs chain on their parent, land drains the chain.** A spec whose parent is built but unmerged now builds on the parent's branch, opens its PR against it, and joins one of GitHub's [stacked pull requests](https://docs.github.com/en/pull-requests/get-started/about-stacked-prs) (public preview); land merges the bottom layer first, carries review verdicts across a rebase when the patch is unchanged, and never deletes a branch a child still targets. Enable: nothing, the dependency graph decides. Details: [chains and stacks](../../skills/flow-next-land/references/chains-and-stacks.md), [orchestration](orchestration.md), [CHANGELOG](https://github.com/gmickel/flow-next/blob/main/CHANGELOG.md).
8383

8484
- **5.2.2: five issue fixes, no new knobs.** Glossary entries with both metadata lines survive `glossary add`; land's merge step works under zsh and its ci-fix step follows git to a worktree that already holds the branch; a planned spec against a `status:backlog` label is a no-op instead of a conflict; a merged spec-text-only PR no longer counts as merge evidence. Enable: nothing. Details: [CHANGELOG](https://github.com/gmickel/flow-next/blob/main/CHANGELOG.md).
8585

plugins/flow-next/codex/skills/flow-next-land/references/chains-and-stacks.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,10 @@
22

33
Read from `workflow.md` §2.0 (shape), §2.8 (frontier rule), §3.5b (native merge), and §3.7 (`retarget`). This page holds the vocabulary, the invariant, and the one cascade fence the plain path executes. Everything else about chains is a rule the tick applies from the PR and git each time; nothing here is stored beyond the ledger fields `workflow.md` Phase 0 lists.
44

5+
## GitHub stacked pull requests (public preview)
6+
7+
The native path rides GitHub's stacked pull requests, in public preview since 2026-07-30 and labelled "subject to change": [announcement](https://github.blog/changelog/2026-07-30-stacked-pull-requests-are-now-in-public-preview/), [about stacked PRs](https://docs.github.com/en/pull-requests/get-started/about-stacked-prs), [stacks REST API](https://docs.github.com/en/rest/pulls/stacks), [asynchronous merge endpoint](https://docs.github.com/en/rest/pulls/pulls#merge-a-pull-request-asynchronously). The [gh-stack extension](https://github.com/github/gh-stack) is never required; every call here is `gh api`. GitHub documents that the legacy merge endpoints cannot merge a stack, that merging a layer merges every open layer below it, and that the layers above a merged one are rebased and retargeted server-side; the frontier rule, the second stack read before submit, and the patch-id carry-over exist because of those three facts. When the preview is unavailable on a repository, or on any other host, the same chain runs on the plain path below.
8+
59
## Vocabulary
610

711
- **Chain**: a dependent PR whose base is the parent's branch, on any host. **Stack**: GitHub's server-side object over a chain (the REST payload's non-null `stack`). **Layer**: one PR in either. **Frontier**: the bottom open layer, the only one land merges.

plugins/flow-next/docs/README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ The repo's strategic intent is [`STRATEGY.md`](../../../STRATEGY.md). The vocabu
7676

7777
## Notable updates
7878

79-
- **5.3.0: dependent specs chain on their parent, land drains the chain.** A spec whose parent is built but unmerged now builds on the parent's branch, opens its PR against it, and joins a GitHub stack; land merges the bottom layer first, carries review verdicts across a rebase when the patch is unchanged, and never deletes a branch a child still targets. Enable: nothing, the dependency graph decides. Details: [chains and stacks](../skills/flow-next-land/references/chains-and-stacks.md), [orchestration](orchestration.md), [CHANGELOG](../../../CHANGELOG.md).
79+
- **5.3.0: dependent specs chain on their parent, land drains the chain.** A spec whose parent is built but unmerged now builds on the parent's branch, opens its PR against it, and joins one of GitHub's [stacked pull requests](https://docs.github.com/en/pull-requests/get-started/about-stacked-prs) (public preview); land merges the bottom layer first, carries review verdicts across a rebase when the patch is unchanged, and never deletes a branch a child still targets. Enable: nothing, the dependency graph decides. Details: [chains and stacks](../skills/flow-next-land/references/chains-and-stacks.md), [orchestration](orchestration.md), [CHANGELOG](../../../CHANGELOG.md).
8080

8181
- **5.2.2: five issue fixes, no new knobs.** Glossary entries with both metadata lines survive `glossary add`; land's merge step works under zsh and its ci-fix step follows git to a worktree that already holds the branch; a planned spec against a `status:backlog` label is a no-op instead of a conflict; a merged spec-text-only PR no longer counts as merge evidence. Enable: nothing. Details: [CHANGELOG](../../../CHANGELOG.md).
8282

plugins/flow-next/skills/flow-next-land/references/chains-and-stacks.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,10 @@
22

33
Read from `workflow.md` §2.0 (shape), §2.8 (frontier rule), §3.5b (native merge), and §3.7 (`retarget`). This page holds the vocabulary, the invariant, and the one cascade fence the plain path executes. Everything else about chains is a rule the tick applies from the PR and git each time; nothing here is stored beyond the ledger fields `workflow.md` Phase 0 lists.
44

5+
## GitHub stacked pull requests (public preview)
6+
7+
The native path rides GitHub's stacked pull requests, in public preview since 2026-07-30 and labelled "subject to change": [announcement](https://github.blog/changelog/2026-07-30-stacked-pull-requests-are-now-in-public-preview/), [about stacked PRs](https://docs.github.com/en/pull-requests/get-started/about-stacked-prs), [stacks REST API](https://docs.github.com/en/rest/pulls/stacks), [asynchronous merge endpoint](https://docs.github.com/en/rest/pulls/pulls#merge-a-pull-request-asynchronously). The [gh-stack extension](https://github.com/github/gh-stack) is never required; every call here is `gh api`. GitHub documents that the legacy merge endpoints cannot merge a stack, that merging a layer merges every open layer below it, and that the layers above a merged one are rebased and retargeted server-side; the frontier rule, the second stack read before submit, and the patch-id carry-over exist because of those three facts. When the preview is unavailable on a repository, or on any other host, the same chain runs on the plain path below.
8+
59
## Vocabulary
610

711
- **Chain**: a dependent PR whose base is the parent's branch, on any host. **Stack**: GitHub's server-side object over a chain (the REST payload's non-null `stack`). **Layer**: one PR in either. **Frontier**: the bottom open layer, the only one land merges.

0 commit comments

Comments
 (0)