CPP Lens v1.0.0 shipped on 26 May 2026 at criticalpathpartners.ca/viewer/; the viewer has moved on since (v1.5.4 as of September 2026) and this post describes the launch build. Drop an XER into the page, get 29 sections of schedule diagnostics back in milliseconds (the count at launch; Lens renders 30 today), and click Run Deep Forensic to hand the analysis off to the CPP engine without your activity names ever leaving your browser.
This post is the launch note. It explains what Lens does, what it is honest about, and how it fits next to the forensic deliverables we already ship.
criticalpathpartners.ca/viewer/: the entire viewer is a single HTML file. Pure vanilla DOM, no framework, no CDN call. Drop one XER on the left to populate the sections (29 at launch, 30 today). Drop a second XER on the right to enable the Compare group.
1. What it actually does
Lens reads a Primavera P6 XER file in your browser and renders it across six sidebar groups. Twenty-nine sections in total: a deep tour of one schedule, then a comparison surface for two.
Overview
Schedule
Visual
Compare and Period
CPP Forensic
Tools
2. The Deep Forensic handoff: privacy you can audit
The Deep Forensic button on the CPP Forensic tab hands the analysis off to the CPP engine. The engine is the same cpp-forensic-mcp service that drives every Critical Path Partners deliverable; it is hosted at mcp.criticalpathpartners.ca and reachable today through the new /lens/run endpoint. Five forensic methods are exposed:
- Windows analysis (MIP 3.3): contemporaneous-period analysis of how the critical path moved; assigning responsibility stays with the analyst.
- Time impact analysis (MIP 3.7): prospective fragnet insertion against a baseline.
- Collapsed as-built (MIP 3.8): remove excusable events from the as-built to surface a but-for completion date.
- Claim workbench: mixed-evidence ledger, chain-of-custody diff, trust scoring, slip-to-evidence linkage.
- Schedule risk analysis: Monte Carlo P50/P80 with sensitivity ranks.
Anonymization is on by default. Before any bytes leave the tab, Lens strips activity names, WBS names, task memos, UDF text, and activity-code names, replacing them with stable opaque tokens (ACT_0001, WBS_0001, …). The map that lets you restore those names stays in the browser. Only its SHA-256 hash travels with the request, so the result you get back can be receipt-validated against the model you uploaded without the engine ever having seen the original strings.
Twenty-five deep-forensic runs per IP per day, five hundred polls per IP per day. This is enough for a real evaluation pass on a schedule, and not enough to use as someone's CPM engine. If you have a job that needs more, that is what an engagement is for.
3. What Lens does not pretend to be
Lens is not a forensic opinion. It is a viewer, a fast triage surface, and a privacy-preserving handoff to the CPP engine. Engine output is not an opinion either: an opinion comes only from an analyst who has checked the figures against the records. The Deep Forensic result HTML carries a Lens-attribution footer for that reason: the artifact is a CPP engine output, not a CPP analyst opinion.
Two limitations to call out:
- There is no float burndown panel. Total float is reported per activity under Constraints / Float, but nothing charts how float is consumed over time.
- MS Project files cannot be read in the browser. An .mpp is a compound binary, so at launch Lens reads P6 XER and XML only.
Both were scoped on the v0.2 list at launch. The launch ships honest about them rather than papering over.
Two corrections, recorded here rather than edited away.
MPP support shipped in July 2026, so the second limitation is closed. Choose an .mpp and Lens sends the file to the CPP conversion service at mcp.criticalpathpartners.ca/lens/convert, which returns P6 XML that Lens then parses locally. That file leaves your machine, it is not anonymized on the way, and the service applies a daily limit per IP. XER and XML files are still read entirely in the browser.
The float burndown panel never shipped, and the first limitation still stands. An earlier revision of this post said the burndown engine went live the week of launch. That was wrong and is withdrawn. The Visual group description in section 1 has been corrected in the same pass: it previously listed a WBS treemap, a float burndown and a slip velocity panel, and Lens has none of the three.
4. Built on the same open stack
Lens is built on two MIT-licensed libraries we already ship:
@criticalpathpartners/lens-parser: the in-browser XER parser. Its parity tests parse a set of sample XER files with it and with our Python parser and fail on any difference in the file header or the table rows. They do not test the helpers built on those tables, such as calendar decoding, and they run on our machines, not in the repository's public CI.cpp-cpm-engine: the forensic CPM engine that backs the Deep Forensic facade. We open-sourced it earlier this month. Its unit suite runs in the repository's CI on every push, on Linux, macOS and Windows, and prints its own count at the end of each run (1,345 checks at v2.9.49, the release current when this line was corrected). Sigstore-signed CI, reproducible bit-identical across GitHub, the MCP registry, and the hosted MCP (the published npm build trails the current release).
The parser line above said the library had byte-identical parity with the Python parser and 248 tests. Its parity tests compare the file header and the raw tables only, and the test count has changed since, so the line now says what the tests check rather than printing a number that goes stale.
30 September 2026. The count in the cpp-cpm-engine bullet above (878 tests) had stood since the release it named, from May 2026, v2.9.16. The suite on the current release, v2.9.49, prints 1,345 passed, 0 failed, so the bullet now says where the suite runs and names the count with the release it was measured on.
The viewer itself, cpp-lens-viewer, is published on GitHub.
5. How to evaluate this honestly
The fastest way is to run your own schedule through it. Drop the XER on the page and skim the sections. If you do not get an answer to the question you brought, that is a result we want to hear about. The "How Lens compares" section in the Overview group lays out, in plain language, where Lens is on par with the wider viewer landscape and where it is deliberately different.
If you want a deeper analyst pass, meaning an expert reading the same schedule and turning it into a defendable opinion, that is the engagement on the other end of the Talk to CPP button.
Open Lens on your own XER
One page. One file. Drop a schedule and inspect it. No signup, no install.
criticalpathpartners.ca/viewer/ →