Skip to content

Benchmarking workflow setup - #1

Open
NitishDevzy wants to merge 3 commits into
mainfrom
workflow/benchmarking
Open

Benchmarking workflow setup#1
NitishDevzy wants to merge 3 commits into
mainfrom
workflow/benchmarking

Conversation

@NitishDevzy

@NitishDevzy NitishDevzy commented Apr 14, 2026

Copy link
Copy Markdown

Summary by DevzyAi

Release Notes

New Feature

  • Added GitHub Actions workflow for automated offline benchmarking with configurable parameters and timeout controls
  • Introduced analysis scripts for merging evaluation data and generating aggregated metrics reports by tool and repository

Bug Fix

  • Fixed backup file extension handling in merge script to correctly preserve .json.bak format
  • Improved environment variable fallback logic in benchmark workflow to handle empty string inputs
  • Added validation for malformed JSON and numeric metric values in analysis scripts
  • Enhanced error handling for missing data and division-by-zero scenarios in metric calculations

Documentation

  • Updated benchmark dataset documentation, reducing scope from 50 to 40 PRs across 4 projects
  • Added comprehensive workflow and analysis script documentation

Chore

  • Removed Discourse from language mapping configuration

@devzyai-develop

devzyai-develop Bot commented Apr 14, 2026

Copy link
Copy Markdown

⚠️ Issues Identified — 2 Critical = 2 Total

Severity File Description
🔴 Critical …/code_review_benchmark/bench_naming.py 🔒 LDAP Injection
🔴 Critical …/code_review_benchmark/bench_naming.py 🔒 LDAP Injection
📂 File Changes
Files Summary
offline/code_review_benchmark/bench_naming.py Adds shared parsing utilities for benchmark repository names and PR metadata extraction.

@devzyai-develop

devzyai-develop Bot commented Apr 14, 2026

Copy link
Copy Markdown

🛡️ Security Analysis Report

📊 Issue Summary

Severity Count
🔴 Critical 1
Total 1

🔍 Issues by Category

💉 Injection Vulnerabilities (1) - 🚨 1 critical issue(s) requiring immediate attention
  • 🔴 LDAP Injection - offline/code_review_benchmark/bench_naming.py:43
    • 🚨 LDAP Injection: User input in LDAP query without proper escaping.
    • 🧭 context: production — confidence: high — Security issue in production code
    • 💡 Use parameterized LDAP queries or properly escape special characters ( , \ ( ) etc).*

💡 Recommendations

  • 💉 Injection: Use parameterized queries and input validation

Powered by Devzy Security Scanner - Detecting 90+ security patterns across OWASP Top 10, cloud secrets, and infrastructure security.

security-summary

@devzyai-develop devzyai-develop Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Commits Files that changed from the base of the PR and between bc8f979 and 47bc4ab commits.
Files selected (7)
  • .github/workflows/benchmark-offline.yml (1)
  • README.md (1)
  • offline/README.md (6)
  • offline/analysis/merge_neatcode_into_openai_gpt52.py (1)
  • offline/analysis/report_all_tools.py (1)
  • offline/analysis/report_scores_by_repo.py (1)
  • offline/code_review_benchmark/step5_label_prs.py (1)
Files ignored due to filter (11)
  • offline/analysis/benchmark_dashboard.json
  • offline/golden_comments/discourse.json
  • offline/results/anthropic_claude-opus-4-5-20251101/candidates.json
  • offline/results/anthropic_claude-opus-4-5-20251101/evaluations.json
  • offline/results/anthropic_claude-sonnet-4-5-20250929/candidates.json
  • offline/results/anthropic_claude-sonnet-4-5-20250929/evaluations.json
  • offline/results/benchmark_data.json
  • offline/results/openai_gpt-5.2/candidates.json
  • offline/results/openai_gpt-5.2/evaluations.json
  • offline/results/pr_labels.json
  • offline/uv.lock
⚠️ Architecture Analysis (2 issues)

🟠 High: 2 issue(s)

  • signature_mismatch: Function "load_dotenv" accepts at most 0 argument(s) but is called with 1 at line 12 in "online/etl/config.py".
  • signature_mismatch: Function "load_dotenv" accepts at most 0 argument(s) but is called with 1 at line 17 in "online/etl/dashboard/app.py".
📊 Impact Analysis (3 high-impact changes)
  • load_dotenv: 27 dependents (high)
  • sanitize_model_name: 25 dependents (high)
  • process_batch: 21 dependents (high)
Review comments generated (3)
  • Review: 3
  • LGTM: 0

Priority ranking: Showing top 3 of 14 most impactful findings (5 cross-file duplicates, 6 lower-value findings suppressed).

Additional findings (outside changed lines) (1)

These were referenced by the model but are outside the PR diff hunks, so they cannot be posted as inline review comments.

  • offline/code_review_benchmark/step5_label_prs.py:9-19 [medium] ⚠️ Behavioral Regression: Removing "discourse" mapping will cause derive_language() to return None for Discourse PRs The UPSTREAM_REPO_TO_LANGUAGE mapping is used by `derive_la...

Tips

Chat with DevzyAi Bot (@DevzyAi)

  • Reply on review comments left by this bot to ask follow-up questions. A review comment is a comment on a diff or a file.
  • Invite the bot into a review comment chain by tagging @DevzyAi in a reply.

Code suggestions

  • The bot may make code suggestions, but please review them carefully before committing since the line number ranges may be misaligned.
  • You can edit the comment made by the bot and manually tweak the suggestion if it is slightly off.

Pausing incremental reviews

  • Add @DevzyAi: ignore anywhere in the PR description to pause further reviews from the bot.

Comment thread .github/workflows/benchmark-offline.yml Outdated
Comment on lines +22 to +122
default: false
step1_force:
description: "Pass --force to step 1 (refetch reviews)"
required: false
type: boolean
default: false
step1_test:
description: "Pass --test to step 1 (one repo per tool)"
required: false
type: boolean
default: false
judge_model:
description: "Override MARTIAN_MODEL for the judge (leave empty to use MARTIAN_MODEL secret)"
required: false
type: string
default: ""
limit:
description: "Optional --limit for steps 2 and 3 (smoke runs); leave empty for full run"
required: false
type: string
default: ""

concurrency:
group: benchmark-offline-${{ github.repository }}
cancel-in-progress: false

defaults:
run:
working-directory: offline

jobs:
benchmark:
runs-on: ubuntu-latest
timeout-minutes: 360
permissions:
contents: read

env:
GH_TOKEN: ${{ secrets.BENCHMARK_GH_TOKEN }}
GITHUB_TOKEN: ${{ secrets.BENCHMARK_GH_TOKEN }}
MARTIAN_API_KEY: ${{ secrets.MARTIAN_API_KEY }}
MARTIAN_MODEL: ${{ inputs.judge_model || secrets.MARTIAN_MODEL }}

steps:
- name: Checkout
uses: actions/checkout@v4
with:
ref: ${{ inputs.ref }}

- name: Verify secrets
run: |
set -euo pipefail
if [ -z "${GH_TOKEN:-}" ]; then echo "Missing secret BENCHMARK_GH_TOKEN"; exit 1; fi
if [ -z "${MARTIAN_API_KEY:-}" ]; then echo "Missing secret MARTIAN_API_KEY"; exit 1; fi
if [ -z "${MARTIAN_MODEL:-}" ]; then echo "Set secret MARTIAN_MODEL or pass judge_model input"; exit 1; fi

- name: Install uv
uses: astral-sh/setup-uv@v4
with:
version: "latest"

- name: Install dependencies
run: uv sync

- name: Step 0 — orchestrate forks
if: ${{ inputs.run_step0 }}
timeout-minutes: 180
run: >-
uv run python -m code_review_benchmark.step0_orchestrate_forks
--org "${{ inputs.benchmark_org }}"
--name "${{ inputs.tool }}"
--golden-dir golden_comments

- name: Step 1 — download PR data
timeout-minutes: 60
run: |
set -euo pipefail
ARGS=(--org "${{ inputs.benchmark_org }}" --output results/benchmark_data.json --tool "${{ inputs.tool }}")
if [[ "${{ inputs.step1_force }}" == "true" ]]; then ARGS+=(--force); fi
if [[ "${{ inputs.step1_test }}" == "true" ]]; then ARGS+=(--test); fi
uv run python -m code_review_benchmark.step1_download_prs "${ARGS[@]}"

- name: Step 2 — extract comments
timeout-minutes: 120
run: |
set -euo pipefail
CMD=(uv run python -m code_review_benchmark.step2_extract_comments --tool "${{ inputs.tool }}")
if [[ -n "${{ inputs.limit }}" ]]; then CMD+=(--limit "${{ inputs.limit }}"); fi
"${CMD[@]}"

- name: Step 2.5 — deduplicate candidates
timeout-minutes: 120
run: >-
uv run python -m code_review_benchmark.step2_5_dedup_candidates
--tool "${{ inputs.tool }}"

- name: Step 3 — judge comments
timeout-minutes: 300
run: |
set -euo pipefail
MODEL_SLUG="${MARTIAN_MODEL//\//_}"

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

🟡 Medium

🐛 Bug: Shell parameter expansion will fail if MARTIAN_MODEL contains special characters

The ${MARTIAN_MODEL//\//_} expansion replaces forward slashes with underscores, but if MARTIAN_MODEL contains other shell metacharacters (spaces, quotes, etc.), the unquoted expansion will cause word splitting or glob expansion failures.

🛠️ Code Suggestions
-          MODEL_SLUG="${MARTIAN_MODEL//\//_}"
+          MODEL_SLUG="${MARTIAN_MODEL//\//_}"
+          MODEL_SLUG="${MODEL_SLUG// /_}"

Actually, a safer approach is to quote the variable and handle all special characters:

🛠️ Code Suggestions
-          MODEL_SLUG="${MARTIAN_MODEL//\//_}"
+          MODEL_SLUG="$(echo "${MARTIAN_MODEL}" | tr '/' '_' | tr -cd '[:alnum:]_-')"
🤖 AI Fix Prompt - Copy this into your AI coding agent
Validation: Read .github/workflows/benchmark-offline.yml and check the MODEL_SLUG assignment around line 60. Confirm that MARTIAN_MODEL is used in a shell parameter expansion without quotes and that the expansion only handles forward slashes. If the variable is already quoted or if the workflow guarantees MARTIAN_MODEL contains only alphanumeric and slash characters, skip this fix.

Problem & Location: In .github/workflows/benchmark-offline.yml, the line MODEL_SLUG="${MARTIAN_MODEL//\//_}" uses unquoted parameter expansion. If MARTIAN_MODEL contains spaces, quotes, or other shell metacharacters, the expansion will trigger word splitting or glob expansion, causing the workflow step to fail or produce incorrect slugs.

Fix: Replace the shell parameter expansion with a sanitization approach that strips all non-alphanumeric characters except underscores and hyphens. Reference the sanitize_model_name function in offline/code_review_benchmark/step5_label_prs.py (and step3, step4) which uses .replace("/", "_") and .strip(). Adapt that logic to shell by using tr to replace slashes with underscores and then delete any character that is not alphanumeric, underscore, or hyphen. The corrected line should be MODEL_SLUG="$(echo "${MARTIAN_MODEL}" | tr '/' '_' | tr -cd '[:alnum:]_-')".

Verify: Check that the benchmark-offline workflow runs successfully with model names containing spaces or special characters. If the workflow has integration tests or example runs, execute them to confirm MODEL_SLUG is correctly sanitized.

↑ Back to Summary

GH_TOKEN: ${{ secrets.BENCHMARK_GH_TOKEN }}
GITHUB_TOKEN: ${{ secrets.BENCHMARK_GH_TOKEN }}
MARTIAN_API_KEY: ${{ secrets.MARTIAN_API_KEY }}
MARTIAN_MODEL: ${{ inputs.judge_model || secrets.MARTIAN_MODEL }}

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

🟠 High

🐛 Bug: Empty string from judge_model input will override MARTIAN_MODEL secret

When inputs.judge_model is an empty string (the default), the expression ${{ inputs.judge_model || secrets.MARTIAN_MODEL }} evaluates to empty string, not the secret. GitHub Actions treats empty strings as truthy in the || operator.

🛠️ Code Suggestions
-      MARTIAN_MODEL: ${{ inputs.judge_model || secrets.MARTIAN_MODEL }}
+      MARTIAN_MODEL: ${{ inputs.judge_model != '' && inputs.judge_model || secrets.MARTIAN_MODEL }}
🤖 AI Fix Prompt - Copy this into your AI coding agent
Validation: Read .github/workflows/benchmark-offline.yml and confirm that the MARTIAN_MODEL environment variable assignment uses the expression `${{ inputs.judge_model || secrets.MARTIAN_MODEL }}` without checking if judge_model is an empty string. If the expression already includes an empty-string check, skip this fix.

Problem & Location: In .github/workflows/benchmark-offline.yml, the env section sets MARTIAN_MODEL using `${{ inputs.judge_model || secrets.MARTIAN_MODEL }}`. Because judge_model has a default value of empty string, and GitHub Actions treats empty strings as truthy in the OR operator, an empty string input will override the secret instead of falling back to it. This breaks the workflow when triggered without explicitly setting judge_model, causing the benchmark to fail with no model configured.

Fix: Change the MARTIAN_MODEL assignment to check if inputs.judge_model is not empty before using it. Use the expression `${{ inputs.judge_model != '' && inputs.judge_model || secrets.MARTIAN_MODEL }}` so that only non-empty judge_model inputs override the secret, and empty strings fall through to secrets.MARTIAN_MODEL.

Verify: Run the benchmark-offline workflow twice: once with no judge_model input (should use MARTIAN_MODEL secret) and once with an explicit judge_model value (should use that value). Check that offline/code_review_benchmark/step3_judge_comments.py successfully initializes the LLM client in both cases.

↑ Back to Summary

Comment on lines +115 to +124
for golden_url, tools in data.items():
if not golden_url_in_repo(golden_url, canonical):
continue
result = tools.get(tool)
if not result or result.get("skipped"):
continue
tp += int(result.get("tp", 0))
fp += int(result.get("fp", 0))
fn += int(result.get("fn", 0))
n_reviews += 1

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

🟡 Medium

🐛 Bug: Silent data loss when result dictionary contains non-numeric values

The int() conversions will raise ValueError if the JSON contains non-numeric strings (e.g., "tp": "N/A" or "tp": null). This will crash the script instead of skipping the malformed entry or reporting it.

🛠️ Code Suggestions
         result = tools.get(tool)
         if not result or result.get("skipped"):
             continue
-        tp += int(result.get("tp", 0))
-        fp += int(result.get("fp", 0))
-        fn += int(result.get("fn", 0))
+        try:
+            tp += int(result.get("tp", 0))
+            fp += int(result.get("fp", 0))
+            fn += int(result.get("fn", 0))
+        except (ValueError, TypeError) as e:
+            print(f"Warning: Skipping {golden_url} due to invalid metrics: {e}", file=sys.stderr)
+            continue
         n_reviews += 1

Note: This requires adding import sys at the top of the file.

🤖 AI Fix Prompt - Copy this into your AI coding agent
Validation: Read offline/analysis/report_scores_by_repo.py and check whether the JSON data loaded from the benchmark results can ever contain non-numeric values for "tp", "fp", or "fn" keys. If the upstream data pipeline guarantees these are always integers or the script is only used with known-good data, this is a false positive and no fix is needed.

Problem & Location: In offline/analysis/report_scores_by_repo.py, the code that accumulates tp, fp, fn metrics directly calls int() on dictionary values without handling cases where the JSON might contain null, non-numeric strings, or missing keys that default to 0 but are then cast. The lines are:
  tp += int(result.get("tp", 0))
  fp += int(result.get("fp", 0))
  fn += int(result.get("fn", 0))
If the benchmark JSON ever contains malformed data (e.g., "tp": "N/A" or "tp": null), the script will crash with ValueError or TypeError instead of skipping the bad entry or reporting it.

Fix: Wrap the three int() conversions in a try-except block that catches ValueError and TypeError. On exception, print a warning to stderr identifying the golden_url and the error, then continue to the next iteration. Add "import sys" at the top of the file if not already present. Reference offline/code_review_benchmark/step_speed_analysis.py for similar error handling patterns if needed.

Verify: Check whether any other scripts in offline/analysis/ or offline/code_review_benchmark/ consume the same JSON format and confirm they handle malformed data consistently. Run the script against a sample JSON file with intentionally malformed metrics to confirm the warning is printed and the script continues.

↑ Back to Summary

@NitishDevzy
NitishDevzy force-pushed the workflow/benchmarking branch 2 times, most recently from e0693ea to e48ba75 Compare April 15, 2026 13:17
rest = head_ref[3:]
if rest.isdigit():
return int(rest)
m = re.search(r"-(\d+)$", rest)

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

🔴 Critical

🔒 LDAP Injection

🚨 LDAP Injection: User input in LDAP query without proper escaping.

Recommendation: Use parameterized LDAP queries or properly escape special characters (* , \ ( ) etc).

🤖 AI Fix Prompt - Copy this into your AI coding agent


↑ Back to Summary


def source_repo_from_github_pr_url(url: str) -> str | None:
"""Return repo segment from a ``https://github.com/{owner}/{repo}/pull/{n}`` URL."""
m = re.search(r"github\.com/[^/]+/([^/]+)/pull/\d+", url)

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

🔴 Critical

🔒 LDAP Injection

🚨 LDAP Injection: User input in LDAP query without proper escaping.

Recommendation: Use parameterized LDAP queries or properly escape special characters (* , \ ( ) etc).

🤖 AI Fix Prompt - Copy this into your AI coding agent


↑ Back to Summary

@devzyai-develop

Copy link
Copy Markdown

📋 Additional Findings (Outside Changed Lines)

The following issues were detected in areas related to your changes but are outside the diff range. These cannot be added as inline comments but may be relevant to your PR.


📍 offline/code_review_benchmark/step1_download_prs.py:27

🟡 Medium

⚠️ Potential Duplicate Detected

Symbol: load_dotenv

This symbol appears to already exist in the codebase:
offline/code_review_benchmark/step0_fork_prs.py:46, offline/code_review_benchmark/step2_5_dedup_candidates.py:70, offline/code_review_benchmark/step2_extract_comments.py:52 (+2 more)

Recommendation:

  • Consider reusing the existing implementation instead of creating a duplicate
  • If this is intentional (e.g., different functionality), consider renaming to avoid confusion
  • If consolidating, ensure all existing usages are updated
View existing implementation

offline/code_review_benchmark/step0_fork_prs.py:46



def load_dotenv(filepath: str = ".env") -> None:
    """Load environment variables from a .env file in the current working directory."""
    env_path = Path(filepath)

offline/code_review_benchmark/step2_5_dedup_candidates.py:70



def load_dotenv() -> None:
    env_path = Path(".env")
    if not env_path.exists():
🤖 AI Fix Prompt - Copy this into your AI coding agent


↑ Back to Summary


📍 offline/code_review_benchmark/step5_label_prs.py:105

🟡 Medium

⚠️ Potential Duplicate Detected

Symbol: load_dotenv

This symbol appears to already exist in the codebase:
offline/code_review_benchmark/step0_fork_prs.py:46, offline/code_review_benchmark/step2_5_dedup_candidates.py:70, offline/code_review_benchmark/step2_extract_comments.py:52 (+2 more)

Recommendation:

  • Consider reusing the existing implementation instead of creating a duplicate
  • If this is intentional (e.g., different functionality), consider renaming to avoid confusion
  • If consolidating, ensure all existing usages are updated
View existing implementation

offline/code_review_benchmark/step0_fork_prs.py:46



def load_dotenv(filepath: str = ".env") -> None:
    """Load environment variables from a .env file in the current working directory."""
    env_path = Path(filepath)

offline/code_review_benchmark/step2_5_dedup_candidates.py:70



def load_dotenv() -> None:
    env_path = Path(".env")
    if not env_path.exists():
🤖 AI Fix Prompt - Copy this into your AI coding agent


↑ Back to Summary


📍 offline/code_review_benchmark/step5_label_prs.py:117

🟡 Medium

⚠️ Potential Duplicate Detected

Symbol: sanitize_model_name

This symbol appears to already exist in the codebase:
offline/code_review_benchmark/step2_5_dedup_candidates.py:82, offline/code_review_benchmark/step2_extract_comments.py:64, offline/code_review_benchmark/step3_judge_comments.py:88 (+1 more)

Recommendation:

  • Consider reusing the existing implementation instead of creating a duplicate
  • If this is intentional (e.g., different functionality), consider renaming to avoid confusion
  • If consolidating, ensure all existing usages are updated
View existing implementation

offline/code_review_benchmark/step2_5_dedup_candidates.py:82



def sanitize_model_name(model: str) -> str:
    return model.strip().replace("/", "_")

offline/code_review_benchmark/step2_extract_comments.py:64



def sanitize_model_name(model: str) -> str:
    """Sanitize model name for use as directory name."""
    return model.strip().replace("/", "_")
🤖 AI Fix Prompt - Copy this into your AI coding agent


↑ Back to Summary


📍 offline/code_review_benchmark/step5_label_prs.py:122

🟡 Medium

⚠️ Potential Duplicate Detected

Symbol: get_model_dir

This symbol appears to already exist in the codebase:
offline/code_review_benchmark/step2_5_dedup_candidates.py:86, offline/code_review_benchmark/step2_extract_comments.py:69, offline/code_review_benchmark/step3_judge_comments.py:93 (+1 more)

Recommendation:

  • Consider reusing the existing implementation instead of creating a duplicate
  • If this is intentional (e.g., different functionality), consider renaming to avoid confusion
  • If consolidating, ensure all existing usages are updated
View existing implementation

offline/code_review_benchmark/step2_5_dedup_candidates.py:86



def get_model_dir() -> Path:
    model = os.environ.get("MARTIAN_MODEL", "openai/gpt-4o-mini")
    model_dir = RESULTS_DIR / sanitize_model_name(model)

offline/code_review_benchmark/step2_extract_comments.py:69



def get_model_dir() -> Path:
    """Get the model-specific results directory, creating it if needed."""
    model = os.environ.get("MARTIAN_MODEL", "openai/gpt-4o-mini")
🤖 AI Fix Prompt - Copy this into your AI coding agent


↑ Back to Summary


📍 offline/code_review_benchmark/step5_label_prs.py:146

🟡 Medium

⚠️ Potential Duplicate Detected

Symbol: call_llm

This symbol appears to already exist in the codebase:
offline/code_review_benchmark/step2_extract_comments.py:94, offline/code_review_benchmark/step3_judge_comments.py:120, offline/code_review_benchmark/step2_extract_comments.py:94 (+1 more)

Recommendation:

  • Consider reusing the existing implementation instead of creating a duplicate
  • If this is intentional (e.g., different functionality), consider renaming to avoid confusion
  • If consolidating, ensure all existing usages are updated
View existing implementation

offline/code_review_benchmark/step2_extract_comments.py:94

        print(f"Batch size: {BATCH_SIZE}")

    async def call_llm(self, prompt: str, max_retries: int = 3) -> dict:
        """Call LLM API with retry logic."""
        for attempt in range(max_retries):

offline/code_review_benchmark/step3_judge_comments.py:120

            print("Structured output: enabled")

    async def call_llm(self, prompt: str, max_retries: int = 3) -> dict:
        for attempt in range(max_retries):
            try:
🤖 AI Fix Prompt - Copy this into your AI coding agent


↑ Back to Summary


📍 offline/analysis/benchmark_dashboard.py:238

🟡 Medium

📊 Impact Analysis: 🟡 Moderate

Function: format_dimension_label

This function has 5 direct callers across 1 files.

⚠️ Changes to this function may affect:

Files importing this function (0)

No direct imports found

Sample call sites
  • offline/analysis/benchmark_dashboard.py:396
  • offline/analysis/benchmark_dashboard.py:408
  • offline/analysis/benchmark_dashboard.py:645

Recommendation:

  • Ensure changes are backward compatible
  • Consider adding/updating tests for affected code paths
  • Review if callers need updates for new parameters or behavior changes
🤖 AI Fix Prompt - Copy this into your AI coding agent


↑ Back to Summary


📍 offline/analysis/benchmark_dashboard.py:276

🟡 Medium

📊 Impact Analysis: 🟡 Moderate

Function: generate_filter_description

This function has 3 direct callers across 1 files.

⚠️ Changes to this function may affect:

Files importing this function (0)

No direct imports found

Sample call sites
  • offline/analysis/benchmark_dashboard.py:570
  • offline/analysis/benchmark_dashboard.py:652
  • offline/analysis/benchmark_dashboard.py:694

Recommendation:

  • Ensure changes are backward compatible
  • Consider adding/updating tests for affected code paths
  • Review if callers need updates for new parameters or behavior changes
🤖 AI Fix Prompt - Copy this into your AI coding agent


↑ Back to Summary


@NitishDevzy
NitishDevzy force-pushed the workflow/benchmarking branch from e48ba75 to af8b6f4 Compare April 15, 2026 13:36
@devzyai-develop

devzyai-develop Bot commented Apr 15, 2026

Copy link
Copy Markdown

Review cycle complete for this PR (max 2 rounds reached).

To request another review, comment @DevzyAi review.

@NitishDevzy
NitishDevzy force-pushed the workflow/benchmarking branch from af8b6f4 to 91eaeed Compare April 15, 2026 16:40
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant