Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
2411 commits
Select commit Hold shift + click to select a range
df308bd
chore: refresh org SBOM inventory
Nov 5, 2026
e1abdf2
chore: preserve SBOM inventory publication lineage
Nov 5, 2026
0f2e26d
chore: refresh org SBOM inventory
Nov 5, 2026
10d7dae
chore: preserve SBOM inventory publication lineage
Nov 5, 2026
5a4f3a5
chore: refresh org SBOM inventory
Nov 5, 2026
8c6dfab
chore: preserve SBOM inventory publication lineage
Nov 5, 2026
4d9e616
chore: refresh org SBOM inventory
Nov 5, 2026
e0d2a23
chore: preserve SBOM inventory publication lineage
Nov 5, 2026
45bec83
chore: refresh org SBOM inventory
Nov 6, 2026
1440b05
chore: preserve SBOM inventory publication lineage
Nov 6, 2026
35fbf94
chore: refresh org SBOM inventory
Nov 6, 2026
e4cf410
chore: preserve SBOM inventory publication lineage
Nov 6, 2026
fbd675b
chore: refresh org SBOM inventory
Nov 6, 2026
5b54bb7
chore: preserve SBOM inventory publication lineage
Nov 6, 2026
78d6229
chore: refresh org SBOM inventory
Nov 6, 2026
0af81f8
chore: preserve SBOM inventory publication lineage
Nov 6, 2026
244db10
chore: refresh org SBOM inventory
Nov 6, 2026
681f94d
chore: preserve SBOM inventory publication lineage
Nov 6, 2026
dee9103
chore: refresh org SBOM inventory
Nov 6, 2026
59ca9d0
chore: preserve SBOM inventory publication lineage
Nov 6, 2026
fe3206b
chore: refresh org SBOM inventory
Nov 6, 2026
b583443
chore: preserve SBOM inventory publication lineage
Nov 6, 2026
75d630a
chore: refresh org SBOM inventory
Nov 6, 2026
e33feee
chore: preserve SBOM inventory publication lineage
Nov 6, 2026
ec2d98f
chore: refresh org SBOM inventory
Nov 6, 2026
34b43f1
chore: preserve SBOM inventory publication lineage
Nov 6, 2026
7cbdaea
chore: refresh org SBOM inventory
Nov 6, 2026
b4decb5
chore: preserve SBOM inventory publication lineage
Nov 6, 2026
871b033
chore: refresh org SBOM inventory
Nov 6, 2026
9975a0b
chore: preserve SBOM inventory publication lineage
Nov 6, 2026
0f41058
chore: refresh org SBOM inventory
Nov 6, 2026
e24f9a7
chore: preserve SBOM inventory publication lineage
Nov 6, 2026
fe28510
chore: refresh org SBOM inventory
Nov 6, 2026
c301c9c
chore: preserve SBOM inventory publication lineage
Nov 6, 2026
2a6425d
chore: refresh org SBOM inventory
Nov 6, 2026
b4dcbb2
chore: preserve SBOM inventory publication lineage
Nov 6, 2026
891fa20
chore: refresh org SBOM inventory
Nov 6, 2026
1f13b0d
chore: preserve SBOM inventory publication lineage
Nov 6, 2026
4217c2d
chore: refresh org SBOM inventory
Nov 6, 2026
a7df2db
chore: preserve SBOM inventory publication lineage
Nov 6, 2026
150ca9d
chore: refresh org SBOM inventory
Nov 6, 2026
bff490b
chore: preserve SBOM inventory publication lineage
Nov 6, 2026
009ee1f
chore: refresh org SBOM inventory
Nov 6, 2026
64fdbb9
chore: preserve SBOM inventory publication lineage
Nov 6, 2026
e61e3cb
chore: refresh org SBOM inventory
Nov 6, 2026
cb23419
chore: preserve SBOM inventory publication lineage
Nov 6, 2026
c76b941
chore: refresh org SBOM inventory
Nov 6, 2026
08fdbf7
chore: preserve SBOM inventory publication lineage
Nov 6, 2026
c22b0b8
chore: refresh org SBOM inventory
Nov 6, 2026
036b50b
chore: preserve SBOM inventory publication lineage
Nov 6, 2026
eac5238
chore: refresh org SBOM inventory
Nov 6, 2026
2fba285
chore: preserve SBOM inventory publication lineage
Nov 6, 2026
8e6aa45
chore: refresh org SBOM inventory
Nov 6, 2026
46c3dfc
chore: preserve SBOM inventory publication lineage
Nov 6, 2026
6777570
chore: refresh org SBOM inventory
Nov 6, 2026
e0a9d32
chore: preserve SBOM inventory publication lineage
Nov 6, 2026
6e0c0fc
chore: refresh org SBOM inventory
Nov 7, 2026
5947e82
chore: preserve SBOM inventory publication lineage
Nov 7, 2026
62631ee
chore: refresh org SBOM inventory
Nov 7, 2026
1230447
chore: preserve SBOM inventory publication lineage
Nov 7, 2026
e4eeb78
chore: refresh org SBOM inventory
Nov 7, 2026
37cfb5e
chore: preserve SBOM inventory publication lineage
Nov 7, 2026
63f071d
chore: refresh org SBOM inventory
Nov 7, 2026
34bd399
chore: preserve SBOM inventory publication lineage
Nov 7, 2026
653a139
chore: refresh org SBOM inventory
Nov 7, 2026
0c99019
chore: preserve SBOM inventory publication lineage
Nov 7, 2026
7f68e8e
chore: refresh org SBOM inventory
Nov 7, 2026
8af6b9a
chore: preserve SBOM inventory publication lineage
Nov 7, 2026
e9a36c1
chore: refresh org SBOM inventory
Nov 7, 2026
e2d3978
chore: preserve SBOM inventory publication lineage
Nov 7, 2026
cf3a00b
chore: refresh org SBOM inventory
Nov 7, 2026
d2c7058
chore: preserve SBOM inventory publication lineage
Nov 7, 2026
7992ac6
chore: refresh org SBOM inventory
Nov 7, 2026
eaa9d47
chore: preserve SBOM inventory publication lineage
Nov 7, 2026
9c6240a
chore: refresh org SBOM inventory
Nov 7, 2026
992eabc
chore: preserve SBOM inventory publication lineage
Nov 7, 2026
fc17382
chore: refresh org SBOM inventory
Nov 7, 2026
369f743
chore: preserve SBOM inventory publication lineage
Nov 7, 2026
baec258
chore: refresh org SBOM inventory
Nov 7, 2026
483ebf4
chore: preserve SBOM inventory publication lineage
Nov 7, 2026
87fc844
chore: refresh org SBOM inventory
Nov 7, 2026
c1d64e1
chore: preserve SBOM inventory publication lineage
Nov 7, 2026
532de19
chore: refresh org SBOM inventory
Nov 7, 2026
4cc2472
chore: preserve SBOM inventory publication lineage
Nov 7, 2026
0b8557f
chore: refresh org SBOM inventory
Nov 7, 2026
ae38073
chore: preserve SBOM inventory publication lineage
Nov 7, 2026
3181934
chore: refresh org SBOM inventory
Nov 7, 2026
73aa14c
chore: preserve SBOM inventory publication lineage
Nov 7, 2026
f0d1db5
chore: refresh org SBOM inventory
Nov 7, 2026
4cf431e
chore: preserve SBOM inventory publication lineage
Nov 7, 2026
6f3b3cd
chore: refresh org SBOM inventory
Nov 7, 2026
a4065f4
chore: preserve SBOM inventory publication lineage
Nov 7, 2026
ce4742b
chore: refresh org SBOM inventory
Nov 7, 2026
f79a83d
chore: preserve SBOM inventory publication lineage
Nov 7, 2026
d12cee3
chore: refresh org SBOM inventory
Nov 7, 2026
7338ac8
chore: preserve SBOM inventory publication lineage
Nov 7, 2026
e29baf9
chore: refresh org SBOM inventory
Nov 7, 2026
7e9e10e
chore: preserve SBOM inventory publication lineage
Nov 7, 2026
bf06169
chore: refresh org SBOM inventory
Nov 7, 2026
202e3cf
chore: preserve SBOM inventory publication lineage
Nov 7, 2026
b5c13e9
chore: refresh org SBOM inventory
Nov 7, 2026
d782673
chore: preserve SBOM inventory publication lineage
Nov 7, 2026
fb958e9
chore: refresh org SBOM inventory
Nov 7, 2026
6feb071
chore: preserve SBOM inventory publication lineage
Nov 7, 2026
2ffde98
chore: refresh org SBOM inventory
Nov 8, 2026
476bc6e
chore: preserve SBOM inventory publication lineage
Nov 8, 2026
0a3533b
chore: refresh org SBOM inventory
Nov 8, 2026
7de02d7
chore: preserve SBOM inventory publication lineage
Nov 8, 2026
f36db01
chore: refresh org SBOM inventory
Nov 8, 2026
a89e7cf
chore: preserve SBOM inventory publication lineage
Nov 8, 2026
605c98a
chore: refresh org SBOM inventory
Nov 8, 2026
287c617
chore: preserve SBOM inventory publication lineage
Nov 8, 2026
7320d61
chore: refresh org SBOM inventory
Nov 8, 2026
7f04af8
chore: preserve SBOM inventory publication lineage
Nov 8, 2026
26078d7
chore: refresh org SBOM inventory
Nov 8, 2026
226c693
chore: preserve SBOM inventory publication lineage
Nov 8, 2026
6147dd6
chore: refresh org SBOM inventory
Nov 8, 2026
3f0a93d
chore: preserve SBOM inventory publication lineage
Nov 8, 2026
3c5f342
chore: refresh org SBOM inventory
Nov 8, 2026
690d091
chore: preserve SBOM inventory publication lineage
Nov 8, 2026
69395c1
chore: refresh org SBOM inventory
Nov 8, 2026
89d5eba
chore: preserve SBOM inventory publication lineage
Nov 8, 2026
c5959fb
chore: refresh org SBOM inventory
Nov 8, 2026
1a1004a
chore: preserve SBOM inventory publication lineage
Nov 8, 2026
2f9a9d0
chore: refresh org SBOM inventory
Nov 8, 2026
0d1db6b
chore: preserve SBOM inventory publication lineage
Nov 8, 2026
dc1105d
chore: refresh org SBOM inventory
Nov 8, 2026
da14257
chore: preserve SBOM inventory publication lineage
Nov 8, 2026
86bc9cc
chore: refresh org SBOM inventory
Nov 8, 2026
10bf9b9
chore: preserve SBOM inventory publication lineage
Nov 8, 2026
a972296
chore: refresh org SBOM inventory
Nov 8, 2026
4758dd7
chore: preserve SBOM inventory publication lineage
Nov 8, 2026
6ed57f8
chore: refresh org SBOM inventory
Nov 8, 2026
e842712
chore: preserve SBOM inventory publication lineage
Nov 8, 2026
d090a61
chore: refresh org SBOM inventory
Nov 8, 2026
f583ad3
chore: preserve SBOM inventory publication lineage
Nov 8, 2026
1a0d637
chore: refresh org SBOM inventory
Nov 8, 2026
2ee611b
chore: preserve SBOM inventory publication lineage
Nov 8, 2026
4537848
chore: refresh org SBOM inventory
Nov 8, 2026
b25e7fa
chore: preserve SBOM inventory publication lineage
Nov 8, 2026
68314bc
chore: refresh org SBOM inventory
Nov 8, 2026
336b574
chore: preserve SBOM inventory publication lineage
Nov 8, 2026
adfdbe6
chore: refresh org SBOM inventory
Nov 8, 2026
fba2133
chore: preserve SBOM inventory publication lineage
Nov 8, 2026
4dfb4b2
chore: refresh org SBOM inventory
Nov 8, 2026
4335209
chore: preserve SBOM inventory publication lineage
Nov 8, 2026
ef9725b
chore: refresh org SBOM inventory
Nov 8, 2026
3a15b7a
chore: preserve SBOM inventory publication lineage
Nov 8, 2026
1cf27a3
chore: refresh org SBOM inventory
Nov 8, 2026
b045ade
chore: preserve SBOM inventory publication lineage
Nov 8, 2026
7d9b946
chore: refresh org SBOM inventory
Nov 8, 2026
d1751a3
chore: preserve SBOM inventory publication lineage
Nov 8, 2026
864ae4e
chore: refresh org SBOM inventory
Nov 9, 2026
207f4b6
chore: preserve SBOM inventory publication lineage
Nov 9, 2026
0309447
chore: refresh org SBOM inventory
Nov 9, 2026
0aea5d2
chore: preserve SBOM inventory publication lineage
Nov 9, 2026
2b7328c
chore: refresh org SBOM inventory
Nov 9, 2026
c28de54
chore: preserve SBOM inventory publication lineage
Nov 9, 2026
a4d4269
chore: refresh org SBOM inventory
Nov 9, 2026
2ebe912
chore: preserve SBOM inventory publication lineage
Nov 9, 2026
a2a886e
chore: refresh org SBOM inventory
Nov 9, 2026
d013bf0
chore: preserve SBOM inventory publication lineage
Nov 9, 2026
29dac29
chore: refresh org SBOM inventory
Nov 9, 2026
89418c5
chore: preserve SBOM inventory publication lineage
Nov 9, 2026
7adeed6
chore: refresh org SBOM inventory
Nov 9, 2026
67256bd
chore: preserve SBOM inventory publication lineage
Nov 9, 2026
c72f031
chore: refresh org SBOM inventory
Nov 9, 2026
8e212a3
chore: preserve SBOM inventory publication lineage
Nov 9, 2026
f6a75b2
chore: refresh org SBOM inventory
Nov 9, 2026
e5a41df
chore: preserve SBOM inventory publication lineage
Nov 9, 2026
983afeb
chore: refresh org SBOM inventory
Nov 9, 2026
ebe02fc
chore: preserve SBOM inventory publication lineage
Nov 9, 2026
9e4776b
chore: refresh org SBOM inventory
Nov 9, 2026
8442fc8
chore: preserve SBOM inventory publication lineage
Nov 9, 2026
0c25d1f
chore: refresh org SBOM inventory
Nov 9, 2026
d2b1a86
chore: preserve SBOM inventory publication lineage
Nov 9, 2026
407787e
chore: refresh org SBOM inventory
Nov 9, 2026
1a058e1
chore: preserve SBOM inventory publication lineage
Nov 9, 2026
bc46a64
chore: refresh org SBOM inventory
Nov 9, 2026
dd925c0
chore: preserve SBOM inventory publication lineage
Nov 9, 2026
80d8a16
chore: refresh org SBOM inventory
Nov 9, 2026
601a56f
chore: preserve SBOM inventory publication lineage
Nov 9, 2026
430fc2e
chore: refresh org SBOM inventory
Nov 9, 2026
f833c98
chore: preserve SBOM inventory publication lineage
Nov 9, 2026
56d3d05
chore: refresh org SBOM inventory
Nov 9, 2026
7602491
chore: preserve SBOM inventory publication lineage
Nov 9, 2026
50ba0f7
chore: refresh org SBOM inventory
Nov 9, 2026
f6eb4f8
chore: preserve SBOM inventory publication lineage
Nov 9, 2026
cf9a2aa
chore: refresh org SBOM inventory
Nov 9, 2026
90e3f2a
chore: preserve SBOM inventory publication lineage
Nov 9, 2026
228a8b5
chore: refresh org SBOM inventory
Nov 9, 2026
f45a9ee
chore: preserve SBOM inventory publication lineage
Nov 9, 2026
1c73448
chore: refresh org SBOM inventory
Nov 9, 2026
54f5410
chore: preserve SBOM inventory publication lineage
Nov 9, 2026
04dc9f6
chore: refresh org SBOM inventory
Nov 9, 2026
c2ccb07
chore: preserve SBOM inventory publication lineage
Nov 9, 2026
e944342
chore: refresh org SBOM inventory
Nov 9, 2026
61445bd
chore: preserve SBOM inventory publication lineage
Nov 9, 2026
bd33004
chore: refresh org SBOM inventory
Nov 10, 2026
8463692
chore: preserve SBOM inventory publication lineage
Nov 10, 2026
a27a60d
chore: refresh org SBOM inventory
Nov 10, 2026
05b1b2b
chore: preserve SBOM inventory publication lineage
Nov 10, 2026
f1d3260
chore: refresh org SBOM inventory
Nov 10, 2026
14b8d7e
chore: preserve SBOM inventory publication lineage
Nov 10, 2026
c8afecf
chore: refresh org SBOM inventory
Nov 10, 2026
7f9fddf
chore: preserve SBOM inventory publication lineage
Nov 10, 2026
610f7ff
chore: refresh org SBOM inventory
Nov 10, 2026
38c556d
chore: preserve SBOM inventory publication lineage
Nov 10, 2026
72b5d62
chore: refresh org SBOM inventory
Nov 10, 2026
d3b6b98
chore: preserve SBOM inventory publication lineage
Nov 10, 2026
273ba51
chore: refresh org SBOM inventory
Nov 10, 2026
f1b8def
chore: preserve SBOM inventory publication lineage
Nov 10, 2026
47271f4
chore: refresh org SBOM inventory
Nov 10, 2026
a6a148f
chore: preserve SBOM inventory publication lineage
Nov 10, 2026
965b923
chore: refresh org SBOM inventory
Nov 10, 2026
8a5b401
chore: preserve SBOM inventory publication lineage
Nov 10, 2026
dc12197
chore: refresh org SBOM inventory
Nov 10, 2026
a72c874
chore: preserve SBOM inventory publication lineage
Nov 10, 2026
a6dd015
chore: refresh org SBOM inventory
Nov 10, 2026
64288e4
chore: preserve SBOM inventory publication lineage
Nov 10, 2026
4eba370
chore: refresh org SBOM inventory
Nov 10, 2026
cf937c1
chore: preserve SBOM inventory publication lineage
Nov 10, 2026
6d4de5e
chore: refresh org SBOM inventory
Nov 10, 2026
4c658fd
chore: preserve SBOM inventory publication lineage
Nov 10, 2026
dc47977
chore: refresh org SBOM inventory
Nov 10, 2026
8ce4c2e
chore: preserve SBOM inventory publication lineage
Nov 10, 2026
47b17e0
chore: refresh org SBOM inventory
Nov 10, 2026
fb95fe2
chore: preserve SBOM inventory publication lineage
Nov 10, 2026
f72d509
chore: refresh org SBOM inventory
Nov 10, 2026
ee19ca4
chore: preserve SBOM inventory publication lineage
Nov 10, 2026
d7deb0d
chore: refresh org SBOM inventory
Nov 10, 2026
3431887
chore: preserve SBOM inventory publication lineage
Nov 10, 2026
43cd889
chore: refresh org SBOM inventory
Nov 10, 2026
53dd1f2
chore: preserve SBOM inventory publication lineage
Nov 10, 2026
0ebc85e
chore: refresh org SBOM inventory
Nov 10, 2026
48d56e2
chore: preserve SBOM inventory publication lineage
Nov 10, 2026
51a56d9
chore: refresh org SBOM inventory
Nov 10, 2026
08acc19
chore: preserve SBOM inventory publication lineage
Nov 10, 2026
1372e0b
chore: refresh org SBOM inventory
Nov 10, 2026
cef09c5
chore: preserve SBOM inventory publication lineage
Nov 10, 2026
3634019
chore: refresh org SBOM inventory
Nov 10, 2026
8d55afa
chore: preserve SBOM inventory publication lineage
Nov 10, 2026
bc06194
chore: refresh org SBOM inventory
Nov 10, 2026
1b4acc0
chore: preserve SBOM inventory publication lineage
Nov 10, 2026
40cc1d8
chore: refresh org SBOM inventory
Nov 10, 2026
4ecc243
chore: preserve SBOM inventory publication lineage
Nov 10, 2026
190d66e
chore: refresh org SBOM inventory
Nov 11, 2026
28e909a
chore: preserve SBOM inventory publication lineage
Nov 11, 2026
75d05c3
chore: refresh org SBOM inventory
Nov 11, 2026
1bd675a
chore: preserve SBOM inventory publication lineage
Nov 11, 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