Circular Logic and Loops

Last reviewed 9 September 20261,337 words6 min read

Finding them and breaking them

🟩 In one line: A loop is a chain of relationships that leads back to where it started (A β†’ B β†’ C β†’ A). P6 refuses to schedule until it's broken and the Schedule Log names the activities in it. It's almost always a wrong direction on one link, an SF used by mistake, or a subcontractor fragnet pasted in backwards β€” found in minutes, fixed by deleting or reversing one link.

πŸ‘€ Who this is for: Juniors who hit "Circular relationships detected" and froze; mid-level planners merging files; anyone who needs to know why F9 stopped. You should know relationship-types-explained.

e / c
First, let's be honest about why this page exists

Loops don't hide. P6 tells you, in a dialog box, and won't calculate dates until you fix it. So the problem isn't finding them; it's that people panic, delete random links until it goes away, and break real logic in the process.

A loop is one wrong link. Find the wrong one; don't shotgun the network.

🟨 The standard β€” what "good" looks like
SourceWhat it says
Oracle P6 Professional User Guide β€” SchedulingCircular relationships prevent scheduling; the Schedule Log lists the activities forming the loop
DCMA 14-PointNo metric β€” an unscheduled file fails everything; loops are a precondition, not a metric
GAO Schedule Assessment Guide, Best Practice 2Logic must form a directed network without cycles
PMI Practice Standard for SchedulingNetwork must be acyclic for CPM calculation

🟒 Rule to remember: read the Schedule Log, list the activities in the loop, find the one link pointing the wrong way, fix that one. Then F9 again β€” there may be a second loop behind it.

How it actually works

Where loops come from.

CauseHow it happensFrequency
Reversed linkPredecessor and successor swapped when typing β€” Pour before RebarVery common
SF relationshipRare and confusing; used by accident instead of FS; combined with another link it loopsCommon
Fragnet pasted backwardsChange fragnet added with an FS into the existing chain and an FS back out at the wrong pointCommon with TIA work
Subcontractor mergeTheir programme links X β†’ Y; yours links Y β†’ X via an interfaceCommon
Copy/paste of levelsFloor template copied; a link to "previous floor" ends up pointing at the copy itselfOccasional
Global Change adding relationshipsBatch link creation with a rule that catches predecessor and successor both waysOccasional
LOE activity linked into the chainLOE with SS from A and FF to B, and someone links B β†’ A's successor through the LOEOccasional

Finding it in P6.

StepAction
1F9 β†’ "Circular relationships detected" dialog; click OK
2Tools > Schedule > View Log β€” the loop section lists activity IDs in order
3Copy the IDs; filter the Activities view to just those
4Open Activity Details > Relationships for each; write out the chain: which link goes "backwards" against the construction sequence?
5Delete or reverse that link only
6F9 again β€” a second loop may have been hidden behind the first
7Record the change in the log for the narrative

Also useful: Activity Network view (View > Show on Top > Activity Network) filtered to the loop activities β€” the cycle is visible as arrows going both ways.

Fixing it β€” which link to change.

SituationFix
One link is clearly reversed (Pour β†’ Rebar)Delete it; add Rebar β†’ Pour
SF usedReplace with the intended FS (or SS/FF)
Fragnet in and outMove the outgoing link to the correct downstream activity
Subcontractor interface conflictDecide which sequence is right on site; delete the other; tell the subcontractor
Two genuinely mutual dependencies (rare β€” "A can't finish until B starts, B can't start until A finishes")Split one activity into two: A1 β†’ B β†’ A2

The unlink-then-relink discipline. Don't delete three links to see if the error goes away. Each deletion you make "just to test" is a logic change you have to remember to restore. Identify first, change once.

πŸŸ₯ Where people go wrong
  1. Deleting links until F9 runs. The loop goes away and so does the real logic. Now the file schedules and lies. Read the log; fix one link.
  1. Not F9-ing again. Loops nest. Fixing the first often reveals a second. Keep going until the log is clean.
  1. Using SF at all. Start-to-Finish has a legitimate use maybe once per project. If you find one in a loop, it's almost certainly a mistake for FS.
  1. Pasting a fragnet into a live chain without checking direction. Insert the fragnet in its own WBS node, link in, link out, F9 before doing anything else (fragnets).
  1. Merging subcontractor files without an interface review. Their internal links and your interface links contradict. Review the interface milestones before F9 (subcontractor-schedule-integration).
  1. Forgetting the change log. The link you fixed was in the accepted baseline. Note it in the narrative — "loop corrected, link X→Y reversed, no date impact" — or it turns up as an undeclared change.
βš–οΈ When you're challenged

"The schedule won't calculate. Is the file corrupt?" "No β€” there's a loop. The log lists four activities; one link is the wrong way round. Five minutes to fix, then F9 runs."

"Why did the date change after you fixed the loop?" "Because the file couldn't schedule before; the dates on screen were last month's. Fixing the loop let it calculate. The change is the update, not the fix β€” and the fix itself is listed in the change table."

"How did a loop get into an accepted baseline?" "It didn't β€” the baseline scheduled cleanly. The loop came in with the Zone B fragnet this month; the outgoing link went to the wrong activity. Corrected and logged."

πŸ“„ Related pages
✏️ Worked example

A substation in the Eastern Province. F9 fails after a variation fragnet is added. Schedule Log lists:

Order in logActivity IDActivityLink to next in loop
1EL-2040Cable pulling, Bay 3FS β†’ EL-2050
2EL-2050Termination, Bay 3FS β†’ VO-0310
3VO-0310(Fragnet) Additional cable route, Bay 3FS β†’ EL-2030
4EL-2030Cable tray, Bay 3FS β†’ EL-2040

The fragnet's outgoing link points at EL-2030 (cable tray) β€” upstream of where the fragnet sits. The additional cable route should feed cable pulling, not tray. Fix: delete VO-0310 β†’ EL-2030; add VO-0310 β†’ EL-2040 FS; F9. Second F9 clean. Change logged: "VO-0310 successor corrected from EL-2030 to EL-2040; loop removed; net effect of fragnet +6 days on Bay 3 energisation."

πŸ“– References
  • Oracle, P6 Professional User Guide β€” Scheduling; Schedule Log; Activity Network
  • GAO, Schedule Assessment Guide (GAO-16-89G), Best Practice 2
  • PMI, Practice Standard for Scheduling, 3rd ed.

From the field

Experience from working planners. Unreviewed β€” read it as experience, not guidance.

Add what you know about circular logic and loops. What worked, what the consultant pushed back on, what you would do differently next time. A paragraph is plenty.

Contributors get their name and one link on the site β€” your own templates, course or consultancy. We take nothing and hold nothing.

Add your experience