What will always be true?
Good decisions can only be made
with accurate facts.
How do we keep accurate facts
about our software?
This is an industry story,
not ours alone.
Facts, and the problem A proposal
Part one
Facts.
Then the problem they point to.
Part one · Facts
Accurate factsConnectedMachines checkAI amplifiesTrusted facts
Good decisions can only be made with accurate facts.
Our software is connected: a change in one place reaches others.
A machine checks a rule the same way every time. People don’t.
AI works only from what it’s given: wrong facts become wrong decisions, faster.
So we need accurate, trusted facts about our software, kept accurate.
Part one · The problem
No one can just ask.
Every change starts half-blind.
connects to?changed by?what’s inside?????
Part one · The problem
Too big for people alone.
This problem can be solved by making people
better at what people are better at.
Part two · a proposal
A model of
accurate facts.
The proposal
One model.
Every component, every relationship.
ModelBanking PlatformCard NetworkMobile AppPayments APILedger DBCustomer ServiceFraud CheckRefusedSYSTEMCONTAINERCOMPONENT
The proposal
What the facts are.
Componentsan inventory of everything we run
Levelswhere each one sits, from a whole system down to its code
Relationshipshow they connect
Get these right and we understand our software.
Mobile app Payments Fraud check Customer records Cards Payments team
The proposal
Useful gets used.
The modelAskChatSketchDiagramTablePhone
The parts · 1 of 5
1
C4: a shared shape
and zoom levels.
Where the inventory, the levels and the relationships are written down, as code.
Four levels: system, container, component, code.
The parts · 1 of 5
C4
Why this
What it costs
What it solves
Connected systems need one shared way to write down what exists, where it sits and what it connects to.
Four levels won’t capture every nuance — and teams must learn and agree them.
One written inventory of components, levels and relationships, read the same way by everyone.
The parts · 2 of 5
2
Code & compiler:
precision.
Rules that make wrong entries impossible to write.
Checks every time. One meaning, no ambiguity.
The parts · 2 of 5
Code & compiler
Why this
What it costs
What it solves
A machine checks a rule the same way every time. Wrong entries cannot be written.
Rigid: it can’t interpret intent — and someone has to set the rules.
No more checking rules by hand — and an exact answer to “what does this affect?”
The parts · 3 of 5
3
Git: history and
accountability.
Who changed what, when and why.
Reviewed and approved before it counts — and we can always go back.
The parts · 3 of 5
Git
Why this
What it costs
What it solves
Every change has an author, a reason and a reviewer — and you can see what was true on any date.
It records any change, right or wrong — and review takes people’s time.
A reliable record of who changed what, when, and why.
The parts · 4 of 5
4
Agents: understanding
and translation.
Perhaps their biggest strength: the view that suits you.
The reverse: say what, not how.
They translate both ways — and are never the source of truth.
The parts · 4 of 5
Agents
Why this
Why AI alone isn’t enough
What it costs
What it solves
Each person gets the facts in the form that suits their understanding — and can ask for change in their own words.
Agents alone, no modelWrong facts, wrong decisions — faster.
No AI at allSlow, tiring work; wastes what the framework built.
Skills aloneHow we work, not what’s true.
Can be confidently wrong — so never trusted alone, always checked.
Understanding for everyone, not just experts — and changes asked for in plain terms.
The parts · 5 of 5
5
People: judgement.
Someone accountable decides what’s right.
Ownership and sign-off, by the right people.
The parts · 5 of 5
People
Why this
Why people still decide
What it costs
What it solves
Code can’t decide what the rules should be, and agents can be confidently wrong. Someone accountable has to decide.
Let the machine decideIt checks rules; it can’t say what’s right.
Let the AI decideFast, but confidently wrong at times.
No clear ownerNo sign-off, no accountability.
Review and judgement take people’s time — the slow part, on purpose.
Every change, and every difference found, has an accountable owner.
Together
01 C4 Shape 02 Code &compiler Precision 03 Git History 04 Agents Understanding 05 People Judgement
Five parts. Some you know well,
some you may not.
We already have everything we need, except the model.
This is about composing what we own.
Here’s what they do together.
Together
How it fits together.
The modelC4, one set of factsYou askin plain wordsAgenttranslatesaskanswerquery or changefacts and viewsCompilerchecks every changerefuses wrong entriesGitrecords every versionmerged inOwnerapprovesapproves the pull request
Every scenario that follows is a path through this.
Together
One shape inside. Any shape outside.
Githistory The modelthe facts COMPILER · OWNER AgentAgent Viewsdiagrams, tables, exports You askWebPhoneApp the one canonical shape UNDERSTANDING FLOWS OUT CHANGES FLOW IN
Scenario 1 of 6 · the ask
Ask ↵
Landscape
All our systems
UsesManages accountsMakes paymentsShows balancesDebits and creditsSends alertsSends paymentsNotifiesCustomer[Person]Bank Staff[Person]Customer Channels[Software System]Mobile and web bankingCustomer Channels[Software System]Mobile App[Container: Mobile App]Mobile App[Container: Mobile App]Components not shown in this exampleWeb App[Container: Web App]Web App[Container: Web App]Components not shown in this examplePayments System[Software System]Moves money between accounts and banksPayments System[Software System]Payment API[Container: Web API]Payment API[Container: Web API]Payment Controller[Component]Payment Controller[Component]Code not shown in this examplePayment Validator[Component]Payment Validator[Component]PaymentRequestamountcurrencypayeeAccountPaymentValidatorvalidate(request)checkLimits(request)FraudCheckClientscore(request)isSuspicious()ValidationResultisValidreasonsFraud Check Client[Component]Fraud Check Client[Component]Code not shown in this examplePayment Repository[Component]Payment Repository[Component]Code not shown in this examplePayment Processor[Container: Service]Payment Processor[Container: Service]Components not shown in this examplePayments Database[Container: Database]Payments Database[Container: Database]Components not shown in this examplePayment Queue[Container: Message Queue]Payment Queue[Container: Message Queue]Components not shown in this examplePayments Admin[Container: Web App]Payments Admin[Container: Web App]Components not shown in this exampleAccounts System[Software System]Holds accounts and balancesAccounts System[Software System]Account Service[Container: Service]Account Service[Container: Service]Account Controller[Component]Account Controller[Component]Code not shown in this exampleBalance Calculator[Component]Balance Calculator[Component]AccountaccountIdbalanceBalanceServicegetBalance(accountId)availableFunds()AccountRepositoryfindById(accountId)MoneyamountcurrencyTransaction History[Component]Transaction History[Component]Code not shown in this exampleAccount Repository[Component]Account Repository[Component]Code not shown in this exampleStatement Generator[Container: Batch Job]Statement Generator[Container: Batch Job]Components not shown in this exampleAccounts Database[Container: Database]Accounts Database[Container: Database]Components not shown in this exampleAccount Events[Container: Message Queue]Account Events[Container: Message Queue]Components not shown in this exampleStaff Portal[Container: Web App]Staff Portal[Container: Web App]Components not shown in this exampleNotifications[Software System]Sends alerts to customersNotifications[Software System]Notification API[Container: Web API]Notification API[Container: Web API]Components not shown in this exampleMessage Sender[Container: Service]Message Sender[Container: Service]Components not shown in this examplePartner Bank[External System]Another bank
Scenario 1 of 6 · behind the scenes
Behind the scenes.
You askin plain wordsAgentfinds the levelThe modelC1 to C4, one mapCompilerevery level agrees
No canonical model: there’s nothing to zoom into. It couldn’t be done.
No compiler: a box at one level could be missing from the next.
No agent: you’d need to know exactly where to look.
Now possible. Now assured.
Scenario 2 of 6 · the ask
Ask ↵
Landscape
All our systems
UsesManages accountsMakes paymentsShows balancesDebits and creditsSends alertsSends paymentsNotifiesCustomer[Person]Bank Staff[Person]Customer Channels[Software System]Mobile and web bankingCustomer Channels[Software System]Mobile App[Container: Mobile App]Mobile App[Container: Mobile App]Components not shown in this exampleWeb App[Container: Web App]Web App[Container: Web App]Components not shown in this examplePayments System[Software System]Moves money between accounts and banksPayments System[Software System]Payment API[Container: Web API]Payment API[Container: Web API]Payment Controller[Component]Payment Controller[Component]Code not shown in this examplePayment Validator[Component]Payment Validator[Component]PaymentRequestamountcurrencypayeeAccountPaymentValidatorvalidate(request)checkLimits(request)FraudCheckClientscore(request)isSuspicious()ValidationResultisValidreasonsFraud Check Client[Component]Fraud Check Client[Component]Code not shown in this examplePayment Repository[Component]Payment Repository[Component]Code not shown in this examplePayment Processor[Container: Service]Payment Processor[Container: Service]Components not shown in this examplePayments Database[Container: Database]Payments Database[Container: Database]Components not shown in this examplePayment Queue[Container: Message Queue]Payment Queue[Container: Message Queue]Components not shown in this examplePayments Admin[Container: Web App]Payments Admin[Container: Web App]Components not shown in this exampleAccounts System[Software System]Holds accounts and balancesAccounts System[Software System]Account Service[Container: Service]Account Service[Container: Service]Account Controller[Component]Account Controller[Component]Code not shown in this exampleBalance Calculator[Component]Balance Calculator[Component]AccountaccountIdbalanceBalanceServicegetBalance(accountId)availableFunds()AccountRepositoryfindById(accountId)MoneyamountcurrencyTransaction History[Component]Transaction History[Component]Code not shown in this exampleAccount Repository[Component]Account Repository[Component]Code not shown in this exampleStatement Generator[Container: Batch Job]Statement Generator[Container: Batch Job]Components not shown in this exampleAccounts Database[Container: Database]Accounts Database[Container: Database]Components not shown in this exampleAccount Events[Container: Message Queue]Account Events[Container: Message Queue]Components not shown in this exampleStaff Portal[Container: Web App]Staff Portal[Container: Web App]Components not shown in this exampleNotifications[Software System]Sends alerts to customersNotifications[Software System]Notification API[Container: Web API]Notification API[Container: Web API]Components not shown in this exampleMessage Sender[Container: Service]Message Sender[Container: Service]Components not shown in this examplePartner Bank[External System]Another bank
Scenario 2 of 6 · behind the scenes
Behind the scenes.
You askin plain wordsAgentturns it into a queryThe modelwalks every linkCompilerconfirms the listOwnersees the impact
No canonical model: no single answer. It couldn’t be done.
No agent: you’d have to write the query yourself.
No compiler: the list could miss something.
No person: no one accountable for the decision.
Now possible. Now assured.
Scenario 3 of 6 · the ask
Ask for the change the way you think of it.
Ask ↵
Payments System[Software System]Moves moneyFraud Check[Software System]Screens payments for fraudNotifications[Software System]Sends alerts to customersScreens each paymentAlerts on blocked payments
Checked by the rules. Approved by a person. Recorded.
Scenario 3 of 6 · behind the scenes
Behind the scenes.
You askin plain wordsAgentdrafts the changeCompilerchecks the rulesOwnerapproves in gitGitrecords, mergesThe modelnow holds it
No agent: the change couldn’t be made from a plain request.
No compiler: a wrong entry gets in.
No person: no one accountable.
No git: no record of who changed it.
No canonical model: nowhere for the change to live.
Now possible. Now assured.
Scenario 4 of 6 · the ask
Ask ↵
Payments SystemCustomer ChannelsMakes paymentsAccounts SystemDebits and creditsNotificationsSends alertsPartner BankSends payments
FromToWhat
Customer ChannelsPayments SystemMakes payments
Payments SystemAccounts SystemDebits and credits
Payments SystemNotificationsSends alerts
Payments SystemPartner BankSends payments
Payments System
Customer Channels make payments through it.
It debits and credits the Accounts System.
It sends alerts through Notifications.
It sends payments to the Partner Bank.
Scenario 4 of 6 · behind the scenes
Behind the scenes.
You askasks for a viewAgentrenders itThe modelone set of facts
No canonical model: every view holds its own facts. They couldn’t agree.
No agent: every new view is a new build.
Now possible. Now assured.
Scenario 5 of 6 · the ask
Any date. Every change has a name on it.
Ask ↵
Payments System[Software System]Moves moneyFraud Check[Software System]Screens payments for fraudNotifications[Software System]Sends alerts to customersScreens each paymentAlerts on blocked paymentsToday
14 April 2026 · added Fraud Check and two relationships
Author: Payments team · Reviewed and approved by: the Payments owner
Reason: screen every payment for fraud
Scenario 5 of 6 · behind the scenes
Behind the scenes.
You askin plain wordsAgentreads the historyGitevery versionThe modelas it was that dayOwnersigned it off
No git: no record of who changed it, or what was true then.
No canonical model: nothing to rebuild the past from.
No person: no name on the change.
Now possible. Now assured.
Scenario 6 of 6 · the ask
Ask ↵
Existing codewhat’s there todaySkill fileshow we workThe modelC4: the architectureAI coding toolwrites the changeSkeleton codegenerated from the C4 modelDetailfilled in from specsFits the architecture ✓
Scenario 6 of 6 · behind the scenes
Behind the scenes.
You askasks for a changeAI coding toolwrites the codeCode + skillswhat exists todayThe modelthe architectureCompilerchecks the fitOwnerapproves
Still possible without the model. With it, more accurate: the code is checked against the architecture.
Now more accurate. Now assured.
The difference
Foundations first.
Everyone’s a mapper.
The model
What will always be true?
Good decisions can only be made
with accurate facts.
Now we can keep them accurate.
→ next · N notes · F fullscreen