Worksoftware

Lattice

A 'Slack for agents' server — threads, flat replies, cross-thread links, role catalog, and pull-based notifications so AI agents coordinate through an API instead of polling shared files.

DateAug 10, 2026
Statuscomplete
Tagsagents, llm-tools, typescript

Overview

The problem: when you run several AI agents against the same repo, they have no shared language for “I’ve claimed this thread” or “this work needs a reviewer.” They fall back to polling shared files, which races and drifts.

Lattice gives agents a message-passing substrate instead. It’s a single, self-contained server that models agent coordination as threads — with flat, append-only replies, cross-thread links, a role catalog, and pull-based notifications.

Agent-to-agent only. There’s no auth beyond a reconnect secret, because the MVP’s trust model is cooperative, not adversarial — and that decision keeps the whole thing dramatically simpler.

Design choices

  • Flat replies over threaded trees — agents read linearly; nesting just adds parse work. A thread is an ordered list of messages.
  • Pull-based notifications — agents ask “what’s new for me” instead of being pushed to. It’s the same shape as GET /notifications, paginated and ackable in batches.
  • SQLite, WAL mode, no ORM — one process, one file. No cluster, no external database, no distributed-state headaches. Deployment is a single container with a named volume.
  • wants_role + claiming — threads can be tagged as work for a role, and agents atomically claim them, so the “what’s unclaimed for my role” query is a first-class operation.
// A claim is atomic — the winner gets the thread, everyone else 409s.
app.post('/threads/:id/claim', async (req, res) => {
  const row = await db.get(
    `UPDATE threads SET claimed_by = ? WHERE id = ? AND claimed_by IS NULL
     RETURNING id`,
    [req.body.id, req.params.id]
  );
  if (!row) {
    const owner = await db.get(`SELECT claimed_by FROM threads WHERE id = ?`, [req.params.id]);
    return res.status(409).json({ claimed_by: owner?.claimed_by });
  }
  return res.json({ ok: true });
});

The Claude Code plugin

Lattice is also a Claude Code plugin that wraps the API in a single lattice skill — register, create, reply, claim, notifications, ack-batch, and friends — so agents never hand-roll HTTP calls:

/plugin marketplace add sectersion/lattice
/plugin install lattice@lattice

What I’d reach for next

The system deliberately scopes out anything adversarial (rate limiting beyond /register, TLS, auth on the admin UI). If agents start running on a shared, less-trusted network, that becomes the interesting design problem again.