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.
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
| Source | What it says |
|---|---|
| Oracle P6 Professional User Guide β Scheduling | Circular relationships prevent scheduling; the Schedule Log lists the activities forming the loop |
| DCMA 14-Point | No metric β an unscheduled file fails everything; loops are a precondition, not a metric |
| GAO Schedule Assessment Guide, Best Practice 2 | Logic must form a directed network without cycles |
| PMI Practice Standard for Scheduling | Network 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.
| Cause | How it happens | Frequency |
|---|---|---|
| Reversed link | Predecessor and successor swapped when typing β Pour before Rebar | Very common |
| SF relationship | Rare and confusing; used by accident instead of FS; combined with another link it loops | Common |
| Fragnet pasted backwards | Change fragnet added with an FS into the existing chain and an FS back out at the wrong point | Common with TIA work |
| Subcontractor merge | Their programme links X β Y; yours links Y β X via an interface | Common |
| Copy/paste of levels | Floor template copied; a link to "previous floor" ends up pointing at the copy itself | Occasional |
| Global Change adding relationships | Batch link creation with a rule that catches predecessor and successor both ways | Occasional |
| LOE activity linked into the chain | LOE with SS from A and FF to B, and someone links B β A's successor through the LOE | Occasional |
Finding it in P6.
| Step | Action |
|---|---|
| 1 | F9 β "Circular relationships detected" dialog; click OK |
| 2 | Tools > Schedule > View Log β the loop section lists activity IDs in order |
| 3 | Copy the IDs; filter the Activities view to just those |
| 4 | Open Activity Details > Relationships for each; write out the chain: which link goes "backwards" against the construction sequence? |
| 5 | Delete or reverse that link only |
| 6 | F9 again β a second loop may have been hidden behind the first |
| 7 | Record 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.
| Situation | Fix |
|---|---|
| One link is clearly reversed (Pour β Rebar) | Delete it; add Rebar β Pour |
| SF used | Replace with the intended FS (or SS/FF) |
| Fragnet in and out | Move the outgoing link to the correct downstream activity |
| Subcontractor interface conflict | Decide 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
- 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.
- Not F9-ing again. Loops nest. Fixing the first often reveals a second. Keep going until the log is clean.
- 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.
- 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).
- Merging subcontractor files without an interface review. Their internal links and your interface links contradict. Review the interface milestones before F9 (subcontractor-schedule-integration).
- 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
- Relationship types explained β why SF is almost never right
- Fragnets β inserting change without breaking the chain
- Subcontractor and Interface Integration β interface links that fight each other
- P6 Global Change β batch link creation risks
- P6 Reflections and What-If β test the fragnet in a copy first
- open-ends and dangling-activities β the other logic checks to run after fixing
βοΈ Worked example
A substation in the Eastern Province. F9 fails after a variation fragnet is added. Schedule Log lists:
| Order in log | Activity ID | Activity | Link to next in loop |
|---|---|---|---|
| 1 | EL-2040 | Cable pulling, Bay 3 | FS β EL-2050 |
| 2 | EL-2050 | Termination, Bay 3 | FS β VO-0310 |
| 3 | VO-0310 | (Fragnet) Additional cable route, Bay 3 | FS β EL-2030 |
| 4 | EL-2030 | Cable tray, Bay 3 | FS β 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