Skip to content

fix(ci): consolidate desktop E2E pipeline and add Rust tests#227

Merged
FSM1 merged 9 commits into
mainfrom
fix/consolidate-desktop-e2e-pipeline
Mar 1, 2026
Merged

fix(ci): consolidate desktop E2E pipeline and add Rust tests#227
FSM1 merged 9 commits into
mainfrom
fix/consolidate-desktop-e2e-pipeline

Conversation

@FSM1

@FSM1 FSM1 commented Mar 1, 2026

Copy link
Copy Markdown
Owner

Summary

  • Remove fragile cross-workflow artifact dependency (build-desktop-*e2e-desktop.yml download) that broke when CI skipped builds on non-desktop changes
  • Make e2e-desktop.yml self-contained: adds change detection, builds its own debug binaries, then runs E2E tests
  • Add cargo-test-{windows,macos,linux} jobs to CI, gated on cargo-check passing — runs the existing 8 test files (crypto vectors, sync queue, FUSE cache, file handles, device registry, auth commands, tray status)
  • Add Rust coverage via cargo-llvm-cov on Linux, uploaded to Codecov with desktop flag

Test plan

  • CI runs cargo-check-*cargo-test-* on PRs with desktop changes
  • cargo-test-linux uploads coverage to Codecov
  • Push to main with desktop changes → E2E workflow detects changes → builds debug binaries → runs tests
  • Push to main with NO desktop changes → E2E workflow skips (changes.outputs.desktop=false)
  • Manual workflow_dispatch on e2e-desktop → always runs full pipeline

🤖 Generated with Claude Code

Summary by CodeRabbit

  • Tests

    • CI jobs renamed to emphasize testing; desktop CI runs test suites on Windows, macOS, and Linux instead of producing debug binaries.
    • Code coverage collection and Codecov upload added; coverage thresholds increased and a desktop coverage target introduced.
    • Workflows skip when desktop-relevant files haven't changed; cargo artifact caching added.
  • E2E

    • E2E builds and launches platform-specific local binaries during tests with per-OS setup (FUSE/WinFsp, deps), platform-aware binary names/paths, and a Windows placeholder artifact for compatibility.

Remove fragile cross-workflow artifact dependency where e2e-desktop.yml
downloaded debug binaries from CI's build-desktop-* jobs. When CI skipped
those builds (no desktop file changes), E2E failed with "Artifact not found."

Changes:
- Remove build-desktop-{windows,macos,linux} jobs from ci.yml
- Make e2e-desktop.yml self-contained: builds its own debug binaries
- Add change detection (dorny/paths-filter) to e2e-desktop.yml
- Add cargo-test-{windows,macos,linux} jobs to ci.yml, gated on
  cargo-check passing
- Add Rust coverage via cargo-llvm-cov on Linux, uploaded to Codecov

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Entire-Checkpoint: f9f9fd17ec7e
@coderabbitai

coderabbitai Bot commented Mar 1, 2026

Copy link
Copy Markdown

Walkthrough

Replace per-OS desktop build jobs with test-and-coverage jobs (cargo-test-*) in CI; add a change-detection job to gate desktop E2E; refactor e2e-desktop to build the desktop binary via cargo, start that binary for tests, and publish coverage.

Changes

Cohort / File(s) Summary
CI workflow
.github/workflows/ci.yml
Replaced per-OS desktop build jobs with cargo-test-* jobs that run cargo test (platform feature flags like winfsp, fuse), removed debug binary build/upload steps, and added Linux coverage tooling (cargo-llvm-cov) plus Codecov upload.
E2E workflow & change detection
.github/workflows/e2e-desktop.yml`
Added changes job (path detector) and made e2e-desktop depend on it; refactored to build desktop binary via cargo (matrix.binary-name), cache cargo/target, set BINARY env, ensure executable permissions, and run the built binary for E2E tests.
Windows-specific adjustments
.github/workflows/ci.yml, .github/workflows/e2e-desktop.yml
Introduced winfsp-placeholder.msi/winfsp.msi placeholder handling for resource-glob compatibility and updated WinFsp install / MSI write steps to match the new cargo-based test flow.
macOS Fuse-T handling
.github/workflows/ci.yml, .github/workflows/e2e-desktop.yml
Robustly locate fuse-t.pc, copy it into pkgconfig (/usr/local/lib/pkgconfig/fuse.pc), set Version to 2.9.9, and add PKG_CONFIG_PATH for macOS test/build steps.
Coverage configuration
codecov.yml, .github/workflows/ci.yml
Added a desktop flag/section in codecov.yml (paths, threshold), raised default thresholds, and wired Codecov upload steps into the Linux and cross-platform coverage flows.
Cross-platform test orchestration
.github/workflows/ci.yml, .github/workflows/e2e-desktop.yml
Unified test-focused flow across OSes: feature-specific test invocations, consolidated caching, adjusted path/permission handling for binaries, and replaced artifact downloads with cargo builds for E2E.

Sequence Diagram(s)

sequenceDiagram
  participant GH as "GitHub Actions"
  participant Changes as "changes job (path detector)"
  participant Runner as "CI Runner"
  participant Cargo as "cargo (build/test/coverage)"
  participant Services as "Backend / Dependencies (API, DB, IPFS...)"
  participant Binary as "Desktop binary (matrix.binary-name)"
  participant Tests as "E2E test runner"
  participant Codecov as "Codecov"

  GH->>Changes: run path detection
  Changes-->>GH: outputs.desktop (true/false)
  GH->>Runner: start e2e-desktop (if outputs.desktop)
  Runner->>Cargo: cargo build/test --features (matrix)
  Cargo-->>Binary: produce built binary
  Runner->>Services: start backend & support services
  Runner->>Binary: launch binary (set BINARY, ensure exec perms)
  Runner->>Tests: run E2E tests against services + binary
  Tests-->>Runner: emit results + coverage
  Runner->>Codecov: upload coverage (if enabled)
  Codecov-->>GH: coverage report uploaded
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~45 minutes

Possibly related PRs

🚥 Pre-merge checks | ✅ 3
✅ Passed checks (3 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title accurately captures the main objectives: consolidating the e2e pipeline for self-contained builds and adding Rust test coverage across platforms with cargo-test jobs.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.

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

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch fix/consolidate-desktop-e2e-pipeline

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.

The taiki-e/install-action is not on the org's allowed actions list.
Install cargo-llvm-cov directly with cargo install + rustup component.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Entire-Checkpoint: 0ff9e48ac739

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Actionable comments posted: 1

🧹 Nitpick comments (1)
.github/workflows/e2e-desktop.yml (1)

27-44: Consider expanding the desktop filter to include E2E harness changes.

Changes under tests/e2e-desktop/** and tools/mock-ipns-routing/** currently won’t trigger this workflow on main pushes, so harness regressions can be missed.

♻️ Suggested filter additions
             desktop:
               - 'apps/desktop/src/**'
               - 'apps/desktop/src-tauri/src/**'
               - 'apps/desktop/src-tauri/vendor/**'
               - 'apps/desktop/src-tauri/capabilities/**'
               - 'apps/desktop/src-tauri/resources/**'
               - 'apps/desktop/src-tauri/Cargo.toml'
               - 'apps/desktop/src-tauri/Cargo.lock'
               - 'apps/desktop/src-tauri/build.rs'
               - 'apps/desktop/src-tauri/rust-toolchain.toml'
               - 'apps/desktop/index.html'
               - 'apps/desktop/vite.config.*'
               - 'apps/desktop/tsconfig*'
+              - 'tests/e2e-desktop/**'
+              - 'tools/mock-ipns-routing/**'
               - 'packages/crypto/src/**'
               - 'packages/crypto/tsconfig*'
               - '.github/workflows/e2e-desktop.yml'
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In @.github/workflows/e2e-desktop.yml around lines 27 - 44, Update the "desktop"
path filter in the workflow's filters block so pushes that change the E2E
harness trigger the job: add entries for tests/e2e-desktop/** and
tools/mock-ipns-routing/** (and any related harness scripts if applicable) to
the desktop filter list in .github/workflows/e2e-desktop.yml so changes to the
E2E tests and mock IPNS routing tool will run the workflow.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In @.github/workflows/e2e-desktop.yml:
- Around line 23-24: The checkout step uses the default behavior which for
workflow_run events checks out the default branch instead of the triggering
commit; update the actions/checkout@v4 step(s) (the lines replacing "uses:
actions/checkout@v4") to pin to the triggering run's commit by setting the ref
to github.event.workflow_run.head_sha (e.g., use ref: ${{
github.event.workflow_run.head_sha }}) and include fetch-depth: 0 to ensure full
history; apply the same change to the other occurrence referenced in the
comment.

---

Nitpick comments:
In @.github/workflows/e2e-desktop.yml:
- Around line 27-44: Update the "desktop" path filter in the workflow's filters
block so pushes that change the E2E harness trigger the job: add entries for
tests/e2e-desktop/** and tools/mock-ipns-routing/** (and any related harness
scripts if applicable) to the desktop filter list in
.github/workflows/e2e-desktop.yml so changes to the E2E tests and mock IPNS
routing tool will run the workflow.

ℹ️ Review info

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between a6e1c4c and 9d0f8ca.

📒 Files selected for processing (2)
  • .github/workflows/ci.yml
  • .github/workflows/e2e-desktop.yml

Comment thread .github/workflows/e2e-desktop.yml
workflow_run events default to the latest default-branch commit, not the
commit that triggered the upstream CI. Pin both checkout steps to
github.event.workflow_run.head_sha so change detection and builds use
the correct code.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Entire-Checkpoint: 5e0838007b7e

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

🧹 Nitpick comments (1)
.github/workflows/ci.yml (1)

570-573: Consider caching the cargo-llvm-cov binary.

The current cache configuration (lines 562-568) excludes ~/.cargo/bin, so cargo-llvm-cov will be reinstalled on every run. Adding ~/.cargo/bin to the cache path would speed up subsequent runs.

♻️ Proposed cache path update
       - uses: actions/cache@v4
         with:
           path: |
             ~/.cargo/registry
             ~/.cargo/git
+            ~/.cargo/bin
             apps/desktop/src-tauri/target
           key: linux-cargo-${{ hashFiles('apps/desktop/src-tauri/Cargo.lock') }}
           restore-keys: linux-cargo-

Note: If you add ~/.cargo/bin to the cache, consider invalidating the cache key when the installed tool version changes (e.g., by including a hash of tool versions or a manual version suffix).

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In @.github/workflows/ci.yml around lines 570 - 573, The CI currently installs
cargo-llvm-cov every run because the cache paths exclude the Rust cargo bin
directory; update the GitHub Actions cache configuration that manages Rust/Cargo
(the block around the existing cache paths) to include ~/.cargo/bin so the
cargo-llvm-cov binary is persisted, and modify the cache key to include a
tool-version token (e.g., a cargo-llvm-cov version string or hash of
tool-versions) so cached binaries are invalidated when you intentionally change
the installed version; ensure the install step that runs `rustup component add
llvm-tools-preview` and `cargo install cargo-llvm-cov --locked` remains but will
be skipped when the binary is recovered from ~/.cargo/bin in the cache.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Nitpick comments:
In @.github/workflows/ci.yml:
- Around line 570-573: The CI currently installs cargo-llvm-cov every run
because the cache paths exclude the Rust cargo bin directory; update the GitHub
Actions cache configuration that manages Rust/Cargo (the block around the
existing cache paths) to include ~/.cargo/bin so the cargo-llvm-cov binary is
persisted, and modify the cache key to include a tool-version token (e.g., a
cargo-llvm-cov version string or hash of tool-versions) so cached binaries are
invalidated when you intentionally change the installed version; ensure the
install step that runs `rustup component add llvm-tools-preview` and `cargo
install cargo-llvm-cov --locked` remains but will be skipped when the binary is
recovered from ~/.cargo/bin in the cache.

ℹ️ Review info

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 9d0f8ca and b30ec26.

📒 Files selected for processing (1)
  • .github/workflows/ci.yml

cargo-check-macos works without setting PKG_CONFIG_PATH because
pkg-config's default search paths include /usr/local/lib/pkgconfig
where the fuse.pc symlink lives. Explicitly setting PKG_CONFIG_PATH
may override these defaults. Match the working cargo-check-macos job.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Entire-Checkpoint: 06c223dddb4a
@codecov

codecov Bot commented Mar 1, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 46.54%. Comparing base (07884ee) to head (4cee46e).
⚠️ Report is 159 commits behind head on main.

Additional details and impacted files

Impacted file tree graph

@@             Coverage Diff             @@
##             main     #227       +/-   ##
===========================================
- Coverage   89.68%   46.54%   -43.14%     
===========================================
  Files          43       93       +50     
  Lines        1483     8142     +6659     
  Branches      284      582      +298     
===========================================
+ Hits         1330     3790     +2460     
- Misses         77     4195     +4118     
- Partials       76      157       +81     
Flag Coverage Δ
api 83.88% <ø> (-5.80%) ⬇️
crypto 83.88% <ø> (-5.80%) ⬇️
desktop 25.83% <ø> (?)

Flags with carried forward coverage won't be shown. Click here to find out more.
see 72 files with indirect coverage changes

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

FSM1 and others added 2 commits March 1, 2026 03:23
The symlink to fuse-t.pc was dangling because the FUSE-T pkgconfig
path varies across macOS runner versions. Use cp with a fallback
find to locate the actual file, and restore PKG_CONFIG_PATH.

cargo-check-macos passed due to cached build script output from
prior runs; cargo-test needs to re-run the build script which
requires pkg-config to find fuse.pc.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Entire-Checkpoint: 57fed1b04f8e
fuse-t.pc reports Version: 1.0.x (FUSE-T's product version) but
fuser's build.rs requires fuse >= 2.6.0 (the libfuse API version).
FUSE-T implements the FUSE 2.9 API, so patch the version field
in the copied fuse.pc to 2.9.9.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Entire-Checkpoint: d998c0e33a58

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Actionable comments posted: 2

🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In @.github/workflows/ci.yml:
- Around line 516-530: The cargo-check-macos job must mirror the robust FUSE-T
setup used in cargo-test-macos: copy the same block that finds FUSE-T (use
FUSE_T_PC variable with the fallback find across /Library /usr/local
/opt/homebrew), validate existence, sudo cp to /usr/local/lib/pkgconfig/fuse.pc,
and run the same sudo sed to set "Version: 2.9.9" so fuser's build.rs sees FUSE
2.9; add this identical sequence to the cargo-check-macos job (same variable
names FUSE_T_PC, same cp and sed invocations) to ensure both jobs handle
missing/renamed fuse-t.pc and the version patch consistently.

In @.github/workflows/e2e-desktop.yml:
- Around line 87-92: The macOS "Install FUSE-T (macOS)" step creates a symlink
but doesn't patch the reported FUSE version, causing the fuser crate's build.rs
(which requires fuse >= 2.6.0) to fail; update that step to patch or replace the
pkgconfig file so pkg-config reports a compatible version (e.g., write or modify
fuse.pc to include "Version: 2.6.0" and appropriate Libs/Requires entries)
similar to the version-patch logic used in the cargo-test-macos job, ensuring
the fuser crate's version check passes.

ℹ️ Review info

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between b30ec26 and 0ad41ce.

📒 Files selected for processing (2)
  • .github/workflows/ci.yml
  • .github/workflows/e2e-desktop.yml

Comment thread .github/workflows/ci.yml
Comment thread .github/workflows/e2e-desktop.yml Outdated
FSM1 and others added 3 commits March 1, 2026 03:37
Apply the same find-fallback + version-patch approach to
cargo-check-macos (ci.yml) and the e2e-desktop macOS build step.
Previously only cargo-test-macos had the fix; the other jobs relied
on cached build script output which masked the issue.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Entire-Checkpoint: 8f3293112f30
The new desktop Rust coverage was being mixed into the default project
target, causing a -43% drop. Fix by:
- Scoping the default project status to api+crypto flags only
- Adding a desktop flag with its own paths and carryforward
- Adding a desktop project status with target: auto, threshold: 5%

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Entire-Checkpoint: b343f8908680
Adding desktop Rust test coverage caused a -5.8% drop in the aggregate
project coverage check. Add the desktop flag to the default status and
bump threshold to 6% to accommodate the new flag.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Entire-Checkpoint: 1dfc03e50560
@FSM1 FSM1 enabled auto-merge (squash) March 1, 2026 03:07

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Actionable comments posted: 2

🧹 Nitpick comments (1)
.github/workflows/e2e-desktop.yml (1)

389-390: Avoid passing dev keys on the command line.

Passing the dev key via --dev-key exposes it in process arguments. Prefer environment-variable injection (or another non-argv channel) if supported by the app.

Based on learnings: In PowerShell and Bash test scripts for tests/e2e-desktop/scripts/, secrets (like TEST_SECRET) should be passed via environment variables, NOT as command-line parameters, to avoid exposure in process listings and shell history.

Also applies to: 411-412, 429-431

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In @.github/workflows/e2e-desktop.yml around lines 389 - 390, The workflow is
passing the development key via the command-line flag "--dev-key" to "$BINARY"
which exposes the secret in process arguments; instead, set the dev key in the
environment (e.g., export/Set-Item env:DEV_KEY or equivalent in the
shell/PowerShell runner) and invoke "$BINARY" without the "--dev-key" flag,
preserving DESKTOP_PID assignment as before; apply the same change to the other
occurrences referenced (the other "$BINARY --dev-key" invocations) and update
the tests/e2e-desktop/scripts/ Bash and PowerShell helpers to read DEV_KEY from
the environment rather than passing it on argv.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In @.github/workflows/e2e-desktop.yml:
- Around line 53-58: The workflow's condition allows runs triggered by any
successful upstream workflow_run, enabling PR-originated code to execute with
repository secrets; update the conditional expression that currently checks
github.event_name == 'workflow_run' && github.event.workflow_run.conclusion ==
'success' && needs.changes.outputs.desktop == 'true' to also require
github.event.workflow_run.event == 'push' so only upstream push events can
trigger this path (i.e., add the guard github.event.workflow_run.event == 'push'
into the same AND clause).

In `@codecov.yml`:
- Around line 7-10: The default Codecov status is incorrectly aggregating
desktop coverage because `project.default.flags` includes `desktop`; remove
`desktop` from the `project.default.flags` list in codecov.yml (or move it into
its own status entry) so the default status only reports the intended flags
(e.g., `api`, `crypto`) and create a separate status block that targets the
`desktop` flag if you need a distinct desktop coverage check.

---

Nitpick comments:
In @.github/workflows/e2e-desktop.yml:
- Around line 389-390: The workflow is passing the development key via the
command-line flag "--dev-key" to "$BINARY" which exposes the secret in process
arguments; instead, set the dev key in the environment (e.g., export/Set-Item
env:DEV_KEY or equivalent in the shell/PowerShell runner) and invoke "$BINARY"
without the "--dev-key" flag, preserving DESKTOP_PID assignment as before; apply
the same change to the other occurrences referenced (the other "$BINARY
--dev-key" invocations) and update the tests/e2e-desktop/scripts/ Bash and
PowerShell helpers to read DEV_KEY from the environment rather than passing it
on argv.

ℹ️ Review info

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 0ad41ce and 4cee46e.

📒 Files selected for processing (3)
  • .github/workflows/ci.yml
  • .github/workflows/e2e-desktop.yml
  • codecov.yml

Comment thread .github/workflows/e2e-desktop.yml
Comment thread codecov.yml
@FSM1 FSM1 merged commit 52159dc into main Mar 1, 2026
23 of 24 checks passed
FSM1 added a commit that referenced this pull request Mar 1, 2026
macOS: Replace wget with curl for Kubo download — wget is not
available on macOS GitHub runners, causing silent download failure
and subsequent "command not found" for install.sh.

Linux: Fix xvfb-action multi-line run — GabrielBB/xvfb-action@v1
executes each line as a separate xvfb-run invocation, so export
and variable assignments fail as standalone commands. Move env vars
to step-level env: and wrap commands in a single bash -c invocation.

Also adds workflow_run.event == 'push' guard (defense-in-depth from
PR #227 that was lost in squash merge).

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Entire-Checkpoint: 87f24f6da360
FSM1 added a commit that referenced this pull request Mar 1, 2026
* fix(ci): fix desktop E2E failures on macOS and Linux

macOS: Replace wget with curl for Kubo download — wget is not
available on macOS GitHub runners, causing silent download failure
and subsequent "command not found" for install.sh.

Linux: Fix xvfb-action multi-line run — GabrielBB/xvfb-action@v1
executes each line as a separate xvfb-run invocation, so export
and variable assignments fail as standalone commands. Move env vars
to step-level env: and wrap commands in a single bash -c invocation.

Also adds workflow_run.event == 'push' guard (defense-in-depth from
PR #227 that was lost in squash merge).

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Entire-Checkpoint: 87f24f6da360

* fix(ci): use POST for Kubo RPC API readiness check

Kubo v0.34.0 requires POST for all RPC API endpoints. The Windows
readiness check used Invoke-WebRequest (GET), which got a 405 response
causing the catch block to trigger on every iteration. The Unix check
worked by accident since curl doesn't fail on 405 without -f.

Fix both: add -Method Post for Windows, add -sf -X POST for Unix.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Entire-Checkpoint: 716c24e576cb

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant