A tab can have an identifier and still exist nowhere useful. In Tangle’s Tangent workspace, the method that opened a view could manufacture a tab while no session was active. The storage step then had nowhere to put it. A caller received something that looked like success, while the user saw no new workarea.
The September 25 contribution describes the consequence for both humans and agents: a resource click could silently do nothing; an agent could report an artifact opened or wait for an environment attached to a tab that was never stored. The commit publicly attributes part of the work to Claude Opus 5. That establishes declared coding-agent participation, not how much of the implementation a model produced.
The refactor made the owner explicit
The wider change extracts shared interface state into TangentProjectStore. It owns the selected session and maps of each session’s workarea and chat tabs. React components observe that store, and the agent provider reads the same instance outside rendering. Server-fetched project and resource data remain in TanStack Query.
This division matters more than a choice between React and MobX. A tool operating outside a render needs current state too. The provider wiring supplies the store’s open-target method to the agent tools. The new owner is shared by the screen and the program acting on it.
Inside the store, openResolvedView now checks for an active session before creating a tab. With none, it throws. With one, it either focuses an existing target or stores the new tab and then returns it. Closing or selecting an absent tab can remain harmless; creating a tab and returning a handle makes a stronger promise.
A builder lesson: test the returned promise
When an agent tool returns a handle, treat it as a claim about shared state. Identify the owner, check its prerequisite before allocating, and test the state the next caller will actually read. A UUID or an object with the right fields is not enough.
The added store tests express that contract from several directions. Opening without a session must throw and leave the tab list empty. Opening the same target again must return the existing identity. Switching sessions must reveal each session’s own tabs and restore the earlier set on return. Those checks distinguish ownership, deduplication and session separation, rather than merely asserting that a creation function returned something.
We traced the store, its tests and agent-provider integration beyond the repository description. We did not run the frontend suite or reproduce the behavior in a deployed Tangle instance. The store is in-memory interface state; this is not a claim of durable recovery after a browser restart. Nor does a stored tab establish that its embedded environment is ready.
That remaining distinction is the next contract to preserve: first prove the tab belongs to a session, then prove the environment behind it is usable. An agent should not have to discover either failure after telling its user that the work is open.