Task dependency failure semantics¶
Task dependencies order work. They do not implicitly authorize cancellation of the dependent task or its descendants.
The default policy is supervised:
- a completed prerequisite satisfies an ordinary dependency;
- a failed or cancelled prerequisite records a durable
mac.dependency_resolution.v1outcome on each waiting dependent; - ordinary and downstream dependents become
blockedwithreason=dependencies_incomplete, preserving their work and provenance; - cooperative integration parents remain
waitingand use anall_settledjoin, so they can inspect completed, failed, cancelled, and dependency-blocked child outcomes; - independent children continue running;
- cooperative children opt into the existing bounded deterministic environment-repair prerequisite, whose recursion guard prevents repair-of-repair chains.
Cancellation is reserved for explicit policy or operator intent. A task may request the old all-for-one behavior with:
Cooperative decomposition writes the following policy onto the integration parent:
all_settled does not treat arbitrary blocked work as finished. A blocked
child counts as settled only when it carries a supervised
dependency_resolution.status=unsatisfied record. Executor failures that may
still retry or acquire an environment-repair prerequisite therefore continue
to hold the integration parent.
When a terminal prerequisite declares a live replacement, dependency reconciliation rewires the edge to that replacement instead of recording an unsatisfied outcome. Work-package task graphs retain their separate immutable epoch transaction semantics and are not rewritten by the legacy task reconciler.
Required invariants¶
- A child failure causes no derived cancellation under the default policy.
- Independent siblings continue after another child fails.
- A downstream child that cannot execute remains preserved and diagnosable.
- The integration parent opens only after every child has a settled outcome.
- Terminal-event ordering does not change the final integration readiness.
- Only
cancel_scopeor an explicit operator cancellation may produce a cancellation cascade. - Replacement and repair creation remains bounded and idempotent.
The control plane emits task.dependency_supervised observations with
derived_cancellations=0 so dependency-failure blast radius can be monitored.