Skip to content

bug(test): Codex fixtures assume a fixed Git curl layout on Windows #2159

Closed

Description

@dnlrsls

Existing Issue Search

  • I searched existing issues and will add evidence to a canonical tracker when applicable.

📝 Observed Consequence

Native Windows full-module CI cannot establish a passing baseline because existing Codex test fixtures abort during tool resolution on the runner, before the sampled hook behavior can be exercised. This affects the observational evidence for #1891; it is not evidence of a production curl or hook regression.

🔄 Steps to Reproduce

  1. Use a native Windows Git installation where the reviewed Bash executable is at <Git root>/usr/bin/bash.exe and <Git root>/mingw64 is absent.
  2. Execute the existing Windows Full Suite (Observational) job definition at head 089734522b30487c68edd9dd6535501fa3866d0a, with its pinned Go/Node versions, mandatory prerequisites, isolated state and full go test -json ./... selection.
  3. Observe TestLifecycleScriptsUseCanonicalProjectResolution and the sampled TestCodexRegisteredSessionHandoff cases fail while canonicalizing the fixture's curl path.

Observed execution, not a requested rerun: https://github.com/Gentleman-Programming/engram/actions/runs/40417232720/job/121902501198

✅ Expected Behavior

The isolated test fixture can resolve a compatible, validated curl executable without depending on one Git distribution directory layout. Absolute/canonical/real-executable validation and child-process isolation remain enforced. A genuinely missing prerequisite fails explicitly rather than silently skipping or fabricating coverage.

❌ Actual Behavior

The sampled fixtures construct <Git root>/mingw64/bin/curl.exe and fail canonicalization because the runner has no mingw64 directory. Native path contracts, preflight and locked Pi dependency installation passed, but the full suite returned exit 1 after 631.1215723 seconds.

The JSON report records 33 package passes, one failing package (plugin), four packages without tests, 108 test/subtest failure events and 131 skip events. The sampled curl-path failures do not establish that every failure or skip has the same cause.

Operating System

Windows

Release Version (Report Context)

Source-checkout CI, not an installed release: PR #2156 head 089734522b30487c68edd9dd6535501fa3866d0a; actual checked-out PR merge 95c0256055f7f6300533b4900e7ab995fba744ee. Observed toolchain: Go 1.26.10 windows/amd64 and Node 24.22.1.

Agent / Client

Other

📋 Relevant Logs

fixture selector CODEX_TEST_TRUSTED_CURL="<Git root>/mingw64/bin/curl.exe"
cannot canonicalize fixture tool path="<Git root>/mingw64/bin/curl.exe"
GetFileAttributesEx <Git root>/mingw64: The system cannot find the file specified.
exit_code=1
elapsed_seconds=631.1215723

The installation-root prefix above is normalized for privacy; the missing-directory error and path suffix are preserved. Failure artifact: https://github.com/Gentleman-Programming/engram/actions/runs/40417232720/artifacts/12696755711

💡 Additional Context

Client selection Other refers to Go test/CI fixtures, not a reported installed-host failure.

Current source evidence: plugin/codex_url_intent_test.go, codexIntentTool, reads environment overrides only for Bash and jq. Its Windows curl branch always derives the fixed mingw64/bin/curl.exe path. CODEX_TEST_TRUSTED_CURL is a diagnostic name, not a supported environment selector in this code. Merely exporting it from CI would not change fixture behavior.

The helper file has identical Git blob a82393d1be6875ac89ea8246e8cc3aadecfda69e at pinned main 5f1aabed7e8a16f8d310877416988e6857671d29 and the observed PR head. The wiring did not modify it. The hosted failure is reproduced evidence for the candidate; a standalone isolated reproduction against freshly verified remote main remains pending. No full local Go suite or new CI dispatch/rerun was executed for this report.

Separate unit boundary

Targeted open-and-closed discovery and full-body comparison found no exact match among #1392, #1327, #2091, #1361 and #921; those cover neighboring but different invariants. This new issue requests maintainer review only. Approval, assignment, implementation, publishing and merge remain separate decisions.

Activity

  1. dnlrsls commented on Oct 27, 2026

    @dnlrsls
    MemberAuthor

    Confirmed with a focused reproduction on unmodified main 5f1aabed7e8a16f8d310877416988e6857671d29. This updates the report's pending main-only reproduction note; the bug is reproduced, not fixed.

    • Toolchain: verified official Go 1.26.10, windows/amd64. Real Bash 5.2.26 and the reviewed jq 1.8.2 delegate were validated in a temporary layout with usr/bin present and mingw64 absent, using the existing Bash/jq fixture selectors.
    • Ran exactly one existing test from an isolated archive of that main commit, with isolated home/data/temp/module/build caches and read-only module inputs:
    go test -json -mod=readonly ./plugin -run '^TestLifecycleScriptsUseCanonicalProjectResolution$' -count=1
    • Observed Go exit 1, exactly one failed test, 0.01 s test time and 31.644 s command wall time (including cold compilation/dependency downloads). The failure occurs during fixture tool resolution, before this test reaches fixture CLI construction or lifecycle subtests. Normalized diagnostic:
    canonical_project_resolution_test.go:17: cannot canonicalize fixture tool path="<git-root>/mingw64/bin/curl.exe"
    GetFileAttributesEx <git-root>/mingw64: The system cannot find the file specified.
    --- FAIL: TestLifecycleScriptsUseCanonicalProjectResolution (0.01s)
    
    • All six checked snapshot source/dependency files, including go.mod and go.sum, retained their hashes. The primary worktree stayed clean at 089734522b30487c68edd9dd6535501fa3866d0a. The temporary SDK, copied tools, snapshot, caches and raw logs were removed; no global installation or installed Git changes occurred.
    • This establishes the fixed-layout fixture failure, not a production hook regression or a common cause for all 108 failure events. The separate correction should preserve absolute/canonical/real-executable validation and hermetic child state, with a regression for the missing-mingw64 layout. PR ci(windows): add observational full-module baseline wiring #2156 remains the wiring unit; no fixture implementation or broad suite/rerun was performed here.

    Raw capture integrity: stdout SHA-256 a6881b329ac339b6434bdad9bc822d38a20afe8c06acf3effd6d94624145babc; stderr SHA-256 2c04f5df909cb72b3e3faec6fe1c1ecb6af07b434bc846c1b150034c18e0695b. Installation paths in the diagnostic are normalized; these are hashes of the original captures, not the displayed excerpt.

  2. self-assigned this
    on Oct 27, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions