The project percentage nobody maintains.
In most project registers the “62% complete” is a number a person typed, and it was true on the day they typed it. In Zenith a project is a window over a list of work orders, and the percentage, the cost, the urgency, the buildings and the forecast are all counted from those jobs at the moment the screen draws. Two things are stored — the budget and the type — because nothing in a maintenance system knows them. Everything else would only be a figure somebody had to remember to update.
Six statuses · Derived progress & cost · Building-grouped schedule · Readiness gate · Bilingual EN / FRA project holds references, not copies
A shutdown is ordinary work with an extraordinary constraint: it all has to happen inside one window, on equipment that is only down once. The jobs keep their own lifecycles, their own history and their own coding — grouping them must not touch any of that, because in two years the reliability figures read the work orders, not the folder they sat in.
- The scope is a list of work order references. Nothing is copied into the project, so a job's status, dates and cost stay the job's own.
- A job may sit in more than one project — a pump that appears in both the pump programme and the reliability push is one job, counted honestly in both windows.
- Detaching a job does not touch the job. It leaves the folder; it keeps its history, and any other project still claiming it keeps it.
- A window needs a site. A project with no site is a window on nothing, so it is required and validated against the location tree at creation.
What a register can say without being told
Four cards, eight tabs and a table that sorts itself worst-first. Every column below is a question about the list of jobs, and the register answers it on read rather than asking anyone to keep it current.
The four decisions behind the columns
- Progress is jobs finished over jobs in scope — counted, not weighted by hours. A weighted figure reads as precision the estimates cannot support, and the unestimated jobs would silently weigh nothing and flatter the total.
- An empty project is 0%, not 100%. An empty list has finished nothing; calling it complete is the arithmetic being clever at the reader's expense.
- Urgency is the worst job in it, never an average. Averaging is how a project holding one emergency and nine routine jobs reports as Low — true of the arithmetic, false of the situation.
- Exposure is the budget of the projects in trouble, not the amount they are over. A project three hundred dollars over on a million is a rounding error; one 20% into its money at 2% complete has the whole budget at stake and has overspent nothing yet.
The table sorts itself: over budget first, then outpacing, then overdue, then by end date. There is no column sort, because the order that matters is not one a reader should have to find.
“Over budget” is the easy half, and the late half
By the time a project is over, it is already over. The half worth computing is the one before that: a project 18% done that has spent 60% of its money has not overspent anything yet — and is going to.
A twenty-point gap, at any stage
The test is a percentage-point gap rather than a ratio. Early in a project a ratio is meaningless — one invoice against 2% complete is a thousand per cent and nothing at all — while twenty points means the same thing in week two and week forty.
- Over — actual cost has passed the budget. Stated plainly, and first in the sort.
- Outpacing — spend is more than twenty points ahead of progress. This is the one you can still act on.
- No budget — nothing to compare against. Not “at risk”, and not silently treated as a budget of zero, which would report every unbudgeted project as overspent.
- Finished work cannot outpace itself — a project that is done and inside its budget is not at risk, however the two curves looked on the way.
- Jobs that cannot be fully priced are named, never folded in. Labour with no rate and parts with no standard cost are counted as unpriced jobs, not added at whatever the priced part came to.
Replaced by the true thing standing closest to it
The design for this page asked for a Gantt of phases, a “3 milestones overdue” alarm and a Risks & Issues register. None of the three exists in the product, and each would have meant a new stored structure somebody has to maintain by hand — which is the exact failure the rest of this module was built to avoid. So each was replaced by something already kept up to date by the work itself.
Buildings
The schedule groups by where the work actually is, read from each job's own location — the room's parent building, or the site where a job names no place. It answers what a phase row was drawn to answer: what is happening, where, and when.
grouped from locationId → parentWork overdue
The same alarm, and it is real: jobs in the scope already past their own required-by date, counted on the day you are looking. Distinct from the project being late — a window that has not closed yet can be full of jobs that have.
early warning · the end date is the late oneHolds & delays
A hold is this product's record of a job that has stopped and why, with a reason code from the references register. Open holds only, longest-standing first. It is the issue log, already written, by the people doing the work.
days stopped · reason code · the job it is onThese are not placeholders. They are better than the things they replace for one reason: nobody has to remember to update them. But they are also not phases, milestones and risks, and if your organisation needs those three as first-class records, this module does not have them — see where this build stops.
A bar prefers what happened to what was planned
Each job's bar starts at when it actually started if it has, and at its scheduled start if it has not; it ends at when it was finished, or at when it is due. A chart drawn from the plan after the work has happened is a picture of an intention, and the two diverge most exactly when somebody most needs to look.
The last date in the scope, not a projection
Extrapolating “62% at day 44 of 128” produces a confident date built on a percentage that is itself a count of finished jobs, and it moves by weeks every time one closes. Zenith takes the latest date anything in the scope is due or was finished. When that falls past the project's own end date, the project cannot finish on time by its own plan — a statement that can be checked rather than believed.
- Slip is counted in days between that date and the project's end date, and is zero when it is not late.
- An empty scope has no forecast at all — the screen says so rather than printing today's date.
- The project being overdue is a separate fact — its end date has passed, and it is neither Complete nor Cancelled.
Two gates, and both of them name names
A shutdown is sixteen jobs in a four-day window, and the one without its parts is discovered on day two. Readiness asks the planner's questions before the window opens, while the answers can still change something. Completion asks a different one, and refuses.
Five questions, per job, on a date
Every job in the scope is checked against the same five, and the answers partition the scope into done, ready and flagged. Finished jobs are counted as done rather than “ready” — the word would be backwards.
- Is it authorized? A job still in Draft or Awaiting Approval is flagged, because it cannot be worked when the window opens.
- Is somebody named? Nobody assigned is a flag, not a refusal.
- Is it already overdue? Past its own required-by date before the project even starts.
- Is its date outside the window? Due after the project ends — scope that will not fit.
- Are parts reserved against it? A flag, not a refusal — plenty of jobs need no parts. It is raised so the planner looks once, on purpose, instead of sixteen times by walking the storeroom on day one.
Six states, and guarded moves between them
A project may go straight from Planned to Active — money that has just been signed off should not have to be walked backwards. A held project restarts. Complete and Cancelled are terminal: there is no reopen in this build.
- A one-day outage is legal. The date check is “ends before starts”, not “ends after starts”, because an outage that starts and ends on the same date is the ordinary case.
- Cancel works from anywhere except finished. A project can be abandoned from Planned, from Active or from On Hold, and the date is stamped.
- Scope can be edited in any live state. Attaching and detaching are not gated on status — the gate is at completion, where it changes something.
One scope, read twelve ways
The register answers “which of these needs me today”. The record answers the next question, which is “and what is going on inside it”. Every tab below is the same list of work orders asked a different question.
Scope & readiness
Every job in the window with its five answers, partitioned into done, ready and flagged. A job opens in a drawer without leaving the project.
Schedule
Bars per job, grouped by building, a month header and a today line. Each bar declares whether its dates are the plan or what happened.
Costs
Labour and materials summed from the jobs, against the budget, with the remainder as the third wedge and unpriced jobs named separately.
Resources
Who is on it by hours actually booked, overtime separated, cost split within a cent. Assigned-but-not-started reads as pending, never as zero hours.
Parts
What the scope has consumed and what is still held for it, direct purchases marked, matched to stock by the job's own code.
Tasks
Every step across every job, in order. Skipped is counted apart from done, because a skipped step carries a reason somebody had to type.
Holds & delays
Open holds only, longest-standing first, each with a reason code and the job it stopped. Lifted holds are history and stay out of the way.
Activity
One stream out of many work orders, newest first, every entry carrying the job's code — because “isolation completed” without it is a sentence about nothing.
Documents
Gathered from the machines, places, job plans and permit types the scope references — never attached to the project, so a procedure revised this morning is the one you see.
Assets
The machines the project touches and how much open work each is carrying, unioned from the jobs' own asset and covered-asset links.
Vendor visits
Who is coming and to which job. A thin link, and the tab says so — it records that a vendor attended, not what they charged.
Forecast
The last date anything in the scope is due or was finished, against the project's own end date, with the slip in days.
Where this build stops
This is the module where the gap between what the category promises and what we have built is widest, so it gets the longest section on the page. Everything above is in the product and demonstrable today. Everything below is not, and we would rather lose the deal here than in month four of an implementation.
This is a portfolio register, not planning software
If you are looking to replace Microsoft Project or Primavera, this is not that, and no amount of roadmap talk will make it that this year. Zenith answers “which of my maintenance projects needs me today, and is any of them spending faster than it is progressing” — from work orders that already exist. It does not build a plan.
- No work breakdown structure, no phases, no milestones. A project is a flat list of work orders over one window.
- No dependencies between tasks — a job's steps have a sequence number and nothing else. No predecessor, no lag, no constraint type.
- No critical path and no float, which follows directly: without dependencies there is nothing to compute them from.
- No baselines. The start and end dates are the only plan, they are not versioned, and nothing records what they used to be.
- No earned value. No planned value, no cost or schedule performance index, no estimate at completion. The single spend-against-progress signal on this page is the whole of it.
- No resource levelling or capacity planning from a project. The resources tab is retrospective — hours already booked. It will not tell you that next week is over-committed.
- No working calendar. Dates are compared as dates and elapsed time is counted in whole days. Weekends and statutory holidays are invisible to every project figure.
Maintenance projects, not construction projects
The fit is a maintenance or facilities team running shutdowns, outages, replacement programmes and rolling small works out of the same system that holds the jobs — where the value is that the project's numbers come from the work orders your technicians are already closing, rather than from a second plan somebody keeps in a spreadsheet.
- Good fit — a four-day shutdown with sixteen jobs, checked for parts and assignment before the plant goes down.
- Good fit — a year-long replacement programme across several buildings, where the question is whether the money is running ahead of the work.
- Poor fit — a capital construction project with contractors, draws, submittals and a critical path. That is a different product, and we will say so on the call.
One fact, one place, every screen
The discipline behind this module is that a rule lives in exactly one function and a fact lives in exactly one record. That is what stops the cost on a project's record quietly disagreeing with the cost on the register two releases after anybody remembers they were computed separately.
Referenced, never retyped
The scope points at work orders, the site at the location tree, the owner at the people register. A project copies nothing, so nothing can go stale inside it.
Priced once
A job's labour cost is computed by the work order module and split here, rather than re-implemented on the project page where the two would drift apart.
Refusals in sentences
Every gate returns typed reasons, and every reason has a sentence in both languages. A blocked screen names the job and the fix.
Accessible to everyone
WCAG 2.2 AA as a build rule: real table semantics, project and bar states announced in words rather than colour alone, and focus that lands where an error refers.
Straight answers, including the unflattering ones
Is this a replacement for Microsoft Project or Primavera?
Where does a project's percent complete come from?
Can I set a budget on a project I create myself?
What does “spending ahead of progress” actually mean?
Why does the schedule group by building instead of by phase?
Can a project be closed while its work orders are still open?
Do purchase orders or contractor invoices reach a project's cost?
Is “Awaiting Approval” a real approval workflow?
Can one work order belong to two projects?
What happens to a work order when I add it to a project?
Who can activate, hold or cancel a project?
Does any of this survive a page reload?
Bring the project nobody can tell you the real status of.
Bring one window, the jobs that belong in it and the number somebody committed to. We will build the project in front of you, then close a job and watch the percentage, the cost and the risk move on their own — and try to declare it finished while something is still open.
Elsewhere in Zenith
Canadian industry guides
Standards and regulators
Standards are named by number, title and scope only. CSA and ULC publications are paywalled — read the standard itself before building a compliance programme on any summary.