`Assembly` composes a `Subassembly`, which composes a `Module`, which composes an `Assembly`. Composition is ownership, so no instance of any of the three can ever be constructed — building one requires building itself. It draws as three rectangles and three composition lines, usually across two pages of a decomposition view, and nobody traces the loop by eye. The same document also holds a `ref part` cycle, which is perfectly legal: a reference is not ownership, and this engine excludes reference edges deliberately rather than reporting the two together.
package Manufacturing {
part def Operator;
part def Assembly {
part sub : Subassembly;
}
part def Subassembly {
part module : Module;
}
part def Module {
// Closes the loop. Composition is ownership: nothing here can exist.
part frame : Assembly;
}
// Legal, and deliberately not reported: a reference cycle is an
// ordinary bidirectional association. The operator knows their station
// and the station knows its operator.
part def Station {
ref part operator : Operator;
}
}