diff --git a/CHANGELOG.md b/CHANGELOG.md index f747adeae..4844de44f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,7 @@ All notable changes to OriginWeave are documented in this file. The format follo ## [Unreleased] +- Scoped pull-request workflow cancellation by workflow, repository, and PR while keeping push and manual runs independent; removed the completed nightly materializer and the redundant standalone `cargo check`, with all-target Clippy retained as the workspace compile/check gate. - Refreshed the product-gap queue to 126 open pull requests (54 ready, 72 draft) after #190, #188, #185, #192, #182, #184, #115, #181, #116, #117, #118, #183, #114, #127, #112, #109, #186, #110, #108, #111, #174, and #113 were merged into their immediate stacked prerequisites. PRs #147, #146, #145, #144, #143, #142, #141, #139, #136, #132, #129, and #128 moved to ready after exact-head checks and thread review; these are queue-consolidation results, not protected-main shipment. ### Added @@ -102,4 +103,4 @@ All notable changes to OriginWeave are documented in this file. The format follo - The hourly product agent has no Git metadata or repository authority. A separate post-verification publisher opens one PR and cannot approve or merge it. - The unprivileged OpenCode user is restricted to loopback egress during model execution, preventing runner-wide allow-listed endpoints from becoming direct source-exfiltration channels. -[Unreleased]: https://github.com/ContextualWisdomLab/OriginWeave/compare/main...HEAD \ No newline at end of file +[Unreleased]: https://github.com/ContextualWisdomLab/OriginWeave/compare/main...HEAD diff --git a/docs/quality-gates.md b/docs/quality-gates.md index b58f8902f..de72506b2 100644 --- a/docs/quality-gates.md +++ b/docs/quality-gates.md @@ -10,7 +10,7 @@ A PR is mergeable only when all apply: - required PR checks explicitly check out the pull request head SHA; GitHub synthetic merge-ref evidence is supplemental and cannot substitute for exact-head evidence; - production function, line, region, and branch coverage each at 100%; - all public Rust APIs documented and rustdoc warnings denied; -- format, check, test, Clippy, and documentation jobs pass; +- format, test, Clippy, and documentation jobs pass; Clippy is the workspace compile/check gate because CI lints every target, so a separate `cargo check` invocation is not required; - dependency and GitHub Action references are locked or commit-pinned; - generated build outputs are ignored and absent from `git ls-files`; - review threads are resolved with code or evidence; diff --git a/tests/test_pr284_governance_contract.py b/tests/test_pr284_governance_contract.py new file mode 100644 index 000000000..833e01e27 --- /dev/null +++ b/tests/test_pr284_governance_contract.py @@ -0,0 +1,47 @@ +"""Regression contracts for the PR #284/#286 CI-governance repairs.""" + +from __future__ import annotations + +import pathlib +import unittest + +ROOT = pathlib.Path(__file__).resolve().parents[1] + + +class WorkflowGovernanceRepairTests(unittest.TestCase): + """Keep workflow optimization, lifecycle admission, and docs in one contract.""" + + def test_concurrency_and_draft_lifecycle_contracts_remain_composed(self) -> None: + """Main must retain both exact concurrency scoping and Draft-run admission rules.""" + + ci = (ROOT / ".github/workflows/ci.yml").read_text(encoding="utf-8") + mv3 = (ROOT / ".github/workflows/mv3-compatibility.yml").read_text(encoding="utf-8") + concurrency = ( + "concurrency:\n" + " group: ${{ github.workflow }}-${{ github.repository }}-" + "${{ github.event.pull_request.number || github.run_id }}\n" + " cancel-in-progress: ${{ github.event_name == 'pull_request' }}" + ) + lifecycle = ( + "types: [opened, synchronize, reopened, ready_for_review, " + "converted_to_draft, closed]" + ) + + self.assertIn(concurrency, ci) + self.assertIn(concurrency, mv3) + self.assertIn(lifecycle, ci) + self.assertIn(lifecycle, mv3) + self.assertEqual(ci.count("github.event.pull_request.draft == false"), 2) + self.assertIn("github.event.pull_request.draft == false", mv3) + + def test_quality_gate_and_changelog_describe_the_optimized_ci_boundary(self) -> None: + """Repository docs must retain the post-optimization compile/check semantics.""" + + quality_gates = (ROOT / "docs/quality-gates.md").read_text(encoding="utf-8") + changelog = (ROOT / "CHANGELOG.md").read_text(encoding="utf-8") + self.assertIn("Clippy is the workspace compile/check gate", quality_gates) + self.assertIn("Scoped pull-request workflow cancellation", changelog) + + +if __name__ == "__main__": + unittest.main()