install-deps: isolate failures so one bad dep never blocks the rest - #170
Merged
Merged
Conversation
One integration failing aborted the whole install-deps run: the brew wwise-cli failure (Homebrew unwritable by the agent user) aborted the Installer's bare-each dispatch, so the unrelated cmake integration never ran and googletest was never fetched. The same bare-each pattern lived inside brew/gh/cmake install_all: the first failing dep aborted the rest. The manifest declares no cross-integration edges, so the failure policy for the (degenerate) dependency DAG is attempt-all: - Integration#collect_failures isolates per-dep failures; brew, gh and cmake raise Integration::PartialInstallError after attempting all deps. - Preamble failures (brew tap registration) still fail the integration as one entry — every dep is predetermined to fail for that root cause. - cmake only rewrites deps.cmake/deps.targets.cmake when every dep succeeded: a file generated from a partial set would silently drop the failed deps' variables (stale-but-consistent, like the install stamp). - Installer#dispatch rescues per integration and aggregates entries into InstallFailedError, ordered by wave (root causes before derivative failures). Raising keeps stamp semantics: no stamp on any failure. Co-authored-by: Cursor <cursoragent@cursor.com>
Codecov Report✅ All modified and coverable lines are covered by tests. 📢 Thoughts on this report? Let us know! |
JPDuchesne
added a commit
that referenced
this pull request
Sep 16, 2026
Agent-isolation and emulated-Mac fixes: install-deps failure isolation with typed errors (#170), brew escalation to the prefix owner + AgentBootstrap sudoers edge (#171), BuildKit secret files in a verified per-uid dir under the data root — colima-visible and substitution-proof (#173), build-watcher guest-load liveness signal + 15m stall window (#174), sigpending ulimit for Rosetta signal-queue aborts (#175), and brew trust before tap in docker-install-build-deps (tap-rot fix).
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
One integration failing aborted the whole
install-depsrun — during d3mlabs/plans#36 leg-2 validation, the brewwwise-clifailure (Homebrew unwritable byai-agent) aborted the Installer's bare-eachdispatch, so the unrelated cmake integration never ran and googletest was never fetched. The same bare-eachpattern lived inside brew/gh/cmakeinstall_all.The manifest declares no cross-integration edges, so the failure policy for the (degenerate) dependency DAG is attempt-all:
Integration#collect_failuresisolates per-dep failures; brew, gh, cmake raiseIntegration::PartialInstallErrorafter attempting every dep.deps.cmake/deps.targets.cmakewhen every dep succeeded (stale-but-consistent, same philosophy as the install stamp).Installer#dispatchrescues per integration and aggregates intoInstallFailedError, entries ordered by wave (root causes before derivative failures). Raising preserves stamp semantics — no stamp on any failure — and the non-zero exit.Test-first: the six new tests were written and confirmed failing before the fix (the installer test failed with exactly the incident shape: googletest never dispatched). Full suite green except the 4 pre-existing
BuildContainerTestfailures that also fail on cleanmainon this machine.When real cross-integration edges appear, the build-wave partition generalizes to a topological sort and failure propagation follows the DAG — this design degrades into that without changing shape.
Made with Cursor