Where this picks up
Session 1 named the two wires and ran the check. Session 3 produced the receivables, inventory and payables balances. Session 4 turned them into the bridge and landed on the change in cash. Every one of those outputs is a line on the sheet, so today is where the parts come back together and where the check earns its keep. Session 6 starts driving the model from its assumptions. The engine is assets/fin-live.js, loaded on this page.
★ What you walk out with today. Seven Marchmont lines and the activity that produced each one, so you can read a sheet as a record of what happened rather than a list of balances. The solved opening equity of £1,662,000, why solving is the honest option and what it costs you. The tie as a working check, with its measured result: 2.24e-8 worst error across the full canon set of 50 model runs, against a tolerance of 0.01. And two deliberate breaks, one that produces a constant error and one that produces a growing one, because the shape of a failure tells you what kind of mistake you made.
LiveA position, not a period4 min▶
The income statement and the cash flow statement both cover a stretch of time and are meaningless without one. The balance sheet is a single instant. Nothing on it happened during the month; everything on it is what was left standing at the end of it.
That is why the sheet has no subtotal you can call performance. It has a shape instead, and the shape is the whole argument: what the business controls on one side, and who has a claim on it on the other.
Marchmont's cash line at the end of month 10 is minus £7,432. Nothing about that figure says the month was bad. It says that on one particular evening, after ten months of profitable trading, the balance was below zero. The reason lives on the other two statements.
Self-studyThe fields the sheet is made of4 min▶
Each row the engine returns carries the whole sheet, plus the two totals and the difference between them. There is no separate balance sheet object, because the sheet is the row.
No credentials of any kind are involved. If an example ever needs one, the string is the word placeholder.
Seven lines, and what put each one there
11 min liveEvery balance on the sheet is the residue of an activity somewhere else. Reading it well means naming that activity for each line, which turns a list of balances into a history.
LiveThe identity, and why it is not a rule4 min▶
Everything a business controls was paid for by somebody: a supplier waiting to be paid, a lender, or the owners, including through profits they left in the business. There is no fourth source. So the total of what it controls is the total of the claims on it, necessarily, not by agreement.
That is what makes the sheet usable as a test. A rule can be waived and a convention can be argued about. An identity cannot fail, so when the two sides differ the failure is in the recording, and the recording is the thing you can go and look at.
LiveEquity is the residual, and it behaves like one4 min▶
Payables and debt are claims for fixed amounts: a supplier is owed what the invoice says. Equity is whatever is left after those are satisfied, which means it absorbs every change that is not itself a claim. Profit raises it, a loss lowers it, and no one negotiates the figure.
In this engine that residual character is literal. Equity is the only balance on the sheet that no assumption drives directly. It opens as a solved number and then moves by net income, once a month, for as long as the model runs.
Self-studyNet fixed assets, the line that hides two movements4 min▶
One balance, two opposing flows. Capex adds to it and never touched the income statement. Depreciation takes off it and never touched the bank. A single netFixed figure therefore tells you nothing about either on its own, which is exactly why both appear separately on the cash flow statement.
Marchmont spent £180,310 and depreciated £102,025 over twelve months, so the line grew. A company whose net fixed assets shrink year after year is depreciating faster than it is investing, which is a fact about the future rather than the past.
£1,662,000 that nobody supplied
8 min liveMarchmont existed before month 1. It opens with customers who already owe it money, stock already on the shelf, suppliers already owed and a loan already drawn. Six of the seven opening balances are given. The seventh is worked out.
LiveWhy solving is correct rather than convenient4 min▶
Equity is not a measurement of anything. It is a definition: what is left when the claims of everybody else are met. Asking a modeller to supply it as an input is asking them to state a number that, if it disagrees with the other six, is simply wrong, because the other six describe things that physically exist and equity does not.
So the engine computes it once, at month 0, from the six balances that do describe real things.
Session 1 set out the argument against this and it is a real one: a solved opening means month 0 cannot fail, so the tie is testing the forward mechanics rather than the opening data. The useful response is not to argue, it is to know precisely which half of the model the check covers.
LiveWhat a plug is, and why this is not one4 min▶
A plug is a figure inserted repeatedly to absorb a difference nobody has explained, usually every period, often with a name like other or adjustment. Its signature is that it moves when something unrelated changes and nobody can say why.
Marchmont's opening equity is computed once, from a definition, and never touched again. After month 0 it moves only by net income. If it were a plug, a change in the collection setting would move it; run { dso: 45 } and it does not, because collecting sooner rearranges cash and receivables on the same side of the sheet.
Self-studyTesting the opening data separately4 min▶
If the tie cannot test the opening position, something else has to. The honest substitute is a reasonableness check on the six given balances, which is a different kind of test and worth running by hand.
Opening receivables of £1,000,000 against month 1 revenue of £400,000 implies two and a half months of sales uncollected, which is the 75 day collection setting and is consistent. Opening inventory of £464,000 against a 60 day stock setting is two months of cost of sales, also consistent. A sheet whose opening receivables implied eight months of sales would tie perfectly and still be wrong, and only this check would catch it.
The tie, measured across fifty runs
8 min liveOne passing run proves almost nothing. Models fail on particular settings, and a check that has only ever been run on the base case is a check that has never been tested. The canon set is fifty runs.
LiveWhat the check actually reads4 min▶
Each row carries its own tieError, computed as assets - liabsEquity at the moment the row is built. ties walks all of them, keeps the largest absolute value and compares it to a tolerance that defaults to a penny.
Two consequences worth holding onto. The check reads a stored field rather than recomputing, so editing a row's balances without editing its tieError will not be caught. And it reports the worst month only, so a single failing month and a dozen failing months look identical until you inspect the rows.
LiveWhy the tolerance is not zero3 min▶
A computer adding decimal amounts does not land on exact zero, and the residue accumulates slightly with the number of months. Demanding an exact match would make the check fail on correct models, which trains everybody to ignore it.
A penny is the right order of magnitude because it is the smallest amount that could be a real accounting error. The measured worst across all fifty runs is 2.24e-8, which is roughly six orders of magnitude inside that, so the tolerance is not doing any work in practice and would not hide a genuine mistake.
Self-studyRunning the sweep yourself4 min▶
The throw is the load bearing line. A sweep that records failures and keeps going will hand you a summary with a broken run inside it.
Break it on purpose, twice
7 min liveA check you have only ever seen pass is a check you do not understand. Two deliberate breaks, one that drops a single leg and one that cuts a wire for good, and the two failures look nothing like each other.
LiveBreak one: drop a single leg4 min▶
In a copy of fin-live.js, stop equity rising in exactly one month and leave every other line alone. This is what recording an invoice against receivables and forgetting the revenue side looks like from the outside.
Run it and the tie error is zero for six months, becomes £38,356 in month 7, and then stays at £38,356 for every month after. It stays flat because later months add their own net income correctly; only the one leg is missing, forever. And £38,356 is month 7's net income, which is the whole point of the check. The failure names the transaction.
LiveBreak two: cut the wire and leave it cut4 min▶
Now profit never reaches equity at all. The tie error is non zero from month 1 and grows every month, reaching £445,631 by month 12, which is exactly twelve month net income. A rule has been broken rather than an entry missed, so the damage compounds.
Put the line back and re-run before doing anything else. The discipline that matters here is not the break, it is restoring the file and confirming ties returns ok again, because a broken engine left on disk is the one that gets used next week.
Self-studyBreaking a row without touching the engine3 min▶
If you would rather not edit the file, you can break a single row in memory. Because ties reads the stored tieError rather than recomputing it, the row's own total has to be updated too, which is itself the lesson.
Change only the first line and the check still passes, which is worth seeing once. A check that reads a stored result can only catch what the recording step recorded.
Read the sheet, then break it
22 min hands onSix steps. The first three are in the console on this page. The last three need a copy of fin-live.js you are willing to damage.
Rebuild both totals by hand
Take rows[11] and add cash, ar, inventory and netFixed yourself. Then add ap, debt and equity. Compare each against the stored assets and liabsEquity. You are checking the engine's arithmetic, which is a reasonable thing to do once with any model you did not write.
Recover the opening equity
Take rows[0].equity and subtract rows[0].netIncome. You should land on £1,662,000. Confirm the same figure comes out of the six opening balances directly, and note that nothing in the assumptions supplied it.
Show that a working capital change does not move equity
Run the base case and { dso: 45 } side by side and compare month 12 equity. They should be identical, because collecting sooner moves money between two lines on the same side of the sheet. If equity had moved, the model would be claiming that collection terms change profit.
Drop one leg and read the error
In your copy, stop equity rising in one chosen month. Print every month's tieError. Confirm the error is zero before that month, equal to that month's net income from it onwards, and flat thereafter.
Cut the wire and read the shape
Now remove the net income addition entirely. Print the same column. Say in one sentence how you would tell these two failures apart if somebody handed you only the tieError column and no explanation.
Restore, and prove you restored it
Put the original line back and run the fifty run sweep. Anything other than ok across all fifty means something else is still edited. Finishing a deliberate break by proving the check passes again is the part people skip.
The habit to keep. Tie check any run before you read a single figure from it, including runs somebody else produced. It is one line, it cannot give a false pass on the mechanics it covers, and the alternative is interpreting a shape that came out of a broken model with complete confidence.
Three questions
Marchmont's opening equity of £1,662,000 is computed from the other six opening balances rather than supplied. What is that?
A plug is inserted repeatedly to absorb unexplained differences. This is computed once at month 0 from six balances that describe real things, and then moves only by net income. The real cost is that month 0 cannot fail, so the tie tests the forward mechanics rather than the opening data, and that is worth saying out loud.
A tie error is zero for six months, becomes £38,356 in month 7 and stays at exactly £38,356 for the rest of the run. What happened?
A flat error is a single missing entry: later months carry on correctly, so nothing adds to it. A rule that has been broken produces a growing error instead, which is the other deliberate break. The flat value is exactly month 7's net income, which is how the failure names the transaction.
Across the fifty run canon set the worst tie error is 2.24e-8 against a tolerance of 0.01. Why does the sweep matter rather than just the base case?
The canon set crosses five growth rates with five collection settings at two horizons precisely because a sign or an accumulation can break at one combination and nowhere else. More runs do not make the arithmetic more accurate; they make the passing result mean something.
Homework
Thirty minutes, in the console and on a copy of the engine.
Invent your own break
Choose any line in the engine other than the equity wire and break it so the sheet stops tying. Predict the shape of the error before you run it, then run it and see whether you were right. Being wrong is the useful outcome.
Reconcile the opening balances against the assumptions
Check that opening receivables, inventory and payables are each consistent with month 1 activity and the 75, 60 and 30 day settings. Write down what you would have to see to conclude the opening data was wrong even though the sheet tied. Session 6 starts changing those settings.