Skip to content

fix(ci): make hosted Hauler lanes pass on a sandboxed ARM host - #2924

Merged
ScriptedAlchemy merged 13 commits into
masterfrom
fix/hauler-ci-env
Oct 2, 2026
Merged

ScriptedAlchemy merged 13 commits into
masterfrom
fix/hauler-ci-env

Conversation

@ScriptedAlchemy

@ScriptedAlchemy ScriptedAlchemy commented Oct 2, 2026 •

Copy link
Copy Markdown
Owner

Hosted Hauler pool / linux-<lane> checks fail on every PR for environmental reasons. These failures hide real regressions. This PR fixes each one at its root cause, re-derived from the 09-29 lane artifacts and PR #2845.

Failing test(s) Root cause Fix
git::churn::exact_paths_and_bounded_history, git_repository_authority::authority_distinguishes_absent_and_unreadable_repository_paths The sandbox /tmp is its own mount. gix stops at the mount boundary with NoGitRepositoryWithinFs, and we mapped that to "unreadable" Map gix's no-repository discovery errors to NotARepository (product fix)
wipe_completes_within_bound_once_the_wedged_holder_stops, 4× host_lifecycle_cli_acceptance::sweep_outcomes::* The image has no systemctl. Maintenance paths resolved it eagerly even when no unit is installed The systemd runner resolves systemctl lazily. current_for_installed_unit() lets the unit-guarded paths skip it when no unit exists. New unit test (product fix)
inode_generation::replacing_a_file_advances_inode_generation tmpfs does not implement FS_IOC_GETVERSION Skip with a message when the temp dir is not ext4. Still fails on ext4
codex::exact_hook_session_lookup_converges_in_bounded_retained_slices tmpfs readdir lists newest entries first and btrfs oldest first. The target written last fell into the first slice Write the target mid-corpus. Assertions unchanged
interactive::a_released_catalog_gives_back_its_bytes_... hashbrown's control group is 16 bytes on x86 SSE2 and 8 on aarch64 NEON (3 tables × 8 = 24 bytes) Arch-specific expected value (6_163 measured with the aarch64 width)
hook_runtime_request_test::project_transcript_ingest_settles_emitted_hints_in_the_served_profile Race: messages_upserted counts only this pass's own drain. A peer or deferred drain projected the rows (observations_committed=2, messages_upserted=0). Locally: 3/6 failures on tmpfs, 0/6 on ext4 Assert observations_committed == 2, then read both rows back through tracedecay_lcm_load_session (bounded 30 s poll). 8/8 on tmpfs
production_lsp_negotiates_and_projects_canonical_context, operation_family_executes_through_cli_mcp_and_http CARGO_HOME=/cache/cargo has no rustup proxies, so cargo/rustc resolve only through /opt/cargo/bin Recipe prepare step symlinks /opt/cargo/bin/* into $CARGO_HOME/bin

The recipe change in .github/hauler-ci.json loads from the trusted default branch, so it takes effect only after merge.

Related: ScriptedAlchemy/cargo-hauler#348 restores the JUnit XML in the hauler-ci-linux-<lane> evidence artifact, so failing lanes name their tests again.

Local verification ran through hauler with TMPDIR=/dev/shm, which simulates the container's tmpfs /tmp:

  • each affected test passes
  • tracedecay-daemon-control --lib: 101 passed
  • cargo fmt --all --check is clean
  • clippy -D warnings on all touched crates with --all-targets is clean

Devin Review

Local verification (land-open-prs)

  • Merged master; hoisted the inline OsStrExt test import (16d824e).
  • TMPDIR=/dev/shm lib tests: daemon-control 104, private-fs 25, runtime-core 462 green.
  • Fail-before: with the git_repository.rs hunk reverted on tmpfs, git::churn::tests::exact_paths_and_bounded_history and git_repository::tests::unretained_walks_hand_their_answer_to_joined_callers fail; the new daemon-control test does not compile without current_for_installed_unit.
  • clippy -D warnings (4 crates), fmt, Windows cross-check: clean (warnings pre-existing on master).
  • Unrelated: under TMPDIR=/dev/shm two sessions goldens (claude_observation production_vertical, pi malformed_session) fail because expected byte ranges embed the 4-char /tmp path length; green on /tmp.

@changeset-bot

changeset-bot Bot commented Oct 2, 2026 •

Copy link
Copy Markdown

⚠️ No Changeset found

Latest commit: 16d824e

Merging this PR will not cause a version bump for any packages. If these changes should not result in a new version, you're good to go. If these changes should result in a version bump, you need to add a changeset.

Click here to learn what changesets are, and how to add one.

Click here if you're a maintainer who wants to add a changeset to this PR

@devin-ai-integration devin-ai-integration Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

✅ Devin Review: No Issues Found

Devin Review analyzed this PR and found no bugs or issues to report.

Devin Review

# Conflicts:
#	crates/tracedecay-code-index/src/graph_projection/interactive/tests.rs
# Conflicts:
#	crates/tracedecay-code-index/src/graph_projection/interactive/tests.rs
#	crates/tracedecay-daemon-control/src/service.rs
#	crates/tracedecay-daemon-control/src/service/runner.rs
The image sets CARGO_HOME=/opt/cargo. Linking /opt/cargo/bin/* onto
itself makes ln fail with 'are the same file', failing prepare on any
run that keeps the image default. Link only into a different CARGO_HOME.
# Conflicts:
#	crates/tracedecay/tests/mcp_suite/mcp_handler_test/hook_runtime_request_test.rs
@ScriptedAlchemy
ScriptedAlchemy merged commit a328d34 into master Oct 2, 2026
7 of 8 checks passed
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