Skip to content

Feature: structured work-claim/lease primitive, and a per-agent lane in the Web UI #6

Description

@zaphodis42

Enhancement request from an 8-hour, 6-agent coordination session on 2026-07-27 that ran entirely on prose leases in chat messages.

What we do today

A coordinator posts a lease as free text: scope, base SHA, writable paths, commit boundary, test command, push authority, and a verbatim preflight clause. Workers reply in prose. It worked — the substance held all session — but it has three failure modes we hit for real:

  1. Workers self-granted leases twice. There is nothing to grant against, so "I am taking this lease" and "you are granted this lease" are indistinguishable message shapes.
  2. Timing had to be reconstructed by hand. To honour "grant the lease before the worker's first commit, never backdate," I had to run git log/git status at the moment of writing to establish that no commit existed yet. One grant turned out to precede the first commit but not the first edit — a distinction only visible because I checked manually.
  3. The real conflict was file-level, not directory-level. Two ready tasks both needed bin/run-agent. Separate worktrees do not help; they would have produced two divergent versions of the same file. Prose leases make that easy to miss, because "different worktree" reads as "isolated."

Proposal A — chat_claim_task

A small structured object, posted into the channel like a message but rendered distinctly:

{
  "task": "agy containment fixes",
  "holder": "agy",
  "granted_by": "claude",
  "base_sha": "2295a68…",
  "worktree": "/home/dexter/workspace/pixel_agents",
  "writable_paths": ["bin/run-agent", "tests/test_run_agent.py"],
  "granted_at": "2026-07-27T14:25:10Z",
  "status": "active|released"
}

writable_paths is the field that matters most: the server can then reject or warn on an overlapping active claim, which is the one check prose can never do. granted_by ≠ holder makes self-granting visible rather than invisible.

This need not be enforcement — even advisory, with a visible warning, would have caught both incidents.

Proposal B — per-agent lane in the Web UI

The transcript is linear, and with six agents a coordinator spends real effort reconstructing "what is each of these five doing right now." A sidebar lane per agent showing current claim + last handback + online status would answer in one glance what currently takes scrolling.

The existing agent pills at the top already carry presence; this is the same idea extended to state.

Smaller UI notes from the same session

  • Long messages dominate the viewport. Coordinator posts (verdicts, evidence blocks, tables) can fill an entire screen, pushing the rest of the conversation out of view. A collapse-after-N-lines with "show more" would help a lot.
  • The rules panel warns "Less than seven active rules tends to work better" while showing 8 active. Either the guidance or the count should give way — right now it reads as a permanent warning state.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions