A DAG holds correctness + cost-gate edges only; a typed Scheduler rations load + budget per host.

Invariant-DAG execution policy (a typed Scheduler separates correctness from resource + cost)

Intent — Keep a build/deploy dependency graph a statement of correctness only, host-identical everywhere, and push every environment-specific execution concern — how much may run at once, and whether a costly step is worth running — into a typed Scheduler that reads a per-host profile and produces the execution plan. Separate three edge intents so a reader can tell a real dependency from a resource or budget accommodation (our instance: a deploy DAG whose edges carry a CORRECTNESS/COST_GATE/LOAD intent, with LOAD edges migrated out to a typed Scheduler that reads a per-host (concurrency-ceiling, budget) profile).

SummaryA DAG holds correctness + cost-gate edges only; a typed Scheduler rations load + budget per host.
TargetBridge · System models
Formtyped-ir
EnforcementSoft·Hard — the per-host profile aims the execution plan (soft: it computes concurrency and budget policy, an operator still sets the values); two lints hold the separation (hard: a load edge in the DAG, or a per-environment edge divergence, is a finding)

Motivation — the failure it kills

A build or deploy pipeline is a dependency graph: B needs A means B runs after A. The graph is supposed to state correctness — B produces a wrong or failed result without A. In practice two other concerns leak into the same needs= syntax, and once they do the graph stops meaning one thing:

The graph now lies to its reader: three unrelated intents wear one syntax, and telling them apart takes per-edge archaeology. The usual patch makes it worse — a per-environment conditional in graph construction (if host == "prod": drop this edge) that strips the rationing edges back out where the box is elastic. The graph mutates per host, the strip rule lives in control flow rather than the types, and two failure modes go uncaught: a rationing edge added without the guard silently ships to an elastic host, and a correctness edge caught by an over-broad strip silently disables a gate. One incident is the shape in miniature — a single-worker queue-drain wait modeled as a needs edge took a multi-paragraph root-cause analysis to prove it was "stale convenience, not a true dependency" before it could be removed. The graph did not encode why the edge existed, so every host difference became a prose-guarded special case.

Why it's not just conditional pipeline construction (or a DAG scheduler, or resource classes)

Every CI and deploy system already builds a dependency graph, schedules it with bounded concurrency, and varies it per environment. The distinct move is grounding execution policy in measured per-host performance and cost, expressed as a typed layer over a graph that is held invariant — with a budget dimension that gates economic edges. Each adjacent practice stops short of one of those:

The move that ties it together: three edge intents on an invariant graph, plus a typed Scheduler that reads a per-host (concurrency-ceiling, budget) profile and produces the plan. Resource and cost rationing become a policy over a graph that never changes shape, rather than mutations of the graph itself.

Mechanism

Four parts.

Prerequisites

Consequences & costs

Known uses

Related mechanisms