A worked example
This is a real report, produced by a real run of the real command. Nothing on this page is a mock-up, and nothing has been shortened to look better.
The scenario
A bridge widening. The baseline plans eighteen activities over twenty-three weeks against a contract completion of 14 August 2026, on two calendars — a five-day week with a lunch break, and a six-day week for the piling and the paving. Three updates follow at roughly monthly data dates.
The claim is one event: the eleven-kilovolt duct bank the drawings showed as already diverted was still live when the contractor mobilised, and the diversion finished on 27 March. Two other events sit beside it so the analysis has something to argue about — a piling rig failure, which is the contractor's, and a late approval of a barrier connection detail, which is not.
Every date in this scenario was written by a generator, and it says so in four
places — the file names, the project short name GENERATED-CLAIM-DEMO, the
root WBS node, and this sentence. So it is evidence that these commands run and
what they say, and it is not evidence about real schedules.
It does carry three properties of a real Primavera export, because a fixture without them cannot exercise the code that reads them: a time of day on every stamp, durations that are not whole working days, and progress recorded part-way through an activity. Several it does not: the relationship mix is more finish-to-start than a real corpus, there are no resource curves, no cost loading beyond a flat rate, no activity codes, no user-defined fields, and eighteen activities where a real programme is two to eight thousand.
The command
construct check claim-01-baseline.xer claim-02-update.xer claim-03-update.xer \
claim-04-update.xer --baseline 0 --terms terms.json
Exit 1.
What comes back first
Before any finding, before any number:
Reservation of determination
Whether this submission is acceptable is the determination of the reviewing authority. This report states what the schedule imported from the supplied material contains and what the cited clauses say. It is not an engineering opinion and does not certify, approve or reject anything.
Then the method, the governing documents, where those documents disagree with each other, the choices that could have gone the other way, the assumptions, and the limitations. Roughly the first eighty lines, in a fixed order, with no parameter to reorder them. The assumptions are what the other side will attack, and burying them reads as concealment even where nothing was concealed.
The headline, and the three numbers in it
The importer could not read all of the supplied material as written. 22 passed, 5 failed — 81% of the 27 clauses that were scored, and those 27 are 24% of the 113 clauses that apply. Of the rest, 12 were stated as observations rather than scored, 6 need a person and 68 could not run.
Read the order. It opens with the condition under which those numbers mean what they appear to, before it states any of them. Here that condition is that the importer could not take all of the supplied material literally — and the Schedules considered section above says exactly what it could not take and what it did instead:
XER.CALENDAR.PART_DAY(warning): calendar C2: weekday(s) [5] work less than a full 8h day — counted as whole working days; work on them is overstated
Then three numbers, each with its own denominator. Eighty-one per cent is a statement about twenty-seven clauses. Twenty-four per cent is what tells you so: eighty-six of the hundred and thirteen applicable clauses were never scored at all. A clean score over a quarter of the section is a clean answer to a small question.
And note which way it moves with more evidence. Running the same command without the contract terms gives 79% of 19 clauses, four blocking. Supplying the terms decides more clauses and finds one more blocking failure. More evidence buys a better-founded answer, not a better-looking one.
What the verdicts rest on
The report says this itself, in the same section, unprompted:
What these verdicts rest on. 5 of the 27 clauses that were scored or stated as an observation can quote a date, a float or a critical-path position this engine calculated. If our scheduling arithmetic is wrong, those are wrong with it — and it agrees with the values Primavera P6 itself stored on 67.85% of 584,687 measured field comparisons. Recalculate them in P6 before relying on them.
The other 22 of those clauses are read out of the submitted file — what it declares, what it contains, how its activities and relationships are coded — and would say the same if our arithmetic were wrong. They are worth what our reading of the file is worth, which this report does not measure. That is a different question, not a softer one.
Every finding is tagged accordingly, from your file or from our arithmetic.
Also stated in the report, and this is the kind of thing a tool usually leaves
out: the twenty-two passing verdicts are not listed, because twenty-two lines
saying nothing is wrong would bury the eleven that need an answer. They are in
the JSON, and --show-passes prints them.
A blocking failure
AACE-29R-03-2.1.B.4 AACE RP 29R-03 §2.1.B(4) — the longest path of 5 activities
does not span the network: §2.1.B(4) asks for a continuous critical path from the
earliest occurring schedule activity to the latest [from our arithmetic]
- the path starts at CURE (2026-06-01); the earliest occurring activity in the
network starts 2026-03-02
- CURE then PAVE then STRIPE then PUNCH then OPEN
The clause is named, what it asks is quoted, the condition found is stated, the evidence is listed, and the tag says the finding depends on this engine's arithmetic rather than on the file alone.
Another, which does not:
SCL-CP1-1.59 SCL Delay and Disruption Protocol 2nd ed. Core Principle 1 ¶1.59 —
1 programme versions share an identity with another; ¶1.59 requires an append-only
history in which no version is replaced [from your file]
- GENERATED-CLAIM-DEMO: supplied 4 times
An observation, which is not a failure
AACE-29R-03-1.5.B.3 AACE RP 29R-03 §1.5.B(3) — the contract allocates network
float as 'project', departing from §1.5.B(3)'s shared default. The RP's default
applies only absent contrary contract terms, so this is a valid allocation and is
reported for the reviewer, not failed [from your file]
The tool found a departure from a standard's default, established that the contract permits it, and declined to fail it. That distinction — between what a standard says by default and what the contract has agreed instead — is the whole of the difference between checking a clause and asserting a house opinion.
The part that matters most: what it would not decide
This is the section that sells the product, and it is the section a marketing page would hide.
Six clauses were referred to a person. The tool assembled the evidence, stated the question, and stopped:
AACE-29R-03-4.3.C AACE RP 29R-03 §4.3.C — 4 controlling chains collected across
the update chain, covering 13 distinct activities. Which of these chains is the
as-built critical path? §4.3.C requires expert selection among the candidates on
contemporaneous-perception factors — was the work perceived as critical at the
time, is it cost-significant, are there unmodelled resource constraints, was it
performed consistently or piecemeal — none of which is in the schedule.
[from our arithmetic]
It did the work. It collected four candidate chains across thirteen activities. And then it refused to pick one, naming the four factors the standard requires a person to weigh and stating that none of them is in the file.
A rule registered as judgment cannot return a pass. That is refused when the finding is constructed, not by convention — the registry rebuilds every finding with the determinism it holds before the finding's own constructor sees it. And a referred finding that names no activities is refused too, because assembling no evidence and asking a question is not a contribution.
Sixty-eight clauses could not run at all, and every one of them names the input it wanted:
AACE-29R-03-4.2.D.1 AACE RP 29R-03 §4.2.D.1 — needs terms['aace.concurrency_theory']
-- 'literal' or 'functional'; terms['aace.analysis_interval_days'] -- an interval
of one day would settle it without the declaration
AACE-29R-03-2.4.A AACE RP 29R-03 §2.4.A — needs terms['aace.quantification_basis']
-- 'relative_start', 'extended_duration' or 'absolute_date_difference'
AACE-29R-03-4.3.E AACE RP 29R-03 §4.3.E — needs terms['aace.project_float_ownership']
-- what the contract says about the gap between the schedule's own completion and
a later contractual one
No industry default is ever substituted for any of these. A default quietly applied is a specification the reviewer never agreed to — and in the case of the concurrency theory, it would be picking a side in the argument the analysis exists to have.
Each of those lines is also a worklist item. construct unanswered groups all
sixty-eight by the input a person would have to go and find, largest group first,
so the top of the list is the most useful thing you can do next.
Where the standards disagree, printed rather than resolved
Under Governing documents, the report prints two conflicts on this run alone. One of them:
Which standard governs the analysis on US federal work. UFGS 01 32 01.00 10 §3.8.4 provides that where a methodology is chosen from AACE 29R-03 and conflicts with ANSI/ASCE/CI 67-17, ASCE 67-17 governs, on work adopting the section. AACE RP 29R-03 is instead the more widely cited taxonomy and is frequently applied by default, including on federal work where it does not govern.
The other is concurrency itself. Neither is resolved by the tool.
The same event, two methods, two answers
The report also carries the reason a number without its method is not an answer. On this scenario, one delay event is worth:
- nought working days under MIP 3.8's subtractive collapse, and
- five working days under MIP 3.7's additive impact.
Neither figure is wrong and neither method is misapplied. Ask for a "time impact analysis" by that name and the tool refuses, because the name means either MIP 3.6 or MIP 3.7 and those are different analyses producing different numbers. It names both and asks which you meant.
And the other side can check it
construct record ... --json --out record.json
construct verify record.json <the same files>
The record binds three digests: the bytes as received, the network parsed out of
them, and every date, float and flag computed from it. verify either reproduces
the answer or names the activity and the field where the two runs disagree —
"the digests differ" is useless in a dispute, because it tells neither side where
to look.
It is append-only, hash-chained and independently verifiable, and that page also says the five things no record of any kind can establish.
The whole thing
Every command in this example, its full output, its exit code and the files it ran on are generated from a real run and regenerated on every change, with a test that fails if the committed copy has drifted. Stale output in front of a reader is worse than no output, because it is a claim about the tool the tool no longer supports.
If you want to see it against your own programme rather than a generated one, that is what a call is for.
Where this example's data comes from
Stated because it is a fair question about anything published on the internet.
The claim scenario above is written by a generator that lives in this repository and produces the same bytes every time. It derives from no real project, no client file and no third-party dataset.
The separate tour in demo/README.md runs on one committed schedule — 27
activities in 13 small networks, scheduled by a real Primavera P6 23.12
installation and captured from P6's own database — which is transcribed from an
MIT-licensed source and may be redistributed with its notice. It is the only
real schedule in the repository that may be published, and that is why the tour
runs on three activities.
The 68 harvested Primavera exports used for the accuracy measurement are real project schedules and would make a far better demonstration. Most of their source repositories state no licence at all, which is the absence of a grant rather than a permission — so this project holds no right to redistribute their bytes, does not, and will not publish a report derived from any of them. What is published instead is the retrieval method and the aggregate result, so the measurement is reproducible without anybody being handed a file.
Source: web/pages/example.md. Source commit date: 2026-09-06.