From 830a643a4b0e8ecb5c43d577f4a39b3948da0d4f Mon Sep 17 00:00:00 2001 From: Andriujose <43181885+andriujoseba@users.noreply.github.com> Date: Tue, 4 Aug 2026 17:12:48 +0000 Subject: [PATCH 1/3] docs: make standing release windows explicit graphs Add the mint-time membership call, the sink/source/subset invariants, and the release note while the contradictory successor-count criterion awaits triage clarification.\n\nCloses #292. --- RELEASES.md | 7 +++++++ TRIAGE.md | 7 +++++++ changelog.d/292.md | 3 +++ 3 files changed, 17 insertions(+) create mode 100644 changelog.d/292.md diff --git a/RELEASES.md b/RELEASES.md index d3d6816..7d30248 100644 --- a/RELEASES.md +++ b/RELEASES.md @@ -74,6 +74,13 @@ interleaving unrelated windows blurs both the release story and the evidence behind it. Gates open windows; they do not silently admit members, so builders still see one deliberately ordered queue. +While a window stands — an open release-labeled issue with a non-empty +enumerated gate — its members form a DAG whose sink is the release issue. +Every member reaches that sink; ordering edges live on members, while the sink +records membership only; and the `ready` set is exactly the graph's sources. +It follows that every `ready` issue is a gate member. `epic` and `post-merge` +issues are exempt because neither is claimable (#292). + The operator may declare a parallel track at init when its footprint is disjoint from the primary window: another repository, another artifact, or provably non-overlapping clusters. The declaration names the boundary and any diff --git a/TRIAGE.md b/TRIAGE.md index 8159379..848e941 100644 --- a/TRIAGE.md +++ b/TRIAGE.md @@ -98,6 +98,13 @@ Every issue you mint carries, in this order: edge with `Blocked by #N`, naming the newest open carrier; there is no alternative for disjoint regions. This keeps every `ready` issue concurrently claimable and makes each close release one successor (#288). + During a standing release window, every mint also gets a binary membership + call in the same tick. A non-member names the release issue as its blocker. + A member is placed by naming its member predecessors on the new issue, + adding or re-pointing every downstream member's dependency to the new issue + (inserting X into A → B makes A → X → B, never a fan), and adding the new + issue to the release issue's gate; collision and window edges are + independent, so write both when both apply (#292). - **Labels**: type (`bug`/`enhancement`/`documentation`), `scope:*`, and exactly one of `ready` / `blocked` (see [LABELS.md](LABELS.md)). diff --git a/changelog.d/292.md b/changelog.d/292.md new file mode 100644 index 0000000..0fbafcb --- /dev/null +++ b/changelog.d/292.md @@ -0,0 +1,3 @@ +### Changed + +- Standing release windows are dependency DAGs: every mint is placed in the window or behind it, and only current sources are `ready` (#292). From 630fd116c2abfbe51e4539bc50358a52c9d278bf Mon Sep 17 00:00:00 2001 From: Andriujose <43181885+andriujoseba@users.noreply.github.com> Date: Tue, 4 Aug 2026 17:23:03 +0000 Subject: [PATCH 2/3] docs: distinguish window fan-out from collision chains --- RELEASES.md | 13 +++++++++---- TRIAGE.md | 12 +++++++----- 2 files changed, 16 insertions(+), 9 deletions(-) diff --git a/RELEASES.md b/RELEASES.md index 7d30248..930463c 100644 --- a/RELEASES.md +++ b/RELEASES.md @@ -76,10 +76,15 @@ still see one deliberately ordered queue. While a window stands — an open release-labeled issue with a non-empty enumerated gate — its members form a DAG whose sink is the release issue. -Every member reaches that sink; ordering edges live on members, while the sink -records membership only; and the `ready` set is exactly the graph's sources. -It follows that every `ready` issue is a gate member. `epic` and `post-merge` -issues are exempt because neither is claimable (#292). +Every member reaches that sink. Members declare only their immediate +predecessors; ordering edges live on members, while the sink records membership +only; and the `ready` set is exactly the graph's current sources. Every close +releases exactly its declared successors, and that whole set is concurrently +claimable: a member may have multiple successors, while the collision rule +already orders any that share a deliverable. Insertion re-points downstream +edges rather than merely appending membership at the sink. It follows that +every `ready` issue is a gate member. `epic` and `post-merge` issues are exempt +because neither is claimable (#292). The operator may declare a parallel track at init when its footprint is disjoint from the primary window: another repository, another artifact, or diff --git a/TRIAGE.md b/TRIAGE.md index 848e941..f6c0644 100644 --- a/TRIAGE.md +++ b/TRIAGE.md @@ -99,11 +99,13 @@ Every issue you mint carries, in this order: alternative for disjoint regions. This keeps every `ready` issue concurrently claimable and makes each close release one successor (#288). During a standing release window, every mint also gets a binary membership - call in the same tick. A non-member names the release issue as its blocker. - A member is placed by naming its member predecessors on the new issue, - adding or re-pointing every downstream member's dependency to the new issue - (inserting X into A → B makes A → X → B, never a fan), and adding the new - issue to the release issue's gate; collision and window edges are + call in the same tick. A non-member names the release issue as its blocker + in its own Dependencies. A member is placed with three writes: the new issue + names its immediate member predecessors; every downstream member adds or + re-points its dependency to the new issue, dropping any predecessor the new + issue now reaches (inserting X into A → B makes A → X → B, so B drops A); + and the release issue adds the new issue to its gate, recording membership + only. A member may have multiple successors. Collision and window edges are independent, so write both when both apply (#292). - **Labels**: type (`bug`/`enhancement`/`documentation`), `scope:*`, and exactly one of `ready` / `blocked` (see [LABELS.md](LABELS.md)). From d81b04148e312c22bb28b92365c95d3a8cceabe0 Mon Sep 17 00:00:00 2001 From: Andriujose <43181885+andriujoseba@users.noreply.github.com> Date: Tue, 4 Aug 2026 17:39:46 +0000 Subject: [PATCH 3/3] docs: scope window insertion to immediate successors --- TRIAGE.md | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/TRIAGE.md b/TRIAGE.md index f6c0644..e05ccb4 100644 --- a/TRIAGE.md +++ b/TRIAGE.md @@ -101,12 +101,14 @@ Every issue you mint carries, in this order: During a standing release window, every mint also gets a binary membership call in the same tick. A non-member names the release issue as its blocker in its own Dependencies. A member is placed with three writes: the new issue - names its immediate member predecessors; every downstream member adds or - re-points its dependency to the new issue, dropping any predecessor the new - issue now reaches (inserting X into A → B makes A → X → B, so B drops A); - and the release issue adds the new issue to its gate, recording membership - only. A member may have multiple successors. Collision and window edges are - independent, so write both when both apply (#292). + names its immediate member predecessors; every member whose immediate + predecessor the new issue becomes adds or re-points its dependency to the + new issue, dropping any predecessor the new issue now reaches (inserting X + into A → B makes A → X → B, so B drops A); a member that must land after the + new issue but already reaches it through another member declares nothing + new; and the release issue adds the new issue to its gate, recording + membership only. Collision and window edges are independent, so write both + when both apply (#292). - **Labels**: type (`bug`/`enhancement`/`documentation`), `scope:*`, and exactly one of `ready` / `blocked` (see [LABELS.md](LABELS.md)).