Back to Build in Public
Build in public15 min read

The Job Stopped, and We Had to Stop Pretending Nothing Happened

When work stopped halfway through, the real failure was not only that progress had paused. It was that the product left too much room for guessing.

By Open Free Max

The Job Stopped, and We Had to Stop Pretending Nothing Happened

On June 9, we were looking at a job that had stopped.

That sentence sounds ordinary. Software stops. Connections disappear. A model reaches a limit. A computer becomes busy with something else. People close windows by accident. Anyone who has used an AI tool for long enough has seen some variation of the moment when the expected answer does not arrive.

The uncomfortable part was not that the job had stopped. The uncomfortable part was how little the product could say about it.

There was a period in the development of Open Free Max when a stopped job could be treated as a temporary inconvenience. We could imagine that the person using the product would notice, wait a little longer, and try again. That assumption was convenient because it kept the interface simple. It was also wrong for the kind of work OFM was becoming a place for.

When a person asks an AI tool for a small answer, a missing response is annoying. When a person asks it to move through a real project, a stopped job creates a much larger question: what can still be trusted? Did the work finish? Did it stop before making a change? Is there a result somewhere? Is it safe to continue? Has the task failed, or is it merely waiting?

The product did not have to promise that every job would complete. It did have to stop acting as if silence were an acceptable explanation.

The moment silence became a product problem

The early mental model for an AI task is simple. There is an instruction, then there is an answer. The space between those two events is often hidden because the user wants the outcome, not a tour of everything happening along the way.

That model works until the task becomes a piece of work rather than a single question.

OFM was being shaped around projects, sessions, terminals, plans, and several kinds of AI work happening in the same environment. A task could take time. It could depend on the state of a project. It could produce something useful before it stopped. It could also be part of a larger sequence, where the next step depended on knowing the honest state of the current one.

In that setting, a stopped job is not an empty space between prompt and answer. It is an event in the history of the work.

We had been thinking too much about the beginning and end of a task. We had not spent enough time on the middle: the point at which progress becomes uncertain, and the person has to decide what to do next.

That was the real product problem. The interface did not need to make interruption disappear. It needed to make interruption legible.

We had two tempting explanations

The first explanation was that the software had failed.

That explanation is sometimes correct, but it is not always useful. “The software failed” does not tell someone whether their work is safe, whether a retry might duplicate an action, or whether the result can be recovered. It describes blame, not state.

The second explanation was that the outside world had failed. A provider might be unavailable. A local process might have ended. A machine might have become unreachable. A usage boundary might have been reached. This explanation can be more accurate, but it can also become a way for the product to point elsewhere and leave the user alone with the consequences.

We considered the quietest path: show less, keep the screen calm, and let people try again. There was an appealing simplicity in it. Every extra status, notice, or recovery choice can make a product feel heavier. A person should not have to become an operator just because an AI task took an unexpected turn.

But hiding the interruption would have created a worse burden. It would have transferred the complexity from the interface to the person’s memory. They would have to reconstruct the event from whatever remained on the screen, from a terminal, or from the absence of an expected result. The product would look simple while the work became harder to understand.

The other path was to expose every possible detail. That would have made OFM feel honest, but not necessarily humane. A wall of technical messages is not the same as an explanation. It can be accurate and still fail the person who needs a clear next decision.

The decision was to aim for a middle ground: enough information to establish what happened, enough continuity to make the next step possible, and no expectation that the user should diagnose the entire system.

A stopped job has more than one meaning

One of the lessons was that “stopped” is not a complete description.

A task can stop because it has finished and the interface has not caught up. It can stop because the next action requires a decision. It can stop because the environment is unavailable. It can stop after producing a partial result. It can stop without producing anything the user recognizes as a result.

Those cases look similar from a distance. They are not equivalent when a person is deciding whether to continue.

That distinction changed the way we talked about status. We did not want a collection of labels that made the product sound more sophisticated than it was. We wanted states to correspond to choices a person might reasonably make.

If the work was complete, the product should help the person recognize completion. If it needed attention, the product should make that visible. If it had been interrupted, the product should preserve enough context to avoid a blind restart. If the reason was uncertain, the product should say that too.

There is a particular kind of trust in an honest uncertainty. “We do not know yet” is not a satisfying outcome, but it is more useful than a confident status that sends someone in the wrong direction.

This mattered because OFM was not being built as a disposable chat window. It was becoming a workspace in which unfinished work could remain meaningful. That raised the standard for what a status message had to do.

The hardest choice was what not to promise

When a product team discovers an interruption problem, the natural instinct is to promise recovery.

Recovery is a valuable direction. It is also a dangerous word if it means more than the product can guarantee. We did not want to imply that every stopped task could be resumed perfectly, that every partial action could be undone, or that the same work could always be replayed without consequences.

The honest version was narrower.

The product could preserve continuity where it had enough information to do so. It could make the state of the work clearer. It could help distinguish an interruption from a completed result. It could avoid forcing a person to begin again without explanation. It could improve the path from an uncertain state to a deliberate next action.

That is less dramatic than “nothing will ever be lost.” It is also a promise that can be tested.

There is a temptation in product writing to describe the ideal future as if it were already part of the current experience. Build in public makes that temptation more visible. If we say that OFM handles interruptions gracefully, the statement has to survive an ordinary day, not just a demonstration prepared in advance.

So the language had to remain precise. A planned improvement stayed planned. A useful observation stayed an observation. A behavior that depended on the particular situation could not become a universal guarantee.

That discipline is slower. It is also part of building a tool people can place inside real work.

We started designing around the next question

The most useful question after an interruption is rarely “what technical component broke?”

It is usually one of these:

  • Did anything happen?
  • Is the work finished?
  • Can I continue safely?
  • Should I try again?
  • What do I need to decide?

Those questions became a better design reference than a list of internal causes. They kept the experience close to the person who had been waiting for progress.

This did not mean removing detail. It meant giving detail a job. A message should help someone understand the state, choose an action, or preserve a useful record. If it does none of those things, it may be information for the software rather than information for the person.

That distinction is easy to describe and difficult to maintain. Product teams naturally accumulate messages. Developers need evidence. Support needs clues. Future debugging needs a trail. Users need clarity. A good workspace has to serve all four needs without making the user read a private investigation.

The answer was not to choose one audience forever. It was to separate the immediate explanation from the deeper record. A person should be able to understand the practical state first, then look further when more context is helpful.

This principle reached beyond stopped jobs. It applied to warnings, retries, project state, provider changes, and anything else that could make a session diverge from the user’s expectation.

What continuity means when the answer is incomplete

Continuity is often described as if it were a technical ability: continue from where you left off.

For a person, continuity is more emotional and more practical than that. It means not having to reconstruct the purpose of the work. It means remembering which question was being answered. It means knowing which result is current. It means recognizing that an unfinished attempt is still part of the project rather than a blank space that should be discarded.

That does not require pretending that a partial result is complete. In fact, it requires the opposite. A partial result becomes useful when it is clearly partial. The person can inspect it, revise the direction, or decide that the attempt should end there.

The danger is not only data loss. It is meaning loss.

If a task stops and the context around it disappears, the user may repeat the same work, make a contradictory decision, or assume that a change happened when it did not. Even when the underlying files remain intact, the work can become harder to trust because the story of how it got there has been broken.

This is why the issue felt larger than a status label. We were deciding what kind of memory an AI workspace should have about its own unfinished work. It should not remember every internal detail forever. It should remember enough to keep the human story coherent.

The cost of explaining too much

There is a second failure mode here: turning every interruption into a ceremony.

People do not want a five-step incident report when a task needs a moment of attention. They do not want to be asked to classify a problem they have never seen before. They do not want a dashboard that treats a small recovery as a crisis.

A helpful explanation has proportion. It gives more attention to an interruption when the consequences are larger. It stays quiet when the state is obvious. It does not make the user feel responsible for interpreting the product’s private complexity.

We had to keep returning to that balance. More visibility can create confidence, but more visibility can also create noise. A product that reports everything may still fail to communicate what matters.

The practical lesson was that explanations should be written from the next human decision backward. What does the person need to know before moving on? What can wait? Which detail belongs in a deeper view? Which uncertainty is important enough to say out loud?

These questions are not solved once. They have to be asked whenever a new kind of work enters the product.

What changed in our definition of a reliable tool

Before this episode, reliability could be understood as keeping a process alive.

After it, that definition felt incomplete. A process can remain alive while the person has no idea whether it is doing useful work. A process can stop and still leave the user in a good position if the product preserves the meaning of what happened. The visible experience is part of reliability, not a decorative layer added after the underlying work is done.

That insight affected the broader direction of OFM. We were no longer designing only for the happy path in which a request begins, runs, and returns a clean result. We were designing for real working days, where tasks are interrupted, projects change, machines sleep, people switch context, and the next decision often arrives before the previous one has been neatly packaged.

This is especially important for people who use several projects and several AI tools in parallel. Their work is not a single queue with one obvious finish line. It is a landscape of open loops. If the product adds another mysterious loop, it increases the very cognitive load it is supposed to reduce.

Reliability therefore became partly a communication promise: when OFM cannot complete the work, it should still help the person understand the situation.

What this means for people using OFM

The change is not meant to turn users into supervisors of every task.

It is meant to give them a firmer place to stand when the expected result does not arrive. A stopped job should be understandable as part of the session, not an unexplained disappearance. A partial outcome should not have to masquerade as a final one. A next step should be chosen with context, not guessed from silence.

This also means that OFM will sometimes acknowledge uncertainty. That can feel less polished than a reassuring green light, but it respects the difference between an answer and an assumption.

The product is most useful when it reduces the amount of invisible work around the work. Reconstructing what happened is invisible work. Deciding whether a retry is safe is invisible work. Remembering why a task mattered is invisible work. The interface cannot remove every uncertainty, but it can stop adding unnecessary ones.

The question we carried forward

The job stopping did not give us a final definition of recovery.

It gave us a better question: what is the smallest amount of preserved context that lets a person make a good next decision?

That question is more demanding than “can we restart the task?” It asks what the person needs, what the product can honestly know, and how much detail belongs in the immediate experience. It also leaves room for the answer to change as OFM supports more kinds of work.

We are still learning where that boundary should be. A short task may need only a clear explanation and a visible result. A longer project may need a stronger record of what was attempted, what remained unresolved, and whether the person had already made a choice before the interruption. The right amount of context depends on the consequences of guessing wrong.

That last point is easy to underestimate. People do not need the same level of protection around every action. A harmless exploratory question can be tried again. A project step that changes the direction of real work deserves more care. The interface should not make every event feel serious, but it should help the person recognize when an event is serious.

A status is a relationship with the user

We used to think of status as something the product displayed about itself.

Now we think of it as part of a relationship. When OFM says that work is continuing, waiting, finished, or interrupted, it is asking the person to trust that description enough to decide what happens next. The wording is therefore not decoration. It sets the terms of the next action.

This is why a status should be understandable without a glossary. People may use the product only occasionally, or return after a release has changed small parts of the experience. They should not have to remember the difference between several internal states in order to know whether it is safe to continue.

Good status language also leaves room for a person to disagree. The product may say that an attempt is complete while the person sees that the result is not useful. It may say that a task is waiting while the person knows that nothing more will happen. A clear status starts a conversation with reality; it should not close that conversation by sounding absolute.

That attitude changes the meaning of polish. A polished experience is not one in which every state looks positive. It is one in which every important state is represented plainly enough to act on.

The work after the interruption still matters

There is a tendency to treat the moment after a failure as a recovery flow and nothing more. Once the warning disappears, the product considers the problem solved.

For the person, the real work may begin after the interruption. They have to decide whether the original goal still makes sense. They may discover that the partial result contains a useful idea. They may realize that the task was too broad, that the next step should be smaller, or that a different tool would be better suited to the remaining question.

An honest interruption can therefore improve the project if it gives the person enough space to reconsider. It can be the moment when a vague request becomes a clearer plan. It can reveal a dependency that should have been named earlier. It can stop a bad direction before more effort is spent on it.

This does not make interruption good. It means the product should not erase the possibility of learning from it. A recovery path that only says “try again” may restore activity while preserving the original confusion. A better path helps the person decide whether trying again is even the right choice.

That is the standard we want to carry into future work on sessions and continuity. Progress is not measured only by how quickly a task resumes. It is also measured by whether the person understands more than they did before the task stopped.

What changed on June 9 was the standard we applied to the problem. A stopped job was no longer an awkward absence to hide. It was part of the story of the work, and the product had a responsibility to tell that part clearly.

Sometimes building an AI workspace means helping a task move forward.

Sometimes it means explaining, without drama, why it did not.

Keep exploring

More from Build in Public

Browse the publication