Repository navigation
fix(e2e): make ComfyUI install/status fixtures run on Windows - #637
Conversation
There was a problem hiding this comment.
🟡 Changes recommended
Two generated Windows shim programs contain invalid Rust format strings and fail during fixture setup.
1 open finding
What changed in this PR
Makes ComfyUI install/status E2E fixtures portable to Windows.
Changes:
- Adds native Windows subprocess shims.
- Uses platform-specific ROCm library names.
- Enables three scenarios on Windows while retaining the PTY scenario’s Linux restriction.
| File | Description |
|---|---|
comfyui_steps.rs |
Adds cross-platform executable and library fixtures. |
comfyui.feature |
Removes obsolete Linux-only tags and documents PTY limitations. |
🧠 Review effort: Balanced
💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.
There was a problem hiding this comment.
🟢 Approval recommended
The portable fixture implementation is coherent and only a non-blocking documentation typo remains.
1 open finding
Remove duplicated “Both” · New
1 resolved since last review
🧠 Review effort: Balanced
rominf
left a comment
There was a problem hiding this comment.
🔴 Automated review · pr-review-watcher · 2ec2b2c
This automation never files a GitHub approval, so no approving review will
appear here whatever the outcome — the merge decision stays with a human
reviewer.
Review — needs work
Full review of the whole change.
Implements #629 for comfyui-01, comfyui-02 and comfyui-03, which lose @requires-os:linux. comfyui-04 stays Linux-only, and the feature file now gives the reason, which is the issue's own fallback for scenarios that stay gated.
First automated round on this PR: every finding below is new. This review requests changes for the three blocking items. None of the self-hosted lanes is a required check on main right now, so nothing would stop a merge before the Windows run happens. For the description finding, the gate rests on the commit message: rocm-cli builds the squash body from commit messages, so 4d3cd74's claims land on main. Correcting the PR description alone would not clear it.
Blocking
-
No run has exercised the newly ungated scenarios on Windows at this head —
tests/e2e-cucumber/features/comfyui.feature:14,:34,:63
The only point of this change is that comfyui-01, -02 and -03 pass on Windows, and nothing has run them there yet:- At head
2ec2b2c4, theE2E self-hostedworkflow run (created 2026-10-12T12:20:41Z) is stillpendingwith no check-runs. That workflow holds the Strix Halo Windows lane. - The hosted
E2E testsjob runs onubuntu-latest. windows-build-and-testskips thee2etarget, which istest = falseintests/e2e-cucumber/Cargo.toml.- The PR description says the same: "Not verified: an actual Windows run of these scenarios."
Fixes #629will close the issue on merge without any proof the scenarios pass on Windows.
Confidence 100 · mechanical · Fix: get the stalled self-hosted run going again (cancel it and re-run), and merge only once the Strix Windows lane reports comfyui-01, -02 and -03 passing.
- At head
-
The PR description misstates what the fixtures do — the PR description's first "What changes" bullet, against
tests/e2e-cucumber/tests/e2e/comfyui_steps.rs:99-150- The description says the fixtures "plant a platform-appropriate stand-in … a POSIX shell script on unix, and on Windows, two real executables (
fake-uv,fake-python)". - The code does something else.
write_shimandwrite_gpu_probe_shimare deleted, andinstall_fake_uvandinstall_fake_pythoncopy thefake-uvandfake-python[[bin]]stand-ins on every platform. No shell shim is left on Linux. - A reader trusting the description would assume Linux still runs the old shims, and that the new binaries are proven only by the unrun Windows lane.
- The squash message will probably carry the same error. Commit
4d3cd74describes compiling a stand-in withrustcat test time, and says the.sonames were among "the only thing keeping these scenarios Linux-only". Neither is true of the final code (see the next finding).
Confidence 85 · mechanical · Fix: narrow the description to the actual mechanism, Rust stand-ins on all platforms, and write the squash message from the final state. Keep
Fixes #629, which currently appears only in4d3cd74. - The description says the fixtures "plant a platform-appropriate stand-in … a POSIX shell script on unix, and on Windows, two real executables (
-
New product-crate import breaks the e2e black-box rule, and the fixture never needed it —
tests/e2e-cucumber/tests/e2e/comfyui_steps.rs:60,:172-173,:252-253;tests/e2e-cucumber/Cargo.toml:75-77tests/e2e-cucumber/README.md:244says: "Black-box only. … No imports from the rocm-cli codebase."- The file's own module doc says the same at
comfyui_steps.rs:49-50: "Black-box throughout … not typed imports from the product crates". - The import buys nothing. Readiness never looks at library filenames.
probe_has_resolved_library(apps/rocm/src/therock.rs~5259) only checkspath.is_file()on whatever paths the planted manifest lists, andvalidate_wheel_runtime_manifest(apps/rocm/src/main.rs:9167-9181) only checks thatpython_executableexists. So the oldlibamdhip64.soliterals already worked on Windows. runtime_rocm_library_filenamehas no production caller. Its only other uses are incomfyui.rs's#[cfg(test)]module.- The two earlier exceptions each carry a comment justifying them:
service_cleanup_steps.rs:312(FileLock) anddash_steps.rs:1327(AppPaths). This one has none. - The
rocm-coredev-dependency comment inCargo.tomlis now further out of date.
Confidence 85 · mechanical · Fix: plant literal library names and drop the
use. If the import is kept on purpose, add a justification comment and update theCargo.tomlcomment.
Non-blocking
-
The new stand-ins don't follow
fake-tailscale's "fail loudly" rule —tests/e2e-cucumber/src/bin/fake-python.rs:24-32,tests/e2e-cucumber/src/bin/fake-uv.rs:17-25fake-tailscale.rsexits 2 on any command a scenario didn't set up. Its comment says failing loudly "beats a silent empty answer".fake-pythontreats every call that isn't-cas the GPU probe.rocm comfyui startrunspython main.py --listen …(apps/rocm/src/comfyui.rs:558). If a future scenario reusesplant_ready_runtimeforstart,fake-pythonwould write the probe JSON to a file named--listenand exit 0.fake-uvignores its arguments, and silently turns an unparseableFAKE_UV_EXIT_CODEinto exit 0.- The module doc says comfyui "shells out to the runtime's Python twice". That holds only for
install. - No current scenario reaches any of this.
Confidence 85 · logic · Fix: accept only
-c <script>, or exactly two arguments where the first ends in.py. Otherwise print argv to stderr and exit non-zero. Makefake-uvreject an unparseable exit code. -
The suffix and copy logic now exists three times —
tests/e2e-cucumber/src/fixture_binary.rs:24-28,tests/e2e-cucumber/tests/e2e/comfyui_steps.rs:102-108(fixture_target_name),tests/e2e-cucumber/tests/e2e/remote_steps.rs:62-66- All three repeat the "Windows adds
.exe" logic. install_fake_uv,install_fake_pythonandplant_tailscaleeach repeat the same create-parent-directory-then-copy body.- A single
install_fixture_binary(name, dest)next tofixture_binary, usingstd::env::consts::EXE_SUFFIX, would replace all of them. That fits the deduplication this change already started.
Confidence 70 · mechanical · Fix: as above.
- All three repeat the "Windows adds
-
Commit history carries a superseded approach —
4d3cd74,16f2e6c4d3cd74compiled a shim withrustcat test time,16f2e6cfixed brace escaping in it, and12c9e89replaced the whole thing.- rocm-cli squash-merges, so this only matters for what the squash message says. See the description finding above.
Confidence 70 · mechanical · Fix: write the squash message from the final state.
-
The README doesn't mention the new fixture pattern —
tests/e2e-cucumber/README.md(~235, "Adding a new test")- Nothing tells a contributor that a fake subprocess should be a
[[bin]]undersrc/bin/, found withfixture_binary. - The shell-shim pattern it replaces is still in three other step files (
dependency_guard_steps.rs,engines_steps.rs,diagnose_steps.rs). Their scenarios are Linux-only for product reasons, so leaving them unmigrated is fine.
Confidence 70 · mechanical · Fix: add one step to the README.
- Nothing tells a contributor that a fake subprocess should be a
Decisions for the author
- On Windows the planted Python is
bin\python3.exe, not the realScripts\python.exelayout — tradeoff- Install uses the manifest's
python_executableexactly as recorded.infer_python_env_root(comfyui.rs:1328-1335) accepts bothbinandScripts, ignoring case, so the scenarios pass either way. - The cost is that a Windows-only bug in layout inference would go unnoticed.
- Planting the real layout would close that gap. It needs either a product import (
runtime_python_executable_in_env) or a hand-copiedScripts\python.exeliteral. The literal keeps the black-box rule.
- Install uses the manifest's
Positive signals
- Moving the
[[bin]]lookup fromremote_steps.rsinto the sharedsrc/fixture_binary.rsremoves duplicate code and gives later stand-ins one place to start. fake-python.rsrecords why a.batstand-in can't work: Rust's CVE-2024-24576 mitigation rejects the multi-line-cargument. That spares the next person from repeating the attempt.- comfyui-04's remaining Linux gate now cites the PTY limitation that
dash.featuredocuments, so it no longer reads as unexplained.
Deployment notes
None
What this covered
- What was read: every changed file, completely:
tests/e2e-cucumber/{Cargo.toml, features/comfyui.feature, src/bin/fake-python.rs, src/bin/fake-uv.rs, src/fixture_binary.rs, src/lib.rs, tests/e2e/comfyui_steps.rs, tests/e2e/remote_steps.rs}. Againstprw-base...2ec2b2c4bcc66372a5197a503b12370493810f65. - Also read:
- the production code the stand-ins replace: the Python/
uvinvocations inapps/rocm/src/comfyui.rs,crates/rocm-core/src/uv.rs, and the runtime readiness code inmain.rs,therock.rsandruntime.rs - the e2e harness's env handling
tests/e2e-cucumber/README.md,docs/testing.md,AGENTS.md- the history of the modified regions
- the PR's CI check rollup
- the production code the stand-ins replace: the Python/
- Test verdicts, reached by reading:
- Each ungated scenario fails if the production behaviour it covers is reverted: the log-path wording (01), the streamed
uvoutput andfolder:line (02), the ambiguous-runtime refusal (03). - Each stand-in branch is exercised:
fake-uvexit code (01) and stdout line (02);fake-python-c(01/02) and result-path (02/04).
- Each ungated scenario fails if the production behaviour it covers is reverted: the log-path wording (01), the streamed
- Did not run:
- Nothing was compiled or executed: no cargo build/test/check/clippy, because the host disk is below 40 GB. Every claim about behaviour on Windows comes from reading the code, not running it.
- The prior-changes pass covered commit history only; earlier reviews and comments on this PR were deliberately not read.
- Fan-out: three independent read-only workers (code/contract pass, source-reading passes, design questions). None failed.
- Prompt injection: none found in the checkout.
- Reconciliation: this report has not been checked against the PR's discussion.
8c914ea to
88fc9df
Compare
|
Reply to the automated review at 2026-10-12T17:29:14Z (head Blocking
Non-blocking
Decision for the author
Verified locally (before and after the rebase): |
rominf
left a comment
There was a problem hiding this comment.
🔴 Automated review · pr-review-watcher · 88fc9df
This automation never files a GitHub approval, so no approving review will
appear here whatever the outcome — the merge decision stays with a human
reviewer.
Review — no blocking findings
Full review of the whole change.
Closes #629 by porting comfyui-01, -02 and -03 to compiled stand-ins. comfyui-04 stays Linux-only and now says why, which is the issue's "document it explicitly" option.
Round 2. The commit reviewed last round (2ec2b2c) is no longer on the branch, so this was a full review. It found no new blocking findings, and both non-blocking findings below are new. This is still a change request because one standing objection from the earlier change request still holds (see Blocking). It was not re-found in the blind review. It was settled by putting it, with the author's reply, to the reviewer after its report was done, so that verdict is anchored evidence, not a blind re-find. Of the other two earlier objections, one is resolved and one is downgraded; details at the end.
Blocking
-
Standing, not yet verified: no Windows run of comfyui-01, -02 or -03 at this head —
tests/e2e-cucumber/features/comfyui.feature,tests/e2e-cucumber/src/bin/fake-python.rs- The passing Windows run cited in the reply (run 38248443250, job "E2E tests (Strix Halo, Windows)") was at 2ec2b2c. Its log does show comfyui-01, -02 and -03 passing.
- Six of the nine changed files differ between that commit and 88fc9df.
- That includes
fake-python.rs. The tested version wrote toargv[2]for any call without-c. The current one exits 1 unless it gets exactly-c <script>or<file>.py <result>. So "same behavior" is not literally true. - Reading the Windows call paths suggests the risk is low. The torch-stack probe is
-c <script>, andprobe_comfyui's script argument still ends in.pyafterruntime_path_for_windows_child. Reading cannot show that the.exestand-ins are built and copied correctly under the Windows lane. - At 88fc9df, "E2E self-hosted" (run 38362830209) is still
pendingwith no jobs. The run for the old head, 38248443250, is also stillqueuedas a whole, even though its Windows job finished. It may be holding the workflow's concurrency group, so cancelling it may unblock the new run. - None of the self-hosted lanes is a required check, so nothing else stops
Fixes #629closing the issue before Windows has run this code.
Confidence 100 · mechanical · Fix: get the self-hosted run going at this head, or at any commit with an identical tree. The block lifts once the Strix Windows lane reports comfyui-01, -02 and -03 passing. No code change is needed.
Non-blocking
-
New: the description's Windows evidence is from a different commit than the one under review — PR description, Verification section
- The cited run 38248443250 has
head_sha2ec2b2c…, not 88fc9df. The branch has been rebased since. - Six of the nine changed files have different blob SHAs at the two commits:
fake-python.rs,fake-uv.rs,fixture_binary.rs,comfyui_steps.rs,remote_steps.rsandREADME.md. - The
fake-python.rsdifference matters most: it changes which calls the stand-in accepts (see Blocking above).
Confidence 100 · mechanical · Fix: re-cite the Windows lane once it finishes at this head, or say that the cited run predates the rebase.
- The cited run 38248443250 has
-
New: a comment copied from
runtime_rocm_library_filenamedescribes checks this function does not have —tests/e2e-cucumber/tests/e2e/comfyui_steps.rs:122-124- The comment says "so the
.dll/.sosuffix checks are intentionally case-sensitive". - That sentence comes verbatim from
crates/rocm-core/src/runtime.rs:140-142. There it justifies#[allow(clippy::case_sensitive_file_extension_comparisons)]on theends_with(".dll")/ends_with(".so")arms. - The fixture copy has no suffix checks and no allow; it only calls
format!. The code is the reference here, because the comment describes behaviour the function body does not have.
Confidence 85 · mechanical · Fix: drop the first sentence, and change "Duplicated from" to "A simplified stand-in for".
- The comment says "so the
Decisions for the author
- Finding the stand-ins: walk up from
current_exe(), or use cargo'sCARGO_BIN_EXE_<name>— non-blocking-improvement- Today
fixture_binarylives in the lib crate and walks up fromcurrent_exe(), skippingdeps/. That keeps it shareable and matches the oldfake_tailscale_binary. - Cargo sets
CARGO_BIN_EXE_fake-uv(and the others) at compile time for integration tests, and the step modules undertests/e2e/belong to the integration test. Using it would remove the directory heuristic and the runtime existence assert. - The cost: the lib cannot see those variables, so the test crate would have to pass the path in.
- Today
Positive signals
fake-pythonrejects any call shape other than the two used byprobe_comfyuiand the torch-stack probe, and exits 1 instead of guessing. If the CLI ever adds a flag to either call, the scenarios fail loudly instead of passing silently on a stale stand-in.- The
current_exe()locator and the copy-with-panic now exist once, infixture_binary.rs.remote_steps.rs's private copy was folded in instead of being left as a twin.
Deployment notes
None
What this covered
- What was read: all nine changed files, completely, against
9a8c5a0b…88fc9df4(prw-base...HEAD). - Product paths traced:
select_runtime,install,probe_comfyuiandtorch_stack_constraintsinapps/rocm/src/comfyui.rs- readiness and
probe_has_resolved_libraryintherock.rs ensure_uv_binaryandrun_uv_logged_commandincrates/rocm-core/src/uv.rsruntime_path_for_windows_child
- Runs on Linux, with a target dir local to the checkout:
cargo xtask e2e -- -n comfyuiran 4 scenarios.- comfyui-01, -02 and -03 passed.
- comfyui-04 failed, and fails the same way with
tests/e2e-cucumberreverted to the base. So it is a local-host issue that predates this PR: under a TTY, the startup runtime-update check spends its 30-second window downloading uv and Python. It is not counted against this PR.
- CI at this head: every completed check is green, including
clippy,windows-build-and-testandE2E tests. "E2E self-hosted" is still pending. - Did not run:
- no local Windows build or run
- the prior-changes pass did not query review threads on earlier PRs that touched these files
- the design review was run by the reviewing context itself, not by independent workers, because the change is small
- the description was read before the findings were settled; the code and source-reading workers never saw it
- Reconciliation with the PR discussion: the blind report was not reconciled against it. The earlier objections were settled afterwards, as below.
Earlier objections (at 2ec2b2c), settled after the review:
- Windows run: still holds. It is the Blocking item above.
- Commit message: partly holds, now below the bar for a change request.
- Squashing removed the superseded
rustc-shim description. - The new message's opening still says the scenarios were Linux-only partly because of "hardcoded … .so library filenames". Readiness only checks
is_file()on the paths the manifest lists, and the same message says so four paragraphs later. - That leaves one self-contradicting clause in history. Deleting "and .so library filenames" from the opening sentence would fix it. Non-blocking.
- Squashing removed the superseded
- Product-crate import: resolved.
comfyui_steps.rsno longer importsrocm_core; a comment mentions it only as provenance.
The comment on the fixture's rocm_library_filename duplicated a case-sensitivity justification from rocm_core::runtime_rocm_library_filename that does not apply here: this stand-in has no suffix checks or clippy allow, it only formats a string. Addresses a non-blocking finding from the automated review on PR ROCm#637. Signed-off-by: Jussi Elo <jussi.elo@amd.com>
The comment on the fixture's rocm_library_filename duplicated a case-sensitivity justification from rocm_core::runtime_rocm_library_filename that does not apply here: this stand-in has no suffix checks or clippy allow, it only formats a string. Addresses a non-blocking finding from the automated review on PR ROCm#637. Signed-off-by: Jussi Elo <jussi.elo@amd.com>
06302b6 to
df9f514
Compare
rominf
left a comment
There was a problem hiding this comment.
🔴 Automated review · pr-review-watcher · df9f514
This automation never files a GitHub approval, so no approving review will
appear here whatever the outcome — the merge decision stays with a human
reviewer.
Review — needs work
Full review of the whole change.
Implements #629 (open), taking its first suggested remedy: compiled stand-ins plus platform-correct library names, then dropping @requires-os:linux from comfyui-01/02/03. If the Windows pass holds, the PR covers what the issue asks for.
Round 3. The commit reviewed last round (88fc9df) is no longer on the branch (rebased onto main), so this was a full, blind review. The first blocking finding is new: it comes from the rebase onto #649. The second blocking finding is the standing Windows objection from the last change request, and this review found it again on its own. The standing commit-message item is listed at the end under Non-blocking. Last round's stale-comment finding is fixed in df9f514.
Blocking
-
New: the fakes are planted with an in-process write, which brings back the
ETXTBSYrace that #649 fixed in these same scenarios —tests/e2e-cucumber/src/fixture_binary.rs:48-58(install_fixture_binary→std::fs::copy), reached fromcomfyui_steps.rsinstall_fake_uv/install_fake_pythonandremote_steps.rs:60;tests/e2e-cucumber/README.md:241-246.- What the rule says. The base commit is #649 (
2314b2d, "write fake executables without the ETXTBSY fork race"). It moved this file'swrite_shimontowrite_fake_executable, and its doc comment warned that "a write fd another scenario's spawn inherits makes the CLI's first run of the shim fail withText file busy".docs/testing.md("Tests that run a fake executable") still states the rule this diff drops: "The same applies to E2E steps: scenarios run concurrently in one process, and therocmchild that runs the shim can be the one refused." - Why
fs::copybreaks it.fs::copyholds a write fd on the destination inside the test process. That is exactly the window the helper exists to remove; a compiled binary does not avoid it, because the race is about the write fd, not the file type. - What I ran. I added a probe next to #649's regression test in
crates/rocm-core/src/fake_executable.rs, same harness (16 threads × 40 runs), but planting withstd::fs::copy("/bin/true", path). Result: 100 of 640 first runs failed with "Text file busy (os error 26)". #649's own test, using the helper, passed in the same run. - Caveat. In the e2e flow the exec happens inside the
rocmchild milliseconds later, so the window there is narrower than in the probe. I did not observe the race in an e2e run. - Two documents now disagree.
docs/testing.mdgoverns: its rule is backed by a measured regression test, and the measurement above showsfs::copyfalls inside it. The new README step tells the next author to copy binaries into place, so the pattern will spread. - Confidence 85 · architectural · Fix: in
install_fixture_binary, plant withrocm_core::fake_executable::write_fake_executable(dest, std::fs::read(fixture_binary(name))?). That keeps the portable[[bin]]approach and #649's guarantee, and the helper already sets 0755 on unix. Then make the README step point at it.
- What the rule says. The base commit is #649 (
-
Standing, found again: the description's verification claims a Windows pass on "this PR's head", but the only self-hosted run for
df9f5148has produced no result — PR description, "Verification".- What the description says. "The self-hosted
E2E self-hosted/E2E tests (Strix Halo, Windows)run against this PR's head confirmscomfyui-01,comfyui-02, andcomfyui-03all pass on a real Windows host". - What the runs show.
actions/runs?head_sha=df9f5148…lists exactly oneE2E self-hostedrun (38393650291), and it ispending. Its lanes are absent fromstatusCheckRollup. The cited run is therefore for an earlier head. - No other check covers Windows. The hosted
windows-build-and-testjob ran only 13 scenarios, alllifecycle-10..22. So no check on this commit exercises comfyui-01..03 on Windows, which is the behaviour the PR exists to add. The fixture code changed since that run, because the branch now sits on #649. - Confidence 100 · logic · Fix: get the Windows lane to complete on the current head (if it is stalled in the concurrency group, cancel the superseded run), then update the link. Or narrow the claim to the commit it was actually observed on.
- Round note: the Windows lane did pass comfyui-01, -02 and -03 at 88fc9df (run 38362830209, job "E2E tests (Strix Halo, Windows)", 10:11–10:25 UTC). This commit has a different tree: it is rebased onto a main that changed
comfyui.rs,therock.rsandruntime.rs. So that pass does not settle the objection. The run for df9f514 (38393650291) has had no jobs since 11:56 UTC. The likely cause is that the 88fc9df run is stillqueued: its "E2E tests (MI300X)" job never started, and the run may be holding the workflow's concurrency group. Cancelling 38362830209 should let the new run start. The objection lifts once the Windows lane passes comfyui-01, -02 and -03 at this head, or at any commit with the same tree. The ETXTBSY fix above changes the tree, so in practice that means the head that carries that fix.
- What the description says. "The self-hosted
Non-blocking
-
New: comments credit
probe_comfyuiwith both Python invocation forms; it has one —tests/e2e-cucumber/tests/e2e/comfyui_steps.rs:115-117; PR description ("neither ofprobe_comfyui's two forms").- The
-cform isprobe_torch_stack_versions(apps/rocm/src/comfyui.rs:1616-1621).probe_comfyui(:1800) only uses<probe.py> <result>.fake-python.rs:21names them correctly. - The same sentence in the description also says both stand-ins reject unrecognised argv.
fake-uvignores argv entirely and only rejects a badFAKE_UV_EXIT_CODE. - Confidence 85 · mechanical · Fix: "both of the runtime Python's invocation forms (
probe_torch_stack_versions's-c,probe_comfyui's script form)".
- The
-
New: the README step names repo files in bare backticks —
tests/e2e-cucumber/README.md:241-246.src/bin/,fixture_binary,fake-uv,fake-pythonandfake-tailscaleare not links.- AGENTS.md §5 asks for markdown citations of repo files to be relative links, e.g.
[fixture_binary.rs](src/fixture_binary.rs), so lychee catches a move. - This README is not one of the exempt files (the root README.md and CONTRIBUTING.md are;
tests/e2e-cucumber/README.mdis not). - Confidence 70 · mechanical · Fix: link
src/fixture_binary.rsand the threesrc/bin/*.rsfiles.
-
Standing: the commit message's opening sentence still contradicts itself — commit 40bd832, first paragraph.
- It still says the scenarios were Linux-only partly because the fixtures "hardcoded POSIX shell shims and .so library filenames". Later in the same message it says readiness only checks
is_file()on the paths the manifest lists. - rocm-cli squash-merges, so this message becomes the commit on main.
- This item was not re-found in the blind review. It was checked against the current commit message after the review. Non-blocking.
- Fix: delete "and .so library filenames" from the opening sentence.
- It still says the scenarios were Linux-only partly because the fixtures "hardcoded POSIX shell shims and .so library filenames". Later in the same message it says readiness only checks
Decisions for the author
- Compiled
[[bin]]stand-ins versus extending the shim helper — tradeoff- Compiled bins run unchanged on Windows and fail loudly on unexpected argv.
- The cost is that their behaviour is configured through process env (
FAKE_UV_*), which leaks into therocmprocess under test. Nothing else reads those vars today. - Shell/batch shims are cheaper per scenario but cannot take the multi-line
-cargument on Windows. - The current choice is reasonable; just confirm the env channel is intended as the pattern for future stand-ins.
Positive signals
- Moving
fake-tailscale's private lookup-and-copy into the sharedfixture_binaryremoves a duplicate rather than adding a third. - Mutation-checked: making
fake-python's-carm exit 1 fails comfyui-01 and comfyui-02. Making its probe-script arm write nothing fails comfyui-02. Neither arm is decorative. fake-pythonrejects unrecognised argv instead of defaulting, so a future change to the probe's call shape surfaces as a fixture failure, not a false pass.
Deployment notes
None
What this covered
- What was read. Every file in the change, completely (
prw-base…df9f5148, merge-base2314b2d). Also the product paths the fixtures stand in for: the Python/uv invocations and runtime readiness inapps/rocm/src/comfyui.rs,probe_has_resolved_libraryintherock.rs, androcm_core::fake_executable. The fan-out was two read-only workers: a code pass and the source-reading passes. - What I ran.
cargo xtask e2e -- -n comfyuion Linux: comfyui-01/02/03 passed.- comfyui-04 failed locally, waiting for the progress frame. The screen showed the CLI rejecting this host's PATH
python3(3.13; cp312 required) and downloading a managed Python. That path is unchanged by this PR, and CI's Linux E2E passed comfyui-04. - The two
fake-pythonmutations above, and thefs::copyrace probe. - CI: all reported checks green;
E2E self-hostedpending for this head.
- Not run, and why.
- Prior-changes pass skipped: it would have needed other PRs' review discussion.
- No Windows build or run was possible locally (no mingw toolchain).
- Design review (Step 7) was done by the driver, not as independent workers, because the change is small.
- Not reconciled. This report was not reconciled against the PR's comment or review discussion.
895b009 to
3e43eea
Compare
|
Reply to the automated review at 2026-10-13T16:07:28Z (head Blocking
Non-blocking
Decision for the authorConfirmed: compiled Also found during this roundRebasing onto Separately, CI's hosted |
rominf
left a comment
There was a problem hiding this comment.
🔴 Automated review · pr-review-watcher · 3e43eea
This automation never files a GitHub approval, so no approving review will
appear here whatever the outcome — the merge decision stays with a human
reviewer.
Review — needs work
Full review of the whole change.
Claims Fixes #629. It makes comfyui-01/02/03 portable. The issue's "and others in the file" (comfyui-05..13) stay Linux-only, and the reason the file documents for that is now partly untrue (see Blocking 2).
Round 4. The commit reviewed last round (df9f514) is no longer on the branch, so this was a full, blind review. This round files no change request and lifts the two standing ones. Why:
- Standing ETXTBSY objection: settled, lifted. This round's blind review did not re-find it. It was then put to the reviewer together with the author's reply, and the reviewer judged it no longer holds:
install_fixture_binary(tests/e2e.rs) now plants throughwrite_fake_executable, and nostd::fs::copycall remains. That verdict is anchored, because the reviewer was shown the objection. The driver also checked the code directly. - Blocking 1 (Windows evidence): standing, re-found blind, but it does not gate on its own. Nothing has yet shown comfyui-01/02/03 passing on Windows. That is because
E2E self-hostedrun 38519200539 for this head has beenpendingsince 05:54Z behind a stalled self-hosted queue. A lane that cannot run is missing evidence, not a defect in the change. A human should still see that lane pass before merging. - Blocking 2 (stale header comment): new, but below the gate. It is a comment that no longer matches the code. The comfyui-05..13 scenarios themselves stay correctly gated. It should be fixed, but on its own it does not justify blocking the merge.
- Last round's non-blocking items: the
probe_comfyuiwording, the bare README paths and the.soclause in the commit message are all fixed at this head.
Blocking
- New: nothing has yet run the three newly ungated scenarios on Windows, and the only lane that would is not a required check —
tests/e2e-cucumber/features/comfyui.feature:14,34,63- The PR exists so that comfyui-01/02/03 run on Windows.
- At 3e43eea, the hosted
windows-build-and-testjob only runscargo clippy -p e2e-cucumber --test e2eand unit tests. Its log (run 38519200508, job 115714817051) contains no cucumber scenario at all. - The run that would exercise them,
E2E self-hosted(Strix Halo Windows), is run 38519200539. It has beenpendingsince 05:54Z. - The header of
.github/workflows/e2e-selfhosted.ymlsays these lanes are not in branch protection's required checks. So the PR can merge with the Windows result still missing, or red. - The description agrees ("Pending: a fresh self-hosted … Windows run").
- Confidence 85 · logic · Fix: before merge, get a Strix Windows report for this head showing comfyui-01/02/03 passed (not skipped). A
workflow_dispatchwithplatform=strix-windowsand aname_filterwould do. - Round note: this is the standing Windows objection from earlier rounds; this round's review found it again without being told about it.
- New: the documented reason comfyui-05..13 are Linux-only is now partly false, and the reinstall steps still override the fixture this change made portable —
tests/e2e-cucumber/features/comfyui.feature:115-116,tests/e2e-cucumber/tests/e2e/comfyui_steps.rs:748-757,comfyui_steps.rs:1538-1545- The header still says "Linux-only because the planted runtime uses
.sonames and a POSIX-shell Python stand-in". After this change,plant_ready_runtimeplantsrocm_library_filename(..)names and the compiledfake-python. Neither stated reason is true of the planted runtime any more. - The real remaining reasons are in the reinstall steps:
write_gpu_probe_shim/write_shimat:750,:1520and:1535Command::new("sh")at:1179- the hard-coded
"python3"inruntime_python()and at:756, whereplant_ready_runtimenow usesfixture_target_name("python3")
used_comfyui_installalso still overwrites the freshly plantedfake-pythonwith the shell shim. Its comment ("Answers the post-install GPU check…") describes something the planted runtime now already does. That contradictsinstall_fake_python's "one install serves every scenario".- #629 offers "document explicitly … why … Linux-only by design" as an acceptable resolution. So this header is the documentation that
Fixes #629relies on for the remaining scenarios. - Which side governs: the code. The planted runtime is what actually runs.
- Confidence 85 · mechanical · Fix: rewrite the header to name the real reasons listed above. Either drop the redundant overwrite at
:750, or keep it and say why.
- The header still says "Linux-only because the planted runtime uses
Non-blocking
- New: README step 6 swaps the two helpers' roles —
tests/e2e-cucumber/README.md:244-245- It says "
fixture_binary'sfixture_target_namelocates and names it". In the code,fixture_binary()locates the built binary (src/fixture_binary.rs:24-37).fixture_target_nameonly appends.exeon Windows. - Confidence 85 · mechanical · Fix: "
fixture_binary()locates it andfixture_target_name()names it".
- It says "
- New: the "black-box" reason given for not importing
runtime_rocm_library_filenamedoesn't hold for this test binary —tests/e2e-cucumber/tests/e2e/comfyui_steps.rs:182-187- The comment says importing it "would cost the black-box guarantee". Yet the same test binary already imports
rocm_core: this PR's owninstall_fixture_binaryintests/e2e.rsusesrocm_core::fake_executable, anddash_steps.rsusesAppPaths. - The local helper is fine. The stated reason is the inaccurate part: the README "No imports from the rocm-cli codebase" rule is already relaxed for
rocm_core. - Confidence 70 · mechanical · Fix: justify the helper on its own terms ("only the filename's look matters; readiness checks
is_file()"), or drop the black-box clause.
- The comment says importing it "would cost the black-box guarantee". Yet the same test binary already imports
- New: the commit carries an AI co-author trailer — commit 3e43eea message (
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>)- AGENTS.md §11: "avoid AI-generated boilerplate footers".
- Confidence 70 · mechanical · Fix: drop the trailer when squashing.
Decisions for the author
- Use cargo's compile-time path for the stand-ins instead of walking up from
current_exe()— non-blocking-improvementtests/e2e.rsis an integration test of the package that declaresfake-uv,fake-pythonandfake-tailscale. Cargo therefore setsCARGO_BIN_EXE_<name>for it.env!("CARGO_BIN_EXE_fake-uv")would replace thedeps/heuristic and the runtimeexists()assert insrc/fixture_binary.rs.- The cost is that the lookup moves into the test binary, next to
install_fixture_binary, rather than the library target. The current approach is inherited fromfake-tailscaleand works.
Positive signals
fake-pythonrejects any argv that isn't one of the two formscomfyui.rsactually uses. The old shell shim exited 0 for anything, so the fixture can now catch a change in how the CLI invokes the runtime Python, where before it would have hidden one.fake-tailscalenow installs throughwrite_fake_executableinstead ofstd::fs::copy, which closes the ETXTBSY window for the remote scenarios as well.
Deployment notes
None
What this covered
- What was read. All 10 changed files, completely, against
prw-base9f2b3f3…3e43eea6. Also the product paths they stand in for:- the
probe_torch_stack_versions/probe_comfyuiargv run_uv_logged_command's environment handlingROCM_CLI_UV_BINARYresolutionprobe_has_resolved_librarywrite_fake_executableon both OSes- every caller of
plant_ready_runtime
- the
- Linux runs (
cargo xtask e2e, owntarget/,report.jsonmtime checked):- comfyui-01/02/03 passed (4 scenarios: 3 passed, 1 failed).
- The comfyui-04 failure is a host artifact, not this change: the same failure reproduces with
tests/e2e-cucumberreverted toprw-base. On this host the CLI goes off to fetch uv and Python 3.12 from the network.
- Test verdicts for comfyui-01/02/03:
- With the fixture change reverted, they still pass on Linux. The behaviour this change adds (running on Windows) is exercised by nothing that has run yet; that is Blocking 1.
- Mutating
fake-uvto drop itsFAKE_UV_STDOUTline turned comfyui-02 red. That proves the env vars reachuvthroughrocmand that this branch is tested. - comfyui-01 requires the non-zero exit path. This is reasoned from its assertion, not separately mutated.
fake-python's unexpected-argv branch is a fail-loud guard that no scenario reaches.
- Did not run or check:
- The scenarios on Windows (not possible on this host).
- A Windows-target
cargo check. The hosted Windows clippy of--test e2epassed in CI. - Step 7 design questions were answered by the review driver from the code, not by independent workers, because the change is small.
- Passes that did run: prior-changes and history (earlier PRs #328, #333, #397, #421, #546 and #600; no recurring concern applies) and agent-instruction adherence.
- Prompt injection: none found in the checkout.
- Discussion: this report was not reconciled against the PR's discussion, apart from the standing-objection settlement described in the round note.
Both objections re-checked at 3e43eea. ETXTBSY: install_fixture_binary now plants through write_fake_executable, and no std::fs::copy remains. Windows evidence: still missing, but only because the self-hosted lane run for this head is stalled in the queue, which is not a defect in the change; a human should confirm that lane before merge. See review 5514907861.
ca9313e to
32c07d4
Compare
|
Reply to the automated review at 2026-10-14T09:07:09Z (head Blocking
Non-blocking
Decision for the authorConfirmed again, nothing new to add: compiled Verified locally at |
rominf
left a comment
There was a problem hiding this comment.
🔴 Automated review · pr-review-watcher · 32c07d4
This automation never files a GitHub approval, so no approving review will
appear here whatever the outcome — the merge decision stays with a human
reviewer.
Review — needs work
Full review of the whole change.
The PR closes #629 ("Fixes #629"). Of the issue's two remedies, it takes the first for comfyui-01/02/03 (portable stand-ins, tag dropped). For comfyui-04..13 it takes the second: the feature file now says why each stays Linux-only.
Round 5. The commit reviewed last round (3e43eea) is no longer on the branch, so this was a full, blind review. This round files no change request; none is standing on this PR. Why:
- Windows evidence (Blocking 1): standing, re-found blind, does not gate on its own.
E2E self-hostedrun 38559321320 for this head is stillpendingwith zero jobs since 11:49Z, behind the stalled self-hosted queue. A lane that cannot run is missing evidence, not a defect in the change. A human should still see comfyui-01/02/03 pass on Strix Windows before merging. - Description scope/verification (Blocking 2): new, below the gate. The mismatch is mainly in the PR description, and rocm-cli builds the squash commit from commit messages. The commit message also describes the change as fixture work for comfyui-01/02/03 only, but the reviewer ran all 13 comfyui scenarios and they pass (comfyui-04's failure reproduces on
prw-base). So the inaccuracy has no consequence beyond the text. It should still be corrected. - Last round's stale header comment: header half fixed, overwrite half standing (below the gate). This round's blind review did not re-find it. It was then put to the reviewer with the author's reply. The reviewer judged that the rewritten
comfyui.featureheader is now accurate, but the redundant overwrite inused_comfyui_installstill holds; see the standing item under Blocking. That verdict is anchored, because the reviewer was shown the objection. The driver confirmed the overwrite in the code. It is a redundant test-fixture write with a misleading comment, and the scenarios pass, so it does not gate, the same as last round. - Last round's non-blocking items: the README helper roles and the AI co-author trailer are fixed. The
rocm_library_filenamecode comment is fixed, but the commit message still gives the old reason ("breaking this suite's black-box-only rule (no imports from the product crates)"), and that message is what lands onmain.
Blocking
- New: nothing has run comfyui-01/02/03 on Windows, though that is the whole point of the PR —
tests/e2e-cucumber/features/comfyui.feature:14,34,63- The hosted
windows-build-and-testjob ranE2E_INCLUDE_LIFECYCLE=1 E2E_ONLY_LIFECYCLE=1. Its log shows13 scenarios (13 passed), and all 13 are lifecycle-10..22. No comfyui scenario ran. - The only lane that would run them is the self-hosted
E2E self-hostedworkflow (run 38559321320). For this head it has beenpendingwith zero jobs since 11:49Z. E2E tests (Strix Halo, Windows)is not one of the required checks onmain(queried live). Nothing stops this merging, and closing #629, without a single Windows run.- I could not run Windows here. From reading the code, the CLI path looks platform-agnostic:
validate_wheel_runtime_manifestonly checksis_file(),probe_has_resolved_libraryonly checksis_file(), and the-cand<probe.py> <result>forms match whatfake-pythonaccepts. But that is a prediction, not a run. - The PR body itself lists this as "Pending".
- Confidence 100 (lane state and job logs read directly) · architectural · Fix: get a Strix Windows run for this head and confirm comfyui-01/02/03 appear as executed, not skipped, in its report. Better still, see the hosted-lane suggestion under Decisions.
- Round note: this is the standing Windows objection from earlier rounds; this round's review found it again without being told about it.
- The hosted
- New: the PR description misstates its own scope and verification — PR body, What changes and Verification
- It says only "comfyui-01, comfyui-02, and comfyui-03's fixtures" changed, and that
cargo xtask e2e -- -n comfyuiran "all 4 scenarios, 23/23 steps". - At this head,
comfyui.featurehas 13 scenarios.plant_ready_runtime(comfyui_steps.rs:208) is shared with comfyui-04..13. Its default runtime Python changed from#!/bin/sh exit 0(which fails the GPU check) tofake-python(which passes it). paced_comfyui_source_archive_fixture(comfyui-04) was also edited, to drop itswrite_gpu_probe_shimcall.- So ten more scenarios had their fixture behaviour changed without being mentioned, and the stated verification does not cover them.
- I ran them myself. On HEAD: comfyui-01..13 gave 12 passed. comfyui-04 failed, but the identical failure (a network download of a managed Python 3.12 timing out) reproduces on
prw-base, so it comes from this environment, not the PR. On HEAD merged withprw-base: comfyui-01/02/03/05/11 all passed. The risk is settled; the description is not. - Confidence 85 · mechanical · Fix: narrow nothing. Update the description to say
plant_ready_runtimenow gives every comfyui scenario a GPU-check-passing Python by default, and correct the verification line to match this head.
- It says only "comfyui-01, comfyui-02, and comfyui-03's fixtures" changed, and that
- Standing (from round 4, settled by putting it to the reviewer):
used_comfyui_installstill overwrites the plantedfake-pythonwith the shell shim —tests/e2e-cucumber/tests/e2e/comfyui_steps.rs:745-756used_comfyui_installcallsplant_ready_runtime, which now plantsfake-python. It then immediately overwrites that file withwrite_gpu_probe_shimat the literalbin/python3path.- Its comment ("Answers the post-install GPU check
install()runs after the swap.") describes what the planted runtime already does. Last round's fix offered two options: drop the overwrite, or keep it and say why. Neither has been done. - Because of the overwrite, the header's first reason for comfyui-05..13 being Linux-only (the
#!/bin/shGPU-check stand-in) is self-inflicted for this shared Given, not an independent limitation. - comfyui-11 (
gpu_check_fails/gpu_check_passes_again) genuinely needs a shell shim, becausefake-pythonhas no failing-GPU mode. So the helpers stay; only this one call is in question. Whether dropping it keeps comfyui-05..13 green has not been run. - Fix: drop the overwrite in
used_comfyui_install, or keep it with a comment that says why. - Round note: the header half of last round's objection is fixed, and this half was not re-found blind. The reviewer's verdict on it is anchored evidence, and the driver confirmed the code. It does not gate (see the round note).
Non-blocking
- New: commit message has a garbled sentence — commit 32c07d4
- "...rather than std::fs::copy, so it does not reopen / the duration of the copy..." is missing a line. The PR body has the intact text: "#649's
ETXTBSYrace: a plain copy holds a write fd on the destination for". - Confidence 85 · mechanical · Fix: reword before merge, or make sure the squash message is taken from the PR body.
- "...rather than std::fs::copy, so it does not reopen / the duration of the copy..." is missing a line. The PR body has the intact text: "#649's
Decisions for the author
- Gate these scenarios on the required hosted Windows lane, not only on the optional Strix one — non-blocking-improvement
- comfyui-01/02/03 are hermetic: no GPU, no network. They could run in the required
windows-build-and-testjob, which today runs only lifecycle scenarios. - As things stand, Windows coverage depends on a non-required self-hosted lane that only runs when
changes.serveis true and is currently stalled. Moving them would make #629's fix enforced rather than incidental.
- comfyui-01/02/03 are hermetic: no GPU, no network. They could run in the required
- Use
env!("CARGO_BIN_EXE_<name>")instead of walking up fromcurrent_exe()— non-blocking-improvement- Cargo exposes the exact path of each
[[bin]]to integration tests at compile time.install_fixture_binaryalready lives intests/e2e.rs, so it could use that. - A rename would then fail to compile, instead of panicking at runtime with "was not built at…", and the
src/fixture_binary.rslocator in the library target would no longer be needed. - The current approach keeps the lookup in the lib and matches the pre-existing
fake-tailscalecode, which is also a valid choice.
- Cargo exposes the exact path of each
- Two copies of the runtime Python path — tradeoff
runtime_python()(comfyui_steps.rs:1537) still hard-codesbin/python3.plant_ready_runtimenow usesfixture_target_name("python3").- On Linux they agree. Ungating any reinstall scenario on Windows later would write the shim to a different file than the one the manifest names.
- The feature-file comment acknowledges this. Confirm it is deliberate rather than a pending unification.
Positive signals
- Each fixture branch is load-bearing. I broke them one at a time on the merged tree:
fake-uvignoringFAKE_UV_EXIT_CODE→ comfyui-01 fails.fake-uvignoringFAKE_UV_STDOUT→ comfyui-02 fails.fake-pythonfailing the-cprobe → comfyui-01 and -02 fail.fake-pythonwriting an empty GPU result → comfyui-02 fails.- comfyui-03 is unaffected by all of these, as expected: it tests runtime selection only.
fake-pythonrejects any argv it doesn't recognise rather than guessing, so a future third Python invocation incomfyui.rsfails loudly instead of passing silently.fake-tailscaleis now planted throughwrite_fake_executableinstead ofstd::fs::copy, which closes theETXTBSYwindow on that path too.
Deployment notes
None
What this covered
- Read: every file in
prw-base...HEAD(merge-base b8c4b3e…32c07d43), completely. Also the CLI code paths the fixtures stand in for:comfyui.rs(install,probe_torch_stack_versions,run_uv_logged_command,probe_comfyui,apply_runtime_environment),runtimes_cmd.rs(validate_wheel_runtime_manifest),therock.rs(probe_has_resolved_library, the Python resolver),rocm-corefake_executable, the self-hosted workflow gating, and the required-check list. - Ran:
cargo xtask e2efor comfyui-01..03 (passed) and for all 13 comfyui scenarios on HEAD (12 passed; comfyui-04 failed locally, and also fails onprw-base).- comfyui-01/02/03/05/11 on HEAD merged with
prw-base: no conflicts, all passed. - Four fixture mutations, as listed under Positive signals.
- Test verdicts:
- comfyui-01/02/03 with the change reverted: they would still pass on Linux. Their new value is Windows execution, which no check has exercised (first blocking finding).
- Breaking one branch at a time: every
fake-uv/fake-pythonbranch turns a scenario red, except the deliberate reject-unknown-argv branch.
- CI: all hosted checks green for 32c07d4. No self-hosted lane (Strix Windows, Strix Ubuntu, WSL2, GPU) has reported; the
E2E self-hostedrun is pending with zero jobs. - Did not run:
- Windows execution: there is no Windows host here, and the mingw cross-check was not needed because the hosted Windows clippy for
--test e2eis green. - The prior-changes pass: earlier PRs' review comments were not consulted.
- Fan-out: single-context review. The change is small enough for one pass, and the design questions were also investigated in this context rather than by independent workers.
- Windows execution: there is no Windows host here, and the mingw cross-check was not needed because the hosted Windows clippy for
- Not reconciled: against any discussion on the PR; that was not done here.
32c07d4 to
f1ac912
Compare
|
Reply to the automated review at 2026-10-14T18:21:40Z (head Blocking
Non-blocking
Decisions for the authorNot acted on this round — leaving open rather than guessing:
Verified locally at |
|
Filed #689 to track moving comfyui-01/02/03 onto a required Windows lane (the first decision item from the round-5 review reply above). |
rominf
left a comment
There was a problem hiding this comment.
🔴 Automated review · pr-review-watcher · f1ac912
This automation never files a GitHub approval, so no approving review will
appear here whatever the outcome — the merge decision stays with a human
reviewer.
Review — no blocking findings
Full review of the whole change.
Implements #629 (open) for comfyui-01, -02 and -03: they lose @requires-os:linux. comfyui-04 to -13 stay Linux-only and the feature file explains why, which is the issue's second accepted option. So "Fixes #629" is a fair claim.
Round 6. The commit reviewed last round (32c07d4) is no longer on the branch, so this was a full, blind review. No change request is filed or standing on this PR. What happened to last round's items (checked by the driver against this head):
- Windows evidence: resolved for the code, not for this exact head.
E2E tests (Strix Halo, Windows)ran at 32c07d4 (job 116129072114, success). Its log shows comfyui-01, -02 and -03 executed with every step passing. At f1ac912 theE2E self-hostedrun is stillpending, so the Windows lane has not run at the live head. The reviewer compared the two heads: the PR's own patch differs only in thecomfyui.featurecomment at :115-120, but the base is newer. plant_ready_runtimescope: fixed. The commit message now says the change affects every comfyui scenario (01 through 13).used_comfyui_installoverwrite: fixed. The overwrite is gone (comfyui_steps.rs:745-759).- Garbled sentence in the commit message: fixed.
- "Black-box" reason in the commit message: still there. The README does state that rule, so the sentence is not false. It is now listed under Decisions below, along with the fact that this change itself adds a
rocm_coreimport. - All findings below are new this round.
Blocking
None
Non-blocking
-
Comments added or left by this change misstate which ComfyUI scenarios still need the POSIX shell —
tests/e2e-cucumber/features/comfyui.feature:90-94,tests/e2e-cucumber/features/comfyui.feature:115-120,tests/e2e-cucumber/tests/e2e/comfyui_steps.rs:127-130,tests/e2e-cucumber/tests/e2e/comfyui_steps.rs:280-281- comfyui.feature:115-120 says the whole comfyui-05..13 block is Linux-only partly because "the planted Python path is the literal
bin/python3rather than the Windows-portable stand-in". That is wrong.- Every one of those scenarios plants its runtime through
plant_ready_runtime. That function now installsfake-pythonatbin/fixture_target_name("python3")(comfyui_steps.rs:212-219), the same stand-in comfyui-03 uses. - Only three scenarios actually depend on the shell:
- comfyui-11 plants a
#!/bin/shshim throughgpu_check_fails/runtime_python(comfyui_steps.rs:1508-1535). - comfyui-08 and comfyui-12 call
spawn_stand_in, which runssh -c(:1168).
- comfyui-11 plants a
- comfyui-05, -06, -07, -09, -10 and -13 use none of these.
- Every one of those scenarios plants its runtime through
- comfyui.feature:90-94 says the file's other scenarios have fixtures that "are now portable". That contradicts lines 115-120 of the same file.
- The
write_shimdoc comment (comfyui_steps.rs:127-130) says the helper is "used by the--reinstallscenarios". Its only remaining caller is comfyui-11. comfyui_steps.rs:280-281says the Python stand-in answers only the empty-JSON probe. It now answers both probes.- The code is what runs, so the code governs.
- Confidence 85 · mechanical · Fix: state the real per-scenario reasons. Either say the shell reasons apply only to -08, -11 and -12 and give whatever else keeps the rest Linux-only, or remove the tag from the scenarios that no longer need it.
- comfyui.feature:115-120 says the whole comfyui-05..13 block is Linux-only partly because "the planted Python path is the literal
-
runtime_python()still hard-codespython3, whileplant_ready_runtimenow usesfixture_target_name("python3")—tests/e2e-cucumber/tests/e2e/comfyui_steps.rs:1528-1535,:212-214- Both functions build the path to the same planted interpreter. They agree on Linux but name different files on Windows (
python3vspython3.exe). - If comfyui-11 is ever made portable, its shim would not land on the interpreter the CLI actually runs, and nothing would report it.
- Confidence 70 · mechanical · Fix: use
fixture_target_name("python3")inruntime_pythontoo.
- Both functions build the path to the same planted interpreter. They agree on Linux but name different files on Windows (
Decisions for the author
rocm_library_filenameduplicatesrocm_core::runtime_rocm_library_filename— answered-by-intent- The commit message and description say: "the import would buy nothing while breaking this suite's black-box-only rule (no imports from the product crates)". The README does state that rule (
tests/e2e-cucumber/README.md:253). Without that reason, this would be a non-blocking duplication finding: the two functions give identical output foramdhip64andhipblastoday. - Two things to confirm:
- The in-code comment at
comfyui_steps.rs:182-186gives only "would buy nothing" and leaves out the black-box rule. The commit message's reason should also be in the code. - This same change adds a
rocm_core::fake_executableimport throughinstall_fixture_binary(tests/e2e.rs:770-782), and movesfake-tailscaleonto it. So the suite already crosses the rule, while its README states it without exception.
- The in-code comment at
- The commit message and description say: "the import would buy nothing while breaking this suite's black-box-only rule (no imports from the product crates)". The README does state that rule (
FAKE_UV_*are left incommand_env, which the firstrocmcall consumes — tradeoffrun_rocm_with_scenario_envtakes these values withstd::mem::take(tests/e2e.rs:910), so they apply only to the next CLI run. The old shelluvencoded its outcome in the file, so it held for the whole scenario.- This matches how
ROCM_CLI_UV_BINARYalready behaves, and no current scenario runs install twice. A future multi-install scenario would have to set them again.
Positive signals
- Both fixture branches are genuinely exercised. With
fake-uvmutated to ignoreFAKE_UV_EXIT_CODEandfake-pythonwriting{}as the GPU result, the comfyui feature dropped from 13/13 to 5/13 passing (comfyui-01, -02, -04, -05, -08, -09, -10 and -12 failed). None of those scenarios was a false green. fake-pythonrejects any argv shape it does not expect, andfake-uvpanics on a bad exit code. A wrong fixture setup fails the scenario instead of passing it.fake-tailscaleis now planted throughwrite_fake_executableinstead ofstd::fs::copy, which closes theETXTBSYwindow the copy left open inremote_steps.rs.
Deployment notes
None
What this covered
- Read: every changed file, completely, against
prw-base5e45915…f1ac912d. Also the product code the fixtures stand in for:- in
apps/rocm/src/comfyui.rs, every place that starts the runtime Python oruv, and how environment variables reach them; - the readiness checks in
apps/rocm/src/therock.rs; rocm_core::fake_executableandruntime_rocm_library_filename.
- in
- Fan-out: two read-only workers. One took the code and product-trace pass; the other took AGENTS.md adherence, history, code comments, docs and the CI lane config.
- Ran:
cargo xtask e2e -- -i features/comfyui.featureon Linux, in the checkout's owntarget/: 13 scenarios and 105 steps passed, exit 0.- The mutation run above.
- CI at f1ac912: all hosted checks are green, including
windows-build-and-test,E2E testsandclippy. TheE2E self-hostedworkflow (GPU lanes, including Strix Windows) is still pending. - Did not run:
- the Windows e2e lane at this head, locally or in CI;
- a Windows-target
cargo check, which was left towindows-build-and-test; - the prior-changes pass.
- Not reconciled: the review itself was not checked against the PR discussion. The round note above is the driver's reconciliation.
f1ac912 to
269d26f
Compare
|
Reply to the automated review at 2026-10-15T09:04:00Z (head Non-blocking
Decisions for the author
Verified at |
rominf
left a comment
There was a problem hiding this comment.
🔴 Automated review · pr-review-watcher · 269d26f
This automation never files a GitHub approval, so no approving review will
appear here whatever the outcome — the merge decision stays with a human
reviewer.
Review — needs work
Full review of the whole change.
Fixes #629 (title, description and commit trailer). The change does the first half of the issue: comfyui-01/02/03 are no longer gated to Linux. It does not cover the issue's "and others in the file", so the Fixes claim goes further than the change does (see Blocking).
Round 7. The commit reviewed last round (f1ac912) is no longer on the branch, so this was a full, blind review. This round files no change request, and none is standing on this PR. The reviewer marked two findings blocking; neither is used as a merge gate this round. Why, as checked by the driver against this head:
- Windows evidence (Blocking 1): standing since earlier rounds, re-found blind; does not gate on its own.
E2E self-hostedrun 38721961366 for this head ispendingwith 0 jobs. The self-hosted queue is stalled repo-wide: several other PRs' runs are queued behind it. A lane that cannot run is missing evidence, not a defect in the change. Since the Strix Windows pass at 32c07d4, the PR's own changes are comments plusruntime_python().runtime_python()is used only by comfyui-11, which is still Linux-only. A human should still see comfyui-01/02/03 pass on Strix Windows at this head before merging. Fixes #629scope (Blocking 2): new wording, below the gate. Last round judged "Fixes #629" fair, because the issue's second option ("document … why … Linux-only") was taken. What is new is the header comment atcomfyui.feature:121-124. It now says "#629 only asks about comfyui-01/02/03", which the issue text contradicts. It also frames the remaining six scenarios' gate as deferral rather than design. That makes the comment wrong and the closing claim weaker. Merging would close #629 with those six scenarios gated and nothing tracking them. Either fix in the finding resolves this cheaply:Part of #629plus a follow-up issue, or ungating the six. It is not used as a merge gate on its own.- Last round's non-blocking items:
runtime_python()now usesfixture_target_name("python3"), so that item is fixed.- The shell-dependency comments now name the real three scenarios (-08, -11, -12). One leftover inconsistency remains in the comfyui-04 comment; see Non-blocking 2.
- The author's reply of 10:41Z is answered by this round.
Blocking
- The change's main claim, that comfyui-01/02/03 now pass on Windows, has no CI run at this head —
tests/e2e-cucumber/features/comfyui.feature:14,34,63- At 269d26f, the
E2E self-hostedworkflow run 38721961366 ispendingand has 0 jobs, so it has not run here. That workflow holds the Strix Halo Windows lane, the only Windows lane that runs the full suite. - The hosted
windows-build-and-testjob does pass. But its e2e step setsE2E_INCLUDE_LIFECYCLE=1andE2E_ONLY_LIFECYCLE=1(.github/workflows/ci.yml, step "Acceptance install lifecycle"), so it runs only@lifecyclescenarios and none of the ungated ComfyUI ones. - The Windows pass the description cites (job 116129072114) ran on
32c07d43. GitHub's compare shows that commit has diverged from this head (ahead 1, behind 1), so it is a different commit. - Confidence 85 · architectural · Fix: get the self-hosted run for this head to actually schedule. A run stuck at 0 jobs after a push usually means a superseded run is holding the concurrency group. Then confirm comfyui-01/02/03 ran and passed on the Strix Windows lane.
- At 269d26f, the
Fixes #629closes an issue the change only partly does, and the in-tree comment misstates what the issue asks —tests/e2e-cucumber/features/comfyui.feature:121-124, PR description / commit trailerFixes #629- The comment says ungating comfyui-05/-06/-07/-09/-10/-13 "is out of this fix's scope (#629 only asks about comfyui-01/02/03)".
- #629's text names "
comfyui-01,comfyui-02,comfyui-ambiguous-runtime-actionable, and others in the file". It asks either to ungate them, or to document why ComfyUI e2e coverage is Linux-only "by design". - For those six scenarios the comment itself concedes there is no shell dependency left. It keeps the gate only as deferral ("has not been run on Windows"), which is neither of the two outcomes #629 asks for.
- The issue text governs here: the comment paraphrases it, and the paraphrase is wrong.
- Confidence 85 · mechanical · Fix: one of two.
- Ungate the six shell-free scenarios and confirm them on the Windows lane.
- Or change the trailer to
Part of #629, open a follow-up for those six, and reword the comment so it no longer says what #629 asks.
Non-blocking
- The comment justifying the local
rocm_library_filenametwin rests on a false premise —tests/e2e-cucumber/tests/e2e/comfyui_steps.rs:182-193- It presents
install_fixture_binaryas the black-box rule's "load-bearing exception elsewhere in this change". - The suite imported
rocm_corewell before this PR:- at
prw-base,tests/e2e.rs:323usesrocm_core::AppPaths; automations_steps.rs:20importsrocm_core::{AutomationProposalRecord, …};write_shimin this same file already calledrocm_core::fake_executable.
- at
- "In this change" will also read wrongly once merged.
- The choice itself still holds, because readiness only checks
is_file()(therock.rs::probe_has_resolved_library). Only the reasoning is wrong. - Confidence 85 · mechanical · Fix: keep only the "readiness only checks
is_file()" justification and drop the exception narrative.
- It presents
- The comfyui-04 comment calls the other scenarios' gate "a separate, narrower limitation" —
tests/e2e-cucumber/features/comfyui.feature:90-95- The header 20 lines below says six of those scenarios are gated for scope reasons, not because of a technical limitation.
- The two comments should agree. The lower header describes the gate the scenarios actually carry, so it governs.
- Confidence 70 · mechanical · Fix: reword to "whose Linux gate is explained below".
- The GPU-probe answer now exists twice —
tests/e2e-cucumber/tests/e2e/comfyui_steps.rs:143(write_gpu_probe_shim),tests/e2e-cucumber/src/bin/fake-python.rs:25(GPU_PROBE_JSON)- The shell shim's only remaining caller is
gpu_check_passes_again(comfyui_steps.rs:1533). - That step could plant
install_fake_python(&runtime_python(world))instead. Doing so deletes the duplicated JSON and one of comfyui-11's two remaining shell dependencies. - Separately, the shim's doc comment still attributes the
-cform toprobe_comfyui;-cactually belongs to the torch-stack probe. This predates the PR, but the PR touches the function next to it. - Confidence 70 · mechanical · Fix: as described.
- The shell shim's only remaining caller is
Decisions for the author
- Permissive stand-ins vs. contract checks — tradeoff
fake-pythonaccepts any-cscript and any*.pypath, andfake-uvignores its arguments. Neither checks what the CLI actually passed.- This matches the shell shims they replace, so nothing got weaker, and it keeps the fixtures simple.
- The cost is that a wrong probe script or wrong uv flags would still go green.
Positive signals
- Planting
fake-tailscalewithwrite_fake_executableinstead ofstd::fs::copycloses a copy site that #649's ETXTBSY fix missed.remote_steps.rswas not in #649's file list. - The new stand-ins match the CLI's real contract:
- Their argv shapes match what the CLI passes: 3 entries for
probe_torch_stack_versions(comfyui.rs:1971) and 3 forprobe_comfyui(comfyui.rs:2181). GPU_PROBE_JSONmatches theComfyUiProbestruct field for field.- Both stand-ins fail loudly on any invocation they don't expect.
- Their argv shapes match what the CLI passes: 3 entries for
Deployment notes
None
What this covered
- What was read: all 10 changed files, read completely, at
b8c4b3ef(merge-base withprw-base) …269d26f4.- Product code on the paths the fixtures stand in for:
apps/rocm/src/comfyui.rs,crates/rocm-core/src/uv.rs,runtimes_cmd.rs::validate_wheel_runtime_manifest,therock.rs::probe_has_resolved_library,crates/rocm-core/src/fake_executable.rs. - CI workflow gating for Windows e2e.
- Issue #629's title, body and state.
- Product code on the paths the fixtures stand in for:
- Passes: fan-out ran with two independent workers, one on code/contracts and one on AGENTS.md adherence, history and code comments. Consolidation, design review and verification were done in the driving context.
- Checks run:
cargo clippy -p e2e-cucumber --all-targets -- -D warningson Linux, in the checkout's own target dir: clean.- The new pure-std files type-check for
x86_64-pc-windows-gnuwithrustc --emit=metadata. - A full Windows
cargo checkof the crate could not run, becauseringneedsx86_64-w64-mingw32-gcc, which is not installed here. - The e2e suite was not run locally.
- Test verdicts: this PR changes no production code, so the "passes with the production change reverted" question does not apply.
- Breaking
fake-python's.pyarm would turn comfyui-02 and comfyui-05..13 red, because their post-install GPU check reads the result file. - Breaking its
-carm would fail comfyui-01/02 at the torch-stack probe. - A bad
FAKE_UV_EXIT_CODEwould flip comfyui-01 or comfyui-02. - These were reasoned from the code paths above, not run as mutations.
- Breaking
- Did not run: the prior-changes pass, because earlier review comments are outside this watcher's remit.
- Discussion: this report was not reconciled against any PR discussion.
The ComfyUI install-path e2e scenarios never ran on Windows — not because the CLI logic they test is Linux-specific (production already resolves .dll/.so and python.exe/uv.exe paths per host via runtime_is_windows() and friends), but because their test fixtures hardcoded POSIX shell shims. comfyui-01/02/03's fixtures in tests/e2e-cucumber/tests/e2e/comfyui_steps.rs now plant the uv/Python subprocesses they shim as real compiled executables (fake-uv, fake-python), declared as ordinary [[bin]] targets of this crate, the same convention remote_steps.rs's fake-tailscale stand-in already used. Their behavior (exit code, stdout line) is configured through env vars rather than generated per scenario. fake-uv panics on an unparseable FAKE_UV_EXIT_CODE instead of silently defaulting; fake-python rejects an argv shape matching neither of the runtime Python's two invocation forms (probe_torch_stack_versions's -c, probe_comfyui's script form) instead of guessing — both failing loudly, the same rule fake-tailscale already follows. plant_ready_runtime — the Given every comfyui scenario (01 through 13) builds its runtime from — now plants fake-python as that runtime's default Python, instead of the old #!/bin/sh exit 0 stand-in that failed the post-install GPU check. used_comfyui_install (comfyui-05..13's shared Given) used to immediately overwrite that planted Python with its own GPU-check shell shim; that overwrite is now dropped, since fake-python already answers the same post-install probe unconditionally. comfyui-11's GPU-check transition used a dedicated shell-shim helper for both halves (failing, then passing again); the passing-again half now plants fake-python too, like every other scenario, so only the failing half still needs a real shell shim, and the now-single-purpose helper is deleted. Planting a fixture binary goes through rocm_core::fake_executable:: write_fake_executable rather than std::fs::copy, so it does not reopen ROCm#649's ETXTBSY race: a plain copy holds a write fd on the destination for the duration of the copy, which is exactly the window a concurrent scenario's spawn can inherit. That helper needs the rocm-core dev-dependency, which this crate's library target cannot reach, so install_fixture_binary() lives in tests/e2e.rs (the test binary that can) rather than alongside the pure fixture_binary()/fixture_target_name() lookups in src/fixture_binary.rs. A .bat script was tried first and rejected: Rust's CVE-2024-24576 mitigation rejects any argument containing a newline once the target resolves to a batch file, and the pre-install torch-stack probe passes its probe script as exactly such an argument — a real compiled executable has no such restriction. The planted rocm_sdk library stubs use a small fixture-local rocm_library_filename() helper instead of importing rocm_core::runtime_rocm_library_filename: readiness only checks path.is_file() on whatever the manifest lists, never the filename, so the import would buy nothing, so it stays a local stand-in. The [[bin]]-locating, suffix-naming, and plant logic is shared between this and remote_steps.rs's fake-tailscale stand-in, which previously duplicated the same lookup-and-copy body privately. tests/e2e-cucumber/ README.md documents the [[bin]] fixture pattern for the next stand-in. @requires-os:linux is dropped from comfyui-01/comfyui-02/comfyui-03 in comfyui.feature, since their fixtures no longer need it. comfyui-04 keeps @requires-os:linux: it drives rocm under a real PTY, the same pre-existing limitation dash.feature's header comment already documents — unrelated to the fixture changes here, now cross-referenced instead of left unexplained. comfyui-05/-06/-07/-09/-10/-13 also lose their shell dependency as a side effect of the plant_ready_runtime change above, but stay @requires-os:linux too: their reinstall behavior has not been run on Windows yet, which is tracked separately in ROCm#697 to keep this change scoped to ROCm#629's comfyui-01/02/03 ask. No production code changes — apps/rocm/src/comfyui.rs and crates/rocm-core already resolve platform-correct paths; only the test fixtures needed to catch up. Part of ROCm#629 (remaining scope tracked in ROCm#697) Signed-off-by: Jussi Elo <jussi.elo@amd.com>
269d26f to
6490e6e
Compare
|
Reply to the automated review at 2026-10-15T12:20:50Z (head Blocking
Non-blocking
Decision for the author
Verified at |
r0x0r
left a comment
There was a problem hiding this comment.
Overview
Ungates comfyui-01/-02/-03 from @requires-os:linux by replacing POSIX-shell shim fixtures (uv, the runtime's Python) with real compiled [[bin]] stand-ins (fake-uv, fake-python) that build on every platform, following the existing fake-tailscale convention. No production code changes.
Verification performed
cargo check -p e2e-cucumber --test e2e: clean.cargo clippy -p e2e-cucumber --test e2e --bins -- -D warnings: clean.- Traced
fake-python's two accepted invocation forms (-c <script>,<script.py> <result-path>) againstapps/rocm/src/comfyui.rs's actual probe call sites — both match. - Confirmed
write_shim(the real shell-shim writer) now has exactly one remaining call site (gpu_check_fails), matching the PR description's claim — the only scenario that needs a failing GPU check, which the unconditionally-successfake-pythoncan't represent. - Confirmed
rocm-coreis a[dev-dependencies]entry intests/e2e-cucumber/Cargo.toml, which is whywrite_fake_executableplumbing had to move totests/e2e.rs(reachable) rather than stay in the library'ssrc/fixture_binary.rs(not reachable) — the stated rationale holds up. - Could not run the actual
cargo xtask e2e -- -n comfyuiscenarios locally: buildingrocm/rocmdfails on this Darwin box inengines/lemonade/src/runtime_dir.rs(au16/u32st_modemismatch), which is a pre-existing issue from an unrelated prior commit, not touched by this diff. The PR's linked Windows CI run (comfyui-01/02/03 passing, 141 scenarios total) and the author's reported Linux 105/105 are the available evidence there.
Code quality
- Fixture binaries fail loudly on unexpected input (unparseable
FAKE_UV_EXIT_CODE, an argv shape matching neither probe form) rather than silently defaulting — consistent withfake-tailscale's existing rule. - Shared lookup/plant logic (
fixture_binary,fixture_target_name,install_fixture_binary) is factored out ofremote_steps.rs's previously-private duplicate, andREADME.md's Design Principles section documents the pattern for the next stand-in. rocm_library_filename()staying a local test-only helper instead of importing the product crate's equivalent is justified (readiness only checksis_file(), never the name) and keeps the suite's black-box-only convention intact.- Comments are precise about why, not just what (e.g., the
.bat/CVE-2024-24576 rejection, theETXTBSYracestd::fs::copywould reopen).
Risk
Low — test-only fixture refactor, no production code paths changed. comfyui-04/-08/-11/-12 correctly keep their Linux-only gates with the reasons now documented inline, and the scope is explicitly limited to #629's three named scenarios (further ungating tracked in #697).
No blocking issues found. Approving.


Why
The ComfyUI install-path e2e scenarios never ran on Windows — not because the CLI logic they test is Linux-specific (production already resolves
.dll/.sonames andpython.exe/uv.exepaths per host viaruntime_is_windows()and friends), but because their test fixtures hardcoded POSIX shell shims. That left only function-level unit tests coveringapps/rocm/src/comfyui.rson Windows, with nothing exercising a realrocm comfyui install/rocm comfyui statusrun there.What changes
comfyui-01,comfyui-02, andcomfyui-03's fixtures intests/e2e-cucumber/tests/e2e/comfyui_steps.rsnow plant theuv/Python subprocesses they shim as real compiled executables (fake-uv,fake-python), declared as ordinary[[bin]]targets of this crate — the same conventionremote_steps.rs'sfake-tailscalestand-in already uses. Their behavior (exit code, stdout line) is configured through env vars rather than generated per scenario.fake-uvpanics on an unparseableFAKE_UV_EXIT_CODEinstead of silently defaulting;fake-pythonrejects an argv shape matching neither of the runtime Python's two invocation forms (probe_torch_stack_versions's-c,probe_comfyui's script form) instead of guessing — both failing loudly, the same rulefake-tailscalealready follows.plant_ready_runtime— the sharedGivenevery comfyui scenario (01 through 13) builds its runtime from — now plantsfake-pythonas that runtime's default Python, instead of the old#!/bin/sh exit 0stand-in that failed the post-install GPU check. This reaches comfyui-04..13 too, though none of their own behavior changes:used_comfyui_install(comfyui-05..13's sharedGiven) used to immediately overwrite that planted Python with its own GPU-check shell shim; that overwrite is now dropped as redundant, sincefake-pythonalready answers the same post-install probe unconditionally. comfyui-11's GPU-check transition used a dedicated shell-shim helper for both halves (failing, then passing again); the passing-again half now plantsfake-pythonlike every other scenario, so only the failing half still needs a real shell shim, andcomfyui.feature's header comment for comfyui-05..13 is reworded to say so.rocm_core::fake_executable::write_fake_executablerather thanstd::fs::copy, so it does not reopen test: write fake executables without the ETXTBSY fork race #649'sETXTBSYrace: a plain copy holds a write fd on the destination for the duration of the copy, which is exactly the window a concurrent scenario's spawn can inherit. That helper needs therocm-coredev-dependency, which this crate's library target cannot reach, soinstall_fixture_binary()now lives intests/e2e.rs(the test binary that can) rather than alongside the purefixture_binary()/fixture_target_name()lookups insrc/fixture_binary.rs..batscript was tried first and rejected: Rust's CVE-2024-24576 mitigation rejects any argument containing a newline once the target resolves to a batch file, and the pre-install torch-stack probe (apps/rocm/src/comfyui.rs) passes its probe script as exactly such an argument — a real compiled executable has no such restriction.rocm_sdklibrary stubs use a small fixture-localrocm_library_filename()helper instead of importingrocm_core::runtime_rocm_library_filename(): readiness only checkspath.is_file()on whatever the manifest lists (probe_has_resolved_libraryinapps/rocm/src/therock.rs), never the filename, so the import would buy nothing while breaking this suite's black-box-only rule (no imports from the product crates — seetests/e2e-cucumber/README.md's Design Principles).[[bin]]-locating, suffix-naming, and plant logic is shared between this andremote_steps.rs'sfake-tailscalestand-in, which previously duplicated the same lookup-and-copy body privately.tests/e2e-cucumber/README.mddocuments the[[bin]]fixture pattern for the next stand-in.@requires-os:linuxis dropped fromcomfyui-01/comfyui-02/comfyui-03incomfyui.feature, since their fixtures no longer need it.comfyui-04keeps@requires-os:linux: it drivesrocmunder a real PTY, the same pre-existing limitationdash.feature's header comment already documents (portable-pty compiles on Windows via ConPTY, but that path isn't yet promoted to a blocking contract) — unrelated to the fixture changes here, now cross-referenced instead of left unexplained.Verification
cargo clippy -p e2e-cucumber --test e2e --bins -- -D warningsandcargo check -p e2e-cucumber --test e2e: clean.cargo xtask e2e -- -n comfyui: all 13 scenarios, 105/105 steps pass on Linux (comfyui-04..13 unaffected in behavior by theplant_ready_runtime/used_comfyui_installchange above).cargo xtask e2e -- -n remote: the 8 non-Docker scenarios (which exercise the shared fixture-plant path viafake-tailscale) pass; the@requires-dockerscenarios are unaffected by this change.E2E tests (Strix Halo, Windows):comfyui-01,comfyui-02, andcomfyui-03all pass there (141 scenarios, 138 passed + 3 expected xfails unrelated to this PR).Scope
No production code changes —
apps/rocm/src/comfyui.rsandcrates/rocm-corealready resolve platform-correct paths; only the test fixtures needed to catch up. The other e2e files with the same unix-only shim-writing pattern (dependency_guard_steps.rs,diagnose_steps.rs,engines_steps.rs) are untouched — their scenarios are@requires-os:linuxfor unrelated reasons (apt/dpkg, D-Bus Secret Service, a bash-only prompt marker), not this fixture limitation.#629 names
comfyui-01,comfyui-02,comfyui-ambiguous-runtime-actionable(comfyui-03) "and others in the file". This PR ungates those three.comfyui-05/-06/-07/-09/-10/-13also lose their shell dependency as a side effect of theplant_ready_runtimechange above, but ungating them needs their reinstall behavior actually run on Windows first, which this PR doesn't do — tracked separately in #697 to keep this change scoped to the fixture fix.comfyui-04,-08,-11,-12keep@requires-os:linuxfor their own, unrelated reasons (a real PTY, or a remainingsh/shell-shim dependency), documented incomfyui.feature's header comments.tests/e2e-cucumber/expectations.tomlfor the fixed ticket ID and removed/narrowed any now-stale xfail rows. (none found for e2e: ComfyUI install/status shims (uv, Python, rocm_sdk) are Linux-only, so Windows has no e2e coverage of the actual CLI run #629)Part of #629 (remaining scope tracked in #697)