Cadence MD
P50, P80 and P95 dates for every milestone in a device program, from your own plan and a reference-class library that names its sources, with a named human on every report.
Showing the synthetic demo: an invented Class II balloon dilation catheter program, twelve simulated weekly check-in cycles, two seeded slips. 6 of 8 milestones open as of 2026-03-30.
| Milestone | Baseline | P50 | P80 | P95 | P(on baseline) | State | Top driver |
|---|---|---|---|---|---|---|---|
| Design inputs approved | 2026-01-27 | 2026-01-28 | 2026-01-28 (+1 d) | 2026-01-28 | 0% | READY | resolved 2026-01-28 |
| Design freeze | 2026-02-28 | 2026-02-28 | 2026-02-28 (+0 d) | 2026-02-28 | 100% | READY | resolved 2026-02-28 |
| Pilot build complete | 2026-04-19 | 2026-06-13 | 2026-07-05 (+77 d) | 2026-08-04 | 0% | BLOCKED | Balloon first-article inspection and approval 100% of late runs |
| Biocompatibility complete | 2026-04-20 | 2026-05-05 | 2026-05-14 (+24 d) | 2026-05-26 | 1% | BLOCKED | Cytotoxicity panel (ISO 10993-5) 92% of late runs |
| Sterilization and aging complete | 2026-07-11 | 2026-10-07 | 2026-11-18 (+130 d) | 2027-01-13 | 0% | BLOCKED | EO sterilization validation (ISO 11135) execution 67% of late runs |
| Design verification complete | 2026-05-21 | 2026-08-03 | 2026-08-30 (+101 d) | 2026-10-05 | 0% | BLOCKED | Balloon first-article inspection and approval 100% of late runs |
| 510(k) submitted | 2026-08-12 | 2026-11-16 | 2026-12-29 (+139 d) | 2027-02-21 | 0% | BLOCKED | EO sterilization validation (ISO 11135) execution 63% of late runs |
| 510(k) cleared | 2027-01-09 | 2027-04-06 | 2027-08-14 (+217 d) | 2028-04-20 | 17% | BLOCKED | FDA 510(k) review to decision 100% of late runs |
Source: Cadence MD engine 0.1.0, forecast.json run 20260330T120000Z-1a944fef, engine 0.1.0, library 0.1; 10,000 Monte Carlo runs, seed 42, as of 2026-03-30; 128 tasks, 0 dependency references excluded. Calibration: n_resolved=0 — unsourced reference classes in use: accelerated_aging, biocomp_iso10993_panel, design_freeze, design_input_review, design_review_gate, design_transfer, design_validation, dv_execution, dv_protocol_approval, labeling_ifu, package_validation, pilot_build, presub_qsub, process_validation, regulatory_submission_assembly, risk_management_file, sterilization_validation, supplier_fai, tooling_lead_time, usability_validation_62366., retrieved 2026-03-30. n=128. Unsourced reference classes in use: 20. Their durations are placeholders marked TODO in the library, which is why the badge reads CALIBRATION: SYNTHETIC.
Limited intake
The Thursday-night slide, generated instead of rebuilt
In most device programs the true state lives in four places, a phase-gate record, a task tracker, a test lab's queue and a supplier's purchase order, and reaches leadership as a slide somebody rebuilt by hand. Cadence MD reads the plan, keeps a probabilistic forecast of every milestone, and drafts the update into the organisation's own template. The draft is not a report until a named program manager has dispositioned every change in it.
Dates come from the engine. A language model may classify, parse and write prose. It may not set a date, and the run log proves it did not.
Run it in ninety seconds
Python 3.11 or newer; nothing else to install. From a checkout of this repository:
py -3 -m cadence demo run
That builds the synthetic program you see above, applies twelve weeks of check-ins, runs 10,000
Monte Carlo iterations in a few seconds and writes forecast.json and a self-contained
gantt.html. For your own plan:
py -3 -m cadence init ./programs/my-program --id P-001 --name "My program" --start 2026-01-05
py -3 -m cadence run ./programs/my-program
Drop a plan beside program.json: a CSV in the documented schema, an MS Project XML, or a
Jira or Azure DevOps CSV export. cadence validate shows how every row was read and
classified before anything runs.
Wire it to your agent
The engine is also an MCP server over stdio, which is the one interface Claude Code, Claude Desktop, GitHub Copilot in VS Code, Cursor, Windsurf and Codex all speak. One command writes the config:
py -3 -m cadence agents install ./programs/my-program --for claude-code
py -3 -m cadence agents install ./programs/my-program --for vscode
py -3 -m cadence agents install ./programs/my-program --for cursor Or by hand. Claude Code and Cursor (.mcp.json / .cursor/mcp.json):
{
"mcpServers": {
"cadence": {
"command": "py",
"args": ["-3", "-m", "cadence", "mcp", "--program", "./programs/my-program"]
}
}
} GitHub Copilot in VS Code (.vscode/mcp.json):
{
"servers": {
"cadence": {
"type": "stdio",
"command": "py",
"args": ["-3", "-m", "cadence", "mcp", "--program", "./programs/my-program"]
}
}
}
The server sends the agent its rules in the handshake, and the repository ships them as a Claude
skill and a generic AGENTS.md: quote the field a date came from, say "Not in the plan"
when the data cannot answer, ask the human for their own name before recording a disposition, never
work around the export gate, never write to a tracker. The last two are not requests: the server has
no tool that could do either.
The reference library, and where its numbers come from
Every task is classified into a reference class, a recurring kind of device-program activity with a
duration distribution, a rework probability and a source. The library ships as a
versioned YAML file. A class whose source still reads TODO is unsourced: the engine
refuses to run against it unless told to, and then badges every output. In this release the
placeholders outnumber the sourced entries, and the page says so rather than hiding it.
The one computed class is the FDA 510(k) review clock. It is read off the pooled openFDA snapshot behind the Clearance Timeline Estimator, and its source line carries the snapshot date, the decision window, the record count and the bin width. A 10xAnd-operated MCP endpoint serves the same library and, per product code, that code's own receipt-to-decision percentiles, so a program can pull real public data for its pathway:
py -3 -m cadence library sync ./programs/my-program --url https://10xand.com/mcp/cadence --product-code DQY The endpoint receives a product code at most. It never sees a plan, a task name or a check-in.
What the numbers are
| Figure | How it is computed |
|---|---|
| Baseline | Your plan's finish date for the milestone, or the critical-path finish from your start date and durations if the plan carries none. |
| P50 / P80 / P95 | The date by which the milestone finished in 50%, 80% and 95% of the seeded Monte Carlo runs. Each run draws every open task's duration from its class distribution around the plan's baseline, adds rework by the class probability, and walks the dependency graph. |
| P(on baseline) | The share of runs that finished on or before the baseline. |
| State | READY if P80 is on or before baseline; ATTENTION if P80 is late by less than a tenth of the time remaining; BLOCKED otherwise. |
| Top driver | Among the open tasks on the milestone's driving path, the one whose elapsed time correlates most strongly with the milestone finish across runs, with the share of late runs it sat on the path. |
| Calibration | Brier score on P(on baseline), 80% interval coverage and mean absolute error by class, over every forecast made before a milestone resolved. With nothing resolved there is nothing to claim, and the badge says so. |
What it will not do
- Write to your tracker. Jira, Azure DevOps, MS Project, Planner, Smartsheet and PLM are read from exports and never written. Plan changes come out as worklists.
- Publish without a name. Export and any channel post are blocked until every forecast change since the last report has a disposition from a human who typed their own name.
- Claim a track record. Nothing about forecast quality is stated anywhere the calibration ledger does not show it. The first published ledger will be computed on a real program, not asserted.
- Send your plan anywhere. No hosted service holds program data. The engine's only outbound calls are the library sync you run and an inference endpoint you configure, both logged in the run log.
Questions we get
Where does my plan go when I use Cadence MD?
Nowhere. The engine is a Python package that runs on your machine and writes only into the program directory you point it at. The MCP server is a local subprocess your agent starts. The only network call the free tier can make is the library sync you run yourself, which downloads reference data and uploads nothing but, optionally, a product code. The viewer on this page reads a forecast.json in your browser with FileReader and makes no request.
What is a reference class, and why does the badge say CALIBRATION: SYNTHETIC?
A reference class is a kind of activity that recurs in device programs — a biocompatibility panel, a sterilization validation, an FDA 510(k) review clock — with a duration distribution, a rework probability and a source for those numbers. The engine refuses to run against a class whose source is still marked TODO unless you pass --allow-unsourced, and then every output carries the badge. In this release most classes are placeholders awaiting authorship; the one exception is the 510(k) review clock, computed from the openFDA snapshot behind the Clearance Timeline Estimator, with n and the snapshot date in its source line. The badge also stays on until at least one milestone has resolved and the calibration ledger has something to show.
Does a language model set the dates?
No. Dates come from three deterministic layers: the critical-path method on the plan, the reference-class priors, and a seeded Monte Carlo. A configured model (off by default) may suggest a class for an unmatched task, parse a free-text check-in reply, and draft the executive summary prose. Every completion passes through the run log, which withholds any date-like string and counts how many it withheld; the count is in the run log of every run.
Why can I not export the status report straight away?
Because a forecast change is a claim, and a named human has to stand behind it before it leaves the tool. Every milestone whose P80 or state moved since the last exported report needs a disposition — accept, override with a reason, or defer with a reason — from a reviewer who gives their own name. The export carries the disposition record as an appendix. An override records the reviewer's date beside the engine's, never in place of it. Drafting is never gated.
Can it update Jira, Azure DevOps or MS Project?
No, permanently. The engine reads exports and never writes to a system of record. When a plan should change, it produces a worklist the program manager applies themselves. The MCP server exposes no tool that could write, so an agent cannot be talked into it.
What does P80 mean here, and how should I read the lamp?
P80 is the date by which the milestone finished in 80% of the Monte Carlo runs. The lamp follows fixed thresholds: READY when P80 is on or before the baseline; ATTENTION when P80 is late by less than a tenth of the time remaining to the baseline; BLOCKED when it is later than that. The thresholds live in program.json. Nothing about the lamp is a judgement of anyone's work; it is arithmetic on the plan and the priors.
What is the difference between the free tier and Cadence for Teams?
Same engine. The free tier is the local CLI, the MCP server and the HTML Gantt, with a file-based check-in loop. Cadence for Teams is the same engine deployed as a container inside an organisation's own Microsoft 365 tenant, surfaced as a Teams app with read-only connectors and the check-in loop in chat, sold as a deployment plus a calibration engagement. It is not built yet and this page makes no claim about it beyond that sentence. "for Microsoft Teams" and "for Jira" describe compatibility; Cadence MD is not affiliated with Microsoft or Atlassian.