Consider iterating on cycles until a fixed point is reached: checksums of objects involved in the cycle are not changing.<p>If the fixed point is not reached in some number of iterations, then abort.<p>Cycles can happen in builds. A simple example is compiling a document in some markup language, plus its table of contents, into the compiled form. Suppose the compilation itself is what updates the table of contents (because details like page numbers are not known until the compilation pass). Then the table of contents is both an input and an output. If the table of contents file has changed, the job must be run again.<p>(Diagnosing and aborting cycles could be a default behavior; it could be that the user has to somehow declare cycles, by specially blessing backward references with some required annotation.)