1. The 3 A.M. Call
At three in the morning, every minute feels expensive.
On this particular night, the feeling was literal. I was part of a major-incident call inside a large enterprise. Something in an important chain of systems had failed, and every hour of downtime risked millions in damage.
Nothing technical was visible to us. The only concrete signal came from the domain experts: production was on hold.
I did not know the systems involved. I did not know their interfaces, their dependencies, or the decisions that had shaped them. That alone was not unusual. No one in a large organization understands every system. The reason for an incident call is to bring the necessary knowledge into one place.
But the knowledge we needed was not in the room.
It was not in the system, either.
1.1 Waiting for the one person
Section titled “1.1 Waiting for the one person”We were waiting for the system expert—the person who understood the affected system well enough to tell us what we were looking at.
Except there was almost nothing to look at. The domain experts could describe the consequence: production had stopped. They could not point us to the operation, interface, or component that had caused it. The incident was undeniable, but its technical path was invisible.
Until the system expert could be reached, the rest of us could do little more than inspect fragments, exchange partial theories, and wait. The system was important enough that its failure could cause enormous damage. Yet understanding that system still depended on locating a particular human being in the middle of the night.
Hours passed.
That was the part I could not reconcile. Complex systems will fail. Interfaces will behave in unexpected ways. Dependencies will become unavailable. Data will arrive in a form nobody anticipated. Reliability cannot mean pretending those things will never happen.
But why did failure also have to mean blindness?
The organization had engineers, operators, processes, and escalation paths. The call itself existed because people took reliability seriously. Nevertheless, the system could not reveal enough about itself for an unfamiliar responder to follow the execution, identify the responsible operation, and understand what had gone wrong.
The scarce resource was not computing power. It was context.
The system expert knew which component mattered, what a particular interface expected, and which behavior was normal or evidence of the fault. That context was what eventually allowed the failure to be identified. But the knowledge lived in a person, not in a form that traveled with the running software.
The incident therefore had two failures. The first was the technical failure that caused the outage. The second was the system’s inability to explain the first.
1.2 The documentation was somewhere else
Section titled “1.2 The documentation was somewhere else”This is usually where a discussion about enterprise software turns toward documentation.
Perhaps there should have been a better diagram. Perhaps a runbook needed another section. Perhaps a ticket should have linked to an architectural decision, or an interface should have had more complete API documentation.
All of those things can help. None of them fully resolves the underlying problem.
A diagram describes the system at the time the diagram was drawn. A runbook describes the failures its authors anticipated. A ticket records a piece of work from the perspective of the people who performed it. Each artifact can be correct when created and still drift away from the software that eventually executes.
The more places the explanation can live, the more opportunities there are for the explanation and the execution to diverge.
This is not necessarily negligence. Maintaining two representations of the same thing is difficult. Maintaining five is worse. Under delivery pressure, people change the artifact that makes the system work. Updating every secondary explanation becomes a separate task, dependent on time, discipline, and memory.
The code may remain technically accurate, but code alone does not necessarily explain the running system to an operator, a domain expert, or a developer arriving during an incident. Configuration may be scattered across services. Runtime behavior may depend on infrastructure that belongs to another team. Logs may report an error without placing it inside the larger process. The architecture exists, but it has to be reconstructed.
Documentation is then treated as a destination somewhere outside the system: a page to find, a repository to search, or a person to call.
What I wanted was different. I wanted the executing system to carry its explanation with it.
That does not mean generating a paragraph of prose from source code and calling the result self-documentation. It means making the actual structure of the program visible. It means exposing its operations and boundaries, preserving the relationship between those operations and their runtime evidence, and showing a responder where execution stopped making sense.
The documentation should not merely describe the system. It should remain connected to the thing being described.
1.3 What the failing block should have told us
Section titled “1.3 What the failing block should have told us”Imagine the same incident with the application represented as a visible Flow.
The responder can see the operations that make up the process and the connections between them. Inputs and outputs have types. External calls are identifiable as operations rather than disappearing inside arbitrary code. Execution evidence belongs to the individual building blocks that produced it.
One node shows the failure.
That node does not magically solve the incident. A graph cannot repair an unavailable dependency or decide how a business process should behave when a critical input is missing. But it can change the first hour of the response.
Instead of beginning with Who knows this system?, the team can begin with What happened at this operation?
An unfamiliar responder can inspect the failing block, see what reached it, understand what it was supposed to produce, and trace the surrounding path. The visual structure provides the map. Typed boundaries narrow the possible explanations. Per-node logs connect runtime evidence to the operation that generated it.
The system begins the incident by giving the responder a place to stand.
The Flow-Like feature that most directly answers that night is tracing tied to individual nodes. The execution log identifies the building block involved in a failure, and from that log the responder can open the node’s recorded result with one click. Instead of beginning with the whole application as an undifferentiated problem, the investigation begins at the block where the run failed.
The textual view matters too. A large program cannot depend on a canvas alone. Experienced developers need a representation they can navigate, compare, review, and edit efficiently. The point is not to replace code with boxes. It is to let the code and the visible workflow describe the same program.
During normal development, the text is often the fastest way to work. During debugging, tracing, onboarding, and conversation, the graph can make the same logic easier to follow. Neither view is a disposable export. A change made in either view changes the Flow.
Looking back, I believed that this kind of system would have made the incident understandable to someone outside the original team within minutes instead of leaving a room waiting for hours. That is a counterfactual; it cannot be proven against an event that already happened. It is also not a promise that visible software never fails.
The more defensible promise is this: when failure happens, the structure needed to investigate it should not be trapped in the memory of the original author.
Flow-Like does not begin with the fantasy of eliminating every incident. It begins with the demand that incidents become legible.
1.4 Domain knowledge is not the lesser skill
Section titled “1.4 Domain knowledge is not the lesser skill”There was another problem hiding inside that call.
Enterprise software is often shaped by people who understand the business domain deeply but do not identify as specialist programmers. They understand the operation, its exceptions, the regulations surrounding it, and the consequences of getting it wrong. That knowledge is not secondary to software development. It is the reason the software exists.
Yet conventional development often places those people at a distance from the implementation. Domain experts describe their needs to one group, which translates them for another group, which turns them into code that becomes difficult for the original experts to inspect. Each translation can lose information.
The usual response is to give domain experts simpler tools. Too often, simpler means less expressive: a toy surface for small tasks, followed by an escape into conventional code when the work becomes serious.
That division creates its own trap. Once important behavior disappears into an opaque code block, the visual representation stops being an honest account of the application. The workflow shows that something happens, while the real program lives behind a rectangle labelled with a reassuring name.
My background in game development suggested another possibility. Unreal Engine Blueprints demonstrated that a visual graph could be a genuine programming surface and an accessible route into programming. It did not have to be a picture pasted on top of unrelated code.
But enterprise workflows can become large, particularly when a platform exposes sufficiently low-level building blocks to solve real problems. Large graphs are difficult to author and review as graphs alone. Experienced developers need text. Domain experts, new programmers, operators, and people debugging unfamiliar systems benefit from the visible Flow.
The answer was not to choose one audience or one representation.
The answer was to let both groups work on the same program.
A developer can use text to manage a large implementation. A domain expert can inspect its process as a workflow. A beginner can enter through the visual model and gradually learn the textual one. During an incident, someone who did not write the program can follow the graph and connect runtime evidence to the responsible building block.
The visual view is not a lesser form of the code. Domain knowledge is not a lesser form of engineering knowledge. Each reveals something the other needs.
1.5 The question that became Flow-Like
Section titled “1.5 The question that became Flow-Like”I did not leave the incident with a grammar, a runtime architecture, or a finished product plan.
I left with a question:
How can a system important enough to cost millions when it fails reveal so little about itself?
That question later connected with the lessons from visual programming and with the reality of enterprise teams. It became larger than incident response.
Could the program’s visible structure remain connected to the program that actually runs? Could text and workflow be equal ways of authoring the same logic? Could logs lead directly to the building block that produced them? Could domain experts understand the application without reducing what experienced developers were able to build?
And could the platform take responsibility for the disciplines that every serious application needs—execution, permissions, data, governance, and deployment—so that each team did not have to reconstruct them independently?
The answer did not arrive as a finished product idea during the call. The significance of the incident crystallized later, when it connected with visual programming, the needs of domain experts, and the recurring difficulty of operating enterprise software whose explanation lives outside the system.
These questions became Flow-Like.
FlowScript is one part of the answer: a textual way to author the same constrained, typed building blocks that appear in the visual workflow. Flow-Like is the surrounding platform that authors, runs, and observes those Flows.
The aim is not software without complexity. Serious domains are complex, and hiding that complexity behind an attractive interface does not remove it. The aim is software whose complexity is organized, inspectable, and connected to evidence.
It is software that explains itself—not perfectly, and not only in prose, but through the structure it executes.
The test is simple to state. When a Flow fails at three in the morning, a capable person who did not build it should be able to see where to begin.
They should not have to wait for the one person.