The Hidden Difference Between Finding Possibilities and Knowing What Can Happen Next
Hatched by Kai Nguyen
Sep 03, 2026
10 min read
0 views
94%
What if many problems feel difficult not because there are too many possibilities, but because we are exploring them in the wrong order?
A state space search asks a fundamental question: What configurations are possible, and how can one configuration become another? Topological ordering asks a different but closely related question: Given the dependencies among those configurations or tasks, which one is allowed to come next?
These questions are usually taught as separate ideas. One belongs to artificial intelligence and problem solving. The other belongs to graph algorithms and scheduling. Yet together they reveal a powerful way to think about complex decisions: search tells us what we might do, while dependency structure tells us what can become actionable.
This distinction matters far beyond programming. It explains why plans collapse, why teams get stuck despite having many options, why learning feels chaotic, and why the best problem solvers spend so much time organizing a problem before trying to solve it.
The Real Problem Is Often Not Choice, but Readiness
Imagine trying to assemble a piece of furniture without instructions. You can see many possible actions: attach a panel, tighten a screw, open a drawer, add a handle. The number of visible actions is not the same as the number of valid actions. A handle cannot be attached before the drawer exists. A drawer cannot be installed before its rails are in place. The rails may depend on the frame being assembled.
This is a small state space. Each configuration of the furniture is a state, and each action is an operation that moves the system from one state to another. But the operations are not independent. They form a network of prerequisites.
A state space search explores this network by considering successive configurations. From the current state, it generates possible next states. It may search broadly, examining many alternatives, or search deeply, following one sequence until it succeeds or fails. The crucial concept is the frontier, the boundary between what has already been explored and what remains possible.
Topological ordering adds a second lens. If an operation depends on another operation, the dependency can be represented as a directed edge. A node with no incoming edge is a source: nothing must precede it. A node with no outgoing edge is a sink: once it is complete, nothing else depends on it. A topological sort produces a linear ordering that respects all these relationships.
The surprising connection is that a search frontier is not merely a list of possibilities. It is a changing set of states whose readiness depends on what has already happened. In other words, good search is not just about generating options. It is about identifying which options have become legally available.
The most useful question in a complex system is often not “What could happen?” but “What has become possible because of what already happened?”
This is the difference between possibility and readiness. Possibility describes the whole space. Readiness describes the part of that space that the current state permits us to enter.
Why Linear Plans Fail in Nonlinear Worlds
People often respond to complexity by writing a linear plan. First do this, then do that, then do the next thing. Linear plans are comforting because they turn uncertainty into a sequence. But many real problems are not naturally linear. They are partial orders.
A partial order says that some events must precede others, while leaving unrelated events unconstrained. In a software project, database design must precede certain implementation decisions. Security review must precede release. But documentation and performance testing may proceed independently. Forcing every task into one rigid sequence creates unnecessary waiting.
Topological sorting exposes this structure. It does not claim that there is one perfect order. It finds an order that respects the constraints, while revealing where flexibility exists. If several source nodes are available at the same time, the system has room for parallel action.
State space search, meanwhile, reveals what happens when a decision changes the available future. Consider planning a trip. Your initial state may include a destination, a budget, and a departure date. Choosing a flight creates a new state. That state may restrict hotels, transportation, and activities. A different flight may open a different set of possibilities. The decision is valuable not only because of its immediate result, but because it changes the future state space.
This gives us a useful distinction between two kinds of decisions:
- Terminal decisions produce a result without substantially changing what can happen next.
- Structural decisions reshape the dependency network and alter which future actions become available.
Structural decisions deserve more attention. Choosing a programming language, designing an organization, selecting a research method, or defining a product architecture can create entire families of possible futures. A mistake early in the dependency structure may make later work expensive, impossible, or misleading.
The common planning error is to evaluate actions only by their immediate payoff. A better evaluation asks three questions:
- What state will this action create?
- Which actions will become available afterward?
- Which actions will become impossible, delayed, or more costly?
The third question is especially neglected. Every transition does more than add an outcome. It removes or reshapes possibilities. A search process that ignores these effects can wander through attractive but strategically barren states.
Sources, Sinks, and the Architecture of Progress
The language of sources and sinks offers a practical vocabulary for diagnosing stalled projects.
A source is a task or condition with no unmet prerequisite. Sources are natural starting points, but they are not necessarily important in the emotional sense. They may be boring, administrative, or invisible. Yet because they unlock dependent work, they can have disproportionate leverage.
A sink is a task that completes a chain. Sinks often receive attention because they look like visible accomplishments: publishing the report, launching the product, completing the renovation. But a sink cannot be attacked effectively while its upstream dependencies remain unresolved.
Between them lies the system's real structure. Some nodes have high unlocking power: completing them makes many other tasks available. Others have high blocking power: failure to complete them prevents many paths from advancing. These are not always the same node.
For example, imagine launching an online course. Writing the course introduction may be easy, but it unlocks little. Choosing the learning objective may be more difficult, yet it determines the lessons, exercises, assessments, and marketing language. The objective is a structurally important node. It has high unlocking power because many later decisions depend on it.
Now imagine that legal approval is required before publication. Legal approval may not generate creative work, but it has high blocking power. If it is delayed, every path that ends in publication is delayed too.
This suggests a simple project diagnostic. For each major task, estimate:
- Prerequisite depth: how many conditions must be satisfied before this task can begin?
- Unlocking power: how many meaningful tasks become available after it is complete?
- Blocking power: how many paths depend on it?
- Reversibility: how costly is it to change this decision later?
These measurements turn a vague plan into a dependency map. They also clarify where search effort belongs. If a decision is highly reversible and weakly connected, it may be reasonable to make it quickly. If it is difficult to reverse and structurally central, it deserves investigation before commitment.
This is where state space thinking improves topological planning. A topological order may tell us which tasks are valid to do next, but state space search asks whether doing them now leads to a promising region of the future. Several tasks may be currently available. They are not equally wise.
The best next action is therefore not always the first source in a list. It is often the available action that produces the most useful next state.
Cycles Are Not Just Algorithmic Errors
A directed cycle occurs when dependencies loop back on themselves. If task A requires task B, task B requires task C, and task C requires task A, no topological ordering exists. The system has no legitimate starting point.
In software, a cycle can signal a design problem. In organizations, it often appears as circular approval. In personal work, it can take the form of an impossible standard: “I will begin once I understand everything, but I can only understand everything by beginning.”
Cycles are important because they distinguish two kinds of difficulty. Some problems are hard because the search space is large. Others are hard because the dependency structure is inconsistent. More exploration cannot solve an inconsistent structure. The system must be changed.
Suppose a product team says it cannot define the product until it has customer research, but it cannot conduct meaningful research until it has a product prototype. This may look like a need for more planning. In reality, it is a cycle. The solution is often to introduce a provisional state: build a crude prototype, conduct limited research, revise the prototype, and repeat.
The provisional state functions as a cycle breaker. It does not satisfy every dependency perfectly. Instead, it lowers the threshold for entering the system. Once the team has a rough artifact, new evidence becomes available, and the dependency loop becomes a sequence of revisable transitions.
This idea generalizes. When progress is blocked by circular requirements, ask:
- Which dependency is genuinely necessary, and which is merely preferred?
- Can a temporary or approximate state satisfy the minimum requirement?
- Can one part of the cycle be externalized through a test, simulation, prototype, or explicit assumption?
- What new information would become available after the first imperfect move?
The purpose of a cycle breaker is not to pretend that dependencies do not exist. It is to transform a closed loop into an exploratory path.
When a system has no source, the answer is rarely “search harder.” The answer is to redesign the conditions for starting.
A Practical Method for Complex Problems
The combination of state space search and topological reasoning can become a repeatable method.
1. Define the state, not just the goal
A goal such as “launch the product” is too vague to guide search. Describe the current configuration: what exists, what is uncertain, what resources are available, and what constraints apply. A precise state makes possible transitions visible.
2. List operations as transitions
Write down the actions that can change the current state. Avoid describing them as aspirations. “Improve quality” is not an operation. “Run ten user tests and record recurring failures” is closer to one.
3. Identify dependencies
For every operation, ask what must be true before it can begin. Draw an arrow from prerequisite to dependent task. Do not assume that all tasks belong in one sequence. Preserve parallelism where no dependency exists.
4. Find the current sources
Which actions have no unmet prerequisites? These are your immediate candidates. If there are no sources, inspect the graph for a cycle or for an unspoken assumption that has been treated as a prerequisite.
5. Choose by information and leverage
Among available actions, prefer those that either unlock many valuable paths or produce information that changes the rest of the search. This is more powerful than simply choosing the easiest task.
6. Update the graph after every meaningful transition
A new state can create sources, remove options, expose hidden dependencies, or reveal that an earlier assumption was wrong. Treat the plan as a living structure, not a document written once.
7. Stop when the state is good enough
Search can continue forever if every possible improvement remains open. Define a satisfactory terminal state, not a fantasy state with no uncertainty. A sink is not perfection. It is a point at which the relevant dependencies have been resolved for the purpose at hand.
Key Takeaways
- Separate possibility from readiness. A large set of imaginable actions is not the same as a set of actions that the current state allows.
- Map dependencies before optimizing effort. The task that looks easiest may unlock nothing, while an unglamorous prerequisite may release an entire chain of progress.
- Evaluate decisions by the futures they create. Ask which states, options, and constraints will follow from each transition.
- Treat cycles as structural problems. When nothing can begin, introduce a provisional state, relax an unnecessary requirement, or redesign the dependency network.
- Update plans dynamically. Every action changes the state space, so every serious transition should change your understanding of what comes next.
The deepest lesson is that progress is not a march through a fixed list of tasks. It is a controlled movement through changing configurations. At each moment, some actions are impossible, some are available, and a few have the power to transform the landscape.
That reframes planning. You are not merely trying to predict the future or arrange tasks in a neat line. You are trying to create states from which better choices become possible. The strongest problem solvers do not possess a perfect map of the entire space. They know how to reach the next state that makes the map clearer.
And perhaps that is what practical intelligence really is: not knowing every destination in advance, but understanding which move turns possibility into readiness.
Sources
Hatch New Ideas with Glasp AI 🐣
Glasp AI allows you to hatch new ideas based on your curated content. Let's curate and create with Glasp AI :)
Start Hatching 🐣