The Function-Driven Organization
A framework for documenting a business the way developers document code — seats as modules, accountabilities as functions, with an organizational linter to diagnose the gaps.
A Framework for Organizational Clarity
What if we documented businesses the way developers document code? A seat becomes a module. Accountabilities become functions. Inputs, processes, and outputs become explicit, testable, and composable — revealing the true operating system of your company.
01 — The Insight
Your business already runs on functions. You just haven't written them down.
Every well-written software function has four elements: a descriptive name that tells you what it does, arguments (inputs it requires), a body (the logic it executes), and a return value (the output it produces). If any of these are missing or unclear, the function is broken.
Every seat in a business has exactly the same structure. It has a name, inputs it depends on (leading indicators), core processes it executes, and outputs it's accountable for (lagging indicators and measurables). When those elements aren't explicit, the seat is broken too — you just don't have a linter telling you.
Software
Organization
Module / File
A file containing related functions
Seat
A role containing related accountabilities
Function
A named unit of work with a single responsibility
Accountability
A specific responsibility with defined scope
Arguments
Declared inputs the function requires
Leading Indicators
Upstream inputs the accountability depends on
Function Body
The logic and decision-making inside
Core Processes
The documented steps, including decision logic
Return Value
The output you can test against
Measurables
The lagging indicators and outcomes produced
Dependencies
Other functions that must run first
Handoffs
Other seats whose outputs you require
But the analogy goes one layer deeper. A VP of Sales isn't a single function — they're a module. Inside that module are multiple functions: pipeline generation, deal closing, revenue forecasting, churn management. Each one has its own inputs, processes, and outputs. The seat is the file. The accountabilities are the functions inside it.
02 — The Method
Function-Driven Process Documentation
Traditional process documentation reads like a numbered list of steps. It's flat, contextless, and disconnected from the rest of the organization. Function-Driven documentation forces you to answer four questions that most teams skip entirely.
What does this process need to run?
A function declares its arguments. If your sales close process requires a "qualified lead," that input has to come from somewhere — and the definition of "qualified" has to be explicit. If you can't name the inputs, you've already found a gap in your operating system.
What decisions live inside?
Every process contains if-else logic — decision points where different conditions produce different paths. Most companies never document this. It lives in someone's head as "judgment." Modeling it as conditional logic makes the decision authority, the thresholds, and the escalation paths explicit and teachable.
What does it produce?
The return value is the accountability moment. A process either produces a defined output or it doesn't. And importantly, multiple return types can all be valid — a disqualified lead is a successful execution of a qualification function, not a failure. Defining the return forces clarity about what "done" actually means.
What calls it and what does it feed?
The return value of one function becomes the argument of the next. When you map this across all seats and all their internal functions, you build a dependency graph of the entire business — not just "who reports to whom," but what has to happen in what order for the company to work.
// sales.module — Revenue Generation Seat
function qualifyLead(inboundLead, idealClientProfile) { // 1. Score against ICP criteria // 2. Conduct discovery call // 3. Assess budget, authority, need, timeline
if (meetsThreshold) { return qualifiedLead } else { return disqualifiedLead // valid outcome } }
function closeDeal(qualifiedLead, pricingGuide, proposalTemplate) { // 1. Design solution against stated needs // 2. Build and deliver proposal // 3. Navigate negotiation
if (dealSize > approvalThreshold) { requireApproval(executiveTeam) }
// 4. Execute agreement return signedAgreement // → feeds into: onboarding.kickoffClient(signedAgreement) }
function forecastRevenue(pipeline[], historicalCloseRates) { // 1. Weight pipeline by stage probability // 2. Apply seasonal adjustment // 3. Compare against target
return quarterlyForecast // → feeds into: finance.planCashflow(quarterlyForecast) }
Notice what this format forces into the open: the arguments are artifacts that must exist before the process can run. If you don't have a pricing guide, closeDeal() throws a runtime error. That's not a nice-to-have — it's a dependency. And the comments showing where each return value feeds downstream make the handoff contracts between seats explicit.
03 — The Linter
Diagnosing your org like a codebase
Once you model your organization as a system of modules and functions, you can run the same kinds of checks a developer runs on code. Call it an Organizational Linter — a diagnostic that flags structural issues in how your business is wired.
✓
sales.qualifyLead() — inputs defined, return value testable, feeds closeDeal()
✕
marketing.generateDemand() — no declared return value. What does this function produce?
!
operations.manageVendors() — input "approvedBudget" not produced by any upstream function
✕
CEO seat — 14 functions. Exceeds single-responsibility threshold. Refactor recommended.
!
hr.onboardEmployee() — contains undocumented decision logic. Who approves exceptions?
✓
finance.closeBooks() — clean function. Inputs, process, and returns all documented.
The diagnostic checks five things across every seat and every function:
Naming clarity. Does the seat name describe the function, not the person? "VP of Sales" tells you hierarchy. "Revenue Generation" tells you what it does.
Input definition. Can the person in this seat name every upstream dependency they need to do their job? Undefined arguments mean undefined accountability.
Process documentation. Is the body of each function written down with enough specificity that someone new could execute it — including decision logic? Undocumented process bodies are the business equivalent of spaghetti code that only works because of the specific person running it.
Return value. Does every function produce a measurable output you can test against? Not activity metrics, but actual outcomes. If you can't assert against the return value, you can't know if the function is working.
Dependency integrity. Can you trace the output of every function as the input to another function downstream? Orphaned return values and undefined arguments are integration bugs in your operating system.
04 — The Implication
Clean architecture is AI-readiness
The companies that will win with AI aren't the ones with "AI strategy." They're the ones that already built a business as a clean system of documented functions with explicit inputs, decision logic, and outputs. They've already done the hard work of understanding their own operating system.
When your processes are already decomposed into function signatures with named inputs and typed outputs, you've essentially written the spec for where AI agents can plug in. You don't need to "figure out AI." You look at your functions and ask which ones a model can execute, augment, or accelerate.
A function with clear arguments, documented logic, and a testable return is automatable by definition. A function that lives in someone's head, depends on tribal knowledge, and produces vague outcomes is not. The discipline of modeling your business this way doesn't just create clarity for humans — it creates the interface layer that AI requires.
This is organizational discipline as architecture. The same rigor that makes a codebase maintainable, testable, and extensible makes a business ready for whatever comes next.
05 — Getting Started
How to run this with your team
Step one: Pick one seat. Start with a seat your team understands well. List every accountability that lives inside it — these are your functions. If you can't separate them cleanly, that's already a finding.
Step two: Write the signatures. For each function, name the inputs it requires, the core process it runs (including decision logic), and the output it produces. Use the function format. The gaps you can't fill are the organizational bugs.
Step three: Trace the dependencies. Map where each function's return value goes next. Which seat receives it? As what input? Follow the chain across your entire accountability chart. Where the chain breaks, you've found a handoff problem.
Step four: Run the linter. Check every function against the five diagnostic criteria. Flag what's missing, what's ambiguous, and what's overloaded. Prioritize the errors over the warnings.
Step five: Refactor. Treat the findings like technical debt. Some fixes are quick — documenting a return value, naming an input. Others are structural — splitting an overloaded seat, redesigning a handoff. Build the backlog and work through it.
The Function-Driven Organization — A framework by Zach Wardlaw / Coach House
coachhouse.so/function-driven-organization