Circular Logic and Loops
Last reviewed 16 September 20265 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
Notes, corrections and additions from people who've done this on a real job. Everything is checked before it appears here.
Loading notes…
Checked before it appears. No client, project or employer names. Your name is shown; your email never is. Terms.