Chapter 8 of 15

From Code Blob to Durable Workspace

Real files, project identity, and history turned a response into a reviewable asset. This was the point where generated output became something I could treat like real software rather than disposable model output. Files, diffs, commits, and restore points gave both the user and the agent a shared history to work from.

  • Real files and project identity
  • Git-backed history
  • Commands, logs, previews, and conversations
  • Persistence across sessions and restarts

The situation

A generated result lived only as a rendered preview or a text blob, with no way to review what changed between requests. In From Code Blob to Durable Workspace, I wanted to capture the real operating situation rather than describe the problem in abstract terms. What mattered to me was the moment the existing approach stopped being sufficient in normal use, because that was usually the point where the next architectural requirement became obvious.

The naive solution

Store the latest generated output and overwrite it on every new request. The naive option was attractive precisely because it was faster and easier to explain. I could have pushed further in that direction and probably improved the demo, but it would have optimised the visible symptom rather than the underlying system constraint.

The hidden constraint

Users wanted to compare, revert, and understand changes - none of which is possible without real file history. This constraint was easy to miss early because it did not show up in the first successful run. It appeared once the workflow had to survive repetition, failure, another user, another provider, or a return visit, which is why I now look for these second-order requirements much earlier.

The decision

Back every workspace with a real filesystem and a project-scoped Git repository. I treated this as an architectural or product decision rather than a prompt tweak. The aim was to create a boundary I could reason about later, instead of relying on model behaviour to remain consistent as providers, templates, and user requests changed.

The implementation

Added descriptive commits, restore points, diffs for review, and stored command history, logs, and preview state alongside the files. I also tried to make the implementation concrete enough that the decision could be inspected in code and runtime behaviour. That meant explicit state, explicit policy, and observable transitions rather than a collection of hidden assumptions spread across prompts and handlers.

The tradeoff

Every agent edit now needs to produce a reviewable diff and commit rather than silently replacing content. I did not treat the decision as free. In most cases I was deliberately accepting more engineering, state management, or operational complexity in exchange for a smaller failure surface and a product that could survive realistic use.

The evidence

An agent turn became a reviewable change to a project - visible as a diff and a commit - rather than an opaque replacement of a text field. I use this evidence as a practical signal, not as a claim that the architecture is universally correct. The useful question was whether the new design changed what the system could reliably do under the conditions that had previously broken it.

The reusable lesson

If users need to trust AI-driven changes, give them the same review tools they would expect from a human collaborator: diffs, history, and rollback. The part I would carry into another build is the decision rule behind the implementation, not the exact technology choice. Vendors and frameworks will change; the underlying question about state, control, isolation, feedback, or user trust is much more reusable.

The consultant's questions

  • Can a user see exactly what an AI edit changed, or only the end result?
  • If a change is wrong, how many steps does it take to get back to the last good state?
  • What assumption in this part of the system would become dangerous if usage or tenant count increased?
  • What evidence would tell me this decision needs to be revisited rather than defended indefinitely?