Skip to content

Conversation

@bashandbone
Copy link
Contributor

@bashandbone bashandbone commented Dec 6, 2025

This pull request updates the GitHub Actions workflows as a fix to a CI-breaking workflow caused by changes in mise configuration and setup. It also improves how Python environments are set up and managed using Mise, and enhances workflow outputs and environment configuration for better reliability and maintainability. The main changes are grouped below by theme.

Mise Environment Setup & Workflow Outputs

  • Added detailed outputs to the setup-mise-env action, including MISE_PATH, MISE_ENV, PROFILE, PYTHON_VERSION, and PYTHON_PATH, making it easier for subsequent steps to access environment details.
  • Disabled automatic environment export (env: false) in all Mise setup steps, and explicitly added Mise to the PATH in output steps to ensure consistent environment configuration. [1] [2] [3]

Workflow Improvements & Reliability

  • Updated reusable test workflow to use the new Mise-based Python setup, adjusted naming for clarity, and ensured PATH includes Mise binaries for quality checks and test runs. [1] [2] [3] [4]
  • Improved experimental Python test setup by removing unnecessary flags from uv sync for cleaner dependency resolution.

CI/CD Configuration Enhancements

  • Passed additional parameters (test-markers, upload-coverage, run-quality-checks) to the test workflow from the main CI workflow for more flexible and granular control.
  • Updated comments for clarity in the build workflow configuration.

Copilot Setup Workflow

  • Added steps to set up and verify the Mise environment in the copilot-setup-steps.yml workflow, ensuring Python 3.13 is correctly installed and Mise is available in the path.

Note

  • There are currently failing tests; those are unrelated and will be addressed in another PR.

Summary by Sourcery

Update CI workflows and mise-based environment setup for Python tooling, MCP registry publishing, and automation reliability.

New Features:

  • Add a scheduled workflow to automatically mark and close stale issues and pull requests.
  • Expose outputs from the setup-uv-env and setup-python-env composite actions for downstream workflow steps.
  • Provide richer outputs from the setup-mise-env action to expose mise and Python environment details to workflows.

Bug Fixes:

  • Fix CI breakages caused by changes in mise configuration by standardizing on MISE_PYTHON_VERSION and improving free-threaded Python handling in workflows and tasks.
  • Correct MCP registry submission by replacing the mcp-publisher CLI usage with a direct signed HTTP publishing flow and more informative failure reporting.
  • Ensure Copilot and Claude workflows correctly initialize the mise dev environment before running automation steps.
  • Allow MCP registry submissions to run on prereleases and ensure the correct tag is checked out with shallow fetches.

Enhancements:

  • Refine reusable test, lint, build, and release workflows to use mise- and uv-based Python setup consistently and pass configuration via inputs and env.
  • Improve mise and uv task configuration (mise.toml and mise.dev.toml) for more robust virtualenv creation, cloud setup, quality checks, and formatting tools.
  • Simplify and harden MCP server.json generation and reporting, including versioned server URLs in summaries.
  • Tighten dev-shell initialization and remove VS Code-specific extras sourcing for a cleaner shell setup.
  • Update dependencies to the latest pydantic patch release.

CI:

  • Broaden the MCP registry submission workflow to handle prereleases and streamline JSON generation and submission steps.
  • Standardize Python and uv setup across reusable test, lint, build, CI, release, Claude, Copilot, and MCP workflows using shared composite actions and environment variables.
  • Add configurable test markers, coverage upload control, and quality-check toggles to the reusable test workflow and wire them into the main CI and release workflows.
  • Introduce a scheduled stale issue/PR workflow using actions/stale to keep the issue tracker tidy.

Documentation:

  • Clarify and expand inline comments in workflows and mise configuration to document environment behavior and CodeQL resource limits.

Tests:

  • Adjust test matrices and markers in CI and release workflows to cover Python 3.14 and exclude flaky or CI-incompatible tests while reusing mise-based environments.

Chores:

  • Reconfigure formatting and quality tools in mise tasks to use aqua/ubi backends and more robust shell invocations for YAML/TOML formatting.

bashandbone and others added 11 commits December 6, 2025 16:26
The mise-action was hanging during the "Exporting mise environment variables"
step, causing the runner to kill the job with exit code 137 (SIGKILL).

This was happening because:
1. The mise.toml has complex template expressions with command executions
2. The hooks.enter configuration may execute during env export
3. The env export was timing out after ~1 minute

Solution: Disable the env parameter (set to false) in all mise-action
configurations to prevent the hanging during environment variable export.

Fixes #issue
…ZvD3Lo3vX7tdaw9xrKC' into fix-test-ci-action-failures
The previous fix disabled env export to prevent hanging, but this caused
MISE_PATH to be empty because mise wasn't in the PATH.

Changes:
1. Add mise bin directory to PATH in "Set outputs" step
2. Add mise bin directory to PATH in workflow steps that execute mise commands

This ensures:
- The "Set outputs" step can find mise using which
- Workflow steps can execute mise commands via $MISE_PATH
- No hanging during env export (env: false is still set)

Fixes the "command not found" error when running mise commands.
…ZvD3Lo3vX7tdaw9xrKC' into fix-test-ci-action-failures
The composite action was setting outputs in the mise-outputs step, but
those outputs were not being exposed by the action itself because the
action.yml was missing the outputs section.

Changes:
- Add outputs section to action.yml defining all output variables
- Map outputs from mise-outputs step to action outputs

This ensures that steps.setup-mise.outputs.MISE_PATH and other outputs
are properly available to the calling workflow.

Related to the CI skip issue fix.
…ZvD3Lo3vX7tdaw9xrKC' into fix-test-ci-action-failures
Copilot AI review requested due to automatic review settings December 6, 2025 22:40
@bashandbone bashandbone added bug Something isn't working ci-cd Issues affecting ci/cd labels Dec 6, 2025
@sourcery-ai
Copy link
Contributor

sourcery-ai bot commented Dec 6, 2025

Reviewer's Guide

Standardizes and hardens CI workflows around Mise- and uv-based Python environments, simplifies MCP registry submission, and propagates environment details and flags through reusable workflows for more reliable, debuggable automation.

Sequence diagram for MCP Registry submission workflow

sequenceDiagram
    actor Developer
    participant GitHubActions as GitHub_Actions_Workflow
    participant SetupUV as setup-uv-env_action
    participant SubmitStep as Submit_to_MCP_Registry_step
    participant OpenSSL as openssl_pkeyutl
    participant MCPAuth as MCP_Registry_Auth_v0_1
    participant MCPPub as MCP_Registry_Publish_v0_1

    Developer->>GitHubActions: Push_release_or_dispatch
    GitHubActions->>SetupUV: Setup UV and Python environment
    SetupUV-->>GitHubActions: uv-path, uvx-path outputs

    GitHubActions->>SubmitStep: Run submission shell script
    SubmitStep->>SubmitStep: Create temp files (indata, key_file, outfile, request_body)
    SubmitStep->>SubmitStep: Write MCP_REGISTRY_KEY PEM to key_file
    SubmitStep->>SubmitStep: Generate timestamp (RFC3339)
    SubmitStep->>SubmitStep: Write timestamp to indata

    SubmitStep->>OpenSSL: Sign timestamp with ed25519 key
    OpenSSL-->>SubmitStep: Signature bytes
    SubmitStep->>SubmitStep: Hex-encode signature (signed_timestamp)
    SubmitStep->>SubmitStep: Build auth JSON body {domain, signed_timestamp, timestamp}

    SubmitStep->>MCPAuth: POST /v0.1/auth/dns with auth JSON
    MCPAuth-->>SubmitStep: registry_token JSON
    SubmitStep->>SubmitStep: Extract registry_token with jq

    SubmitStep->>MCPPub: POST /v0.1/publish with server.json and Bearer registry_token
    MCPPub-->>SubmitStep: Publication response JSON
    SubmitStep->>SubmitStep: Extract published_at from _meta.io.modelcontextprotocol.registry/official
    SubmitStep-->>GitHubActions: MCP_PUBLICATION_TIME output

    GitHubActions-->>Developer: Step summary with version, status, published_at URL
Loading

Flow diagram for setup-mise-env composite action and free-threaded Python handling

flowchart TD
    Start["Start setup-mise-env"] --> Checkout["Checkout repository (optional)"]
    Checkout --> FreeDisk["Free up disk space script"]
    FreeDisk --> SysDeps["Install system dependencies (curl, git, build libs)"]

    SysDeps --> SetFTEnv["Set up Environment for Free-Threaded Python"]
    SetFTEnv --> CheckFT{Ends with 't'?}

    CheckFT -- No --> StdPy["Use standard Python version\nMISE_PYTHON_VERSION=inputs.python-version\nUV_PYTHON=inputs.python-version"]
    CheckFT -- Yes --> FTPy["Free-threaded Python requested\nMISE_PYTHON_VERSION=base_version\nUV_PYTHON=base_version+freethreaded"]

    StdPy --> ProfileDecision
    FTPy --> ProfileDecision

    ProfileDecision{Profile}
    ProfileDecision -- minimal --> MiseMinimal["Setup Mise profile=minimal\n(env: false, cache, install)"]
    ProfileDecision -- reviewer --> MiseReviewer["Setup Mise profile=reviewer\n(MISE_ENV=dev, env: false)"]
    ProfileDecision -- dev --> MiseDev["Setup Mise profile=dev\n(MISE_ENV=dev, env: false)"]

    MiseReviewer --> ActivateReviewer["Activate Reviewer Environment\nuv sync and mise commands"]

    MiseDev --> MaybeInsertFT{Free-threaded?}
    MaybeInsertFT -- No --> ActivateDev
    MaybeInsertFT -- Yes --> InsertFT["Insert Free-Threaded Python into Dev Profile\nuse uv to install cpython-UV_PYTHON\nrun mise sync python --uv"] --> ActivateDev

    ActivateDev["Activate Dev Profile Environment\n- mise activate bash --shims\n- mise doctor\n- mise use -g uv@latest\n- mise //:cloud-setup"]

    MiseMinimal --> Outputs
    ActivateReviewer --> Outputs
    ActivateDev --> Outputs

    Outputs["Set outputs (MISE_PATH, MISE_ENV, PROFILE, PYTHON_PATH, MISE_PYTHON_VERSION, bin dirs)"] --> End["End setup-mise-env"]
Loading

File-Level Changes

Change Details Files
Refactor MCP registry submission workflow to use shared uv setup, support prereleases, and call the official MCP registry auth/publish APIs directly instead of the mcp-publisher CLI.
  • Trigger MCP registry workflow on prereleased releases and use shallow checkout for efficiency.
  • Replace ad-hoc Python and uv setup with the shared setup-uv-env composite action and emit uv tool paths as outputs.
  • Simplify server.json generation and remove inline JSON mutation and validation scripts, delegating validation to the registry API.
  • Remove mcp-publisher installation/usage and implement DNS-based auth by signing a timestamp with the ed25519 private key via openssl, then POST to auth and publish endpoints with error reporting and publication time output.
  • Improve step summaries by including publication timestamp and a versioned, URL-encoded link to the published server entry.
.github/workflows/mcp-registry-submit.yml
.github/actions/setup-uv-env/action.yml
Enhance the setup-mise-env composite action to be the single source of truth for CI Python/Mise setup, including support for free-threaded Python and richer outputs.
  • Add a mise-debug input and expose MISE_PATH, MISE_ENV, PROFILE, PYTHON_PATH, and MISE_PYTHON_VERSION as action outputs, computing corresponding bin directories.
  • Insert an early system dependency install, disk-space cleanup, and environment preparation to support building Python and using uv reliably in CI.
  • Introduce logic to distinguish standard vs free-threaded Python versions, wiring MISE_PYTHON_VERSION and UV_PYTHON appropriately for each profile.
  • Disable Mise env auto-export in all profiles, instead explicitly activating shims and running profile-specific tasks (including a new cloud-setup path for dev).
  • Tighten reviewer/dev profile activation (uv sync, cloud-setup) and ensure env variables like MISE_VERBOSE and MISE_GITHUB_TOKEN are consistently wired.
.github/actions/setup-mise-env/action.yml
mise.dev.toml
Align mise.toml and mise.dev.toml with the new CI model by centralizing Python version control via MISE_PYTHON_VERSION and improving tooling tasks for venv, lint, format, and cloud/dev environments.
  • Introduce MISE_PYTHON_VERSION and use it for the default python tool, uv venv creation, and test/test-cov tasks instead of the previous MISE_PYTHON variable.
  • Relax some aggressive mise python settings and add comments clarifying how tools are resolved (pipx, aqua, ubi, etc.).
  • Make venv-related tasks more robust by creating the venv on demand, using uv venv with MISE_PYTHON_VERSION, and handling activation failures gracefully.
  • Modernize quality/formatting tool configuration by switching tombi/ty/typos installation backends and simplifying YAML/TOML formatting commands to avoid rust-parallel.
  • Add a cloud-setup task to bootstrap cloud CI/agent environments with mise, hk, uv, a .venv, dependency sync, and .gitignore wiring using MISE_PYTHON_VERSION.
mise.toml
mise.dev.toml
Standardize reusable CI workflows (tests, lint, build, release, and Copilot/Claude workflows) around the new Mise-based Python environment and propagate control flags from callers.
  • In _reusable-test, move common env to workflow-level, drive Python selection via MISE_PYTHON_VERSION, use setup-mise-env for all matrix entries (including experimental), and run checks with mise run instead of direct mise //: calls.
  • Simplify experimental Python handling by dropping a separate setup-python-env-based flow and relying on uv sync defaults.
  • Wire CI and release workflows to pass test markers, coverage upload, and run-quality-checks flags into _reusable-test, and extend release tests to include Python 3.14.
  • Update _reusable-lint to use setup-mise-env with a reviewer profile, derive MISE_PYTHON_VERSION from inputs, and run lint/format via mise run with minimal env boilerplate.
  • Ensure Copilot and Claude workflows set appropriate Mise env vars and call setup-mise-env, including a simple verification step for mise setup in Copilot.
.github/workflows/_reusable-test.yml
.github/workflows/ci.yml
.github/workflows/release.yml
.github/workflows/_reusable-lint.yml
.github/workflows/copilot-setup-steps.yml
.github/workflows/claude.yml
.github/actions/setup-python-env/action.yml
.github/workflows/_reusable-build.yml
Tidy local dev shell and VS Code integration, bump a core dependency, and add automated stale issue/PR management.
  • Remove sourcing of VS Code-specific terminal extras from the zsh dev-shell init script to decouple shell startup from editor-specific configs.
  • Add a new GitHub Actions workflow using actions/stale to auto-mark and close inactive issues/PRs based on labels and time thresholds.
  • Bump pydantic from 2.12.4 to 2.12.5 in pyproject.toml and update uv.lock accordingly to keep dependencies current.
scripts/dev-env/dev-shell-init.zsh
.github/workflows/stale.yml
pyproject.toml
uv.lock

Tips and commands

Interacting with Sourcery

  • Trigger a new review: Comment @sourcery-ai review on the pull request.
  • Continue discussions: Reply directly to Sourcery's review comments.
  • Generate a GitHub issue from a review comment: Ask Sourcery to create an
    issue from a review comment by replying to it. You can also reply to a
    review comment with @sourcery-ai issue to create an issue from it.
  • Generate a pull request title: Write @sourcery-ai anywhere in the pull
    request title to generate a title at any time. You can also comment
    @sourcery-ai title on the pull request to (re-)generate the title at any time.
  • Generate a pull request summary: Write @sourcery-ai summary anywhere in
    the pull request body to generate a PR summary at any time exactly where you
    want it. You can also comment @sourcery-ai summary on the pull request to
    (re-)generate the summary at any time.
  • Generate reviewer's guide: Comment @sourcery-ai guide on the pull
    request to (re-)generate the reviewer's guide at any time.
  • Resolve all Sourcery comments: Comment @sourcery-ai resolve on the
    pull request to resolve all Sourcery comments. Useful if you've already
    addressed all the comments and don't want to see them anymore.
  • Dismiss all Sourcery reviews: Comment @sourcery-ai dismiss on the pull
    request to dismiss all existing Sourcery reviews. Especially useful if you
    want to start fresh with a new review - don't forget to comment
    @sourcery-ai review to trigger a new review!

Customizing Your Experience

Access your dashboard to:

  • Enable or disable review features such as the Sourcery-generated pull request
    summary, the reviewer's guide, and others.
  • Change the review language.
  • Add, remove or edit custom review instructions.
  • Adjust other review settings.

Getting Help

@github-actions
Copy link
Contributor

github-actions bot commented Dec 6, 2025

👋 Hey @bashandbone,

Thanks for your contribution to codeweaver! 🧵

You need to agree to the CLA first... 🖊️

Before we can accept your contribution, you need to agree to our Contributor License Agreement (CLA).

To agree to the CLA, please comment:

I read the contributors license agreement and I agree to it.

Those exact words are important1, so please don't change them. 😉

You can read the full CLA here: Contributor License Agreement


@bashandbone has signed the CLA.


0 out of 3 committers have signed the CLA.
@bashandbone
@claude
❌ @Copilot
You can retrigger this bot by commenting recheck in this Pull Request. Posted by the CLA Assistant Lite bot.

Footnotes

  1. Our bot needs those exact words to recognize that you agree to the CLA.

Copy link
Contributor

@sourcery-ai sourcery-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.

Hey there - I've reviewed your changes - here's some feedback:

  • In copilot-setup-steps.yml, the Verify Mise Setup command mise --version || echo "Mise not in path" || "$MISE_PATH" --version will never reach the final "$MISE_PATH" --version because echo always succeeds; consider restructuring with if/else or a single || chain so the fallback actually runs.
  • You’re hardcoding $HOME/.local/share/mise/bin in multiple workflow steps while also exposing MISE_PATH from the composite action; consider deriving the bin/shim paths from the action outputs (or centralizing PATH setup) to avoid future drift if Mise’s install location changes.
Prompt for AI Agents
Please address the comments from this code review:

## Overall Comments
- In `copilot-setup-steps.yml`, the `Verify Mise Setup` command `mise --version || echo "Mise not in path" || "$MISE_PATH" --version` will never reach the final `"$MISE_PATH" --version` because `echo` always succeeds; consider restructuring with `if`/`else` or a single `||` chain so the fallback actually runs.
- You’re hardcoding `$HOME/.local/share/mise/bin` in multiple workflow steps while also exposing `MISE_PATH` from the composite action; consider deriving the bin/shim paths from the action outputs (or centralizing PATH setup) to avoid future drift if Mise’s install location changes.

## Individual Comments

### Comment 1
<location> `.github/workflows/copilot-setup-steps.yml:79` </location>
<code_context>
+          MISE_EXPERIMENTAL: 1
+          MISE_PATH: ${{ steps.setup-mise.outputs.MISE_PATH }}
+        run: |
+          mise --version || echo "Mise not in path" || "$MISE_PATH" --version
</code_context>

<issue_to_address>
**issue (bug_risk):** The fallback to use MISE_PATH will never run because the echo command short-circuits the `||` chain.

Because `echo` returns 0, a chain like `mise --version || echo ... || "$MISE_PATH" --version` will always stop at the `echo` and never reach the fallback. To actually run the explicit path when the PATH lookup fails, group the message and fallback together, e.g.:

```bash
mise --version || { echo "Mise not in path"; "$MISE_PATH" --version; }
```
</issue_to_address>

Sourcery is free for open source - if you like our reviews please consider sharing them ✨
Help me be more useful! Please click 👍 or 👎 on each comment and I'll use the feedback to improve your reviews.

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 fixes CI-breaking workflow issues caused by changes in Mise configuration and setup. It enhances Python environment management using Mise and improves workflow reliability through better environment configuration and explicit outputs.

Key Changes:

  • Added structured outputs to the setup-mise-env action (MISE_PATH, MISE_ENV, PROFILE, PYTHON_VERSION, PYTHON_PATH) for better environment visibility
  • Disabled automatic environment export in Mise setup steps and explicitly added Mise to PATH for consistent configuration
  • Updated test workflows to use Mise-based Python setup with improved PATH handling for quality checks and test execution

Reviewed changes

Copilot reviewed 4 out of 4 changed files in this pull request and generated 3 comments.

File Description
.github/actions/setup-mise-env/action.yml Added outputs for environment details, disabled automatic env export, explicitly configured PATH in output step
.github/workflows/copilot-setup-steps.yml Added Mise environment setup and verification steps for Python 3.13
.github/workflows/ci.yml Added workflow parameters for test markers, coverage upload, and quality checks; updated comment for clarity
.github/workflows/_reusable-test.yml Updated step names for clarity, fixed PATH configuration to include Mise binaries, removed unnecessary flags from experimental Python setup

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

@bashandbone bashandbone changed the title Fix: Fix: Mise configuration changes causing blocking CI failures Dec 6, 2025
Co-authored-by: Copilot <[email protected]>
Signed-off-by: Adam Poulemanos <[email protected]>
Copilot AI review requested due to automatic review settings December 6, 2025 22:46
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

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


💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Copy link
Contributor

Copilot AI commented Dec 6, 2025

@bashandbone I've opened a new pull request, #197, to work on those changes. Once the pull request is ready, I'll request review from you.

Copilot AI and others added 3 commits December 6, 2025 22:55
Remove the first instance of "Setup Mise Environment" step (lines 52-58)
as it was a duplicate. The second instance with id: setup-mise is kept
since it's needed for the Verify Mise Setup step that references it.

Co-authored-by: bashandbone <[email protected]>
Remove duplicate Setup Mise Environment step in copilot-setup-steps workflow
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

Copilot reviewed 18 out of 19 changed files in this pull request and generated 1 comment.


💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Copilot AI review requested due to automatic review settings December 8, 2025 22:08
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

Copilot reviewed 18 out of 19 changed files in this pull request and generated 4 comments.


💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

"mise trust > NUL 2>&1",
"mise install > NUL 2>&1 || echo.",
"hk install --mise > NUL 2>&1 || echo.",
"mise trust --all > NUL 2>&1",
Copy link

Copilot AI Dec 8, 2025

Choose a reason for hiding this comment

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

The mise trust --all command is potentially dangerous as it trusts all mise configurations without user confirmation. The --all flag trusts configurations in all parent directories up to the root, which could inadvertently trust malicious configurations in shared or system directories.

Consider using mise trust without the --all flag to only trust the current project's configuration, or add additional safeguards to verify the configuration source before trusting.

Copilot uses AI. Check for mistakes.
"mise trust &>/dev/null",
"mise install &>/dev/null || true",
"hk install --mise &>/dev/null || true",
"mise trust --all &>/dev/null",
Copy link

Copilot AI Dec 8, 2025

Choose a reason for hiding this comment

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

The mise trust --all command is potentially dangerous as it trusts all mise configurations without user confirmation. The --all flag trusts configurations in all parent directories up to the root, which could inadvertently trust malicious configurations in shared or system directories.

Consider using mise trust without the --all flag to only trust the current project's configuration, or add additional safeguards to verify the configuration source before trusting.

Copilot uses AI. Check for mistakes.
Copilot AI review requested due to automatic review settings December 9, 2025 01:48
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

Copilot reviewed 18 out of 19 changed files in this pull request and generated 1 comment.


💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Copilot AI review requested due to automatic review settings December 9, 2025 02:22
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

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


💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

# profile is set to 'dev' in a cloud CI environment for cloud agents. 'enter' tends to break there.
if [ "$profile" = "dev" ] && [ "$CI" = "true" ]; then
# don't run
exit 0
Copy link

Copilot AI Dec 9, 2025

Choose a reason for hiding this comment

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

[nitpick] The comparison operator uses == which is a bash-specific feature. For POSIX compatibility, consider using = instead. However, since the shebang is likely bash, this is acceptable but inconsistent with line 177 in mise.toml which uses =. Consider standardizing the comparison operator across the codebase.

Copilot uses AI. Check for mistakes.
Co-authored-by: Copilot <[email protected]>
Signed-off-by: Adam Poulemanos <[email protected]>
Copilot AI review requested due to automatic review settings December 9, 2025 02:58
@bashandbone bashandbone marked this pull request as ready for review December 9, 2025 02:59
Copy link
Contributor Author

@bashandbone bashandbone left a comment

Choose a reason for hiding this comment

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

Well folks. This was two days of absolute misery. Someone remind me of this next time I consider so much as blinking at CI/CD.

Copy link
Contributor

@sourcery-ai sourcery-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.

Hey there - I've reviewed your changes and found some issues that need to be addressed.

  • The new MCP registry submission step assumes jq, xxd, shred, and recent openssl pkeyutl support are present on the runner; consider either installing/validating these explicitly in the workflow or adding graceful error messages if they are missing or incompatible.
Prompt for AI Agents
Please address the comments from this code review:

## Overall Comments
- The new MCP registry submission step assumes `jq`, `xxd`, `shred`, and recent `openssl pkeyutl` support are present on the runner; consider either installing/validating these explicitly in the workflow or adding graceful error messages if they are missing or incompatible.

## Individual Comments

### Comment 1
<location> `mise.dev.toml:86-87` </location>
<code_context>
+      fi
+  fi''',
+  "echo \"[codeweaver] Using mise...\"",
+  '''if command -v mise &>/dev/null && ! grep -q "mise activate" "$HOME/.bashrc"; then
+    echo "eval \"$(mise activate bash)\" 2>&1 || true" >> "$HOME/.bashrc"
+    fi''',
+  '''if command -v mise &>/dev/null && ! grep -q "mise activate" "$HOME/.bash_profile"; then
</code_context>

<issue_to_address>
**issue (bug_risk):** The `mise activate` command is evaluated during setup instead of at shell startup, and the resulting line in `.bashrc` may be malformed.

Because `$(mise activate bash)` is inside double quotes, it runs during `cloud-setup`, and its (likely multi-line) output is inlined into the `echo`, producing a malformed one-line `eval "..." 2>&1 || true` in `.bashrc`.

To append the literal command for later execution at shell startup, use single quotes so the substitution isn’t evaluated at setup time, e.g.:

```bash
echo 'eval "$(mise activate bash --shims)" 2>/dev/null || true' >> "$HOME/.bashrc"
```

Apply the same pattern to the `.bash_profile` block below.
</issue_to_address>

### Comment 2
<location> `.github/workflows/mcp-registry-submit.yml:160-165` </location>
<code_context>
+            echo -n '"timestamp":"'"$timestamp"'"}'
+          } > "$request_body"
+          echo "Logging in to MCP Registry..."
+          response="$(curl --request POST \
+            --url "https://registry.modelcontextprotocol.io/v0.1/auth/dns" \
+            --header "Accept: application/json, application/problem+json" \
+            --header "Content-Type: application/json" \
+            --data @"$request_body")"
+          token="$(echo "$response" | jq -r '.registry_token')"
+          if [ -z "$token" ] || [ "$token" = "null" ]; then
+            echo "ERROR: Failed to obtain registry token"
</code_context>

<issue_to_address>
**issue (bug_risk):** The registry auth/publish steps assume `jq` is available on the runner, which may not always hold.

Both login and publish parse responses with `jq`, but the workflow never ensures it is installed. While `ubuntu-latest` currently includes `jq`, that’s not guaranteed across all runners or over time, and missing `jq` would cause the registry token/timestamp extraction to fail. Please add an explicit install/verification step early in the job so the workflow doesn’t depend on runner defaults.
</issue_to_address>

Sourcery is free for open source - if you like our reviews please consider sharing them ✨
Help me be more useful! Please click 👍 or 👎 on each comment and I'll use the feedback to improve your reviews.

Comment on lines +86 to +87
'''if command -v mise &>/dev/null && ! grep -q "mise activate" "$HOME/.bashrc"; then
echo "eval \"$(mise activate bash)\" 2>&1 || true" >> "$HOME/.bashrc"
Copy link
Contributor

Choose a reason for hiding this comment

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

issue (bug_risk): The mise activate command is evaluated during setup instead of at shell startup, and the resulting line in .bashrc may be malformed.

Because $(mise activate bash) is inside double quotes, it runs during cloud-setup, and its (likely multi-line) output is inlined into the echo, producing a malformed one-line eval "..." 2>&1 || true in .bashrc.

To append the literal command for later execution at shell startup, use single quotes so the substitution isn’t evaluated at setup time, e.g.:

echo 'eval "$(mise activate bash --shims)" 2>/dev/null || true' >> "$HOME/.bashrc"

Apply the same pattern to the .bash_profile block below.

Comment on lines +160 to +165
response="$(curl --request POST \
--url "https://registry.modelcontextprotocol.io/v0.1/auth/dns" \
--header "Accept: application/json, application/problem+json" \
--header "Content-Type: application/json" \
--data @"$request_body")"
token="$(echo "$response" | jq -r '.registry_token')"
Copy link
Contributor

Choose a reason for hiding this comment

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

issue (bug_risk): The registry auth/publish steps assume jq is available on the runner, which may not always hold.

Both login and publish parse responses with jq, but the workflow never ensures it is installed. While ubuntu-latest currently includes jq, that’s not guaranteed across all runners or over time, and missing jq would cause the registry token/timestamp extraction to fail. Please add an explicit install/verification step early in the job so the workflow doesn’t depend on runner defaults.

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

Copilot reviewed 18 out of 19 changed files in this pull request and generated 5 comments.

Comments suppressed due to low confidence (1)

.vscode/terminal.extra.zsh:40

  • [nitpick] Inconsistent indentation in the else block. Lines 33-40 have mixed indentation levels - the chmod command and subsequent lines are indented with spaces, creating a confusing code structure.

The code should have consistent indentation:

else
  REPO_ROOT="$(git rev-parse --show-toplevel 2>/dev/null || echo "${PWD}")"
  # Mise is not installed, run the install script
  chmod -R +x "${REPO_ROOT}/scripts" || {
    print -P "%F{209}[codeweaver]%f %F{red}Failed to make install scripts executable!%f"
  }
  print -P "%F{209}[codeweaver]%f Installing Mise for the first time..."
  "${REPO_ROOT}/scripts/install-mise.sh" || {
    print -P "%F{209}[codeweaver]%f %F{red}Failed to install Mise!%f Try running the install script manually: %F{cyan}${REPO_ROOT}/scripts/install-mise.sh%f"
  }
  full_setup
fi
else
  REPO_ROOT="$(git rev-parse --show-toplevel 2>/dev/null || echo "${PWD}")"
  # Mise is not installed, run the install script
  chmod -R +x "${REPO_ROOT}/scripts" || {
      print -P "%F{209}[codeweaver]%f %F{red}Failed to make install scripts executable!%f"
    }
    print -P "%F{209}[codeweaver]%f Installing Mise for the first time..."
    "${REPO_ROOT}/scripts/install-mise.sh" || {
      print -P "%F{209}[codeweaver]%f %F{red}Failed to install Mise!%f Try running the install script manually: %F{cyan}${REPO_ROOT}/scripts/install-mise.sh%f"
    }
    full_setup

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment on lines +168 to +169
# after a lot of trial and error, it seems that combined with setting MISE_PYTHON_VERSION to the base version, and using uv to install the free-threaded version, and syncing uv and mise, this works
# the favored version is now the free-threaded version -- as mise list python will show:
Copy link

Copilot AI Dec 9, 2025

Choose a reason for hiding this comment

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

[nitpick] The comment spans two lines and could be more concise. Long comments in shell scripts embedded in YAML can be hard to read. Consider breaking it into multiple single-line comments or shortening it:

# After trial and error: set MISE_PYTHON_VERSION to base version, install free-threaded via uv, then sync.
# The favored version is now free-threaded -- visible in: mise list python
Suggested change
# after a lot of trial and error, it seems that combined with setting MISE_PYTHON_VERSION to the base version, and using uv to install the free-threaded version, and syncing uv and mise, this works
# the favored version is now the free-threaded version -- as mise list python will show:
# Set MISE_PYTHON_VERSION to base version, install free-threaded via uv, then sync.
# After these steps, the favored version is free-threaded (see: mise list python).

Copilot uses AI. Check for mistakes.
Comment on lines +12 to +17
function _mise_hook {
local diff=${__MISE_DIFF}
source <(command mise hook-env -s zsh)
[[ ${diff} == ${__MISE_DIFF} ]]
_mise_updated=$?
}
Copy link

Copilot AI Dec 9, 2025

Choose a reason for hiding this comment

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

The _mise_hook and _prompt functions are defined but _mise_hook is never called in this file. The hook may be intended to be registered elsewhere, but without that registration visible here, the _mise_updated variable will never be set, meaning the prompt function will always use the default behavior (green/red based on exit status) rather than the blue prompt for mise updates.

Consider either:

  1. Adding the hook registration: add-zsh-hook precmd _mise_hook
  2. Or documenting where/how this hook is meant to be registered

Copilot uses AI. Check for mistakes.
domain="knitli.com"
timestamp="$(date -u +"%Y-%m-%dT%H:%M:%SZ")"
echo -n "$timestamp" > "$indata"
Copy link

Copilot AI Dec 9, 2025

Choose a reason for hiding this comment

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

The secret key is being written to a temporary file without verification that the file permissions are restrictive enough before writing. While umask 077 is set, there's a race condition where an attacker could potentially access the file between creation and the shred operation.

Consider using a more secure approach:

umask 077
key_file="$(mktemp)"
chmod 600 "$key_file"
echo "$MCP_REGISTRY_KEY" > "$key_file"

This ensures the file has restrictive permissions immediately after creation.

Suggested change
chmod 600 "$key_file"

Copilot uses AI. Check for mistakes.
UV_PYTHON: ${{ inputs.python-version }}
UV_PYTHON: ${{ env.UV_PYTHON }}
MISE_VERBOSE: ${{ inputs.mise-debug }}
MISE_PYTHON_COMPILE: 0
Copy link

Copilot AI Dec 9, 2025

Choose a reason for hiding this comment

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

[nitpick] Setting MISE_PYTHON_COMPILE=0 disables Python compilation which may impact performance for compute-intensive operations. While this speeds up installation in CI, it means tests run on unoptimized Python builds.

Consider documenting this trade-off in a comment, or making it configurable:

# Disable Python compilation for faster CI setup (trade: slower runtime)
MISE_PYTHON_COMPILE: 0

This helps future maintainers understand the performance implications.

Copilot uses AI. Check for mistakes.
'''bash -c "
ignore_files=('src/codeweaver/_version.py' 'coverage.xml' 'test-results.xml')
for file in \"\${ignore_files[@]}\"; do
if ! grep -qx \"\$file\" .git/info/exclude; then
Copy link

Copilot AI Dec 9, 2025

Choose a reason for hiding this comment

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

The grep -qx in line 103 uses the -x flag which matches the entire line exactly. However, the .git/info/exclude file may have leading/trailing whitespace or different formatting. This could cause duplicate entries to be added.

Consider using a more robust check:

if ! grep -qF "$file" .git/info/exclude 2>/dev/null; then
  echo "$file" >> .git/info/exclude 2>&1
fi

The -F flag treats the pattern as a fixed string (not regex) and is more reliable for this use case.

Suggested change
if ! grep -qx \"\$file\" .git/info/exclude; then
if ! grep -qF \"\$file\" .git/info/exclude; then

Copilot uses AI. Check for mistakes.
@github-actions
Copy link
Contributor

github-actions bot commented Dec 9, 2025

PR Review: CI Workflow Improvements

I've completed a comprehensive review of PR #196. This is an extensive and well-executed improvement to the CI/CD infrastructure. Below is my detailed feedback:


✅ Strengths

1. Comprehensive Mise Integration

The integration of Mise for environment management is well-designed:

  • Proper output exposure from composite actions (setup-mise-env, setup-python-env, setup-uv-env)
  • Support for free-threaded Python versions (3.13t, 3.14t) with fallback logic
  • Appropriate use of env: false to prevent hanging during environment export
  • Clean separation of profiles (minimal, reviewer, dev)

2. Workflow Simplification

  • Removed experimental Python setup duplication in favor of unified Mise-based approach
  • Consolidated test workflow to use mise run commands directly
  • Better parameter passing (test-markers, upload-coverage, run-quality-checks)
  • Proper use of environment variables at appropriate scopes

3. MCP Registry Submission

  • Removed dependency on external mcp-publisher CLI
  • Direct HTTP-based submission with proper ed25519 signing
  • Good security practices: temporary files, secure deletion with shred, proper umask
  • Support for both release and prerelease submissions

4. Documentation & Comments

  • Excellent inline comments explaining non-obvious logic (free-threaded Python handling, CodeQL resource limits)
  • Clear step names and descriptions
  • Proper SPDX headers

🔴 Critical Issues

1. Missing jq Dependency (Addressed by Sourcery comment #2600900474)

Location: .github/workflows/mcp-registry-submit.yml:165, 179, 217

The workflow relies on jq for JSON parsing but doesn't ensure it's installed:

token="$(echo "$response" | jq -r '.registry_token')"

Risk: While ubuntu-latest currently includes jq, this is not guaranteed across all runner versions or types.

Recommendation: Add explicit installation:

- name: Install dependencies
  run: |
    sudo apt-get update && sudo apt-get install -y jq

Or use Python's json module for consistency with the rest of the codebase.

2. CI Test Failures

Several jobs are currently failing:

  • Test Python 3.13t/3.14t/3.14 - All experimental Python versions failing
  • Build Docker Image - Failing after 42s
  • Test Docker Compose - Failing after 33s
  • cla-check - Failing

Note: The PR description mentions "failing tests are unrelated and will be addressed in another PR," but this should be clarified. Some failures may actually be related to the environment setup changes.


⚠️ Medium Priority Issues

3. Free-Threaded Python Version Handling

Location: .github/actions/setup-mise-env/action.yml:71-93

The free-threaded Python setup has a workaround comment:

# I couldn't get Mise's handling of free-threaded Python versions to work correctly...

Concerns:

  • This workaround may break if Mise or uv changes behavior
  • The logic relies on string manipulation (${python_version%t}) which is fragile
  • Setting MISE_PYTHON_VERSION to base version while using free-threaded is confusing

Recommendations:

  • Document this as a known limitation with a tracking issue
  • Add validation to ensure the correct Python version was installed
  • Consider contributing a fix upstream to Mise

4. Error Handling in Mise Tasks

Location: .github/workflows/_reusable-test.yml:96, .github/workflows/_reusable-lint.yml:56,63

Some steps use continue-on-error: true which may hide real issues:

run: mise run check 2>&1
continue-on-error: true

Recommendation: Consider distinguishing between expected warnings and actual failures. Use exit codes or conditional logic to fail on critical errors.

5. Disk Space Cleanup

Location: .github/actions/setup-mise-env/action.yml:61-63

The disk cleanup script is called early but there's no verification that it succeeded or freed sufficient space.

Recommendation: Add logging to show before/after disk usage.


💡 Minor Issues & Suggestions

6. Duplicate Environment Variables

Some environment variables are set at multiple levels (workflow, job, step), which can be confusing:

  • MISE_YES, MISE_EXPERIMENTAL appear in multiple places
  • UV_PYTHON and MISE_PYTHON_VERSION have overlapping purposes

Recommendation: Consolidate where possible, document why duplicates are necessary.

7. Hardcoded Python Version

Location: .github/workflows/mcp-registry-submit.yml:39

python-version: "3.12"

Recommendation: Consider using a repository-level default or variable.

8. Security: Temporary File Cleanup

Location: .github/workflows/mcp-registry-submit.yml:138-144

Good use of trap cleanup EXIT, but the cleanup function could be more robust:

shred -u "$key_file" "$outfile" || rm -f "$key_file" "$outfile"

Recommendation: Log if shred fails, as this could indicate a security issue.

9. Test Matrix Clarity

Location: .github/workflows/_reusable-test.yml:62-70

The matrix includes experimental versions via include, which is correct but could be clearer. Consider adding a comment explaining why they're not in the main matrix.

10. Missing Input Validation

Location: .github/workflows/mcp-registry-submit.yml:42-57

The version extraction doesn't validate the format. Invalid versions could cause downstream failures.


🎯 Architecture & Design

Positive Aspects:

  1. Separation of Concerns: Composite actions are well-structured
  2. Reusability: Workflow templates properly use workflow_call
  3. Flexibility: Good use of input parameters for customization
  4. Caching: Proper use of Mise caching with cache_key_prefix

Areas for Improvement:

  1. Testing: No tests for the workflow changes themselves (consider workflow integration tests)
  2. Rollback Plan: No documented rollback strategy if Mise integration causes issues
  3. Migration Path: Large changeset makes it hard to identify root cause if something breaks

📊 Code Quality Metrics

Metric Assessment
Code Style ✅ Excellent (consistent YAML formatting, proper indentation)
Documentation ✅ Good (inline comments, clear step names)
Security ⚠️ Good with minor concerns (jq dependency, shred logging)
Maintainability ✅ Good (modular design, reusable workflows)
Testing ⚠️ Needs improvement (CI failures, no workflow tests)

🔧 Recommended Actions (Priority Order)

  1. Critical: Add explicit jq installation or switch to Python JSON parsing
  2. High: Investigate and resolve CI test failures (especially experimental Python versions)
  3. Medium: Add validation for free-threaded Python installation
  4. Medium: Improve error handling for continue-on-error steps
  5. Low: Add disk space logging to cleanup script
  6. Low: Document temporary files cleanup behavior

📝 Summary

This PR represents a significant improvement to the CI/CD infrastructure with excellent attention to detail in most areas. The Mise integration is well-executed, and the MCP registry submission improvements are solid. The main concerns are:

  1. The jq dependency issue (easily fixed)
  2. Current CI failures (need investigation)
  3. Free-threaded Python workaround (needs documentation/tracking)

Recommendation: Address the jq dependency and investigate the CI failures before merging. Once those are resolved, this PR will be ready for approval.


Overall Assessment: 👍 Approve with changes requested

Let me know if you'd like me to help address any of these issues!

@github-actions
Copy link
Contributor

github-actions bot commented Dec 9, 2025

PR Review: CI/CD Workflow and Mise Configuration Updates

I've reviewed PR #196 which updates the GitHub Actions workflows to fix CI-breaking issues and improve Python environment management with Mise. This is a substantial refactor with 19 files changed and 484 additions. Here's my comprehensive feedback:


Strengths

  1. Well-Structured Composite Actions

    • Added proper outputs: sections to all composite actions (setup-mise-env, setup-python-env, setup-uv-env) — this was a critical fix for making outputs accessible to calling workflows
    • Clear separation of concerns between minimal, reviewer, and dev profiles in setup-mise-env
    • Good use of conditional steps for profile-specific setup
  2. Free-Threaded Python Support

    • Thoughtful handling of free-threaded Python versions (3.13t, 3.14t) with the workaround at setup-mise-env/action.yml:71-93
    • The comment explaining the workaround is helpful: "I couldn't get Mise's handling of free-threaded Python versions to work correctly..."
    • Using uv python install for free-threaded versions and syncing with mise is a pragmatic solution
  3. Environment Variable Management

    • Consolidated environment variables at the workflow level (job-level env blocks)
    • Proper use of MISE_PYTHON_VERSION instead of deprecated MISE_PYTHON
    • Disabled automatic env export (env: false) to prevent hanging issues — good fix!
  4. Simplified Workflow Execution

    • Removed complex $MISE_PATH variable usage in favor of direct mise run commands
    • Cleaner task invocations: mise run lint, mise run test-cov, etc.
    • Removed experimental Python workaround in favor of unified mise-based setup
  5. Debug Capabilities

    • Added mise-debug input parameter for enhanced troubleshooting
    • Currently enabled (mise-debug: true) which is helpful during stabilization

⚠️ Areas of Concern

1. CI Test Failures (High Priority)

  • Multiple test jobs are failing (Python 3.12, 3.13t, 3.14, 3.14t)
  • Docker image build is failing
  • The PR description mentions "There are currently failing tests; those are unrelated and will be addressed in another PR."
  • Recommendation: While I understand the desire to separate concerns, merging with failing tests creates technical debt and makes it harder to identify new issues. Consider:
    • Creating a draft PR until tests pass, OR
    • Temporarily skipping known-broken tests with clear markers, OR
    • Providing more detail on which specific tests are failing and why they're unrelated

2. Path Management Complexity

The setup-mise-env action has convoluted PATH management:

  • .github/actions/setup-mise-env/action.yml:202-213 — Sets outputs including MISE_BIN_DIR and PYTHON_BIN_DIR but these aren't exposed in the outputs: section (lines 35-51)
  • Workflows depend on mise being in PATH but this isn't explicitly guaranteed post-setup
  • Recommendation:
    • Expose MISE_BIN_DIR and PYTHON_BIN_DIR as action outputs
    • Add a step to explicitly add mise to $GITHUB_PATH for subsequent steps

3. Disk Space Management

  • .github/actions/setup-mise-env/action.yml:61-63ci-free-disk-space.sh runs early but we don't know if it's sufficient
  • Docker build failures might be disk-space related
  • Recommendation: Add disk space monitoring or summary output after cleanup

4. Error Handling

Several steps use continue-on-error: true or || true:

  • .github/workflows/_reusable-lint.yml:57,64 — Lint and format checks allow failures
  • .github/actions/setup-mise-env/action.yml:185mise activate can fail silently
  • Recommendation: These might hide real issues. Consider:
    • Making failures visible with GitHub annotations/warnings
    • Only allowing known-safe failures to continue

5. Free-Threaded Python Implementation

The workaround at setup-mise-env/action.yml:156-171 is complex:

- name: Insert Free-Threaded Python into Dev Profile
  if: inputs.profile == 'dev' && endsWith(inputs.python-version, 't')
  • This only runs for dev profile, but tests use dev profile for all Python versions including experimental ones
  • Recommendation:
    • Verify this works correctly for experimental matrix entries
    • Consider extracting this logic to a separate composite action for reusability

6. Removed Experimental Python Handling

The reusable test workflow removed the separate experimental Python setup (formerly lines ~115-138):

# Removed:
# - name: Setup Experimental Python environment
# - name: Run test coverage for experimental Python
  • All Python versions now use mise-based setup
  • Recommendation: Confirm that experimental Python versions work correctly with mise. The current failures suggest they might not.

🔍 Code Quality & Best Practices

Positive

  • ✅ Proper SPDX license headers on all files
  • ✅ Good use of matrix strategy for multi-version testing
  • ✅ Appropriate use of fetch-depth: 3 for tests (needs recent history)
  • ✅ Secrets properly handled (not exposed in logs)
  • ✅ Caching configured for mise installations

Suggestions

  • 📝 The mise.toml file is well-documented with inline comments
  • 📝 Task definitions are clear and follow a consistent pattern
  • 🔄 Consider documenting the cloud-setup task that runs at setup-mise-env/action.yml:192 — what does it do?
  • 🔄 The mise.toml:89 creates venv if missing — good fallback but log it more prominently

🐛 Potential Bugs

  1. Missing Tool Definitions (mise.toml:158-162)

    [tasks.check.tools]
    hk = "latest"
    pkl = "latest"
    "pipx:ty" = "latest"
    "pipx:reuse" = "latest"
    ruff = "latest"
    • These tools are defined at task-level but also referenced in other tasks
    • Potential Issue: If check task hasn't run, tools might not be available for format task
    • Recommendation: Consider hoisting common tools to global [tools] section
  2. Windows Support Questions

    • run_windows blocks exist throughout mise.toml but are untested in CI
    • Recommendation: Either test Windows workflows or add a comment noting Windows support is best-effort
  3. UV Version Pinning

    • Most tasks use uv = "latest" which could cause non-reproducible builds
    • Recommendation: Consider pinning UV version or using version ranges

📊 Performance Considerations

  1. Parallel Installation: The mise setup appears sequential. Tools could potentially be installed in parallel.
  2. Cache Effectiveness: Good use of cache keys (cache_key_prefix: ${{ inputs.profile }}) but verify cache hit rates.
  3. Docker Space: Docker failures might benefit from prune steps before builds.

🎯 Recommendations Summary

Before Merging:

  1. Fix or explain CI failures — Current status shows multiple failing checks
  2. Verify free-threaded Python works with mise-based setup
  3. ⚠️ Add PATH management — Explicitly ensure mise is in PATH for all steps
  4. ⚠️ Document behavior changes — Note removal of separate experimental Python handling

Future Improvements:
5. 📈 Add workflow run time tracking to measure performance improvements
6. 🔧 Extract free-threaded Python logic to separate composite action
7. 📝 Add troubleshooting documentation for common mise issues
8. 🧪 Add integration tests for composite actions


📝 Final Assessment

This PR represents significant, valuable work to modernize the CI/CD infrastructure. The approach is sound:

  • Moving to mise-based environment management is a good architectural decision
  • Consolidating environment setup into reusable actions improves maintainability
  • The handling of free-threaded Python is creative and pragmatic

However, I cannot approve this PR in its current state due to the failing CI checks. The failures need to be either:

  • Fixed and shown to pass, OR
  • Clearly documented as pre-existing/unrelated with a plan to address them

Once the CI is green (or failures are properly explained/isolated), this PR will be ready to merge. The code quality is good, the architecture is improved, and the documentation is helpful.

Status: ⏸️ Requesting Changes
Reason: Failing CI checks must be addressed

Great work on this complex refactor! Looking forward to seeing this land once tests are stabilized. 🚀


Generated with Claude Code - Feel free to reach out if you need clarification on any points.

@bashandbone bashandbone merged commit 043d49a into main Dec 9, 2025
25 of 33 checks passed
@bashandbone bashandbone deleted the fix-test-ci-action-failures branch December 9, 2025 03:09
@github-actions github-actions bot locked and limited conversation to collaborators Dec 9, 2025
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

bug Something isn't working ci-cd Issues affecting ci/cd

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants