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

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions scripts/ci/audit_codeql_default_setup_rollout.py
Original file line number Diff line number Diff line change
Expand Up @@ -269,6 +269,7 @@ def load_payload(path: Path | None, stdin: TextIO) -> list[dict[str, Any]]:


def parse_args(argv: list[str] | None = None) -> argparse.Namespace:
"""Parse CLI arguments for either the file-payload or live-collection mode."""
parser = argparse.ArgumentParser(description=__doc__)
parser.add_argument("snapshots_json", nargs="?", type=Path)
parser.add_argument("--repository")
Expand All @@ -277,6 +278,7 @@ def parse_args(argv: list[str] | None = None) -> argparse.Namespace:


def main(argv: list[str] | None = None) -> int:
"""Audit CodeQL rollout state from file or live snapshots and print verdicts."""
args = parse_args(argv)
try:
live_mode = args.repository is not None or args.pr is not None
Expand Down
29 changes: 25 additions & 4 deletions tests/test_docs_only_pr_runner_admission.py
Original file line number Diff line number Diff line change
Expand Up @@ -85,19 +85,40 @@ def _on_block(workflow: str) -> str:
return match.group(1)


def _strip_if_condition(block: str) -> str:
"""Drop the `if:` line and, for a folded/literal scalar, its continuation lines.

A workflow's `if:` condition can span multiple lines (``if: >-`` or ``if: |``
followed by more-indented continuation lines) rather than a single line.
Comparing gate copies must ignore the whole condition, not just its first
line, since each copy is allowed its own admission condition independent
of how many source lines that condition takes.
"""
kept: list[str] = []
skip_indent: int | None = None
for line in block.splitlines():
indent = len(line) - len(line.lstrip(" "))
if skip_indent is not None and line.strip() and indent > skip_indent:
continue
skip_indent = None
if line.strip().startswith("if:"):
skip_indent = indent
continue
Comment on lines +104 to +106

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Restrict normalization to the job-level condition

Because this predicate matches every YAML if: in the entire job block, the new continuation-line skipping also erases a folded step-level condition. If one workflow adds or changes steps[*].if: >-, _strip_if_condition removes both the key and its expression, so the byte-identity test passes even though the executable changed-scope job has drifted; only the top-level admission condition should be normalized.

Useful? React with 👍 / 👎.

kept.append(line)
return "\n".join(kept)


def test_gate_job_is_byte_identical_across_the_five_workflows_apart_from_if():
"""The `changed-scope` block must not drift between its five copies."""
normalized_blocks = set()
for filename in GATE_WORKFLOWS:
workflow = _read(filename)
block = _top_level_job_block(workflow, "changed-scope")
normalized = "\n".join(
line for line in block.splitlines() if not line.strip().startswith("if:")
)
normalized = _strip_if_condition(block)
normalized_blocks.add(normalized)
assert len(normalized_blocks) == 1, (
"changed-scope gate copies drifted; keep them byte-identical apart "
"from the single 'if:' line"
"from the 'if:' condition"
)


Expand Down
2 changes: 1 addition & 1 deletion tests/test_github_hourly_conflict_repair.py
Original file line number Diff line number Diff line change
Expand Up @@ -119,7 +119,7 @@ def test_central_repository_has_hourly_self_caller() -> None:
"""The central repository itself is scanned instead of relying on product callers."""
workflow = _CALLER.read_text(encoding="utf-8")

assert 'cron: "21 * * * *"' in workflow
assert 'cron: "21 6 * * *"' in workflow
assert "uses: ./.github/workflows/pr-review-fix-scheduler.yml" in workflow
# The consolidated file resolves per-repository parameters through a
# github.event.schedule lookup table rather than flat `key: value`
Expand Down
34 changes: 17 additions & 17 deletions tests/test_hourly_review_repair_callers.py
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@
# and both are asserted separately as static `with:` values rather than
# carried per-target.
_EXPECTED_TARGETS: dict[str, list[dict[str, str]]] = {
"2 * * * *": [
"2 0 * * *": [
{
"name": "afipc",
"target_repository": "ContextualWisdomLab/aFIPC",
Expand All @@ -59,7 +59,7 @@
"concurrency_group": "afipc-hourly-review-repair",
},
],
"4 * * * *": [
"4 1 * * *": [
{
"name": "lineageweave",
"target_repository": "ContextualWisdomLab/LineageWeave",
Expand All @@ -68,7 +68,7 @@
"concurrency_group": "lineageweave-hourly-review-repair",
},
],
"9 * * * *": [
"9 2 * * *": [
{
"name": "psychometrics-commons",
"target_repository": "ContextualWisdomLab/psychometrics-commons",
Expand All @@ -77,7 +77,7 @@
"concurrency_group": "psychometrics-commons-hourly-review-repair",
},
],
"10 * * * *": [
"10 3 * * *": [
{
"name": "originweave",
"target_repository": "ContextualWisdomLab/OriginWeave",
Expand All @@ -86,7 +86,7 @@
"concurrency_group": "originweave-hourly-review-repair",
},
],
"14 * * * *": [
"14 4 * * *": [
{
"name": "quarantine-sandbox",
"target_repository": "ContextualWisdomLab/quarantine-sandbox-runtime",
Expand All @@ -95,7 +95,7 @@
"concurrency_group": "quarantine-sandbox-hourly-review-repair",
},
],
"16 * * * *": [
"16 5 * * *": [
{
"name": "nonnest2",
"target_repository": "ContextualWisdomLab/nonnest2",
Expand All @@ -104,7 +104,7 @@
"concurrency_group": "nonnest2-hourly-review-repair",
},
],
"21 * * * *": [
"21 6 * * *": [
{
"name": "github",
"target_repository": "ContextualWisdomLab/.github",
Expand All @@ -113,7 +113,7 @@
"concurrency_group": "github-hourly-review-repair",
},
],
"23 * * * *": [
"23 7 * * *": [
{
"name": "clearfolio",
"target_repository": "ContextualWisdomLab/clearfolio",
Expand All @@ -122,7 +122,7 @@
"concurrency_group": "clearfolio-hourly-review-repair",
},
],
"27 * * * *": [
"27 8 * * *": [
{
"name": "accounting-information-platform",
"target_repository": "ContextualWisdomLab/accounting-information-platform",
Expand All @@ -131,7 +131,7 @@
"concurrency_group": "accounting-information-platform-hourly-review-repair",
},
],
"34 * * * *": [
"34 9 * * *": [
{
"name": "contextual-orchestrator",
"target_repository": "ContextualWisdomLab/contextual-orchestrator",
Expand All @@ -140,7 +140,7 @@
"concurrency_group": "contextual-orchestrator-hourly-review-repair",
},
],
"37 * * * *": [
"37 10 * * *": [
{
"name": "disksage",
"target_repository": "ContextualWisdomLab/disksage",
Expand All @@ -149,7 +149,7 @@
"concurrency_group": "disksage-hourly-review-repair",
},
],
"43 * * * *": [
"43 11 * * *": [
{
"name": "governance-risk-compliance",
"target_repository": "ContextualWisdomLab/governance-risk-compliance",
Expand All @@ -164,7 +164,7 @@
# lookup makes that sharing explicit and still dispatches each
# repository exactly once per hour, via the matrix in
# dispatch-review-repair.
"49 * * * *": [
"49 12 * * *": [
{
"name": "fast-mlsirm",
"target_repository": "ContextualWisdomLab/fast-mlsirm",
Expand All @@ -180,7 +180,7 @@
"concurrency_group": "metering-billing-platform-hourly-review-repair",
},
],
"53 * * * *": [
"53 13 * * *": [
{
"name": "bandscope",
"target_repository": "ContextualWisdomLab/bandscope",
Expand All @@ -189,7 +189,7 @@
"concurrency_group": "bandscope-hourly-review-repair",
},
],
"56 * * * *": [
"56 14 * * *": [
{
"name": "inkspan",
"target_repository": "ContextualWisdomLab/inkspan",
Expand All @@ -198,7 +198,7 @@
"concurrency_group": "inkspan-hourly-review-repair",
},
],
"58 * * * *": [
"58 15 * * *": [
{
"name": "orgmetra",
"target_repository": "ContextualWisdomLab/Orgmetra",
Expand All @@ -207,7 +207,7 @@
"concurrency_group": "orgmetra-hourly-review-repair",
},
],
"59 * * * *": [
"59 16 * * *": [
{
"name": "semantic-data-portal",
"target_repository": "ContextualWisdomLab/semantic-data-portal",
Expand Down
9 changes: 7 additions & 2 deletions tests/test_noema_orchestrator_workflow_contract.py
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ def test_noema_close_cleanup_selects_only_the_closed_pr_across_shared_display_ti
script = textwrap.dedent(
workflow_step(
workflow_text("noema-review.yml"),
"Cancel queued and running Noema reviews for the closed pull request",
"Cancel queued and running Noema reviews for the inactive pull request",
).split(" run: |\n", 1)[1].split("\n noema-review:", 1)[0]
)
workflow_path = ".github/workflows/noema-review.yml"
Expand Down Expand Up @@ -100,6 +100,9 @@ def test_noema_close_cleanup_selects_only_the_closed_pr_across_shared_display_ti
status="$(printf '%s' "$url" | sed -E 's/.*status=([a-z_]+)&.*/\\1/')"
jq --arg status "$status" '{workflow_runs: [.workflow_runs[] | select(.status == $status)]}' \\
"$FAKE_RUNS_FILE"
elif [[ "$*" == *"/pulls/"* ]]; then
printf '%s\n' "$*" >>"$FAKE_CALLS_FILE"
printf '{"state": "closed", "draft": false, "head": {"sha": "%s"}}\n' "$(printf 'a%.0s' {1..40})"
else
printf '%s\n' "$*" >>"$FAKE_CALLS_FILE"
fi
Expand All @@ -113,7 +116,9 @@ def test_noema_close_cleanup_selects_only_the_closed_pr_across_shared_display_ti
**os.environ,
"PATH": f"{tmp_path}{os.pathsep}{os.environ.get('PATH', '')}",
"TARGET_REPOSITORY": "ContextualWisdomLab/demo",
"CLOSED_PR_NUMBER": "7",
"INACTIVE_PR_NUMBER": "7",
"INACTIVE_PR_HEAD_SHA": "a" * 40,
"PR_ACTION": "closed",
"CURRENT_RUN_ID": "999",
"FAKE_RUNS_FILE": str(runs_file),
"FAKE_CALLS_FILE": str(calls_file),
Expand Down
2 changes: 1 addition & 1 deletion tests/test_pr_review_autofix_nvidia_nim_contract.py
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ def _workflow_text(path: Path) -> str:
def test_review_fix_caller_runs_once_each_hour() -> None:
"""Keep the actionable-review repair caller on the approved hourly cadence."""
caller = _workflow_text(HOURLY_CALLER_WORKFLOW)
assert 'cron: "23 * * * *"' in caller
assert 'cron: "23 7 * * *"' in caller

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Badge Restore the documented hourly recovery contract

In the inspected .github/workflows/hourly-review-repair.yml, 23 7 * * * runs Clearfolio recovery only once per day, yet this test is explicitly intended to enforce an hourly cadence and the repository contract requires all consolidated review-repair callers to remain hourly. Accepting the daily literal removes the regression signal and can leave a PR whose native event was missed without recovery for nearly 24 hours; retain the hourly assertion unless the governing contract is deliberately revised.

AGENTS.md reference: AGENTS.md:L12-L12

Useful? React with 👍 / 👎.

assert 'cron: "23 */2 * * *"' not in caller
assert "uses: ./.github/workflows/pr-review-fix-scheduler.yml" in caller

Expand Down
6 changes: 6 additions & 0 deletions tests/test_strix_rerun_job_selection.py
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,12 @@ def record_rerun(repo: str, job_id: str, *, dry_run: bool, action: str) -> None:
reruns.append((repo, job_id, action))

monkeypatch.setattr(sched, "rerun_actions_job", record_rerun)
# This test's own concern is job selection (the "strix" scan job, not its
# "publish-manual-pr-evidence-status" sibling) -- not the separate live
# head-freshness re-check `dispatch_strix_evidence` now performs before
# any rerun, which needs a real `gh` call and has its own dedicated
# coverage. Stub it to the happy path so this test stays focused.
monkeypatch.setattr(sched, "live_dispatch_head_matches", lambda repo, pr: True)
Comment on lines +41 to +46

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Add the missing stale-head Strix rerun case

This unconditional happy-path stub bypasses the exact-head guard on the existing-job rerun branch, while the claimed dedicated coverage does not exist: the repository's stale-head dispatch test exercises dispatch_opencode_review, not dispatch_strix_evidence, and no test calls this Strix rerun path with live_dispatch_head_matches returning false. Consequently, removing or reordering the guard could let a scheduler snapshot rerun an obsolete Strix job after the PR head changes without any regression test failing; add the false-result case before isolating job selection here.

Useful? React with 👍 / 👎.


assert (
sched.dispatch_strix_evidence(
Expand Down
Loading