What this cannot do
This page is in the primary navigation on purpose, and it is the longest page on this site.
A tool whose output gets cross-examined has exactly one asset, and it is not accuracy — nothing is accurate enough to survive an opposing expert on its own. The asset is that everything it cannot do is written down before anybody asks. A project selling evidentiary rigour that overstates its own validation has destroyed the only thing it sells, and would be found out by exactly the audience it was trying to impress.
So: here is the list. It is not complete, because no such list is, but nothing on it has been softened.
1. It is not validated at scale
It agrees with what Primavera P6 stored on 67.85% of 584,687 field comparisons. The full measurement, including the ceiling and the movement history, is on Does this actually work?.
Every report the tool produces prints this limitation, and it must not be removed from a deliverable. Any figure it produces should be reconciled against the source scheduling software before it is relied on.
A whole-day time axis accounts for roughly a third of the remaining gap on the projects that pass the validity gate. That is an architectural property and more files will measure it more precisely without lifting it.
One bound the project published about itself turned out to be false, and it is recorded rather than quietly replaced. "Sub-day arithmetic costs at most one working day per activity" was disproved. The replacement, measured: a whole-day time axis costs at most one working day per activity in 97.8% of cases and at most two in 99.4%, and the second day arises at the link rather than within the activity. A residual 0.6% of activities where the model predicts three days and the median is fifteen is explicitly not claimed by anything.
2. Nobody has used it
No customer has run this tool on a real project. Zero users, zero pilots, zero agencies, and no professional engineer has reviewed or adopted any output.
There is no user interface. There is a Python library, a command-line entry point, and a local page that is a shell over the same commands.
Every claim anywhere about what a reviewer wants comes from documents, not from reviewers. A tool built only from reading specifications will be wrong in ways only a reviewer can see.
3. Fifty-five of the 103 UFGS clauses are not implemented
Forty-eight are. All fifty-five that are not carry a stated reason, and the reasons group:
- No record of the thing exists in a schedule submission at all — the largest group.
- The model carries no cost or resource data — including the entire SDEF activity coding dictionary.
- A P6 setting that is not modelled.
- Implemented elsewhere, under another clause.
- Partially implemented, and marked so.
Stated practically: if your review covers cost loading, SDEF activity coding, resource loading, scheduler qualifications, submittal transmittals, SEKO meeting minutes, narrative content, or P6 admin preferences, the tool has told you nothing about any of them. Those checks remain entirely manual.
A weaker version of any unimplemented clause, shipped quietly under the real clause number, would be the one defect this package could not survive: a citation a reviewer relies on that does not check what the clause says. So they are absent and listed rather than approximated.
4. The tool checks clauses, not compliance
A passing report does not mean a compliant schedule. It means the clauses this tool could reach, on the material you supplied, were satisfied.
The tool cannot see the contract. It does not read narratives, transmittals, correspondence, submittal logs, daily reports or drawings.
Exit code 0 means no blocking failure was found, which — given the coverage the report prints beside it — is a weaker claim than conforms.
The ANSI/ASCE/CI 67-17 pack is the sharpest case: all 35 guidelines are implemented, and on a run with no contract terms most of them report not evaluated, three refer to a person and two are decided. That is not a partial implementation. The UFGS pack checks a schedule; the ASCE pack mostly checks an analyst, and the analyst is not in the file.
5. A wrong contract term produces a confident wrong finding
This is the most dangerous item on the page and it has no mitigation in the tool.
A mistyped key is now complained about on standard error, by name, with the nearest real key offered — but the run continues and the clause still reports the term as not supplied. If a clause keeps asking for something you are sure you gave it, the answer is in those warnings.
A key stated twice in the same object is refused outright, exit 2.
A term that is present and wrong is worse: it produces a finding stated with full confidence, with no signal anywhere in the report. Responsibility for the terms supplied is the person supplying them.
An empty list means none were made; an absent key means nobody said. The tool treats those differently on purpose, and an absent key is never treated as false.
6. Concurrency is never resolved under US jurisdictions
Under us_federal, us_state_or_private and neutral, the governing answer is
None. Only the UK SCL protocol produces one, because it states a rule.
That is deliberate. A tool that picked one theory to avoid returning None would
be manufacturing the certainty that gets an expert excluded rather than merely
disagreed with.
Alongside it: float ownership is never decided. Pacing is never decided. Both are registered as hybrid or judgment and never as deterministic. And the mapping between the literal/functional theories and an events/effects framing is unsourced, and marked so.
Two incompatible day-count bases coexist in the model. The numbers must never be added to or subtracted from one another, and nothing in the type system stops you.
7. One progress mode is an interpretation, not a reproduction
ProgressMode.ACTUAL_DATES is this project's reading of Primavera's behaviour.
It has not been validated against real Primavera output, and a finish date
computed under it may not match P6's. The reasoning is written into the test file
so whoever validates it knows which claim to check.
8. The methods run; the methods are not proved
All nine AACE MIPs run end to end and there are tests. That does not mean any result has been checked against Primavera, against a published expert analysis, or against a real project. Five of the nine were built in a single session and none has been run on a real schedule.
The delay-injection matrix — which passed, including a placebo and a neutral control — is bounded at five activities, one injection at a time, no concurrency, no fuzz, and no attribution of cause to a party anywhere. MIP 3.5 was not exercised at all.
What the matrix demonstrated is mostly what the methods cannot do:
- MIP 3.3 stops explaining a delay at the point the delay becomes decisive, and its explained-fraction reading of zero is ambiguous between two different situations that no method here can tell apart.
- MIP 3.1's per-activity table counts float consumption as a delayed finish, so a reader summing the delayed-activity column can obtain five days of delay on a project that was not delayed.
- A constraint-driven delay has no MIP 3.6 input form at all.
Collapsed as-built has four bounds of its own, and the first is the one to notice: the total depends on an anchor nobody states — fourteen working days at one anchor and eleven at the other, on the same data. A delay recorded in line can produce a collapse larger than the delay removed. A per-event figure is not an apportionment. And of the 69 corpus files, none passes the collapse's own preconditions.
9. The formats are read; they are not equally evidenced
Four formats are read. The validation corpus is 68 files and every one is XER. No P6 XML or MSPDI file produced by Primavera or by Microsoft Project has ever been read by this engine. The other three readers rest on this project's own tests.
The P6 XML and MSPDI readers carry no resources and no costs. The report says so; it changes no verdict; a cost or quantity question wants the XER.
The project-default lag calendar falls back to a guess when the file does not state one. On a multi-calendar job that silently changes every lagged link.
The data date convention defaults to through. That is a compatibility argument
and not a correctness one — AACE RP 10S-90 declines to settle it, and the two
readings differ by one day on every window boundary.
The ask, named as one: one real P6 XML export and one real MSPDI export.
10. Everything requiring a second machine has never run
Continuous integration has been dead since 3 September 2026. The cross-platform and cross-version reproduction matrix has never executed once in the life of the repository. See Does this actually work? for what is measured instead and how far it goes.
There is no install route but a clone. pip install construct-engine and
pipx install construct-engine resolve to nothing; the name is unregistered.
11. Two output surfaces do not read aloud correctly
The reports are sound in Markdown, HTML and JSON, and were read end to end through a screen reader. Six of the eight error and refusal paths read as sentences. Two do not, and they are recorded as defects rather than closed:
- a refusal that reaches the reader with every Windows path separator doubled, and it is the only refusal in the tool that does not say what to do next;
- one warning in
construct verifythat dumps a Python representation of a calendar dictionary at the reader — left as-is deliberately, because the values are what the warning is about.
A wider class remains: around twenty sites write X -> Y meaning was X, now Y,
and a screen reader at one punctuation setting announces the arrow as nothing at
all, so duration 5 -> 7 working days becomes "duration 5 7 working days". They
are a real defect and they are still there.
This matters commercially and not only ethically: a forensic report is read aloud, quoted in a letter and pasted into a filing, so text that works only visually is broken output rather than ugly output.
12. What none of this is
Nothing produced by this tool is legal advice, and nothing in it is advice about any project.
The FRE 902(13)/(14) text the engine emits is draft text for a qualified person to review, adopt and sign. It is not a certification until such a person signs it, and this engine cannot be that person. Self-authentication addresses authenticity only, not hearsay, and FRE 902(11) requires reasonable written notice — missing that step forfeits the benefit.
Where the tool observes a missing update or an unusual interval, it reports that as an observation about the documents in hand. It does not assert that anything was lost, destroyed, withheld or concealed. FRCP 37(e)(2) turns on intent to deprive, and the most common innocent explanation for a missing update is that nobody sent it.
13. It will not hand you back a corrected file
UFGS 01 32 17.00 20 (NAVFAC, 05/25) makes third-party processing of an XER cause for rejection. The submission a contractor sends must come from their own Primavera. No corrected file, no re-export, no "fixed" schedule handed back, however carefully any of it were built. The engine contains writers for all three P6 formats and no shipped command reaches any of them.
If this page has talked you out of it, it has worked. The alternative — finding these out in a deposition — costs considerably more.
Source: web/pages/limitations.md. Source commit date: 2026-09-06.