Skip to main content
The smallest useful Agent Application can return to work it saved during an earlier run and decide what to do next from the state it finds. This example is a notebook agent for one user. It saves notes in its workspace and maintains a short briefing the user can open without reading the conversation. The files live in examples/durable-notebook/. For this walkthrough, we will use Goose as the harness / Agent Application Framework, and Dharta as the Agent Application Platform to deploy the agent. Same agent can be written for other harness/frameworks, with corresponding folder structure and that agent can be deployed to platforms that support that particular harness.

0: Agent project folder

The paper describes an Agent Project by parts, not by specific filenames:
Goose maps those parts onto its own files. After this point the example uses only that Goose layout:

1. Framework selection

Pick a harness that can load instructions, call tools, keep a working directory across sessions, and later run as a native project on a platform. This example uses Goose because it is open source, model-agnostic, and already compared in the paper’s capability model. The same application can be written for other harnesses such as Claude Code and Deep Agents. Install the Goose CLI and configure a model:
On macOS you can instead run brew install block-goose-cli. First launch asks you to choose a provider. See Goose’s installation guide.

2. Agent Application Programming

Agent Application Programming is designing, authoring, and evaluating the hybrid program. The result is an Agent Project in Goose’s native layout, using the parts from section 12.2. The job: one user, a research notebook, durable notes and a briefing. The privacy boundary is that user. The walkthrough uses two example users, Ada and Bea. They are different people and must not share a workspace. Natural-language instructions. Goose loads AGENTS.md from this directory when a session starts. This app has no skills, so skills/ stays empty.
Computer-code tools. tools/save-note.ts is a script Goose runs with the developer shell tool:
System integrations. None in this app. The notebook does not call MCP servers or other connectors. Evaluations. evals/persistence.yaml is the behavior to keep: Ada’s note survives suspension, and Bea cannot see it. Package dependencies. package.json marks the folder as an ES module so Node can run tools/save-note.ts. Platform configuration. dharta.toml is used in section 4.

3. Local testing

Local Goose checks that the notebook continues in the same folder after the process exits. The developer builtin is required so Goose can run the save script and write files. Stay in the project:
Say: “Remember that the launch moved to September 18.” Exit. notes.md should still be in this directory. Start Goose again in the same folder:
Say: “Prepare a launch briefing.” The agent should read the earlier note and write briefing.md. You can also run one turn without the interactive prompt:
goose configure must have a model. recipe.yaml is valid Goose recipe input (goose recipe validate recipe.yaml). On Monday, Ada says, “Remember that the launch moved to September 18.” On Friday she asks for a briefing. The same workspace, durable artifact. Ada and Bea still must not share a workspace. Copying the project into two folders on the same disk does not provide that isolation. The agent can see the whole filesystem, and a natural-language rule not to look in the other folder is not a privacy boundary. Each user needs an instance whose workspace is a dedicated virtual filesystem the other instance cannot reach. That is platform work, in section 4. The YAML eval states both checks: Ada’s note survives suspension, and Bea cannot see it. Local Goose covers the first. The second needs isolated instances.

4. Agent Application Platform deployment

A platform turns the tested Goose project into a release and operates long-lived instances. It provisions an instance at the notebook’s privacy boundary (one user), attaches a dedicated virtual filesystem as that instance’s workspace, and serves a URL. Two signed-in users must get two instances. Their files never sit as sibling folders on one shared disk. Dharta is one platform that runs Goose projects in their native format. Install the CLI, sign in, enable deploy for this folder, and ship it:
Commands are from Dharta’s CLI overview and quickstart. Platform configuration is dharta.toml. It names the agent and selects the Goose harness:
dharta deploy builds an immutable release and activates it at a stable URL. The platform then creates instances as users arrive. In Dharta, the instance is a karta: one id is one durable computer with its own workspace and memory. Map the id to Ada and to Bea. Each gets a private notebook. The same project, two instances. Open the hosted page (dharta open). Sign in as Ada, leave the September 18 note, sign out. Sign in as Bea. Bea must not see Ada’s notes. Sign in as Ada again; the briefing work is still there. dharta dev --user ada and dharta dev --user bea exercise that routing on your machine against the same session API production serves. They do not replace Goose’s own local workflow in section 3. The same hello-world-on-Goose shape, including other harness twins, is also published at dharta-ai/examples. This repository does not operate a platform.

Optional: the notebook as a plugin

The example above keeps save-note.ts in the project so its code is visible. Another version could get the note tool and briefing procedure from a portable plugin:
The plugin uses the Agent Plugins 1.0 package format. Installation does not grant filesystem access or credentials. The plugin version must use the same instance routing and workspace isolation, and it must pass the same persistence test.