AI, on your terms

The model proposes.
The engine judges.

A language model never touches your schedule. It returns edits in the same form the undo stack already uses, and every one is checked before it can apply — so a bad answer is a rejected parse, not a corrupted programme.

any model · your key local models supported nothing stored by us
> push procurement two weeks
  1. The request is sent with a summary, not the file120 activities chosen by relevance · never the whole XER
  2. The model answers with ops, through tool calling{ type: "edit", table: "TASK", id: "A1050", … }
  3. Shape · reference · fieldknown op · the row exists · the field is writable
  4. Anything outside the whitelist is refused hereactuals · status · renamed identifiers
  5. CPM runs and you see the diff6 activities move · finish slips 4 working days
  6. You accept it — as one undo stepone command, one undo
The boundary

Three checks stand between a sentence and your programme.

They run in order, in your browser, on every edit a model returns. Nothing reaches the document until all three pass — and the third is deliberately the narrowest.

01 · Shape

Is this an op at all?

A known operation type, with the fields that operation requires. Prose, half-formed JSON and invented op names all die here, before anything is looked up.

02 · Reference

Does the row exist?

An edit must name a row that is actually in the file — and an addition must name one that is not. A hallucinated activity code is a rejection, not a new activity.

03 · Field

Is this field writable?

A whitelist per table: names, durations, activity type, calendar, WBS, constraint, relationship type and lag, resource quantities. Anything not on the list is refused.

It cannot report progress

act_start_date act_end_date status_code are excluded on purpose. Recording that work happened is a claim about the real world, and it belongs to the person who was there — not to a text model reading a summary of your file.

It cannot rename an identifier

Changing a key on an existing row silently reparents its relationships and its assignments. New rows may of course carry ids; changing one afterwards is what is refused. Nothing is quietly re-pointed while you are reading the summary.

What it does

Three jobs, and the honest split between engine and model.

The deterministic work — parsing, CPM, open ends, leads, constraints, cycles — runs locally and costs nothing. Asking a language model to count missing predecessors is slower, costs money and is less reliable than the code that already does it. So the engine finds; the model judges, explains and proposes.

Draft from scope

A blank sheet, filled in.

"Design, procure and install 4 no. 33kV transformer bays including civils, cabling and commissioning. Completion within 9 months of award."

→ proposed: 4 WBS bands · 26 activities · 31 links

Rendered as a preview diff. Accept it into the project, edit it first, or throw it away — nothing applies until you say so.

Logic assistant

The engine finds. The model triages.

7 open ends · 2 negative lags · 1 cycle

Those are found exactly, locally and for free, then handed to the model as fact — not as a question.

"The cycle through CW-1080 is the one to fix first: it's suppressing float on the entire commissioning chain."

Fixes come back as ops you preview, through the same three checks as everything else.

Plain-language edits

Say it; see what it costs.

> push procurement two weeks

→ 6 activities move · finish slips 4 working days

Durations go in and come back in hours on an eight-hour day, relationships in P6 codes — PR_FS, PR_SS, PR_FF, PR_SF — so what applies is what P6 would have written.

Previewed in plain language, applied through the normal undo path. One command, one undo.

Any model, your key

Model-agnostic by construction — including no model at all.

Each provider gets a small adapter, so nothing above has to know which is in use. Structured output goes through tool calling wherever the provider has it, rather than asking for JSON in the prompt: it is the one mechanism the major APIs share, and the provider enforces it instead of us hoping for it.

Anthropicclaude-sonnet-5The default fast tier. The top tier is one click away in the picker.
OpenAIgpt-5-miniSame protocol, different adapter. Your key, your account, your rate limits.
Googlegemini-2.5-flashNamed models only — nothing is chosen for you behind the scenes.
Any compatible endpointOllama · LM Studio · your ownA local runtime is called straight from the page, so the request never leaves the machine.
your browser localStorage · your key, never ours relay · keeps no copy, no-store the provider you chose · or · local model — the relay is skipped entirely
Cost and consent

Only the request you ask for leaves, and only when you ask for it.

Opening, editing, CPM, baselines, DCMA checks, levelling, earned value, risk and print all run in your browser with no model involved and no request made. The assistant is something you invoke; when you do, the text it needs for that one request goes to the provider you picked, with your key, through a relay that keeps nothing — or to no one at all if that model runs on your machine. A 20,000-activity XER fits in no context window, so what is sent is a summary chosen by relevance, never the file. The full route is written out on how it works, and the long form is in the privacy policy.

Point it at a real file and see what it refuses.

Free to open, no account, nothing uploaded. What it costs →

Open the Studio