diff --git a/.github/workflows/hourly-product-development.yml b/.github/workflows/hourly-product-development.yml index 9e86e5ada..f8884f33e 100644 --- a/.github/workflows/hourly-product-development.yml +++ b/.github/workflows/hourly-product-development.yml @@ -134,7 +134,13 @@ jobs: Select an unrelated buyer gap from current protected main. A trusted publisher will fail closed if any proposed changed path overlaps any live open pull request or if protected main advances. Do not intentionally duplicate or replace work already owned - by an active pull-request lane. + by an active pull-request lane. Before selecting a gap, list every live open pull request with its changed paths + and respect lane ordering: a sole-writer document stays with its owner lane. + A newer dependency bump is only a successor after its exact candidate independently verifies complete inheritance of every valid delta, test, fixture, contract, and evidence from the older lane. + Until that verification succeeds, keep both dependency lanes open and do not claim supersession. + Only when a successor's correctness or authority depends on another lane, wait for that prerequisite lane to reconverge to the current protected main. + Path-isolated work that consumes no mutable predecessor authority remains eligible. + Prefer gaps whose paths overlap no live lane. Keep Noema independently deployable and preserve its modular MSA role with ContextualWisdomLab/.github, naruon, contextual-orchestrator, and other CWL diff --git a/test/hourly-product-development-lane-ordering.test.ts b/test/hourly-product-development-lane-ordering.test.ts new file mode 100644 index 000000000..45b63e4cf --- /dev/null +++ b/test/hourly-product-development-lane-ordering.test.ts @@ -0,0 +1,37 @@ +import { readFileSync } from "node:fs"; +import { describe, expect, it } from "vitest"; + +const workflow = readFileSync( + ".github/workflows/hourly-product-development.yml", + "utf8", +); + +describe("hourly product-development lane ordering", () => { + it("does not treat a newer dependency bump as an automatic successor", () => { + expect(workflow).toContain( + "list every live open pull request with its changed paths", + ); + expect(workflow).toContain("a sole-writer document stays with its owner lane"); + expect(workflow).toContain( + "A newer dependency bump is only a successor after its exact candidate independently verifies complete inheritance of every valid delta, test, fixture, contract, and evidence from the older lane", + ); + expect(workflow).toContain( + "Until that verification succeeds, keep both dependency lanes open and do not claim supersession", + ); + expect(workflow).not.toContain( + "a newer dependency bump supersedes an older one on the same package", + ); + }); + + it("blocks only real prerequisite authority instead of globally serializing path-isolated work", () => { + expect(workflow).not.toContain( + "a declared successor lane must not start source work before its predecessor docs lane reconverges to the current protected main", + ); + expect(workflow).toContain( + "Only when a successor's correctness or authority depends on another lane, wait for that prerequisite lane to reconverge to the current protected main", + ); + expect(workflow).toContain( + "Path-isolated work that consumes no mutable predecessor authority remains eligible", + ); + }); +});