Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
2003 commits
Select commit Hold shift + click to select a range
b311513
chore: refresh org SBOM inventory
Oct 28, 2026
4edf5d7
chore: preserve SBOM inventory publication lineage
Oct 28, 2026
eb7ebd5
chore: refresh org SBOM inventory
Oct 28, 2026
c5c5a58
chore: preserve SBOM inventory publication lineage
Oct 28, 2026
85061de
chore: refresh org SBOM inventory
Oct 28, 2026
63b258d
chore: preserve SBOM inventory publication lineage
Oct 28, 2026
b51d170
chore: refresh org SBOM inventory
Oct 28, 2026
d4c07f5
chore: preserve SBOM inventory publication lineage
Oct 28, 2026
ddced7c
chore: refresh org SBOM inventory
Oct 28, 2026
0e21688
chore: preserve SBOM inventory publication lineage
Oct 28, 2026
85e5d8f
chore: refresh org SBOM inventory
Oct 28, 2026
ffb858e
chore: preserve SBOM inventory publication lineage
Oct 28, 2026
f740999
chore: refresh org SBOM inventory
Oct 28, 2026
8e24069
chore: preserve SBOM inventory publication lineage
Oct 28, 2026
48e0f4b
chore: refresh org SBOM inventory
Oct 28, 2026
2d667d9
chore: preserve SBOM inventory publication lineage
Oct 28, 2026
8733689
chore: refresh org SBOM inventory
Oct 28, 2026
4d441f7
chore: preserve SBOM inventory publication lineage
Oct 28, 2026
0e6a69e
chore: refresh org SBOM inventory
Oct 28, 2026
e020d42
chore: preserve SBOM inventory publication lineage
Oct 28, 2026
c7920a5
chore: refresh org SBOM inventory
Oct 28, 2026
37f8139
chore: preserve SBOM inventory publication lineage
Oct 28, 2026
95807ee
chore: refresh org SBOM inventory
Oct 28, 2026
69d0028
chore: preserve SBOM inventory publication lineage
Oct 28, 2026
236a60c
chore: refresh org SBOM inventory
Oct 28, 2026
a774715
chore: preserve SBOM inventory publication lineage
Oct 28, 2026
5120a9d
chore: refresh org SBOM inventory
Oct 28, 2026
5c9ba03
chore: preserve SBOM inventory publication lineage
Oct 28, 2026
3e67605
chore: refresh org SBOM inventory
Oct 28, 2026
3ea1588
chore: preserve SBOM inventory publication lineage
Oct 28, 2026
5b4f18f
chore: refresh org SBOM inventory
Oct 28, 2026
9c1d440
chore: preserve SBOM inventory publication lineage
Oct 28, 2026
0efd25a
chore: refresh org SBOM inventory
Oct 28, 2026
37a8b05
chore: preserve SBOM inventory publication lineage
Oct 28, 2026
09f8b6a
chore: refresh org SBOM inventory
Oct 28, 2026
27433b6
chore: preserve SBOM inventory publication lineage
Oct 28, 2026
8deadde
chore: refresh org SBOM inventory
Oct 28, 2026
f8f69b3
chore: preserve SBOM inventory publication lineage
Oct 28, 2026
fb2de9f
chore: refresh org SBOM inventory
Oct 28, 2026
cb9e4ac
chore: preserve SBOM inventory publication lineage
Oct 28, 2026
0139175
chore: refresh org SBOM inventory
Oct 29, 2026
60f16a1
chore: preserve SBOM inventory publication lineage
Oct 29, 2026
677c440
chore: refresh org SBOM inventory
Oct 29, 2026
0c1ff5c
chore: preserve SBOM inventory publication lineage
Oct 29, 2026
e82658e
chore: refresh org SBOM inventory
Oct 29, 2026
eca5604
chore: preserve SBOM inventory publication lineage
Oct 29, 2026
1f6ac84
chore: refresh org SBOM inventory
Oct 29, 2026
1e140f4
chore: preserve SBOM inventory publication lineage
Oct 29, 2026
3bc5999
chore: refresh org SBOM inventory
Oct 29, 2026
723d578
chore: preserve SBOM inventory publication lineage
Oct 29, 2026
7a8676f
chore: refresh org SBOM inventory
Oct 29, 2026
1f64cf7
chore: preserve SBOM inventory publication lineage
Oct 29, 2026
9829417
chore: refresh org SBOM inventory
Oct 29, 2026
542016a
chore: preserve SBOM inventory publication lineage
Oct 29, 2026
dedf260
chore: refresh org SBOM inventory
Oct 29, 2026
d4431b4
chore: preserve SBOM inventory publication lineage
Oct 29, 2026
dd9f33d
chore: refresh org SBOM inventory
Oct 29, 2026
130a0b5
chore: preserve SBOM inventory publication lineage
Oct 29, 2026
b6b03d7
chore: refresh org SBOM inventory
Oct 29, 2026
247876c
chore: preserve SBOM inventory publication lineage
Oct 29, 2026
7386f71
chore: refresh org SBOM inventory
Oct 29, 2026
0250c97
chore: preserve SBOM inventory publication lineage
Oct 29, 2026
e582e21
chore: refresh org SBOM inventory
Oct 29, 2026
0f88697
chore: preserve SBOM inventory publication lineage
Oct 29, 2026
b46ba63
chore: refresh org SBOM inventory
Oct 29, 2026
af2c983
chore: preserve SBOM inventory publication lineage
Oct 29, 2026
febad8b
chore: refresh org SBOM inventory
Oct 29, 2026
55c40a0
chore: preserve SBOM inventory publication lineage
Oct 29, 2026
5c7adf3
chore: refresh org SBOM inventory
Oct 29, 2026
cc0ad1c
chore: preserve SBOM inventory publication lineage
Oct 29, 2026
c321882
chore: refresh org SBOM inventory
Oct 29, 2026
e23b3bb
chore: preserve SBOM inventory publication lineage
Oct 29, 2026
bb25a72
chore: refresh org SBOM inventory
Oct 29, 2026
b526815
chore: preserve SBOM inventory publication lineage
Oct 29, 2026
2dacd71
chore: refresh org SBOM inventory
Oct 29, 2026
b3f0a1c
chore: preserve SBOM inventory publication lineage
Oct 29, 2026
2f74a26
chore: refresh org SBOM inventory
Oct 29, 2026
85010ee
chore: preserve SBOM inventory publication lineage
Oct 29, 2026
c1dced7
chore: refresh org SBOM inventory
Oct 29, 2026
0abfd55
chore: preserve SBOM inventory publication lineage
Oct 29, 2026
bdd225e
chore: refresh org SBOM inventory
Oct 29, 2026
c0cb837
chore: preserve SBOM inventory publication lineage
Oct 29, 2026
1404889
chore: refresh org SBOM inventory
Oct 29, 2026
52e3801
chore: preserve SBOM inventory publication lineage
Oct 29, 2026
1a578b8
chore: refresh org SBOM inventory
Oct 29, 2026
1539432
chore: preserve SBOM inventory publication lineage
Oct 29, 2026
604a307
chore: refresh org SBOM inventory
Oct 29, 2026
0d75871
chore: preserve SBOM inventory publication lineage
Oct 29, 2026
ad9a359
chore: refresh org SBOM inventory
Oct 30, 2026
b3eabf6
chore: preserve SBOM inventory publication lineage
Oct 30, 2026
bfc6679
chore: refresh org SBOM inventory
Oct 30, 2026
9137665
chore: preserve SBOM inventory publication lineage
Oct 30, 2026
8806db0
chore: refresh org SBOM inventory
Oct 30, 2026
87ebed9
chore: preserve SBOM inventory publication lineage
Oct 30, 2026
64911f4
chore: refresh org SBOM inventory
Oct 30, 2026
ba12217
chore: preserve SBOM inventory publication lineage
Oct 30, 2026
4e95cfb
chore: refresh org SBOM inventory
Oct 30, 2026
7861792
chore: preserve SBOM inventory publication lineage
Oct 30, 2026
9c7c439
chore: refresh org SBOM inventory
Oct 30, 2026
8a6f6c2
chore: preserve SBOM inventory publication lineage
Oct 30, 2026
d8c6ef7
chore: refresh org SBOM inventory
Oct 30, 2026
dcb0302
chore: preserve SBOM inventory publication lineage
Oct 30, 2026
6c5c71f
chore: refresh org SBOM inventory
Oct 30, 2026
2578c18
chore: preserve SBOM inventory publication lineage
Oct 30, 2026
5c9e8ff
chore: refresh org SBOM inventory
Oct 30, 2026
b8bbe6a
chore: preserve SBOM inventory publication lineage
Oct 30, 2026
258796d
chore: refresh org SBOM inventory
Oct 30, 2026
9640423
chore: preserve SBOM inventory publication lineage
Oct 30, 2026
98901d5
chore: refresh org SBOM inventory
Oct 30, 2026
9ac0074
chore: preserve SBOM inventory publication lineage
Oct 30, 2026
290f6f7
chore: refresh org SBOM inventory
Oct 30, 2026
747ffab
chore: preserve SBOM inventory publication lineage
Oct 30, 2026
8ce8aa5
chore: refresh org SBOM inventory
Oct 30, 2026
5c98ed4
chore: preserve SBOM inventory publication lineage
Oct 30, 2026
9c60d11
chore: refresh org SBOM inventory
Oct 30, 2026
858a92d
chore: preserve SBOM inventory publication lineage
Oct 30, 2026
a50b520
chore: refresh org SBOM inventory
Oct 30, 2026
6b57004
chore: preserve SBOM inventory publication lineage
Oct 30, 2026
eb5e3fc
chore: refresh org SBOM inventory
Oct 30, 2026
607894d
chore: preserve SBOM inventory publication lineage
Oct 30, 2026
0c53ce3
chore: refresh org SBOM inventory
Oct 30, 2026
106ad6a
chore: preserve SBOM inventory publication lineage
Oct 30, 2026
8c0d2c6
chore: refresh org SBOM inventory
Oct 30, 2026
e5abeb0
chore: preserve SBOM inventory publication lineage
Oct 30, 2026
bb5acb0
chore: refresh org SBOM inventory
Oct 30, 2026
afb4d0f
chore: preserve SBOM inventory publication lineage
Oct 30, 2026
a52d1f5
chore: refresh org SBOM inventory
Oct 30, 2026
9827357
chore: preserve SBOM inventory publication lineage
Oct 30, 2026
0dcab2f
chore: refresh org SBOM inventory
Oct 30, 2026
ad7c232
chore: preserve SBOM inventory publication lineage
Oct 30, 2026
c1b93b5
chore: refresh org SBOM inventory
Oct 30, 2026
677255f
chore: preserve SBOM inventory publication lineage
Oct 30, 2026
cc27167
chore: refresh org SBOM inventory
Oct 30, 2026
f7ac352
chore: preserve SBOM inventory publication lineage
Oct 30, 2026
1117b40
chore: refresh org SBOM inventory
Oct 30, 2026
84064a4
chore: preserve SBOM inventory publication lineage
Oct 30, 2026
d4e5fcd
chore: refresh org SBOM inventory
Oct 31, 2026
990ee28
chore: preserve SBOM inventory publication lineage
Oct 31, 2026
3fc3187
chore: refresh org SBOM inventory
Oct 31, 2026
e8d43ce
chore: preserve SBOM inventory publication lineage
Oct 31, 2026
3e40f5f
chore: refresh org SBOM inventory
Oct 31, 2026
13ac019
chore: preserve SBOM inventory publication lineage
Oct 31, 2026
88b084b
chore: refresh org SBOM inventory
Oct 31, 2026
35f9a56
chore: preserve SBOM inventory publication lineage
Oct 31, 2026
3b4b19a
chore: refresh org SBOM inventory
Oct 31, 2026
a3845bb
chore: preserve SBOM inventory publication lineage
Oct 31, 2026
3917a84
chore: refresh org SBOM inventory
Oct 31, 2026
06f98fd
chore: preserve SBOM inventory publication lineage
Oct 31, 2026
dbc466d
chore: refresh org SBOM inventory
Oct 31, 2026
4b0efe3
chore: preserve SBOM inventory publication lineage
Oct 31, 2026
537488f
chore: refresh org SBOM inventory
Oct 31, 2026
c84ce08
chore: preserve SBOM inventory publication lineage
Oct 31, 2026
9815b29
chore: refresh org SBOM inventory
Oct 31, 2026
2bba545
chore: preserve SBOM inventory publication lineage
Oct 31, 2026
9cbee53
chore: refresh org SBOM inventory
Oct 31, 2026
9378a8a
chore: preserve SBOM inventory publication lineage
Oct 31, 2026
87f5188
chore: refresh org SBOM inventory
Oct 31, 2026
86a5c17
chore: preserve SBOM inventory publication lineage
Oct 31, 2026
bb3595c
chore: refresh org SBOM inventory
Oct 31, 2026
e40f018
chore: preserve SBOM inventory publication lineage
Oct 31, 2026
0ec94f2
chore: refresh org SBOM inventory
Oct 31, 2026
e40f304
chore: preserve SBOM inventory publication lineage
Oct 31, 2026
e9812c3
chore: refresh org SBOM inventory
Oct 31, 2026
cafb1f1
chore: preserve SBOM inventory publication lineage
Oct 31, 2026
e9de7a0
chore: refresh org SBOM inventory
Oct 31, 2026
e9134ac
chore: preserve SBOM inventory publication lineage
Oct 31, 2026
5fe7566
chore: refresh org SBOM inventory
Oct 31, 2026
25face2
chore: preserve SBOM inventory publication lineage
Oct 31, 2026
63aa9c5
chore: refresh org SBOM inventory
Oct 31, 2026
ed137fa
chore: preserve SBOM inventory publication lineage
Oct 31, 2026
3c5c96a
chore: refresh org SBOM inventory
Oct 31, 2026
a48c4b9
chore: preserve SBOM inventory publication lineage
Oct 31, 2026
ab376f2
chore: refresh org SBOM inventory
Oct 31, 2026
ee2c194
chore: preserve SBOM inventory publication lineage
Oct 31, 2026
79fc976
chore: refresh org SBOM inventory
Oct 31, 2026
4097555
chore: preserve SBOM inventory publication lineage
Oct 31, 2026
d351022
chore: refresh org SBOM inventory
Oct 31, 2026
6be5fe4
chore: preserve SBOM inventory publication lineage
Oct 31, 2026
36e2d4d
chore: refresh org SBOM inventory
Oct 31, 2026
41bd757
chore: preserve SBOM inventory publication lineage
Oct 31, 2026
688fd9d
chore: refresh org SBOM inventory
Oct 31, 2026
b6c8688
chore: preserve SBOM inventory publication lineage
Oct 31, 2026
bae1e24
chore: refresh org SBOM inventory
Oct 31, 2026
a1dfb26
chore: preserve SBOM inventory publication lineage
Oct 31, 2026
ee9c2e7
chore: refresh org SBOM inventory
Nov 1, 2026
1e154ad
chore: preserve SBOM inventory publication lineage
Nov 1, 2026
eead80e
chore: refresh org SBOM inventory
Nov 1, 2026
b1e8775
chore: preserve SBOM inventory publication lineage
Nov 1, 2026
444b3a6
chore: refresh org SBOM inventory
Nov 1, 2026
3a1446a
chore: preserve SBOM inventory publication lineage
Nov 1, 2026
d3644f1
chore: refresh org SBOM inventory
Nov 1, 2026
6a69fe2
chore: preserve SBOM inventory publication lineage
Nov 1, 2026
2b74e9c
chore: refresh org SBOM inventory
Nov 1, 2026
8e30a9c
chore: preserve SBOM inventory publication lineage
Nov 1, 2026
886bf10
chore: refresh org SBOM inventory
Nov 1, 2026
26240fe
chore: preserve SBOM inventory publication lineage
Nov 1, 2026
9c13188
chore: refresh org SBOM inventory
Nov 1, 2026
50232c8
chore: preserve SBOM inventory publication lineage
Nov 1, 2026
99a30fc
chore: refresh org SBOM inventory
Nov 1, 2026
02c72bd
chore: preserve SBOM inventory publication lineage
Nov 1, 2026
353d583
chore: refresh org SBOM inventory
Nov 1, 2026
76959d2
chore: preserve SBOM inventory publication lineage
Nov 1, 2026
869dfde
chore: refresh org SBOM inventory
Nov 1, 2026
901e034
chore: preserve SBOM inventory publication lineage
Nov 1, 2026
d2f59e6
chore: refresh org SBOM inventory
Nov 1, 2026
3856383
chore: preserve SBOM inventory publication lineage
Nov 1, 2026
1e587f2
chore: refresh org SBOM inventory
Nov 1, 2026
82fcd8f
chore: preserve SBOM inventory publication lineage
Nov 1, 2026
a6da718
chore: refresh org SBOM inventory
Nov 1, 2026
e423cca
chore: preserve SBOM inventory publication lineage
Nov 1, 2026
99dd291
chore: refresh org SBOM inventory
Nov 1, 2026
75ce9ff
chore: preserve SBOM inventory publication lineage
Nov 1, 2026
882f0ac
chore: refresh org SBOM inventory
Nov 1, 2026
b4cc79b
chore: preserve SBOM inventory publication lineage
Nov 1, 2026
490cff1
chore: refresh org SBOM inventory
Nov 1, 2026
ff772a5
chore: preserve SBOM inventory publication lineage
Nov 1, 2026
3a9c173
chore: refresh org SBOM inventory
Nov 1, 2026
c5076e1
chore: preserve SBOM inventory publication lineage
Nov 1, 2026
edf2665
chore: refresh org SBOM inventory
Nov 1, 2026
787b0e8
chore: preserve SBOM inventory publication lineage
Nov 1, 2026
2ccd8cd
chore: refresh org SBOM inventory
Nov 1, 2026
b850a1f
chore: preserve SBOM inventory publication lineage
Nov 1, 2026
953edb5
chore: refresh org SBOM inventory
Nov 1, 2026
7260e38
chore: preserve SBOM inventory publication lineage
Nov 1, 2026
4c569e0
chore: refresh org SBOM inventory
Nov 1, 2026
a305f0e
chore: preserve SBOM inventory publication lineage
Nov 1, 2026
7aba603
chore: refresh org SBOM inventory
Nov 1, 2026
b23d2b4
chore: preserve SBOM inventory publication lineage
Nov 1, 2026
8afb054
chore: refresh org SBOM inventory
Nov 1, 2026
d6da366
chore: preserve SBOM inventory publication lineage
Nov 1, 2026
6997172
chore: refresh org SBOM inventory
Nov 1, 2026
74b118d
chore: preserve SBOM inventory publication lineage
Nov 1, 2026
1a8a5f3
chore: refresh org SBOM inventory
Nov 2, 2026
8200070
chore: preserve SBOM inventory publication lineage
Nov 2, 2026
c6eaffb
chore: refresh org SBOM inventory
Nov 2, 2026
4cd8419
chore: preserve SBOM inventory publication lineage
Nov 2, 2026
936f6c1
chore: refresh org SBOM inventory
Nov 2, 2026
c28146c
chore: preserve SBOM inventory publication lineage
Nov 2, 2026
d51bfc0
chore: refresh org SBOM inventory
Nov 2, 2026
21f6c28
chore: preserve SBOM inventory publication lineage
Nov 2, 2026
729ff7c
chore: refresh org SBOM inventory
Nov 2, 2026
a03094b
chore: preserve SBOM inventory publication lineage
Nov 2, 2026
4801245
chore: refresh org SBOM inventory
Nov 2, 2026
c3fca7a
chore: preserve SBOM inventory publication lineage
Nov 2, 2026
1bdf8ac
chore: refresh org SBOM inventory
Nov 2, 2026
8414fe3
chore: preserve SBOM inventory publication lineage
Nov 2, 2026
911f0af
chore: refresh org SBOM inventory
Nov 2, 2026
ded6c4a
chore: preserve SBOM inventory publication lineage
Nov 2, 2026
7e183e7
chore: refresh org SBOM inventory
Nov 2, 2026
67a14a3
chore: preserve SBOM inventory publication lineage
Nov 2, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
8 changes: 5 additions & 3 deletions .Jules/palette.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
## 2024-05-20 - Repository without UI Codebase
**Learning:** This repository is a GitHub organization profile consisting entirely of Markdown documentation and static assets, and does not contain an active UI or frontend application codebase.
**Action:** Since there is no UI, no UX enhancements can be applied. Aborting UX enhancements and PR creation as per instructions.
## 2026-09-29 - Product UI boundary confirmed

**Learning:** This repository owns the ContextualWisdomLab GitHub Actions control plane, including production CI scripts, tests, workflows, and documentation. It does not own an interactive product UI or frontend application.

**Action:** Do not invent product UI work in this repository. Improve the control-plane artifacts here and route reusable product UI work to its canonical product owner.
8 changes: 8 additions & 0 deletions .github/actionlint.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
# Source validation only; labels do not attest runtime isolation.
self-hosted-runner:
labels:
- cwlab-ci-isolated
- cwlab-control
- cwl-hostile-workload
- selinux
- k-csap-isolated
76 changes: 66 additions & 10 deletions .github/actions/noema-review/two_phase.py
Original file line number Diff line number Diff line change
Expand Up @@ -156,6 +156,7 @@ def prepare_verdict(repo: str, number: int, expected_head: str, path: Path) -> i
return 0
expected_base = _canonical_base(pull_request)
actor = _reviewer_actor()
author = gate.require_distinct_pr_author(pull_request, actor)
if pull_request.get("isDraft"):
print("PR is draft; Noema verdict preparation skipped.")
return 0
Expand All @@ -167,16 +168,20 @@ def prepare_verdict(repo: str, number: int, expected_head: str, path: Path) -> i
changed_files = gate.fetch_changed_files(repo, number)
changed_paths = tuple(file_path for file_path, _status in changed_files)
review_context = gate.build_review_context(repo, number, pull_request, changed_files)
verdict = gate.call_llm(
repo,
number,
pull_request,
diff,
truncated,
expected,
review_context,
changed_paths,
)
try:
verdict = gate.call_llm(
repo,
number,
pull_request,
diff,
truncated,
expected,
review_context,
changed_paths,
)
except gate.NoemaTransportError as exc:
_emit_transport_capacity_outputs(exc, expected_head=expected)
raise

_write_envelope(
path,
Expand All @@ -186,6 +191,8 @@ def prepare_verdict(repo: str, number: int, expected_head: str, path: Path) -> i
"pull_request_number": number,
"expected_head": expected,
"expected_base": expected_base,
"reviewer_actor": actor,
"pull_request_author": author,
"verdict": verdict,
},
)
Expand All @@ -196,6 +203,45 @@ def prepare_verdict(repo: str, number: int, expected_head: str, path: Path) -> i
return 0


def _emit_transport_capacity_outputs(
exc: gate.NoemaTransportError,
*,
expected_head: str,
) -> None:
"""Publish typed capacity evidence for the workflow's bounded re-dispatch step."""
retry_attempt = gate.current_transport_retry_attempt()
delay = gate.transport_redispatch_delay_seconds(
transport_retry_attempt=retry_attempt,
head_sha=expected_head,
retry_after_seconds=exc.retry_after_seconds,
)
eligible = bool(exc.capacity_unavailable and delay is not None)
outputs = {
"transport_capacity_unavailable": "true" if exc.capacity_unavailable else "false",
"transport_retry_eligible": "true" if eligible else "false",
"prepared": "false",
}
if type(exc.http_status) is int:
outputs["transport_http_status"] = str(exc.http_status)
if type(exc.provider_attempt_count) is int:
outputs["provider_attempt_count"] = str(exc.provider_attempt_count)
if delay is not None:
outputs["transport_retry_delay_seconds"] = str(delay)
outputs["transport_retry_next_attempt"] = str(retry_attempt + 1)
gate.append_github_output(outputs)
if eligible:
print(
"::notice::Noema provider capacity unavailable after gateway failover; "
f"bounded continuation re-dispatch is eligible in {delay}s "
f"(attempt {retry_attempt + 1}/{gate.MAX_TRANSPORT_REDISPATCH_ATTEMPTS})."
)
elif exc.capacity_unavailable:
print(
"::error::Noema provider capacity unavailable after gateway failover; "
"automatic re-dispatch budget is exhausted. Review remains required."
)


def publish_verdict(repo: str, number: int, expected_head: str, path: Path) -> int:
"""Publish a prepared verdict only with fresh exact-head/base reviewer authority."""
expected = _canonical_head(expected_head)
Expand All @@ -207,6 +253,8 @@ def publish_verdict(repo: str, number: int, expected_head: str, path: Path) -> i
"pull_request_number",
"expected_head",
"expected_base",
"reviewer_actor",
"pull_request_author",
"verdict",
}
if set(payload) != required_keys:
Expand Down Expand Up @@ -234,6 +282,14 @@ def publish_verdict(repo: str, number: int, expected_head: str, path: Path) -> i
print("Pull request base advanced after model review; stale prepared verdict was not published.")
return 0
actor = _reviewer_actor(allow_refreshed_app=True)
author = gate.require_distinct_pr_author(current_pull_request, actor)
if payload["pull_request_author"] != author:
raise RuntimeError("Noema pull request author changed after verdict preparation")
reviewer_actor = payload["reviewer_actor"]
if not isinstance(reviewer_actor, str) or not reviewer_actor.strip():
raise RuntimeError("Noema prepared reviewer actor is invalid")
if reviewer_actor.strip().casefold() != actor.strip().casefold():
raise RuntimeError("Noema refreshed reviewer actor differs from verdict preparation")
if current_pull_request.get("isDraft"):
print("PR became draft after model review; prepared verdict was not published.")
return 0
Expand Down
11 changes: 9 additions & 2 deletions .github/actions/orchestrator-free-sidecar/action.yml
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,9 @@ inputs:
required: false
default: "false"
catalog_limit:
description: Maximum discovered route catalog size for the sidecar preflight.
description: Maximum discovered route catalog size for the sidecar preflight (a candidate list probed lazily to a readiness target, ADR-0029).
required: false
default: "12"
default: "24"
catalog_account_cap:
description: Maximum routes admitted from one credential account.
required: false
Expand All @@ -23,9 +23,16 @@ runs:
ref: ${{ github.action_ref }}
path: ${{ runner.temp }}/cwl-control-plane
persist-credentials: false
- name: Set up lock-compatible sidecar Python
id: sidecar_python
uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0
with:
python-version: "3.12"
update-environment: false
- name: Provision contextual-orchestrator orchestrator/free
shell: bash --noprofile --norc -e -o pipefail {0}
env:
SIDECAR_PYTHON: ${{ steps.sidecar_python.outputs.python-path }}
CONTEXTUAL_ORCHESTRATOR_REQUIRE_ZDR: ${{ inputs.require_zdr }}
ORCHESTRATOR_CATALOG_LIMIT: ${{ inputs.catalog_limit }}
ORCHESTRATOR_CATALOG_ACCOUNT_CAP: ${{ inputs.catalog_account_cap }}
Expand Down
15 changes: 0 additions & 15 deletions .github/dependabot.yml

This file was deleted.

8 changes: 8 additions & 0 deletions .github/runner-images/law-ai-agent/Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
FROM ghcr.io/actions/actions-runner@sha256:e5496277be5d09bc968b3d64911b74e219ac4a3f2edce956a3ecf9271bea1ef4
USER root
RUN apt-get update \
&& apt-get install -y --no-install-recommends postgresql-16 postgresql-client-16 libpq-dev python3-venv ca-certificates git curl \
&& apt-get clean \
&& rm -rf /var/lib/apt/lists/*
USER runner
WORKDIR /home/runner
57 changes: 57 additions & 0 deletions .github/workflows/actions-queue-health.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
name: GitHub Actions queue health

on:
schedule:
- cron: "7 * * * *"

concurrency:
group: github-actions-queue-health
cancel-in-progress: false

permissions:
contents: read
actions: read

jobs:
collect:
name: Collect exact-head queue evidence
runs-on:
group: ${{ (github.repository == 'ContextualWisdomLab/.github' && github.ref == 'refs/heads/main' && endsWith(github.workflow_ref, '@refs/heads/main') && fromJSON('{"group":"CWL MCP remediation","labels":["self-hosted","linux","x64"]}') || fromJSON('{"group":"CWL CI isolated","labels":["self-hosted","linux","x64","cwlab-ci-isolated"]}')).group }}
labels: ${{ (github.repository == 'ContextualWisdomLab/.github' && github.ref == 'refs/heads/main' && endsWith(github.workflow_ref, '@refs/heads/main') && fromJSON('{"group":"CWL MCP remediation","labels":["self-hosted","linux","x64"]}') || fromJSON('{"group":"CWL CI isolated","labels":["self-hosted","linux","x64","cwlab-ci-isolated"]}')).labels }}
timeout-minutes: 30
permissions:
contents: read
actions: read
steps:
- name: Harden the runner (Audit all outbound calls)
uses: step-security/harden-runner@b09bb98e06d4d774595224525879c09bc6e98c40 # v2.20.1
with:
egress-policy: audit

- name: Checkout trusted queue-health source
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
with:
persist-credentials: false

- name: Collect read-only repository and runner evidence
env:
GH_TOKEN: ${{ secrets.PR_REVIEW_MERGE_TOKEN || secrets.OPENCODE_APPROVE_TOKEN }}
run: |
if [ -z "${GH_TOKEN:-}" ]; then
echo "::error::PR_REVIEW_MERGE_TOKEN or OPENCODE_APPROVE_TOKEN is required for cross-repository queue reads."
exit 1
fi
echo "::add-mask::$GH_TOKEN"
python3 scripts/ci/actions_queue_health.py \
--allowlist config/actions_queue_health_repositories.json \
--output-json "$RUNNER_TEMP/actions-queue-health.json" \
--output-html "$RUNNER_TEMP/actions-queue-health.html"

- name: Upload queue-health evidence
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
with:
name: github-actions-queue-health-${{ github.run_id }}
path: |
${{ runner.temp }}/actions-queue-health.json
${{ runner.temp }}/actions-queue-health.html
if-no-files-found: error
21 changes: 17 additions & 4 deletions .github/workflows/agent-mention-noema-dispatch.yml
Original file line number Diff line number Diff line change
Expand Up @@ -8,16 +8,29 @@ on:
repository_dispatch:
types: [agent-mention-noema]

concurrency:
# Workflow-level admission, for the same reason strix.yml, noema-review.yml,
# opencode-review.yml and opencode-review-dispatch.yml carry theirs at this level:
# a job-level group is never evaluated while the whole run waits behind the
# organization job ceiling, so a superseded mention keeps its queue slot until a
# runner frees up and only then cancels. At workflow level the older run is
# coalesced while both are still queued, which is where the slot is actually held.
# This workflow has a single job, so the group lives here and nowhere else --
# every workflow in this repository that carries a group at both levels
# (strix.yml, opencode-review-dispatch.yml) gives the two levels DIFFERENT names,
# because a job requesting the group its own run already holds would wait on itself.
group: agent-mention-noema-${{ github.event.client_payload.target_repository }}-${{ github.event.client_payload.pr_number || github.run_id }}
cancel-in-progress: true

permissions:
contents: read

jobs:
validate-and-forward:
if: github.repository == 'ContextualWisdomLab/.github'
concurrency:
group: agent-mention-noema-${{ github.event.client_payload.target_repository }}-${{ github.event.client_payload.pr_number || github.run_id }}
cancel-in-progress: true
runs-on: ubuntu-24.04
runs-on:
group: ${{ (github.repository == 'ContextualWisdomLab/.github' && endsWith(github.workflow_ref, '@refs/heads/main') && fromJSON('{"group":"CWL MCP remediation","labels":["self-hosted","linux","x64"]}') || fromJSON('{"group":"CWL CI isolated","labels":["self-hosted","linux","x64","cwlab-ci-isolated"]}')).group }}
labels: ${{ (github.repository == 'ContextualWisdomLab/.github' && endsWith(github.workflow_ref, '@refs/heads/main') && fromJSON('{"group":"CWL MCP remediation","labels":["self-hosted","linux","x64"]}') || fromJSON('{"group":"CWL CI isolated","labels":["self-hosted","linux","x64","cwlab-ci-isolated"]}')).labels }}
timeout-minutes: 5
permissions:
actions: read
Expand Down
21 changes: 17 additions & 4 deletions .github/workflows/agent-mention-opencode-dispatch.yml
Original file line number Diff line number Diff line change
Expand Up @@ -8,16 +8,29 @@ on:
repository_dispatch:
types: [agent-mention-opencode]

concurrency:
# Workflow-level admission, for the same reason strix.yml, noema-review.yml,
# opencode-review.yml and opencode-review-dispatch.yml carry theirs at this level:
# a job-level group is never evaluated while the whole run waits behind the
# organization job ceiling, so a superseded mention keeps its queue slot until a
# runner frees up and only then cancels. At workflow level the older run is
# coalesced while both are still queued, which is where the slot is actually held.
# This workflow has a single job, so the group lives here and nowhere else --
# every workflow in this repository that carries a group at both levels
# (strix.yml, opencode-review-dispatch.yml) gives the two levels DIFFERENT names,
# because a job requesting the group its own run already holds would wait on itself.
group: agent-mention-opencode-${{ github.event.client_payload.target_repository }}-${{ github.event.client_payload.pr_number || github.run_id }}
cancel-in-progress: true

permissions:
contents: read

jobs:
validate-and-forward:
if: github.repository == 'ContextualWisdomLab/.github'
concurrency:
group: agent-mention-opencode-${{ github.event.client_payload.target_repository }}-${{ github.event.client_payload.pr_number || github.run_id }}
cancel-in-progress: true
runs-on: ubuntu-24.04
runs-on:
group: ${{ (github.repository == 'ContextualWisdomLab/.github' && endsWith(github.workflow_ref, '@refs/heads/main') && fromJSON('{"group":"CWL MCP remediation","labels":["self-hosted","linux","x64"]}') || fromJSON('{"group":"CWL CI isolated","labels":["self-hosted","linux","x64","cwlab-ci-isolated"]}')).group }}
labels: ${{ (github.repository == 'ContextualWisdomLab/.github' && endsWith(github.workflow_ref, '@refs/heads/main') && fromJSON('{"group":"CWL MCP remediation","labels":["self-hosted","linux","x64"]}') || fromJSON('{"group":"CWL CI isolated","labels":["self-hosted","linux","x64","cwlab-ci-isolated"]}')).labels }}
timeout-minutes: 5
permissions:
actions: read
Expand Down
10 changes: 9 additions & 1 deletion .github/workflows/agent-mention-router-quality-ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,10 @@ on:
- "scripts/ci/agent_mention_sweep.py"
- "tests/test_agent_mention_*.py"
- "tests/test_pr_review_fix_scheduler_coverage.py"
- "requirements-opencode-review-ci.txt"
- "requirements-noema-document-ci.txt"
- "requirements-opencode-review-ci-hashes.txt"
- "scripts/ci/compile_opencode_review_lock.sh"
push:
branches: [main]
paths:
Expand All @@ -26,7 +29,10 @@ on:
- "scripts/ci/agent_mention_sweep.py"
- "tests/test_agent_mention_*.py"
- "tests/test_pr_review_fix_scheduler_coverage.py"
- "requirements-opencode-review-ci.txt"
- "requirements-noema-document-ci.txt"
- "requirements-opencode-review-ci-hashes.txt"
- "scripts/ci/compile_opencode_review_lock.sh"

concurrency:
group: agent-mention-router-quality-${{ github.repository }}-${{ github.event.pull_request.number || github.ref }}
Expand All @@ -40,7 +46,9 @@ env:

jobs:
quality:
runs-on: ubuntu-24.04
runs-on:
group: CWL CI isolated
labels: [self-hosted, linux, x64, cwlab-ci-isolated]
timeout-minutes: 20
steps:
- name: Harden runner
Expand Down
8 changes: 6 additions & 2 deletions .github/workflows/agent-mention-router.yml
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,9 @@ jobs:
concurrency:
group: review-agent-mention-router-local-${{ github.repository }}-${{ github.event.issue.number || github.run_id }}
cancel-in-progress: true
runs-on: ubuntu-24.04
runs-on:
group: CWL central control
labels: [self-hosted, linux, x64]
timeout-minutes: 5
permissions:
actions: read
Expand Down Expand Up @@ -74,7 +76,9 @@ jobs:
concurrency:
group: review-agent-mention-router-sweep-${{ github.repository }}
cancel-in-progress: false
runs-on: ubuntu-24.04
runs-on:
group: CWL central control
labels: [self-hosted, linux, x64]
timeout-minutes: 15
permissions:
actions: read
Expand Down
Loading
Loading