Skip to content

Shell completion auto-install and pre-commit hook improvements#1124

Open
sbryngelson wants to merge 35 commits intoMFlowCode:masterfrom
sbryngelson:triage
Open

Shell completion auto-install and pre-commit hook improvements#1124
sbryngelson wants to merge 35 commits intoMFlowCode:masterfrom
sbryngelson:triage

Conversation

@sbryngelson
Copy link
Member

@sbryngelson sbryngelson commented Feb 5, 2026

User description

User description

Summary

Follow-up improvements to the CI and developer experience work from #1122:

  • Auto-install shell completions: On first ./mfc.sh run, completions are installed to ~/.local/share/mfc/completions/ and the source line is added to .bashrc/.zshrc
  • Auto-update completions: When generated completion files change, installed copies are automatically updated
  • Pre-commit hook improvements: Cap parallelism at 12 jobs, show job count in output
  • Tab completion fixes: Prevent unwanted directory completion fallback
  • Documentation: Clarify -v/-vv/-vvv (verbosity), --debug (compiler flags), and --debug-log (toolchain debugging)

Changes

  • mfc.sh: Auto-install completions with shell rc setup
  • toolchain/main.py: Auto-update installed completions when regenerated
  • toolchain/mfc/cli/completion_gen.py: Fix bash/zsh completion options
  • .githooks/pre-commit: Cap at 12 jobs, show count
  • toolchain/mfc/cli/commands.py: Clarify flag documentation

Test plan

  • Run ./mfc.sh on fresh clone - completions should auto-install
  • Delete ~/.local/share/mfc/completions/ and run again - should reinstall
  • Tab completion should not suggest directories like build/
  • Pre-commit hook should show -j N where N ≤ 12

🤖 Generated with Claude Code

PR Type

Enhancement, Tests

Description

  • Add CI lint-gate job and local precheck command for early validation

  • Auto-install git pre-commit hook and shell completions on first run

  • Gate benchmarks on test suite completion to prevent wasted HPC resources

  • Improve documentation clarity for debug, verbosity, and logging flags

  • Add concurrency groups to CI workflows to cancel superseded runs

Diagram Walkthrough

flowchart LR
  A["mfc.sh startup"] --> B["Auto-install pre-commit hook"]
  A --> C["Auto-install shell completions"]
  D["./mfc.sh precheck"] --> E["Format check"]
  D --> F["Spell check"]
  D --> G["Lint checks"]
  H["CI: test.yml"] --> I["Lint Gate job"]
  I --> J["Github test matrix"]
  J --> K["wait-for-tests job"]
  K --> L["Benchmark jobs"]
Loading

File Walkthrough

Relevant files
Enhancement
7 files
main.py
Auto-update installed completions when regenerated             
+31/-3   
commands.py
Add precheck command and clarify flag documentation           
+26/-4   
mfc.sh
Auto-install pre-commit hook and shell completions             
+38/-0   
precheck.sh
New precheck script for local CI validation                           
+138/-0 
pre-commit
New git pre-commit hook running precheck                                 
+30/-0   
test.yml
Add lint-gate job and concurrency groups                                 
+45/-3   
bench.yml
Add wait-for-tests job and concurrency groups                       
+59/-3   
Bug fix
1 files
completion_gen.py
Fix bash/zsh completion options and prevent directory fallback
+10/-5   
Documentation
1 files
docs_gen.py
Clarify debug and verbosity flag documentation                     
+10/-3   
Configuration changes
2 files
cleanliness.yml
Add concurrency groups to cancel superseded runs                 
+4/-0     
coverage.yml
Add concurrency groups to cancel superseded runs                 
+4/-0     

CodeAnt-AI Description

Auto-install shell completions, clearer build/run errors, and bench jobs gated on Test Suite

What Changed

  • Tab completions are now auto-installed and auto-updated to ~/.local/share/mfc/completions and activated immediately when possible; shell rc is configured on first install
  • Build and run error panels show full stdout/stderr (no truncation) so users see complete error output
  • Help output shortened and reformatted for compact, single-screen readability; quick-start and command list are easier to scan
  • Python bootstrap shows cleaner package-install progress by default and supports a verbose mode for full output; installer uses faster tool when available
  • CLI bootstrap scripts now forward flags/arguments correctly and main command shows help when only flags are given
  • Benchmark workflow now only starts after the Test Suite completes successfully (or on manual dispatch), and reads PR metadata so benchmarks are not wasted on failing or unapproved PRs

Impact

✅ Clearer build and run errors
✅ Immediate tab completions on first run
✅ Fewer wasted benchmark runs

💡 Usage Guide

Checking Your Pull Request

Every time you make a pull request, our system automatically looks through it. We check for security issues, mistakes in how you're setting up your infrastructure, and common code problems. We do this to make sure your changes are solid and won't cause any trouble later.

Talking to CodeAnt AI

Got a question or need a hand with something in your pull request? You can easily get in touch with CodeAnt AI right here. Just type the following in a comment on your pull request, and replace "Your question here" with whatever you want to ask:

@codeant-ai ask: Your question here

This lets you have a chat with CodeAnt AI about your pull request, making it easier to understand and improve your code.

Example

@codeant-ai ask: Can you suggest a safer alternative to storing this secret?

Preserve Org Learnings with CodeAnt

You can record team preferences so CodeAnt AI applies them in future reviews. Reply directly to the specific CodeAnt AI suggestion (in the same thread) and replace "Your feedback here" with your input:

@codeant-ai: Your feedback here

This helps CodeAnt AI learn and adapt to your team's coding style and standards.

Example

@codeant-ai: Do not flag unused imports.

Retrigger review

Ask CodeAnt AI to review the PR again, by typing:

@codeant-ai: review

Check Your Repository Health

To analyze the health of your code repository, visit our dashboard at https://app.codeant.ai. This tool helps you identify potential issues and areas for improvement in your codebase, ensuring your repository maintains high standards of code health.

Summary by CodeRabbit

  • New Features

    • Centralized, bootstrap-driven installer for shell completions with immediate activation.
  • Improved UX

    • Consistent quoting/forwarding of flags and arguments across bootstrap steps.
    • Verbose mode enabled across tooling and CI; Python bootstrap supports verbose install and shows full logs on failures.
    • Help output condensed; build errors now show full output.
    • Early detection and guidance for incompatible legacy setups; refined main command invocation behavior.
  • Chores

    • CI benchmark workflow simplified to run after tests and derive PR metadata.

sbryngelson and others added 17 commits February 4, 2026 16:17
- Add lint-gate job to test.yml that runs fast checks (formatting,
  spelling, linting) before expensive test matrix and HPC jobs start
- Add concurrency groups to test.yml, coverage.yml, cleanliness.yml,
  and bench.yml to cancel superseded runs on new pushes
- Add ./mfc.sh precheck command for local CI validation before pushing

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add cross-platform hash function (macOS uses md5, Linux uses md5sum)
- Validate -j/--jobs argument (require value, must be numeric)
- Improve error messages with actionable guidance
- Clarify that formatting has been auto-applied when check fails

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Add wait-for-tests job that polls GitHub API to ensure:
- Lint Gate passes first (fast fail)
- All Github test jobs complete successfully
- Only then do benchmark jobs start

This prevents wasting HPC resources on benchmarking code that
fails tests, while preserving the existing maintainer approval gate.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add .githooks/pre-commit that runs ./mfc.sh precheck before commits
- Auto-install hook on first ./mfc.sh invocation (symlinks to .git/hooks/)
- Hook only installs once; subsequent runs skip if already present
- Developers can bypass with: git commit --no-verify

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Auto-detect available CPUs for parallel formatting:
- Linux: nproc
- macOS: sysctl -n hw.ncpu
- Fallback: 4

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Keep both: pre-commit hook auto-install and 'Starting...' log message

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Register precheck in commands.py so it appears in:
- Shell tab completion
- CLI documentation
- ./mfc.sh precheck --help

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
When completion scripts are auto-regenerated, also update the installed
completions at ~/.local/share/mfc/completions/ if they exist.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
When installed shell completions are auto-updated, print a message
with the appropriate source command for the user's detected shell.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Previously, installed completions only updated when source files
changed and regeneration occurred. Now we also check if the installed
completions are older than the generated ones (e.g., after git pull
brings new pre-generated completions).

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Remove -o bashdefault from bash complete command to prevent
  falling back to directory completion when no matches found
- Add explicit : (no-op) for zsh commands without arguments to
  prevent default file/directory completion

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Auto-install completions on first mfc.sh run (via main.py)
- Add -o filenames back to bash complete (needed for file completion)
- Keep -o bashdefault removed to prevent directory fallback
- Simplify code by having __update_installed_completions handle both
  install and update cases

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Move completion auto-install to mfc.sh so it runs for ALL commands
including help, precheck, etc. This ensures completions are always
set up on first run.

- Install completion files to ~/.local/share/mfc/completions/
- Add source line to .bashrc or fpath to .zshrc
- Tell user to restart shell or source the file
- main.py now only handles updates when generated files change

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- -v/-vv/-vvv: output verbosity levels
- --debug: build with debug compiler flags (for MFC Fortran code)
- --debug-log/-d: Python toolchain debug logging (not MFC code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Avoid hogging resources on machines with many cores.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Previously checked if ~/.local/share/mfc/completions/ existed.
Now checks if the actual completion file exists for the user's shell.
This handles the edge case of an empty completions directory.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Copilot AI review requested due to automatic review settings February 5, 2026 15:30
@codeant-ai
Copy link
Contributor

codeant-ai bot commented Feb 5, 2026

CodeAnt AI is reviewing your PR.


Thanks for using CodeAnt! 🎉

We're free for open-source projects. if you're enjoying it, help us grow by sharing.

Share on X ·
Reddit ·
LinkedIn

@cursor
Copy link

cursor bot commented Feb 5, 2026

You have run out of free Bugbot PR reviews for this billing cycle. This will reset on March 8.

To receive reviews on all of your PRs, visit the Cursor dashboard to activate Pro and start your 14-day free trial.

@coderabbitai
Copy link
Contributor

coderabbitai bot commented Feb 5, 2026

📝 Walkthrough

Walkthrough

Replaces inline completion installation with a centralized bootstrap script; standardizes quoted argument forwarding to bootstrap scripts; adds verbose handling to the Python bootstrap and CI/runtime invocations; compacts help output and prints full build error outputs; changes bench CI trigger to workflow_run with PR-info collection.

Changes

Cohort / File(s) Summary
mfc startup script
mfc.sh
Delegates completions to toolchain/bootstrap/completions.sh, removes in-script RC edits/copies, detects presence of a command vs only flags and invokes main.py accordingly, and consistently forwards "$@" to bootstrap invocations.
Completions bootstrap
toolchain/bootstrap/completions.sh
New _mfc_setup_completions() installer: detects bash/zsh, installs/updates completion files into ~/.local/share/mfc/completions, appends RC sourcing on first install, and activates completions when sourced.
Python bootstrap
toolchain/bootstrap/python.sh
Adds verbose flag parsing (-v/--verbose) to control uv install output; adjusts log capture, filtered progress display, and full-output reporting on failure; copies pyproject.toml on success.
Bootstrap arg forwarding
toolchain/bootstrap/*, mfc.sh
Standardized passing of quoted CLI args ("$@") across bootstrap invocations (modules, lint, format, spell, precheck, python, venv, etc.).
User guide
toolchain/mfc/user_guide.py
Reworked help output to a compact inline format with _truncate_desc for command descriptions; removed boxed panels and multi-line quick-start panels.
Build error display
toolchain/mfc/build.py
Removed truncation of stdout/stderr in _show_build_error; now strips and prints the full non-empty outputs.
CI workflow
.github/workflows/bench.yml
Replaced PR triggers with workflow_run (Test Suite completion) + workflow_dispatch; removed wait-for-tests job; added Get PR Info step and outputs (pr_number, pr_author, pr_approved); wired clone ref to `workflow_run.head_sha
Verbose flag additions in CI & scripts
.github/**/frontier*.sh, .github/**/phoenix*.sh, .github/workflows/*, .github/Dockerfile
Adds -v to various build/test/bench invocations to enable verbose mode across workflows and container runs.
Manifests & deps
toolchain/pyproject.toml, manifest_file, pyproject.toml
Pins pyrometheus to a specific commit hash and records minor manifest edits related to bootstrap/python changes.

Sequence Diagram(s)

sequenceDiagram
    participant TestSuite as Test Suite (workflow)
    participant BenchWF as bench.yml (workflow)
    participant GitHub as GitHub API
    participant Runner as Runner / Job

    TestSuite->>BenchWF: Emit workflow_run (conclusion: success)
    BenchWF->>GitHub: Request PR info (derive pr_number from workflow_run)
    GitHub-->>BenchWF: Return pr_number, pr_author, approvals
    BenchWF->>BenchWF: Set outputs (pr_number, pr_author, pr_approved)
    BenchWF->>Runner: Start file-changes & matrix jobs (conditional)
    Runner->>GitHub: Clone repo with ref = workflow_run.head_sha || github.sha
    Runner-->>BenchWF: Job results and statuses
Loading

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~20 minutes

Possibly related PRs

Suggested labels

Review effort 3/5

Suggested reviewers

  • wilfonba

Poem

🐰
I hopped into scripts at break of dawn,
Gave completions work to a helper I spawned.
No more RC scribbles — tidy paths to share,
Arguments wrapped gently, verbose scents in the air.
Carrot-powered builds hum clean and aware.

🚥 Pre-merge checks | ✅ 3
✅ Passed checks (3 passed)
Check name Status Explanation
Title check ✅ Passed The title clearly and specifically summarizes the main changes: auto-install of shell completions and pre-commit hook improvements, which are the central features in this PR.
Description check ✅ Passed The PR description is comprehensive and well-structured. It includes a clear summary, detailed change descriptions, a test plan with checkboxes, motivation via PR #1122 reference, and both auto-generated and detailed walkthroughs covering all major modifications.
Docstring Coverage ✅ Passed Docstring coverage is 85.71% which is sufficient. The required threshold is 80.00%.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing touches
  • 📝 Generate docstrings
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@codeant-ai codeant-ai bot added the size:L This PR changes 100-499 lines, ignoring generated files label Feb 5, 2026
@qodo-code-review
Copy link
Contributor

PR Reviewer Guide 🔍

Here are some key observations to aid the review process:

⏱️ Estimated effort to review: 4 🔵🔵🔵🔵⚪
🧪 No relevant tests
🔒 No security concerns identified
⚡ Recommended focus areas for review

Possible Issue

__update_installed_completions references os (and prints via cons) without showing any local imports in the function. This works only if os/cons are guaranteed to be available as module globals; otherwise this will raise at runtime when regeneration runs. Consider making dependencies explicit inside the function or ensuring they are imported in the module scope.

def __update_installed_completions(toolchain: str):
    """Update installed shell completions if they're older than generated ones."""
    import shutil  # pylint: disable=import-outside-toplevel
    from pathlib import Path  # pylint: disable=import-outside-toplevel

    src_dir = Path(toolchain) / "completions"
    dst_dir = Path.home() / ".local" / "share" / "mfc" / "completions"

    # Only update if already installed (mfc.sh handles initial install)
    if not dst_dir.exists():
        return

    # Update if installed but older than generated
    updated = False
    for name in ["mfc.bash", "_mfc"]:
        if (src_dir / name).exists() and (dst_dir / name).exists():
            if os.path.getmtime(src_dir / name) > os.path.getmtime(dst_dir / name):
                shutil.copy2(src_dir / name, dst_dir / name)
                updated = True

    if updated:
        is_zsh = "zsh" in os.environ.get("SHELL", "")
        src_cmd = f"source {dst_dir}/_mfc" if is_zsh else f"source {dst_dir}/mfc.bash"
        cons.print(f"[dim]Tab completions updated. Run: {src_cmd}[/dim]")
Duplication

The “lint gate” checks are duplicated between this script and .github/workflows/test.yml (format/spelling/toolchain lint + three grep-based source lints). This increases the chance of drift (different patterns, excludes, or behavior). Consider factoring the grep-based source lint checks into a single shared script invoked by both CI and precheck, or having CI call ./mfc.sh precheck to keep a single source of truth.

log "Running$MAGENTA precheck$COLOR_RESET (same checks as CI lint-gate)..."
echo ""

# 1. Check formatting
log "[$CYAN 1/4$COLOR_RESET] Checking$MAGENTA formatting$COLOR_RESET..."
# Capture state before formatting
BEFORE_HASH=$(git diff -- '*.f90' '*.fpp' '*.py' 2>/dev/null | compute_hash)
if ! ./mfc.sh format -j "$JOBS" > /dev/null 2>&1; then
    error "Formatting check failed to run."
    FAILED=1
else
    # Check if formatting changed any Fortran/Python files
    AFTER_HASH=$(git diff -- '*.f90' '*.fpp' '*.py' 2>/dev/null | compute_hash)
    if [ "$BEFORE_HASH" != "$AFTER_HASH" ]; then
        error "Code was not formatted. Files have been auto-formatted; review and stage the changes."
        echo ""
        git diff --stat -- '*.f90' '*.fpp' '*.py' 2>/dev/null || true
        echo ""
        FAILED=1
    else
        ok "Formatting check passed."
    fi
fi

# 2. Spell check
log "[$CYAN 2/4$COLOR_RESET] Running$MAGENTA spell check$COLOR_RESET..."
if ./mfc.sh spelling > /dev/null 2>&1; then
    ok "Spell check passed."
else
    error "Spell check failed. Run$MAGENTA ./mfc.sh spelling$COLOR_RESET for details."
    FAILED=1
fi

# 3. Lint toolchain (Python)
log "[$CYAN 3/4$COLOR_RESET] Running$MAGENTA toolchain lint$COLOR_RESET..."
if ./mfc.sh lint > /dev/null 2>&1; then
    ok "Toolchain lint passed."
else
    error "Toolchain lint failed. Run$MAGENTA ./mfc.sh lint$COLOR_RESET for details."
    FAILED=1
fi

# 4. Source code lint checks
log "[$CYAN 4/4$COLOR_RESET] Running$MAGENTA source lint$COLOR_RESET checks..."
SOURCE_FAILED=0

# Check for raw OpenACC/OpenMP directives
if grep -qiR '!\$acc\|!\$omp' --exclude="parallel_macros.fpp" --exclude="acc_macros.fpp" --exclude="omp_macros.fpp" --exclude="shared_parallel_macros.fpp" --exclude="syscheck.fpp" ./src/* 2>/dev/null; then
    error "Found raw OpenACC/OpenMP directives. Use macros instead."
    SOURCE_FAILED=1
fi

# Check for double precision intrinsics
if grep -qiR 'double_precision\|dsqrt\|dexp\|dlog\|dble\|dabs\|double\ precision\|real(8)\|real(4)\|dprod\|dmin\|dmax\|dfloat\|dreal\|dcos\|dsin\|dtan\|dsign\|dtanh\|dsinh\|dcosh\|d0' --exclude-dir=syscheck --exclude="*nvtx*" --exclude="*precision_select*" ./src/* 2>/dev/null; then
    error "Found double precision intrinsics. Use generic intrinsics."
    SOURCE_FAILED=1
fi

# Check for junk code patterns
if grep -qiR -e '\.\.\.' -e '\-\-\-' -e '===' ./src/* 2>/dev/null; then
    error "Found junk code patterns (..., ---, ===) in source."
    SOURCE_FAILED=1
fi

if [ $SOURCE_FAILED -eq 0 ]; then
    ok "Source lint passed."
else
    FAILED=1
fi
CI Fragility

The new polling job uses gh api .../check-runs and assumes check-run names like Lint Gate and names starting with Github. If check names change (matrix naming, capitalization) the gate may hang until timeout or incorrectly block benchmarks. Also consider whether GITHUB_TOKEN has sufficient permissions in all trigger contexts (notably PRs from forks) for querying check-runs; otherwise this job may fail unexpectedly.

wait-for-tests:
  name: Wait for Test Suite
  runs-on: ubuntu-latest
  steps:
    - name: Wait for Test Suite to Pass
      env:
        GH_TOKEN: ${{ github.token }}
      run: |
        echo "Waiting for Test Suite workflow to complete..."
        SHA="${{ github.event.pull_request.head.sha || github.sha }}"

        # Poll every 60 seconds for up to 3 hours
        for i in $(seq 1 180); do
          # Get the Test Suite workflow runs for this commit
          STATUS=$(gh api repos/${{ github.repository }}/commits/$SHA/check-runs \
            --jq '.check_runs[] | select(.name == "Lint Gate") | .conclusion' | head -1)

          if [ "$STATUS" = "success" ]; then
            echo "Lint Gate passed. Checking test jobs..."

            # Check if any Github test jobs failed
            FAILED=$(gh api repos/${{ github.repository }}/commits/$SHA/check-runs \
              --jq '[.check_runs[] | select(.name | startswith("Github")) | select(.conclusion == "failure")] | length')

            if [ "$FAILED" != "0" ]; then
              echo "::error::Test Suite has failing jobs. Benchmarks will not run."
              exit 1
            fi

            # Check if Github tests are still running
            PENDING=$(gh api repos/${{ github.repository }}/commits/$SHA/check-runs \
              --jq '[.check_runs[] | select(.name | startswith("Github")) | select(.conclusion == null)] | length')

            if [ "$PENDING" = "0" ]; then
              echo "All Test Suite jobs completed successfully!"
              exit 0
            fi

            echo "Tests still running ($PENDING pending)..."
          elif [ "$STATUS" = "failure" ]; then
            echo "::error::Lint Gate failed. Benchmarks will not run."
            exit 1
          else
            echo "Lint Gate status: ${STATUS:-pending}..."
          fi

          sleep 60
        done

        echo "::error::Timeout waiting for Test Suite to complete."
        exit 1

@codeant-ai
Copy link
Contributor

codeant-ai bot commented Feb 5, 2026

CodeAnt AI finished reviewing your PR.

Copy link
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

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

Pull request overview

This PR implements follow-up improvements to the CI and developer experience workflow introduced in #1122, focusing on shell completion auto-installation, completion auto-updates, and pre-commit hook enhancements.

Changes:

  • Auto-install shell completions to ~/.local/share/mfc/completions/ on first ./mfc.sh run, with automatic rc file configuration for bash/zsh
  • Auto-update installed completions when generated files are newer than installed copies
  • Enhanced pre-commit hook with parallelism capped at 12 jobs and visible job count in output
  • Fixed bash/zsh tab completion to prevent unwanted directory fallback by removing -o bashdefault
  • Clarified documentation distinguishing --debug (compiler flags), -v/-vv/-vvv (verbosity), and --debug-log (toolchain debugging)

Reviewed changes

Copilot reviewed 1 out of 1 changed files in this pull request and generated 2 comments.

Show a summary per file
File Description
mfc.sh Auto-install shell completions and pre-commit hook on first run, with rc file modifications
toolchain/main.py Auto-update installed completions when regenerated files are newer
toolchain/mfc/cli/completion_gen.py Remove -o bashdefault from bash completions and add explicit no-op for empty zsh commands
toolchain/bootstrap/precheck.sh New precheck script for local CI validation before commits
toolchain/mfc/cli/commands.py Add PRECHECK_COMMAND definition and clarify flag documentation
toolchain/mfc/cli/docs_gen.py Update documentation for debug and verbosity flags
.githooks/pre-commit New pre-commit hook with capped parallelism (max 12 jobs)
.github/workflows/test.yml Add lint-gate job and concurrency groups
.github/workflows/coverage.yml Add concurrency configuration
.github/workflows/cleanliness.yml Add concurrency configuration
.github/workflows/bench.yml Add concurrency and wait-for-tests job with polling logic
Comments suppressed due to low confidence (2)

mfc.sh:42

  • The shell completion auto-install logic modifies user's shell rc files (.bashrc/.zshrc) without explicit user consent. This could be considered intrusive. Consider either:
  1. Prompting the user before modifying their shell rc files, or
  2. Printing a clear message explaining what was added and how to remove it if desired.

Additionally, the check on line 38 only verifies if COMPLETION_DIR exists in the rc file, which could produce false positives if the directory path appears in an unrelated context.

    if [ -f "$RC_FILE" ] && ! grep -q "$COMPLETION_DIR" "$RC_FILE" 2>/dev/null; then
        echo "" >> "$RC_FILE"
        echo "# MFC shell completion" >> "$RC_FILE"
        echo "$RC_LINE" >> "$RC_FILE"
    fi

mfc.sh:16

  • The symlink creation could fail silently if the user doesn't have write permissions to .git/hooks/ or if the target doesn't exist. Consider adding error handling to inform the user if the hook installation fails.
if [ -d "$(pwd)/.git" ] && [ ! -e "$(pwd)/.git/hooks/pre-commit" ] && [ -f "$(pwd)/.githooks/pre-commit" ]; then
    ln -sf "$(pwd)/.githooks/pre-commit" "$(pwd)/.git/hooks/pre-commit"
    log "Installed git pre-commit hook (runs$MAGENTA ./mfc.sh precheck$COLOR_RESET before commits)."

Check if installed completions are older than source files and
update them automatically. Shows message with source command
only on install or update, silent otherwise.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Replace polling-based wait-for-tests job with workflow_run trigger
  that fires when Test Suite completes (more efficient, no wasted
  runner minutes)
- Extract shell completion setup from mfc.sh to dedicated
  toolchain/bootstrap/completions.sh script for better maintainability

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 3

🤖 Fix all issues with AI agents
In @.github/workflows/bench.yml:
- Around line 48-51: The current workflow sets author using
github.event.workflow_run.actor.login which can be the re-runner, not the PR
author; when PR_NUMBER is present, call the GitHub API to fetch the PR metadata
(GET /repos/{owner}/{repo}/pulls/{PR_NUMBER}) and extract the pull request
author login (user.login) and write that to GITHUB_OUTPUT instead of
github.event.workflow_run.actor.login; update the block that defines PR_NUMBER
and author (the PR_NUMBER variable and the echo "author=..." line) to detect
PR_NUMBER, query the API (using gh api or curl with GITHUB_TOKEN), parse
.user.login, and echo "author=<pr_author>" >> $GITHUB_OUTPUT so downstream gates
use the real PR author.

In `@toolchain/bootstrap/completions.sh`:
- Around line 60-67: The sourced-detection using BASH_SOURCE in the if condition
is bash-specific and fails silently in zsh; update the detection logic around
the BASH_SOURCE check so it handles zsh too (or use a portable fallback): detect
sourcing by checking both bash's BASH_SOURCE and zsh's $ZSH_VERSION or checking
if the current shell differs from the parent via "${BASH_SOURCE[1]} != ${0}" OR
a zsh-compatible test (e.g., [[ -n $ZSH_VERSION && $ZSH_EVAL_CONTEXT == *:file:*
]]) before sourcing "$COMPLETION_FILE" and calling log "Tab completions
activated.", while preserving the existing else branch that uses SOURCE_CMD and
log for manual instructions.
- Around line 38-56: The script is copying completion files without verifying
their presence; before any cp from "$COMPLETION_SRC/mfc.bash" and
"$COMPLETION_SRC/_mfc" (used in both the fresh-install and update branches where
COMPLETION_FILE or SOURCE_FILE logic runs), check that those source files exist
and are readable, and only perform the copy and set COMPLETIONS_CHANGED=true if
they do; if either is missing, avoid copying and either log a warning to stderr
(e.g., mention COMPLETION_SRC and which file is missing) or skip silently so the
script doesn't fail when toolchain/completions hasn't been generated yet, and
keep the existing RC_FILE/RC_LINE addition behavior only after successful copy.

Filter out individual package lines (+ pkg==1.0) from uv output
while keeping progress info (Resolved, Built, Installed). Use -v
flag to see full package list.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Copy link
Contributor

@cubic-dev-ai cubic-dev-ai bot left a comment

Choose a reason for hiding this comment

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

2 issues found across 3 files (changes from recent commits).

Prompt for AI agents (all issues)

Check if these issues are valid — if so, understand the root cause of each and fix them.


<file name="toolchain/bootstrap/completions.sh">

<violation number="1" location="toolchain/bootstrap/completions.sh:41">
P2: The completion files are copied without verifying the source files exist. If `toolchain/completions/mfc.bash` or `toolchain/completions/_mfc` haven't been generated yet (e.g., fresh clone before running the toolchain), `cp` will fail with an error message that may confuse users. Add an existence check before copying.</violation>
</file>

<file name=".github/workflows/bench.yml">

<violation number="1" location=".github/workflows/bench.yml:51">
P2: Using `workflow_run.actor.login` returns the user who triggered the workflow run, not the PR author. On re-runs by maintainers or other users, this will return the wrong author, potentially bypassing or incorrectly applying the author-based benchmark gate. Consider fetching the actual PR author from the API when `PR_NUMBER` is available.</violation>
</file>

Reply with feedback, questions, or to request a fix. Tag @cubic-dev-ai to re-run a review.

sbryngelson and others added 2 commits February 5, 2026 11:23
Remove decorative boxes and condense layout while keeping all
essential information: commands with aliases, descriptions, and
quick start guide.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Now ./mfc.sh init -v and similar commands respect verbosity
flags during venv/package installation.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 1

🤖 Fix all issues with AI agents
In `@mfc.sh`:
- Around line 53-71: Several bootstrap invocations (the calls that source
lint.sh, format.sh, spelling.sh and precheck.sh after the shift) use unquoted $@
which breaks arguments with spaces; change each occurrence like shift; .
"$(pwd)/toolchain/bootstrap/lint.sh" $@ to quote the arguments as shift; .
"$(pwd)/toolchain/bootstrap/lint.sh" "$@" (and do the same for format.sh,
spelling.sh, precheck.sh), and also ensure the similar $@ usage near the
python.sh invocation earlier (around the referenced line 51) is consistently
quoted as "$@".

sbryngelson and others added 3 commits February 5, 2026 11:43
When only flags are given without a command, show help screen
instead of passing flags to main.py which would error.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Use the CLI schema from commands.py instead of hardcoded
descriptions for the compact splash screen.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
1. Fix workflow_run.actor.login returning re-runner instead of PR author
   by fetching actual PR author from GitHub API

2. Quote all $@ in mfc.sh to handle arguments with spaces correctly

3. Add existence check for completion source files before copying
   (prevents errors on fresh clones before generation)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 1

🤖 Fix all issues with AI agents
In `@mfc.sh`:
- Around line 87-92: The shell wrapper in mfc.sh incorrectly drops flags by
treating any leading option as "no command"; update the conditional so it only
treats the no-argument case as empty (i.e., keep the check for -z "$1" only) and
always forward all arguments to python3 "$(pwd)/toolchain/main.py" when any
arguments exist (so remove the [[ "$1" == -* ]] branch and call main.py with
"$@"); this preserves flags like -v and lets main.py's _get_command_from_args()
parse mixed option/command ordering.
🧹 Nitpick comments (1)
.github/workflows/bench.yml (1)

41-69: Quote variables for robustness (static analysis).

Static analysis flags unquoted variable expansions throughout this script block. While $GITHUB_OUTPUT and other GitHub-provided variables typically don't contain spaces, quoting is still best practice. Additionally, if the gh api call fails or returns unexpected output, $APPROVED could be empty, causing the arithmetic comparison on Line 59 to fail.

🛠️ Proposed fix
           if [ "${{ github.event_name }}" = "workflow_dispatch" ]; then
-            echo "pr_number=" >> $GITHUB_OUTPUT
-            echo "approved=true" >> $GITHUB_OUTPUT
-            echo "author=${{ github.actor }}" >> $GITHUB_OUTPUT
+            echo "pr_number=" >> "$GITHUB_OUTPUT"
+            echo "approved=true" >> "$GITHUB_OUTPUT"
+            echo "author=${{ github.actor }}" >> "$GITHUB_OUTPUT"
           else
             # Get PR number from workflow_run
             PR_NUMBER="${{ github.event.workflow_run.pull_requests[0].number }}"
             if [ -n "$PR_NUMBER" ]; then
-              echo "pr_number=$PR_NUMBER" >> $GITHUB_OUTPUT
+              echo "pr_number=$PR_NUMBER" >> "$GITHUB_OUTPUT"

               # Fetch actual PR author from API (workflow_run.actor is the re-runner, not PR author)
               PR_AUTHOR=$(gh api repos/${{ github.repository }}/pulls/$PR_NUMBER --jq '.user.login')
-              echo "author=$PR_AUTHOR" >> $GITHUB_OUTPUT
+              echo "author=$PR_AUTHOR" >> "$GITHUB_OUTPUT"

               # Check if PR is approved
               APPROVED=$(gh api repos/${{ github.repository }}/pulls/$PR_NUMBER/reviews \
                 --jq '[.[] | select(.state == "APPROVED")] | length')
-              if [ "$APPROVED" -gt 0 ]; then
-                echo "approved=true" >> $GITHUB_OUTPUT
+              if [ "${APPROVED:-0}" -gt 0 ]; then
+                echo "approved=true" >> "$GITHUB_OUTPUT"
               else
-                echo "approved=false" >> $GITHUB_OUTPUT
+                echo "approved=false" >> "$GITHUB_OUTPUT"
               fi
             else
-              echo "pr_number=" >> $GITHUB_OUTPUT
-              echo "approved=false" >> $GITHUB_OUTPUT
-              echo "author=" >> $GITHUB_OUTPUT
+              echo "pr_number=" >> "$GITHUB_OUTPUT"
+              echo "approved=false" >> "$GITHUB_OUTPUT"
+              echo "author=" >> "$GITHUB_OUTPUT"
             fi
           fi

The ${APPROVED:-0} default ensures the arithmetic comparison doesn't fail if the API call returns empty.

@codecov
Copy link

codecov bot commented Feb 5, 2026

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 44.03%. Comparing base (7b35b59) to head (1e863ae).

Additional details and impacted files
@@           Coverage Diff           @@
##           master    #1124   +/-   ##
=======================================
  Coverage   44.03%   44.03%           
=======================================
  Files          70       70           
  Lines       20649    20649           
  Branches     2053     2053           
=======================================
  Hits         9093     9093           
  Misses      10368    10368           
  Partials     1188     1188           

☔ View full report in Codecov by Sentry.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.

sbryngelson and others added 2 commits February 5, 2026 15:39
Truncation hides important context when diagnosing build failures.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
--debug-log only enables Python toolchain logging, while --debug
enables debug compiler flags which is actually useful for
diagnosing build and run failures.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
@codeant-ai
Copy link
Contributor

codeant-ai bot commented Feb 5, 2026

CodeAnt AI is running Incremental review


Thanks for using CodeAnt! 🎉

We're free for open-source projects. if you're enjoying it, help us grow by sharing.

Share on X ·
Reddit ·
LinkedIn

@codeant-ai codeant-ai bot added size:L This PR changes 100-499 lines, ignoring generated files and removed size:L This PR changes 100-499 lines, ignoring generated files labels Feb 5, 2026
@codeant-ai
Copy link
Contributor

codeant-ai bot commented Feb 5, 2026

CodeAnt AI Incremental review completed.

- Scan all args for a non-flag to detect if a command is present,
  so ./mfc.sh -v build works correctly instead of dropping args
- Use ZSH_VERSION instead of $SHELL for shell detection (detects
  the running shell, not the login shell)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 1

🤖 Fix all issues with AI agents
In `@toolchain/bootstrap/completions.sh`:
- Around line 56-61: The update condition only checks a single SOURCE_FILE vs
COMPLETION_FILE and can miss newer source scripts for the other shell; change
the logic to independently compare each source file (e.g.
"$COMPLETION_SRC/mfc.bash" and "$COMPLETION_SRC/_mfc") against their respective
destination files in "$COMPLETION_DIR" and copy each file when its source is
newer, setting COMPLETIONS_CHANGED=true if either copy occurs; locate the block
that references SOURCE_FILE, COMPLETION_FILE, COMPLETION_SRC, COMPLETION_DIR,
mfc.bash and _mfc and replace the single conditional with two checks (one per
file) that perform cp and set the flag when needed.

@sbryngelson
Copy link
Member Author

/improve

sbryngelson and others added 4 commits February 5, 2026 16:50
The pyrometheus dependency requires Python >= 3.12. The previous
minimum of 3.11 would allow bootstrapping but fail at package
installation.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Pin pyrometheus to commit 49833404f (before it added a Python >= 3.12
requirement) so MFC can support Python 3.10+. Verified that bootstrap,
build, and chemistry test cases all pass with Python 3.10.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Enables verbose output in CI for easier debugging of failures.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Missed these in the previous commit — adds verbose output to the
codecov build/test and the GitHub-hosted runner build/test steps.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 2

🤖 Fix all issues with AI agents
In @.github/workflows/coverage.yml:
- Around line 41-45: The workflow uses unquoted command substitution for
parallelism in the Build and Test steps (the run lines invoking "mfc.sh build -v
-j $(nproc) --gcov" and "mfc.sh test -v -a -j $(nproc)"), which triggers
actionlint SC2046; fix it by quoting the command substitutions so they read "-j
\"$(nproc)\"" in both the Build (mfc.sh build) and Test (mfc.sh test) run
commands to prevent word-splitting and satisfy actionlint.

In @.github/workflows/frontier_amd/bench.sh:
- Around line 18-21: ShellCheck warns about unquoted variables causing
word-splitting: in the bench invocation inside the if/else branch (condition
checks job_device and calls ./mfc.sh bench), quote the $n_ranks and the command
substitution $(nproc) so they become "$n_ranks" and "$(nproc)"; update the two
occurrences in the bench command lines that call ./mfc.sh so the -j arguments
are quoted, leaving job_device, job_slug and device_opts usage unchanged.

Comment on lines 41 to +45
- name: Build
run: /bin/bash mfc.sh build -j $(nproc) --gcov
run: /bin/bash mfc.sh build -v -j $(nproc) --gcov

- name: Test
run: /bin/bash mfc.sh test -a -j $(nproc)
run: /bin/bash mfc.sh test -v -a -j $(nproc)
Copy link
Contributor

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟠 Major

Fix actionlint SC2046 by quoting $(nproc).

actionlint flags the unquoted command substitution; this can fail the lint gate.

🔧 Suggested fix
-        run: /bin/bash mfc.sh build -v -j $(nproc) --gcov
+        run: /bin/bash mfc.sh build -v -j "$(nproc)" --gcov
@@
-        run: /bin/bash mfc.sh test -v -a -j $(nproc)
+        run: /bin/bash mfc.sh test -v -a -j "$(nproc)"
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
- name: Build
run: /bin/bash mfc.sh build -j $(nproc) --gcov
run: /bin/bash mfc.sh build -v -j $(nproc) --gcov
- name: Test
run: /bin/bash mfc.sh test -a -j $(nproc)
run: /bin/bash mfc.sh test -v -a -j $(nproc)
- name: Build
run: /bin/bash mfc.sh build -v -j "$(nproc)" --gcov
- name: Test
run: /bin/bash mfc.sh test -v -a -j "$(nproc)"
🧰 Tools
🪛 actionlint (1.7.10)

[error] 42-42: shellcheck reported issue in this script: SC2046:warning:1:30: Quote this to prevent word splitting

(shellcheck)


[error] 45-45: shellcheck reported issue in this script: SC2046:warning:1:32: Quote this to prevent word splitting

(shellcheck)

🤖 Prompt for AI Agents
In @.github/workflows/coverage.yml around lines 41 - 45, The workflow uses
unquoted command substitution for parallelism in the Build and Test steps (the
run lines invoking "mfc.sh build -v -j $(nproc) --gcov" and "mfc.sh test -v -a
-j $(nproc)"), which triggers actionlint SC2046; fix it by quoting the command
substitutions so they read "-j \"$(nproc)\"" in both the Build (mfc.sh build)
and Test (mfc.sh test) run commands to prevent word-splitting and satisfy
actionlint.

Comment on lines 18 to +21
if [ "$job_device" = "gpu" ]; then
./mfc.sh bench --mem 12 -j $n_ranks -o "$job_slug.yaml" -- -c frontier_amd $device_opts -n $n_ranks
./mfc.sh bench -v --mem 12 -j $n_ranks -o "$job_slug.yaml" -- -c frontier_amd $device_opts -n $n_ranks
else
./mfc.sh bench --mem 1 -j $(nproc) -o "$job_slug.yaml" -- -c frontier_amd $device_opts -n $n_ranks
./mfc.sh bench -v --mem 1 -j $(nproc) -o "$job_slug.yaml" -- -c frontier_amd $device_opts -n $n_ranks
Copy link
Contributor

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟡 Minor

🧩 Analysis chain

🏁 Script executed:

rg -nP '\bjob_slug\b' -C2 .github/workflows

Repository: MFlowCode/MFC

Length of output: 10370


🏁 Script executed:

cat -n .github/workflows/frontier_amd/bench.sh | head -50

Repository: MFlowCode/MFC

Length of output: 1004


🏁 Script executed:

fd -type f -name "*.sh" .github/workflows | head -10

Repository: MFlowCode/MFC

Length of output: 227


🏁 Script executed:

cat -n .github/workflows/frontier_amd/submit-bench.sh

Repository: MFlowCode/MFC

Length of output: 1552


🏁 Script executed:

cat -n .github/workflows/frontier_amd/bench.sh

Repository: MFlowCode/MFC

Length of output: 1004


Quote variables to follow shellcheck recommendations.

Lines 19 and 21 use unquoted $n_ranks and $(nproc), which shellcheck flags for potential word-splitting issues. Quote these for consistency: "$n_ranks" and "$(nproc)".

Note: job_slug is reliably set in the parent sbatch context (submit-bench.sh line 45) before this script is sourced, so a guard is unnecessary.

🔧 Suggested fix
 if [ "$job_device" = "gpu" ]; then
-    ./mfc.sh bench -v --mem 12 -j $n_ranks -o "$job_slug.yaml" -- -c frontier_amd $device_opts -n $n_ranks
+    ./mfc.sh bench -v --mem 12 -j "$n_ranks" -o "$job_slug.yaml" -- -c frontier_amd $device_opts -n "$n_ranks"
 else
-    ./mfc.sh bench -v --mem 1 -j $(nproc) -o "$job_slug.yaml" -- -c frontier_amd $device_opts -n $n_ranks
+    ./mfc.sh bench -v --mem 1 -j "$(nproc)" -o "$job_slug.yaml" -- -c frontier_amd $device_opts -n "$n_ranks"
 fi
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
if [ "$job_device" = "gpu" ]; then
./mfc.sh bench --mem 12 -j $n_ranks -o "$job_slug.yaml" -- -c frontier_amd $device_opts -n $n_ranks
./mfc.sh bench -v --mem 12 -j $n_ranks -o "$job_slug.yaml" -- -c frontier_amd $device_opts -n $n_ranks
else
./mfc.sh bench --mem 1 -j $(nproc) -o "$job_slug.yaml" -- -c frontier_amd $device_opts -n $n_ranks
./mfc.sh bench -v --mem 1 -j $(nproc) -o "$job_slug.yaml" -- -c frontier_amd $device_opts -n $n_ranks
if [ "$job_device" = "gpu" ]; then
./mfc.sh bench -v --mem 12 -j "$n_ranks" -o "$job_slug.yaml" -- -c frontier_amd $device_opts -n "$n_ranks"
else
./mfc.sh bench -v --mem 1 -j "$(nproc)" -o "$job_slug.yaml" -- -c frontier_amd $device_opts -n "$n_ranks"
fi
🧰 Tools
🪛 Shellcheck (0.11.0)

[warning] 19-19: job_slug is referenced but not assigned.

(SC2154)


[warning] 21-21: Quote this to prevent word splitting.

(SC2046)

🤖 Prompt for AI Agents
In @.github/workflows/frontier_amd/bench.sh around lines 18 - 21, ShellCheck
warns about unquoted variables causing word-splitting: in the bench invocation
inside the if/else branch (condition checks job_device and calls ./mfc.sh
bench), quote the $n_ranks and the command substitution $(nproc) so they become
"$n_ranks" and "$(nproc)"; update the two occurrences in the bench command lines
that call ./mfc.sh so the -j arguments are quoted, leaving job_device, job_slug
and device_opts usage unchanged.

The Python 3.10 compatibility changes have been merged upstream,
so we no longer need to pin to a specific commit.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Copy link
Contributor

@cubic-dev-ai cubic-dev-ai bot left a comment

Choose a reason for hiding this comment

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

1 issue found across 1 file (changes from recent commits).

Prompt for AI agents (all issues)

Check if these issues are valid — if so, understand the root cause of each and fix them.


<file name="toolchain/pyproject.toml">

<violation number="1">
P2: Dependency is no longer pinned to a specific commit or tag, making builds non-reproducible and susceptible to upstream changes. Pin the Git dependency to a commit hash or release tag.</violation>
</file>

Reply with feedback, questions, or to request a fix. Tag @cubic-dev-ai to re-run a review.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Review effort 4/5 size:L This PR changes 100-499 lines, ignoring generated files

Development

Successfully merging this pull request may close these issues.

1 participant