Test the findings.
See the limits.
Known inputs, independently written expectations and actual production-engine output. Every XER fixture is available to download and run yourself.
Suite XER-tests-1.0 · Published 2026-10-06 · Scoring model v1.2Download. Validate. Compare.
Each list shows the rule, affected-record count and internal task IDs. The resource example below is tested separately.
Connected control
Four activities, three FS links, no configured exceptions.
- Expected
- No findings
- Actual engine result
- No findings
Boundary: Small synthetic fixture; it does not establish field accuracy across all P6 versions.
Download test XER ↗ · Calculated score 100/100Isolated incomplete task
The added activity has neither a predecessor nor a successor.
- Expected
- PP-101: 1 [task 5]; PP-102: 1 [task 5]; PP-103: 1 [task 5]
- Actual engine result
- PP-101: 1 [task 5]; PP-102: 1 [task 5]; PP-103: 1 [task 5]
Boundary: The first start and finish in file order are exempted automatically; they are not verified contractual milestones.
Download test XER ↗ · Calculated score 96/100Negative float
A110 has -8 hours of total float.
- Expected
- PP-201: 1 [task 2]
- Actual engine result
- PP-201: 1 [task 2]
Boundary: Small synthetic fixture; it does not establish field accuracy across all P6 versions.
Download test XER ↗ · Calculated score 97/100Float above 352 hours
One hour above the fixed 44 × 8-hour threshold.
- Expected
- PP-202: 1 [task 2]
- Actual engine result
- PP-202: 1 [task 2]
Boundary: Small synthetic fixture; it does not establish field accuracy across all P6 versions.
Download test XER ↗ · Calculated score 99/100Mandatory start
A110 contains the mandatory-start constraint code.
- Expected
- PP-301: 1 [task 2]
- Actual engine result
- PP-301: 1 [task 2]
Boundary: A legitimate constraint can still be flagged; the rule does not decide whether it is justified.
Download test XER ↗ · Calculated score 99/100Duration above 352 hours
A110 original duration exceeds the fixed threshold.
- Expected
- PP-401: 1 [task 2]
- Actual engine result
- PP-401: 1 [task 2]
Boundary: Small synthetic fixture; it does not establish field accuracy across all P6 versions.
Download test XER ↗ · Calculated score 99/100Zero-duration task
An ordinary task has zero original duration; start/finish milestones remain exempt.
- Expected
- PP-402: 1 [task 2]
- Actual engine result
- PP-402: 1 [task 2]
Boundary: Small synthetic fixture; it does not establish field accuracy across all P6 versions.
Download test XER ↗ · Calculated score 100/100Complete without actual finish
A110 is complete but its actual finish is blank.
- Expected
- PP-501: 1 [task 2]
- Actual engine result
- PP-501: 1 [task 2]
Boundary: Small synthetic fixture; it does not establish field accuracy across all P6 versions.
Download test XER ↗ · Calculated score 98/100Started FS successor
A120 has started while its FS predecessor is incomplete.
- Expected
- PP-502: 1 [task 3]
- Actual engine result
- PP-502: 1 [task 3]
Boundary: A review heuristic, not a P6 retained-logic calculation.
Download test XER ↗ · Calculated score 99/100Negative lag
The A110 → A120 relationship has an eight-hour lead.
- Expected
- PP-601: 1 [task 3]
- Actual engine result
- PP-601: 1 [task 3]
Boundary: Small synthetic fixture; it does not establish field accuracy across all P6 versions.
Download test XER ↗ · Calculated score 98/100Lag above 40 hours
One hour above the fixed five × eight-hour lag threshold.
- Expected
- PP-602: 1 [task 3]
- Actual engine result
- PP-602: 1 [task 3]
Boundary: Small synthetic fixture; it does not establish field accuracy across all P6 versions.
Download test XER ↗ · Calculated score 99/100SS relationship
A start-to-start relationship is surfaced for review.
- Expected
- PP-603: 1 [task 3]
- Actual engine result
- PP-603: 1 [task 3]
Boundary: Non-FS does not mean invalid; justified overlap may be appropriate.
Download test XER ↗ · Calculated score 99/100Missing predecessor
An extra relationship references absent activity 999.
- Expected
- PP-604: 1 [task 3]
- Actual engine result
- PP-604: 1 [task 3]
Boundary: External-project links can appear missing in a single-project export; check the source before removing them.
Download test XER ↗ · Calculated score 97/100Activity linked to itself
A120 is its own predecessor.
- Expected
- PP-605: 1 [task 3]
- Actual engine result
- PP-605: 1 [task 3]
Boundary: Small synthetic fixture; it does not establish field accuracy across all P6 versions.
Download test XER ↗ · Calculated score 97/100Missing relationship type
A relationship type is blank.
- Expected
- PP-606: 1 [task 3]
- Actual engine result
- PP-606: 1 [task 3]
Boundary: Small synthetic fixture; it does not establish field accuracy across all P6 versions.
Download test XER ↗ · Calculated score 98/100Unsupported relationship type
The unsupported type triggers both the non-FS review and invalid-type check.
- Expected
- PP-603: 1 [task 3]; PP-606: 1 [task 3]
- Actual engine result
- PP-603: 1 [task 3]; PP-606: 1 [task 3]
Boundary: Small synthetic fixture; it does not establish field accuracy across all P6 versions.
Download test XER ↗ · Calculated score 97/100Duplicate activity codes
Two records share A110; both are listed.
- Expected
- PP-701: 2 [task 2, 3]
- Actual engine result
- PP-701: 2 [task 2, 3]
Boundary: PP-701 checks activity codes, not duplicate internal task_id values.
Download test XER ↗ · Calculated score 97/100Negative remaining duration
A110 has -1 hour remaining.
- Expected
- PP-702: 1 [task 2]
- Actual engine result
- PP-702: 1 [task 2]
Boundary: Small synthetic fixture; it does not establish field accuracy across all P6 versions.
Download test XER ↗ · Calculated score 99/100Actual after data date
Start milestone actual start is later than the stated data date.
- Expected
- PP-703: 1 [task 1]
- Actual engine result
- PP-703: 1 [task 1]
Boundary: Small synthetic fixture; it does not establish field accuracy across all P6 versions.
Download test XER ↗ · Calculated score 97/100Unknown calendar reference
A110 references a calendar absent from CALENDAR.
- Expected
- PP-704: 1 [task 2]
- Actual engine result
- PP-704: 1 [task 2]
Boundary: Small synthetic fixture; it does not establish field accuracy across all P6 versions.
Download test XER ↗ · Calculated score 98/100Exact thresholds do not trigger
Exactly 352 duration/float hours and 40 lag hours are allowed by strict greater-than comparisons.
- Expected
- No findings
- Actual engine result
- No findings
Boundary: Small synthetic fixture; it does not establish field accuracy across all P6 versions.
Download test XER ↗ · Calculated score 100/100Known limitation: fixed eight-hour thresholds
The engine flags 400 hours, although this is 40 ten-hour days.
- Expected
- PP-401: 1 [task 2]
- Actual engine result
- PP-401: 1 [task 2]
Boundary: Threshold checks and finding day labels use eight-hour equivalents, not calendar-aware working days. A match here records the limitation; it does not endorse the result.
Download test XER ↗ · Calculated score 99/100Known limitation: legitimate SS overlap
A started successor with an incomplete SS predecessor still triggers PP-502.
- Expected
- PP-502: 1 [task 3]; PP-603: 1 [task 3]
- Actual engine result
- PP-502: 1 [task 3]; PP-603: 1 [task 3]
Boundary: PP-502 does not evaluate relationship type or lag. Legitimate overlap can be overflagged.
Download test XER ↗ · Calculated score 98/100Known limitation: no data-date test
No parseable data date means PP-703 cannot test a future actual.
- Expected
- No findings
- Actual engine result
- No findings
Boundary: No finding does not confirm date integrity when the comparison date is absent.
Download test XER ↗ · Calculated score 100/100Known limitation: absent calendar field
With no clndr_id column in TASK, the calendar-reference rule is skipped.
- Expected
- No findings
- Actual engine result
- No findings
Boundary: No PP-704 finding is not proof that calendar data is complete.
Download test XER ↗ · Calculated score 100/100Multiple projects rejected
Prevents combining unrelated project dates and scores.
- Expected
- Reject file: multiple projects
- Actual engine result
- Rejected: This XER contains multiple projects. Export one project at a time so dates, scores and resource weights refer to the same project.
Boundary: Export one project per XER.
Download test XER ↗Missing TASK table rejected
A file without activity records cannot produce a validation score.
- Expected
- Reject file: No TASK records
- Actual engine result
- Rejected: No TASK records were found. Upload a valid Primavera P6 XER export.
Boundary: This is a parser rejection test, not a complete XER-schema validator.
Download test XER ↗Published before sample
The exact NT-1.0 sample used on the homepage and in reports.
- Expected
- PP-101: 1 [task 7]; PP-102: 1 [task 7]; PP-103: 1 [task 7]; PP-201: 3 [task 4, 5, 6]; PP-202: 1 [task 7]; PP-301: 1 [task 3]; PP-401: 1 [task 4]; PP-502: 1 [task 5]; PP-601: 1 [task 3]; PP-602: 1 [task 4]; PP-603: 1 [task 4]; PP-703: 1 [task 5]
- Actual engine result
- PP-101: 1 [task 7]; PP-102: 1 [task 7]; PP-103: 1 [task 7]; PP-201: 3 [task 4, 5, 6]; PP-202: 1 [task 7]; PP-301: 1 [task 3]; PP-401: 1 [task 4]; PP-502: 1 [task 5]; PP-601: 1 [task 3]; PP-602: 1 [task 4]; PP-603: 1 [task 4]; PP-703: 1 [task 5]
Boundary: Synthetic teaching fixture; not a customer project or verified recovery programme.
Download test XER ↗ · Calculated score 81/100Published corrected sample
Zero configured findings after the teaching edits.
- Expected
- No findings
- Actual engine result
- No findings
Boundary: A score of 100 does not prove recovery feasibility, completeness or contractual compliance.
Download test XER ↗ · Calculated score 100/100A separate hand-calculated Progress Measurement Sheet (PMS) check
| Measure | Expected | Actual |
|---|---|---|
| Total budget units | 400 hours | 400 hours |
| A110 budget weight | 25% | 25% |
| A110 actual / budget | 50% | 50% |
| Project weighted resource progress | 12.5% | 12.5% |
Both assignments use labour hours. This checks the resource arithmetic only, not physical completion, productivity or P6 Units % Complete. Mixed units must not be aggregated without an approved common basis.
Reproduce and challenge a result
- Choose a case and download its XER. Keep the suite version with the file.
- Run the file in the free validator. Rejection cases should produce the stated error.
- Compare all rule codes, counts and task IDs with this page. Download the JSON for a machine-readable record.
- For the main demo, compare NT-1.0 and its PDF, Excel, CSV and JSON exports under the same scoring version.
- Send a minimal, authorised example and expected/actual difference to support@planproof.co. Do not include confidential project data without permission.
Further limits: evidence displays retain at most 250 records per finding; counts include all matches. Several checks exclude completed activities. Numeric blanks can be interpreted as zero. Missing or partial data can therefore produce an apparently clean score. No finding is a substitute for reviewing data completeness.
Read the exact rule methodology →