Budget
The project cost plan by budget code, with committed costs, change orders and forecast landing on the same line
The budget is the project's cost plan, one line per budget code, and the column engine over it is what makes it useful. Each column is either a figure you entered, an aggregate pulled from another LEDGER register, or a signed sum of other columns. Open it from Budget in the LEDGER rail.
The Budget tool defaults to NONE on every seed role except Project Manager, because the register puts revised budget beside committed costs line by line.
Build the budget
- Open Budget.
- Click New line.
- Pick a budget code, give the line a description, and enter the original budget.
- Optionally record quantity, unit of measure, unit cost and budgeted labor hours.
Hours are tracked beside labor dollars rather than derived from them. Unit cost is $/unit at four decimal places, and the extended amount is computed from quantity times unit cost.
Clicking a row opens it for editing. Show inactive lines brings back lines that were retired. A line with history is never deleted, only made inactive, so every reference stays resolvable.
Lock the budget
Once the job is bought out, click Lock budget. The confirmation states what happens:
Locking freezes Original Budget on every line. After this, money moves only through budget changes or the change management chain. A new line can still be created, but only at zero.
Unlocking is a separate act, recorded in the audit log, and the dialog tells you to prefer a budget change unless the baseline itself was entered wrong. Locking and unlocking need Budget ADMIN, or Budget STANDARD with the Lock and unlock the budget baseline permission explicitly granted.
The Standard columns
| Column | Where it comes from |
|---|---|
| Original Budget | The line itself. Frozen once locked |
| Budget Modifications | Approved budget changes |
| Approved COs | Approved change orders and executed prime-contract amendments |
| Revised Budget | Original Budget + Budget Modifications + Approved COs |
| Pending Budget Changes | Budget changes submitted but not yet approved |
| Projected Budget | Revised Budget + Pending Budget Changes |
| Committed Costs | Commitments that are executed or complete |
| Direct Costs | Approved direct costs |
| Pending Cost Changes | Submitted change orders with their markups, plus contingency uses that are submitted or approved by project controls but not yet signed by the owner |
| Projected Costs | Committed Costs + Direct Costs + Pending Cost Changes |
| Forecast to Complete | Mode-driven, see below |
| Est. Cost at Completion | Projected Costs + Forecast to Complete |
| Projected Over/Under | Projected Budget - Est. Cost at Completion |
Nothing here is stored. The whole matrix is recomputed from the source records on every read, so a column can never be stale.
Why Over/Under reads zero on a fresh line
Under the automatic forecast mode, Forecast to Complete is Projected Budget minus Projected Costs. Substitute that into Est. Cost at Completion and it collapses to Projected Budget, which makes Projected Over/Under exactly zero. That is not a rounding artifact. An automatic forecast is, by definition, a forecast that lands exactly on budget. Over/Under only becomes informative once a line is set to manual or lump sum.
Unavailable columns
If a source module fails, or nothing is registered to feed a column, the column
is unavailable, not zero. Every calculated column that references it becomes
unavailable too, carrying the reason forward. A budget cell showing $0.00
because a module is missing is a wrong number someone would act on, so the
product refuses to draw one.
Some money genuinely carries no budget code, and it is disclosed rather than spread. A prime-contract amendment and a commitment change order both carry a value with no coded lines behind them. Those amounts appear in the register's project total as unattributed rather than being allocated across lines nobody allocated them to.
Forecast to Complete
Set a line's forecast mode when you edit it.
| Mode | What it does |
|---|---|
| Automatic | Projected Budget minus Projected Costs. The default, and recomputed on every read |
| Manual (itemized) | A list of remaining-work items that sum to the forecast |
| Lump sum | One number you enter |
| Monitored resources | Not selectable |
Monitored resources renders disabled with its reason: it needs schedule resource loading, which the platform does not track. Use automatic, manual or lump sum.
Manual forecasts cap at 25 itemized entries per line.
Time-phased forecasting
The Forecasting tab on the same register spreads each line's Forecast to Complete across a window of calendar months, so you can say when the remaining money lands rather than only how much is left.
- A derived spread splits the forecast evenly across the window. It is recomputed on every read and never stored.
- A manual spread is months you typed, stored as a record.
Two things about a manual grid are worth knowing before you use it:
- The last month of the window is the server's. It is re-derived on every read and every write as Forecast to Complete minus the sum of the earlier months, so the grid can never disagree with the column it came from. That cell is read-only, labelled as the balancing month, and reports when it moved.
- Edits are staged and saved on purpose. Nothing is written as you type. Click save when the grid is right.
If someone else saved a manual grid while yours was open, the save is refused and nothing is retried. Reload and re-enter, rather than overwriting a decision someone else made.
The project's forecast window is set from a cost-through date (costs are counted through it, and forecast months begin the month after) and an end period. With no end period the window runs eleven months past the first forecast month.
You can import a month grid from CSV and download a template for it. The import caps at 2,000 rows.
Budget changes
After the budget is locked, a budget change is the only internal mechanism that moves budget money. Open them from Budget changes in the header, or create one with New budget change.
A budget change carries lines on two sides: an Adjustment taking money away from a code, and one or more Allocations putting it somewhere else. The arithmetic reads the signed amount only, so the side is intent and display structure, never what moves the money.
Budget changes must net to exactly zero unless you explicitly flag the change an increase. The check runs when the change is submitted and again when it is approved, and the refusal reports the imbalance to the cent. A draft is allowed to be out of balance while you build it.
| Status | Meaning |
|---|---|
| Draft | Being built. Moves nothing |
| Pending | Submitted for approval. Feeds the Pending Budget Changes column |
| Approved | Feeds the Budget Modifications column. Terminal |
| Void | Abandoned. Terminal |
Approving or voiding a budget change requires Budget ADMIN. Approved and Void are both terminal: to reverse an approved change, issue another one that moves the money back, so both facts stay on the record.
Types are reporting metadata and do not change the arithmetic: Allowance, Buy-out, Contingency, Production quantity, Transfer.
Budget changes are numbered from a per-project counter that is monotonic and never reuses a number.
Snapshots
Click Snapshot to materialize every column for every line exactly as the register reads it right now. A snapshot is immutable and byte-stable: the matrix is serialized once at capture, so re-reading it returns the identical figures no matter how the column engine changes later. A snapshot is what the numbers were.
Flag anomalies
Flag anomalies reads the current register and returns a list of flags with a short cause sentence for each. It is on demand, it changes nothing, and there is no apply step: a flag is an observation, not a change.
The division of labour matters. The flags themselves are found by plain arithmetic over the already-computed matrix and the most recent snapshot, so they cannot be invented. Only the sentence is generated. If the model returns nothing usable, the flags still ship with plain-English descriptions. A model failure degrades the feature to a list of correct flags, never to a wrong number.
A movement counts as material only when it clears both a $1,000 floor and 2% of the line's revised budget. A hand-set forecast older than 30 days is a stale-forecast candidate. At most 40 flags go into one pass.
This is a metered AI operation and it draws on the project's credit pool.
Limits
| Limit | Value |
|---|---|
| Budget lines per project | 2,000 |
| Itemized forecast entries per line | 25 |
| Lines per budget change | 200 |
| Budget changes per project | 1,000 |
| Rows in one forecast CSV import | 2,000 |
Troubleshooting
A column header is dimmed and its cells show a placeholder. That column's source could not be read, or nothing is registered to feed it. The header carries the reason. Every calculated column downstream of it is dimmed too.
Original Budget will not accept an edit. The budget is locked. Move the money with a budget change instead, or unlock the budget if the baseline itself was entered wrong.
Submitting a budget change is refused. The lines do not net to zero and the change is not flagged an increase. The message states the imbalance.
Projected Over/Under is zero on every line. Every line is still forecasting automatically. Set the lines you have a view on to manual or lump sum.