Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
2493 commits
Select commit Hold shift + click to select a range
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
017b368
chore: refresh org SBOM inventory
Nov 11, 2026
15b42dc
chore: preserve SBOM inventory publication lineage
Nov 11, 2026
9c4f8bc
chore: refresh org SBOM inventory
Nov 11, 2026
60f1f64
chore: preserve SBOM inventory publication lineage
Nov 11, 2026
f299ac4
chore: refresh org SBOM inventory
Nov 11, 2026
ff5186e
chore: preserve SBOM inventory publication lineage
Nov 11, 2026
3f2487f
chore: refresh org SBOM inventory
Nov 11, 2026
03b9aae
chore: preserve SBOM inventory publication lineage
Nov 11, 2026
b4ae9a8
chore: refresh org SBOM inventory
Nov 11, 2026
2d18730
chore: preserve SBOM inventory publication lineage
Nov 11, 2026
4ccc908
chore: refresh org SBOM inventory
Nov 11, 2026
a5ba17a
chore: preserve SBOM inventory publication lineage
Nov 11, 2026
1b13b4e
chore: refresh org SBOM inventory
Nov 11, 2026
cf1f318
chore: preserve SBOM inventory publication lineage
Nov 11, 2026
5632347
chore: refresh org SBOM inventory
Nov 11, 2026
43716a0
chore: preserve SBOM inventory publication lineage
Nov 11, 2026
fc6b023
chore: refresh org SBOM inventory
Nov 11, 2026
ea2e4d7
chore: preserve SBOM inventory publication lineage
Nov 11, 2026
a840c74
chore: refresh org SBOM inventory
Nov 11, 2026
2a288d0
chore: preserve SBOM inventory publication lineage
Nov 11, 2026
0e68bd2
chore: refresh org SBOM inventory
Nov 11, 2026
94d2cb4
chore: preserve SBOM inventory publication lineage
Nov 11, 2026
77c61f3
chore: refresh org SBOM inventory
Nov 11, 2026
3dbde56
chore: preserve SBOM inventory publication lineage
Nov 11, 2026
36e5a70
chore: refresh org SBOM inventory
Nov 11, 2026
43db6d9
chore: preserve SBOM inventory publication lineage
Nov 11, 2026
55afd86
chore: refresh org SBOM inventory
Nov 11, 2026
7e2f0a4
chore: preserve SBOM inventory publication lineage
Nov 11, 2026
2ebc25d
chore: refresh org SBOM inventory
Nov 11, 2026
26f80ee
chore: preserve SBOM inventory publication lineage
Nov 11, 2026
373eb94
chore: refresh org SBOM inventory
Nov 11, 2026
d63e711
chore: preserve SBOM inventory publication lineage
Nov 11, 2026
86af503
chore: refresh org SBOM inventory
Nov 11, 2026
f483923
chore: preserve SBOM inventory publication lineage
Nov 11, 2026
64588be
chore: refresh org SBOM inventory
Nov 11, 2026
5a66fce
chore: preserve SBOM inventory publication lineage
Nov 11, 2026
2baec57
chore: refresh org SBOM inventory
Nov 11, 2026
bef2aab
chore: preserve SBOM inventory publication lineage
Nov 11, 2026
260b35d
chore: refresh org SBOM inventory
Nov 11, 2026
d069cc2
chore: preserve SBOM inventory publication lineage
Nov 11, 2026
0db9bfd
chore: refresh org SBOM inventory
Nov 11, 2026
12fd224
chore: preserve SBOM inventory publication lineage
Nov 11, 2026
4d03972
chore: refresh org SBOM inventory
Nov 12, 2026
5973d58
chore: preserve SBOM inventory publication lineage
Nov 12, 2026
51fa07f
chore: refresh org SBOM inventory
Nov 12, 2026
6c6c898
chore: preserve SBOM inventory publication lineage
Nov 12, 2026
969c9dd
chore: refresh org SBOM inventory
Nov 12, 2026
3ec6e04
chore: preserve SBOM inventory publication lineage
Nov 12, 2026
5a261b9
chore: refresh org SBOM inventory
Nov 12, 2026
9f87696
chore: preserve SBOM inventory publication lineage
Nov 12, 2026
d690520
chore: refresh org SBOM inventory
Nov 12, 2026
aa6ec5c
chore: preserve SBOM inventory publication lineage
Nov 12, 2026
341eb17
chore: refresh org SBOM inventory
Nov 12, 2026
1e4b43f
chore: preserve SBOM inventory publication lineage
Nov 12, 2026
2925047
chore: refresh org SBOM inventory
Nov 12, 2026
3933e6b
chore: preserve SBOM inventory publication lineage
Nov 12, 2026
02a39c4
chore: refresh org SBOM inventory
Nov 12, 2026
d43ec4c
chore: preserve SBOM inventory publication lineage
Nov 12, 2026
77cd029
chore: refresh org SBOM inventory
Nov 12, 2026
8face52
chore: preserve SBOM inventory publication lineage
Nov 12, 2026
19c045d
chore: refresh org SBOM inventory
Nov 12, 2026
11e5319
chore: preserve SBOM inventory publication lineage
Nov 12, 2026
bbc15db
chore: refresh org SBOM inventory
Nov 12, 2026
fed9916
chore: preserve SBOM inventory publication lineage
Nov 12, 2026
cf46605
chore: refresh org SBOM inventory
Nov 12, 2026
e7492bf
chore: preserve SBOM inventory publication lineage
Nov 12, 2026
7c785d4
chore: refresh org SBOM inventory
Nov 12, 2026
bb72d59
chore: preserve SBOM inventory publication lineage
Nov 12, 2026
d05989b
chore: refresh org SBOM inventory
Nov 12, 2026
5f9c368
chore: preserve SBOM inventory publication lineage
Nov 12, 2026
6863daa
chore: refresh org SBOM inventory
Nov 12, 2026
e1950e7
chore: preserve SBOM inventory publication lineage
Nov 12, 2026
26fcf2b
chore: refresh org SBOM inventory
Nov 12, 2026
b251644
chore: preserve SBOM inventory publication lineage
Nov 12, 2026
fd04eca
chore: refresh org SBOM inventory
Nov 12, 2026
04dcc22
chore: preserve SBOM inventory publication lineage
Nov 12, 2026
40c08bc
chore: refresh org SBOM inventory
Nov 12, 2026
7f7edbd
chore: preserve SBOM inventory publication lineage
Nov 12, 2026
8862e9c
chore: refresh org SBOM inventory
Nov 12, 2026
3e214dc
chore: preserve SBOM inventory publication lineage
Nov 12, 2026
02c5a00
chore: refresh org SBOM inventory
Nov 12, 2026
4d3d416
chore: preserve SBOM inventory publication lineage
Nov 12, 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