Files
sausage/extensions/messages
..

Messages and lineage

The extensions preserve the durable board.* and lineage.* identifiers from Main agent. They use world files and world git. They do not use native filesystem or process APIs.

Branches and delivery

branch requires an absolute repo path and a prompt. It forks a listed tree root and writes board.started.by in the same transaction. The coordinator definition supplies the branch configuration. The branch start event reports the coordinator's model, not the inherited root model. Worktree isolation requires the later workspaces port. The default is a shared checkout.

The tool admits the prompt as a reply-enabled message. A call receipt prevents a second fork or message after a restart. The service also supports lineage.prompt, which commits with a direct branch request.

board.delivery admits an input with a stable request ID. It waits for the answer, records the reply, and delivers that reply with another stable request ID. A restart can repeat these phases without a second input or reply.

A branch reports to its starter when its work ends. While a child, landing, or reply remains pending, its final answer becomes a passive note. One-way updates to the starter also become passive notes. The starter can answer a report without an endless exchange of routed answers. The starter's final answer reaches the branch without a faulted routing task. A static test checks free runtime identifiers in every extension module, including function bodies.

The grant chain contains fork ancestry before starter ancestry. Each conversation occurs once. A root fork that the main agent starts includes [branch, root, mainAgent].

Tally and catch-up

The listed roots live in lineage.roots on conversation 1. An empty root becomes a tally when its first branch starts. A tally does not run model turns. It records branch intents, liquid abstracts, passive notes, and landed submissions. A landing freezes its branch's abstract and removes the liquid anchor from the model context. Its request ID prevents a second note for the same submission.

Before an input, catch-up reads loose or packed Git refs through the VFS. It calls world git only when the target tip differs from the saved baseline. Commit rows use the Sausage-Conversation trailer for attribution. The tally section includes other branches' changes within a token budget.

Project memory

Memory lives in /src/sausage/.sausage-memory/<root>.json. Each file contains memories and requests objects. These world files are authoritative. The harness database does not duplicate their contents.

Memory writes validate the entire batch before a temporary file replaces the destination. A shared queue serializes writes across extension reloads. A tool or landing receipt commits in that same file. Thus, a restart after the rename does not apply the operations twice.

Only the main agent can use the remember tool. Other extensions can use the lineage service. Branches from a root with memory start with its index and recent landings.

lineage.memorize asks the conversations service for its summary model. Without that model, it leaves memory unchanged. It memoizes the model, input, and answer. It retries a refused batch once. It normalizes automated text limits and records landing provenance.

Remote messaging, side chats, editor launch, and rewind are outside this port.