Two weeks ago we shipped cpp-cpm-engine as an MIT-licensed public repository. Today we shipped v2.9.16 to npm, to the Model Context Protocol registry, and bit-identical across the four canonical CPP deployment surfaces. The engine that drives every Critical Path Partners forensic deliverable is now reproducible on your own machine in under a minute.
This is not a marketing post. It is a methodology post. Under FRE 702 as amended in December 2023, an expert's reasoning and methodology have to be reliable to a preponderance of the evidence. Proposed FRE 707 pushes in the same direction, and it is still only a proposal: it is not on the US Courts schedule of amendments set to take effect, and the Advisory Committee on Evidence Rules reported in September 2026 that it is still considering the proposal (Standing Committee report to the Judicial Conference, September 2026, page 26; US Courts, pending rules and forms amendments). An inspectable engine is how a tool meets that bar. CPP’s engine hands an opposing expert a one-command reproduction path.
From any terminal with Node 18+:
npm install cpp-cpm-engine
Or, to reproduce the full verification suite:
git clone https://github.com/danafitkowski/cpp-cpm-engine && cd cpp-cpm-engine && npm install && npm run test:all
Measured at five seconds on a 2023-era laptop (Win11, Node 22, NVMe SSD). 878 unit tests pass. 444 cross-validation checks across 43 fixtures pass. A citation regression scan fails the build if any known-bad forensic citation string reappears anywhere in the repository.
1. Four deployment surfaces, locked to one SHA-256
One engine. Three public install paths and CPP’s own copy. Bit-identical hash across all four.
npm install cpp-cpm-engine · npmjs.com/package/cpp-cpm-engine. Public registry. Globally mirrored. Versions immutable once published.v2.9.16 matches today's npm publish, byte for byte.https://mcp.criticalpathpartners.ca/cpm-engine.js. The same file served live by the CPP MCP server. Anyone can curl it and hash it.io.github.danafitkowski/cpp-cpm-engine at registry.modelcontextprotocol.io points to the same canonical repository. AI-driven forensic-analysis workflows discover the server there.2. What the test suite actually proves
878 unit tests, 444 cross-validation checks across 43 fixtures, a citation regression scan that fails the build on any known-bad forensic citation string, and method-label assertions against the AACE RP 29R-03 taxonomy.
cpm.py) that drives batch claim-preparation pipelines. They are held in agreement by a 43-fixture, 444-check cross-validation harness that runs in CI on every commit, comparing early and late dates, total float, the critical-path set and topological order node by node. Free float sits outside that compared surface, because the Python reference does not compute it; the gap is listed fixture by fixture on the cross-validation results page. JS and Python disagree on a single Early Start by even one minute and the build fails. This is how an opposing expert can be confident the dashboard they are reviewing and the DOCX they are reading were computed from the same primitives.tests/no-fabricated-citations.test.js) walks every Markdown, JavaScript, HTML and Python file in the repository and fails the build if a citation string from the known-bad register reappears. The register holds the forensic citations that earlier audit rounds found to be fabricated, year-drifted, or attached to a section that does not carry the proposition. Lines that document a bad citation as bad, such as the historical CHANGELOG entries, are exempted so the audit record can quote what it corrected. What the scan does not do is check a metric definition against its source document: DCMA-EA PAM 200.1 is a reference we read, not a fixture the suite runs against.3. Sigstore-signed CI runs on a public transparency log
The build is signed by GitHub Actions OIDC and logged to Rekor. CPP cannot edit either.
cosign protocol and the signatures are appended to the Rekor public transparency log.4. AACE-canonical, Daubert-disclosed
Every method-id matches AACE. The Daubert disclosure is built into the engine.
method_id on every output. The label set is restricted to AACE-canonical strings. Windows analysis is MIP 3.3 per AACE 29R-03, and the engine refuses to emit any other label for that method. Same discipline for MIP 3.6, MIP 3.7, MIP 3.8.buildDaubertDisclosure(), which produces a four-prong methodology statement aligned with FRE 702 (testability, peer review, error rate, general acceptance). The output names the engine version, the method-id, the topology hash of the input data, the calendar version, and a link to the canonical methodology document. An expert disclosure that uses this output can be cross-examined against the underlying engine code, line for line.verifyReport() recomputes the topology hash from a disclosed report and confirms engine_version lock-step. A CLI (cli_verify.py) lets opposing experts run the check without installing the entire suite. The CPP MCP server exposes a public /verify endpoint for the same purpose.5. The math is sixty years old. The discipline is new.
None of this should be commercial confidential in 2026.
6. What CPP is asking the industry to do
If a forensic engine cannot be reproduced by the opposing expert, it should not be admissible.
How to participate
The minimal path:
npm install cpp-cpm-engine
The full reproduction path:
git clone https://github.com/danafitkowski/cpp-cpm-engine
cd cpp-cpm-engine
npm install
npm run test:all
That is it. No license server. No SaaS portal. No phone call with a sales engineer. MIT license. Fork it. Audit it. File an issue if you find a bug. If it stands up to peer review, it stands up to court.
A one-page attachment for FRCP 26(a)(2)(B) expert disclosures: cpm-engine-v2.9.16-reproducibility-certificate.html · download PDF. Lists the engine SHA-256, the four public deployment surfaces, the AACE-canonical method identifiers, and the Daubert framework citations. Print and attach to any forensic deliverable.
The brand-discipline rules (no truncation in user-facing output, AACE-canonical labels, Daubert disclosure built in) are documented in CONTRIBUTING.md. Pull requests that violate them fail CI.
The companion repositories shipped at the same time:
cpp-xer-parser: standalone Primavera P6 XER parser and generator with MIP 3.4 half-step support, MIT-licensed.cpp-critical-path-validator: critical path validation, DCMA-14 assessment, and logic health review for P6 schedules, MIT-licensed.
The whole world can watch the verification runs at github.com/danafitkowski/cpp-cpm-engine/actions/workflows/verify.yml. We would rather correct the record than defend it.