Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 7 additions & 1 deletion .github/workflows/hourly-product-development.yml
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
37 changes: 37 additions & 0 deletions test/hourly-product-development-lane-ordering.test.ts
Original file line number Diff line number Diff line change
@@ -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",
);
});
});
Loading