Reading a report

The order is fixed and cannot be changed

  1. Reservation of determination
  2. Method
  3. Governing documents, and where they disagree
  4. Choices that could have gone the other way
  5. Assumptions
  6. Limitations
  7. Principles relied on
  8. Findings

There is no parameter to reorder it. The assumptions come first because the assumptions are what the other side will attack, and burying them reads as concealment even where nothing was concealed. That is roughly the first eighty lines, and it is there so the report survives being read by the other side.

The first thing on the page

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.

That is emitted unconditionally by the renderer, on every output path. There is no flag to suppress it.

Beside it sits the provenance: the project, the date prepared, the engine version, and the SHA-256 digest of the input as received — on the first screen, not in an appendix. And the date prepared carries its own disclaimer, because it would otherwise be read as more than it is:

Date prepared is a self-asserted local time, read from the clock of the machine that ran this analysis and checked against nothing. It records when this document was produced. It is not evidence that this document, or the files it describes, predate any dispute; only an external timestamp authority is, and this engine wires none up.

Method, and what happens when none is declared

No method has been declared for this analysis. Under AACE RP 29R-03 the method is itself an argument to be made and defended, so this report cannot be presented as a delay analysis until one is stated.

Three things that look similar and are not

A choice that could have gone the other way — a disclosure. It meets three conditions: it could have gone the other way, the other way gives a different answer on this schedule, and a published document leaves it open or two documents disagree. Each carries what was chosen, the alternative, the reason, the source, and where it was computed, what the alternative would have given.

Read the materiality claim carefully. The command-line report marks every disclosure material without establishing it, so the heading says "N of N choices below would change the result on this schedule" where what was actually established is "N choices were made and none was tested for materiality". Treat the list as complete rather than as filtered.

An assumption carries what it is, why it was assumed, what would resolve it, and what it affects. An assumption with no route to resolution is not an assumption — it is a limitation.

A limitation carries what it is, the consequence, and what would remove it. One limitation applies to every report this engine produces today: this engine's results are not validated against Primavera P6. Stating it costs a paragraph. Having it discovered in cross-examination costs the analysis.

The five verdicts

Verdict Meaning Counts toward the score
PASS The rule ran and the condition was satisfied Yes
FAIL The rule ran and the condition was breached Yes
OBSERVATION Something worth looking at, which the specification does not make a failure No
NOT_EVALUATED The rule could not run. A missing field says what would let it No
REFERRED Judgment rules only: the evidence is assembled, the question is stated, and a person must answer it No

Severity is orthogonal to verdict. There are four levels — CRITICAL, MAJOR, MINOR, INFO — and blocking means a FAIL at CRITICAL or MAJOR.

A rule that crashes becomes NOT_EVALUATED naming the exception at MAJOR; the run does not abort. A rule that returns nothing at all is treated the same way, because a silent rule is indistinguishable from a rule that crashed.

A judgment rule cannot return PASS. That is refused structurally rather than by convention: the registry rebuilds every finding with the determinism it holds, before the finding's own constructor sees it. A green tick against "the logic is reasonable" is a lie told in the one document whose reader is entitled to assume otherwise. A referred finding must state a question, and a referred finding that names no activities has done nothing — both are enforced at construction.

Score and coverage, and why one without the other is useless

score    = passed / (passed + failed)
coverage = (passed + failed) / total findings

Abstaining cannot raise the score. A check that could not run is in neither half of it.

Two reports can read identically on the score line and mean entirely different things:

Report A Report B
Passed of decided 38 of 41 38 of 41
Coverage 100% 60%

Report B says 38 of the 25 clauses the tool could reach. Stated to a Contracting Officer: "This submission was checked against three-fifths of the section. Three of the clauses reached fail. Nothing is known about the rest."

The second report is a narrower claim, not a weaker version of the first. Reading it as "93% conformant" is the single most common way to misuse this tool.

When nothing at all could be decided, the score is None. Not 0.0 and not 1.0 — both of those are claims. The report prints: "No clause could be decided on the material supplied. The score is not zero; there is no score."

There is also a confidence label across the whole report, and the report prints the weakest one across all its sections. computed_unvalidated is set unconditionally today and means computed from inputs that could not be validated; it is true of every run regardless of coverage. Run validate for the thing that label says was not done.

Every finding carries what it rests on

from your file means the finding would still stand if this tool's date arithmetic were wrong. from our arithmetic means it would not. Given that this engine agrees with Primavera on roughly two field comparisons in three, that distinction is the most useful thing on a finding line — and 265 of the 351 rules are in the first class.

Every finding also names the document and the clause, quotes what the clause requires, and states the condition found. Findings carry stable identifiers derived from the rule id rather than from position, so a citation into a report survives another clause failing above it.

Evidence lists are truncated at fifty items with an exact "…and N more" tail. The truncation is lossy; the count is not.

What NOT_EVALUATED obliges you to do

It obliges you to do the check yourself, or to supply the input. It does not mean the clause passed and it does not mean the clause is unimportant. It means the tool refused to guess.

Every abstention carries a non-empty statement of what it wanted, in one of three families:

  1. A contract termneeds terms['contract_completion_date'], and often the term explained. Note that the ASCE pack writes the bare key instead (needs asce.delay_events), so searching a report for terms[ misses some of them.
  2. More schedule materialneeds a prior schedule submission to compare against; needs a snapshot marked as the baseline; needs at least three schedule versions; needs in-progress activities.
  3. A defect in the toolneeds a finding from the rule; a silent rule cannot be scored, or needs a fix to the rule implementation. These two are the only fixed strings; everything else is phrased by the rule, and one no-terms run across the thirteen packs emits forty distinct wordings. Match on what the line asks for, not on its exact words.

A report where a third of the clauses are not evaluated is the correct output for a submission whose contract terms were never provided. Printing a confident score instead would be the single most damaging thing this tool could do.

What a passing report does not mean

A passing conformance report means the clauses this tool could reach, on the material you supplied, were satisfied. It does not mean the schedule complies with the specification. See what this cannot do §3 and §4 for the clauses that are not in the packs at all.

One snapshot or two

Measured on a real 58-and-59-activity pair:

Baseline alone Baseline and as-built, --baseline 0
validate 0 passed, 0 failed of 3 3 passed, 1 failed of 16
check 10 passed, 1 failed of 11 decidable 14 passed, 2 failed of 16
Coverage 10% of 107 15% of 109

The second snapshot does not improve the score; it changes how many checks exist at all. For a first run, hand it two dated snapshots and name the baseline.

Reading the report with a screen reader

The report was designed to be read aloud and is audited that way. What it commits to:

Four known defects remain inside the findings section: some section signposts are bold paragraphs where an h4 was meant, some inline emphasis reaches as literal asterisks, one label is missing, and only one region is labelled. They cost navigation, not information, and they are listed rather than closed.

Source: web/pages/reading-a-report.md. Source commit date: 2026-09-06.

See it in practice

Follow the evidence, from the schedule to the finding.

Explore the worked example