Files
mcpctl/docs/agentic-teams-review.md
Michal d24c30761b docs: keep superseded design-round doc history
Supporting documents folded into agentic-teams.md (the canonical unified
design record), retained as historical context:

- agentic-teams-review.md (round 2)
- vision-fidelity.md (round 3 diagnosis + research)
- epic-task-artifact-model.md (Epic/epictask/task + context philosophy)
- session-summary-vision-fidelity.md (session narrative)

All superseded by docs/agentic-teams.md, which remains the source of truth.
2026-08-08 09:03:58 +01:00

247 lines
11 KiB
Markdown

# Agentic Teams — Second Review Round
> **Status:** Second design review round. Complements and refines
> `docs/agentic-teams.md` (the primary design record). This file captures the
> loose ends surfaced by reviewing the first draft, and the decisions/recommen-
> dations that followed.
>
> Date of round: second pass. Like the base doc, this is **feature/decision-
> focused**, not code-focused. Items marked **[OPEN]** are not yet decided and
> block or shape implementation. Items under **"DECIDED in this round"** are
> resolutions reached here.
---
## 0. What this round covered
Reviewing the first draft surfaced several **loose ends, tensions, and undefined
mechanics** that would have bitten during implementation. They cluster into one
through-line question (below), then several specific items. The single most
important framing decision this round is **async-vs-sync**, because it resolves
most of the others.
---
## 1. THE through-line decision: async vs sync [mostly DECIDED — see below]
Most of the loose ends collapse into one question:
> **Is the system fundamentally synchronous-team (everyone—agents and
> human—working "together" in near-real-time, waiting on each other), or
> asynchronous (frozen artifacts + a decision queue + disposable pods)?**
**Where this landed (DECIDED in this round):**
The system is **fundamentally asynchronous and artifact-driven**, with `exec`
being the *deliberate exception* the human opts into for joint active work.
Evidence from the whole conversation supports this:
- Confidence checks run on **frozen task artifacts**, not live chat.
- The human supervises from a **single dashboard/inbox** of packaged decisions.
- Pods are **ephemeral and disposable** by design.
- State lives in **mcpctl's database** (not in pods).
- Agents escalate **packaged questions**, not live interjections.
Locking this resolves loose ends 1, 2, 3 and 4 (below) together, and makes the
design **more robust** (no idle synchronous chains, no live-session
coordination, everything auditable and resumable). `exec` remains available,
but it is a **different activity** (joint active collaboration) rather than the
default way work proceeds.
---
## 2. Loose ends surfaced & resolution status
### 🔴 LE-1: Do reviewers (QA/security) block the working agent, or run async?
**The tension:** if a working agent submits and reviewers run in *their own
pods*, does the working agent **block** (idle for minutes/hours) or **end its
session** and get resumed only if rejected?
**DECIDED (recommendation, consistent with async model):** reviewers run
**asynchronously against the frozen branch/artifact**. The working agent's pod
can end after submission. A **rejection re-spawns a working session** with the
rejection comment as new input. No idle blocking chains.
This also means we do **not** need live multi-pod coordination — the handoff is
artifacts + verdicts in mcpctl's DB, not a live rendezvous between pods.
### 🔴 LE-2: Are QA/security verdicts a hard gate, or advisory?
**The tension:** "QA checks, security looks, CI passes, then submit" implies a
**gate** (all must pass); but the confidence model and "human accept is the only
true fuse" imply they're **advisory**.
**DECIDED (recommendation):** QA/security review is **primarily for the working
agent's self-correction** (catching issues before it reaches you) and **as
attached evidence for the human's accept decision**. Their verdicts are
**informative, not hard autonomous gates**. The **only hard autonomous gate is
CI-against-current-main**; the **human's accept remains the one true fuse.**
Reasoning: if reviewer verdicts were hard gates, they'd effectively be an
autonomous pre-approval pipeline — the rigid-pipeline shape we explicitly
rejected, and the human's accept would become rubber-stamping. Keeping them
advisory preserves the human's genuine authority while still giving agents a
self-correction loop and giving the human good evidence.
### 🔴 LE-3: Did we actually decide "standup," and how does it fit the async model?
**The tension:** "standup" was described early ("standup where we discuss
progress since yesterday") but was never designed. It also risks implying a
synchronous ritual.
**DECIDED (recommendation):** a standup is an **on-demand, artifact-driven
instrospective flow**, not a recurring synchronous call. Example shape:
- `mcpctl standup --project sre [--since <date|task>]` — pull each agent's
per-task progress/notes since the last standup and summarize.
- Each agent's **requested decisions surface as dashboard items** (one queue).
- The human reviews the summary and works the queue asynchronously.
So standup **pulls from per-agent per-task notes** (where progress actually
lives) and **feeds the decision dashboard**. It does not require anyone to be
live simultaneously.
### 🟡 LE-4: `exec` vs the async review model — clarify the boundary.
**DECIDED (recommendation):** `exec` is for **joint active collaboration**
(debugging / architecting / real-time hands-on), *not* for inserting into a
task already under async review. A task under review is a **frozen artifact**;
`exec` is the opt-in exception when the human *chooses* to be live with one
agent. This keeps the two modes coherent and avoids expecting to `exec` into
the middle of a review pipeline.
### 🟡 LE-5: Where does state live given pods are disposable?
**DECIDED:** State lives in **mcpctl's database** — task artifacts, verdicts,
per-agent notes, coverage ledgers. **Pods are stateless workers** that read
from / write to that state. Nothing is lost on pod death; pods are cheap to
re-spawn. This is a strength of the design and worth stating explicitly.
### 🟡 LE-6: The "brain" question — who powers the agent's LLM? [OPEN → resolve]
The one real open knot from the first round, still not closed.
**Recommendation (decided-leaning):**
- **Bare chat** (`mcpctl chat agent001`): the agent's **home brain** (agent-owned
Llm default).
- **`--project` mode**: the **project's `llmProvider`** takes over (portability;
matches today's project-chat; a project can invite any agent and run it on the
project's model of choice).
**This blocks the data model**, so it should be closed with one decision. It is
the single most important unresolved item.
### 🟢 LE-7 (naming): "Task" may collide with the repo's Task Master workflow.
The mcpctl "Task" resource could conceptually collide with this repo's
`.taskmaster` tasks. **Flag for a naming check** — e.g., `workitem` / `item` /
`assignment` — so the two don't confuse. Not an implementation blocker; flagged
because a second pass is the right time to settle naming.
### 🟢 LE-8 (minor): Where does the artifact store (non-git binaries) live?
Decided earlier that git carries source+verdicts and an **immutable artifact
store keyed by commit** carries binaries/build outputs. **Recommendation:** that
store also lives server-side (mcpctl-owned), keyed by commit/branch, so it
survives pod death and pods pull exactly what they need. Consistent with LE-5.
### 🟢 LE-9 (open): How are project/persona prompts delivered to the pod?
**[OPEN]** The user explicitly raised this early and we never chose between:
- **exposed via MCP** (prompts as MCP calls),
- **as files placed in the container** (prompt files on disk in the pod),
- **LLM query injection directly** (system-prompt injection at call time).
This affects the pod image and the runtime interface. Lean: a prompt-file-aware
coding-agent runtime → *files in the container*; MCP as an alternative surface;
injection-at-call is how today's `chat` behaves. Should be closed at design time.
### 🟢 LE-10 (open): The explicit "ask-for-help / joint problem-solving" mode
**The user described wanting a mode where they help an agent with a challenge
and work on it together** — “you can ask me to help you with some challenge and
we can work for it together.” This is related to but distinct from `exec`-into-
a-workspace and from hot escalation. It is not fully designed.
Lean: an agent that is stuck or lacks knowledge can **request help** (an
escalation tagged as a help-request), routed to the dashboard or an `exec`
session, rather than the human having to discover it independently.
---
## 3. Confirmed strengths worth preserving (from round-one, re-affirmed)
While reviewing, we confirmed these hold up and should survive any refinement:
- **Agents as persistent "people"** (global memory + per-project context +
multi-project membership). [DECIDED round one]
- **Confidence = evidence-anchored**, outcome-aware (attach similar tasks'
description + resolution + *effect*). [DECIDED round one]
- **Task-level accept gate** (one decisive human accept/reject + comment) rather
than per-tool permission — no permission engine rebuild. [DECIDED round one]
- **Merge gated on current-main CI + human accept** via provider API, with
**auto-reopen/revert** on post-merge failure. [DECIDED round one]
- **Coverage-ledger invalidation** is the honesty backbone of the memory. [MVP
prerequisite]
- **Delegation over reinvention** — build an `AgentRuntime` interface; first
runtime = battle-tested coding agent headless; `pi` as a later optional
adapter. [DECIDED round one]
---
## 4. Post-merge concern — revisited and reinforced
The "stuff only fails after merge to master" worry got a concrete resolution in
round one, and the async framing **reinforces** it:
- Pre-merge acceptance must verify **against current main tip**, not the stale
base.
- The **human's accept is conditioned** on that current-main verification; if
main moved and it's stale, stay `AwaitingReview` flagged rebase-needed (agent
refreshes + re-verifies).
- Post-merge, `Merged → Reopened` on a failure webhook, with **fast revert of
the task-sized merge** as the cheapest recovery.
The async model strengthens this: because each step is a frozen artifact + state
transition, a post-merge failure is a *routable state* (auto-reopen), not a
surprise to be debugged live.
---
## 5. Remaining open questions (consolidated)
To make the design "ready to design," close these:
1. **[LE-6] Brain ownership** — closed-leaning but not confirmed: home brain for
bare chat; project's `llmProvider` in `--project` mode.
2. **[LE-7] Naming** — is the work entity called a "Task" or something else?
3. **[MVP-scope] Which vertical slice first** — the base doc proposes
Task+Repo entities → runtime adapter → accept gate → collaboration modes →
confidence/dashboard → memory/ledger. Confirm or adjust the order.
4. **[LE-9] Prompt delivery** — MCP vs files-in-container vs LLM injection (see
LE-9).
5. **[LE-10] Ask-for-help / joint problem-solving mode** (see LE-10).
---
## 6. Suggested MVP path (unchanged from base doc, re-listed for completeness)
1. Task + Repo entities + project linkage.
2. AgentRuntime adapter interface + first runtime (existing coding agent
headless) inside a pod. Prove: pod spawn → clone → work task branch → push →
report.
3. Task lifecycle + PR linkage + human accept gate → merge via provider API
(current-main CI + Reopened-on-failure).
4. Collaboration modes: on-demand async standup + `exec` joint mode.
5. Confidence-driven autonomy + escalation dashboard.
6. Memory + coverage ledger (invalidation-aware).
---
*This file records the second review round and its outcome. It should be read
together with `docs/agentic-teams.md`; together they form the durable design
record. The async-vs-sync through-line (section 1) is the key decision to carry
forward.*