Three new plan trees that fill in the gaps surfaced during repo review. Together they map out what remains between the current scaffold-with-stubs state and a daily-usable, multitenant, agent-coordinated app. * Plan-daily-driver-finish (P0): turn stubs into real data. Five tasks covering the lint/shared-types breakage, hardcoded dashboard mocks, AI-page setTimeout placeholder, post-signin landing decision, and a cross-browser collab smoke test against the deployed Hocuspocus instance. * Plan-multitenant-saas-hardening (P1): everything multitenant needs beyond what Plan-multitenant-cursor-sync already covers. Invites and role management, soft-delete + append-only audit log, rate limits on the auth + mutation hot paths, and a Vitest + GitHub Actions test foundation so PRs can't ship red. * Plan-agent-coordination (P2): the layer that makes a Task-*.md runnable, not just readable. Adds workflow_prompt with task -> epic -> plan inheritance, an agent_runs table for auditable sessions, and two new MCP tools (claim_task / complete_task) that replace the freeform update_object composition agents do today. Includes an intentionally-deferred Epic-optional-orchestrator that captures the Symphony-shaped runner as a decision point rather than an immediate build. Each task is bead-scale (one focused Cursor session) with explicit in-scope, out-of-scope, and anti-goal sections so a future agent can pick up a single Task-*.md and start without scrollback context. Co-authored-by: Cursor <cursoragent@cursor.com>
3.8 KiB
| kind | slug | title | status | priority | tenant_id | cursor_plan_id | updated_at |
|---|---|---|---|---|---|---|---|
| plan | agent-coordination | Agent coordination — make tasks runnable, not just readable | ready | P2 | global | null | 2026-06-01 |
Plan overview
Echodo already exposes objects to coding agents via the MCP server. What it doesn't yet do is make a Task-*.md runnable — a Cursor (or Codex, or Claude) agent that picks up a task should be able to claim it, work it, and complete it with auditable state changes, without freeform composition through update_object.
This plan is the agent-coordination layer: workflow prompts on tasks, a runs table that records every agent session, and two new MCP tools (claim_task / complete_task) that give agents a primitive shaped for the actual workflow.
Inspired by OpenAI's Symphony orchestrator state machine, but multitenant from day one (Symphony has no concept of tenants) and not spawning agent processes itself. Echodo here is the coordination plane; the agent process still runs in your local Cursor session or wherever you launch it.
Objectives and success criteria
- Every backlog item can carry a workflow prompt (per-task or inherited from epic/plan) that an agent uses as its first-message context.
- A
runstable records every agent session against a task:started_at,finished_at,outcome,actor,token_usage, and a shortnotesfield. - Two new MCP tools —
claim_taskandcomplete_task— make the lifecycle explicit and atomic, instead of a sequence ofupdate_objectcalls. - A
runssummary surface (tRPC + minimal UI) lets you see "what did agents do this week?" without grepping logs.
Scope and boundaries
In scope
- New columns / table for workflow prompts and runs.
- Two new MCP tools.
- tRPC
runsrouter for the read side. - Minimal UI: a "Recent agent runs" panel on the task detail view or workspace home.
Out of scope (this plan)
- An actual orchestrator daemon that polls and spawns agents. Punted to a separate epic (
Epic-optional-orchestrator), explicitly deferred until manual usage ofclaim_task/complete_taskproves the abstractions are right. - Workflow templates per-epic / per-plan beyond simple inheritance. Don't gold-plate.
- Cross-tenant agent coordination. Not happening.
Cross-team collaborators
| Name / group | Role |
|---|---|
| Solo operator (you) | Everything. |
Epics
| Epic | Link |
|---|---|
| Task as runnable unit | ./Epic-task-as-runnable-unit/Epic-task-as-runnable-unit.md |
| MCP claim/complete | ./Epic-mcp-claim-complete/Epic-mcp-claim-complete.md |
| Optional orchestrator (deferred) | ./Epic-optional-orchestrator/Epic-optional-orchestrator.md |
Metrics and milestones
| Milestone | Target | Metric |
|---|---|---|
| Runnable tasks | M1 | A task carries a workflow prompt; the MCP claim_task tool returns it. |
| Auditable runs | M2 | Every session writes a runs row with actor_user_id, timings, and outcome. |
| Snapshot surface | M3 | GET /[workspaceSlug]/settings/runs (or similar) lists recent runs paginated. |
| Operator's choice | M4 | After 10+ real runs, decide whether the optional orchestrator epic is worth building. Update the deferred epic with a yes/no decision. |
Risks and mitigations
| Risk | Mitigation |
|---|---|
| Workflow prompts drift from task body | Render them together; don't make the prompt a hidden field. Make it editable inline in the task detail panel. |
| Runs table grows fast | Partial index on workspace_id, status for the "active runs" query. Roll up to a daily aggregate later if needed. |
| MCP tool surface creep | Two tools only. Resist adding pause_task, block_task, comment_on_task until you've felt the absence. |