# Anexo 037-D — Cloudflare Agents SDK × Orquestração Ligbox

**Parent:** [spec.md](./spec.md) · Spec **037**  
**Relacionado:** Spec **029** (agentic-ops-runbooks) · Spec **030** (agentic-ops-ui)  
**Roger · 2026-06-22** · Status: 📋 Arquitectura alvo

---

## Contexto

O [Cloudflare Agents SDK](https://developers.cloudflare.com/agents/) é **realidade hoje**:

| Padrão | Uso Ligbox |
|--------|------------|
| **Multi-agent** | Agentes especializados (identidade, DNS, mail) colaboram no onboarding |
| **Human-in-the-loop** | Decisões críticas: BYO vs Ligbox CF, handoff gestor, purge |
| **Addressable agents** | WebSocket wizard ↔ agente; Desk ops ↔ thread A6 Copiloto |

**Infra:** cada agente = **Durable Object** stateful — hiberna ocioso, acorda sob demanda, storage próprio, MCP para APIs externas (VM112, pfSense, Carbonio).

---

## Duas camadas agenticas Ligbox

```mermaid
flowchart TB
  subgraph edge [Cloudflare Edge — Agents SDK]
    O[Orquestrador Onboard]
    I[Agente Identidade]
    D[Agente DNS/CF]
    H[Agente Handoff]
  end
  subgraph vm122 [VM122 Ops Desk — Spec 029]
    A0[Maestro A0]
    A6[Copiloto A6]
    A2[Trilho A2]
  end
  subgraph vm112 [VM112 Wizard API]
    W[FastAPI onboarding]
    C[Carbonio zmprov]
    CF[Cloudflare API]
  end
  O --> I
  O --> D
  O --> H
  I -->|MCP / webhook| W
  D -->|MCP / webhook| W
  H -->|MCP / webhook| W
  W --> C
  W --> CF
  O -->|eventos funil 004| A0
  A6 -->|human-in-the-loop| O
  A2 -->|validação infra| D
```

| Camada | Onde corre | Papel |
|--------|------------|-------|
| **Edge (CF Agents)** | Workers + Durable Objects | Orquestração **por cliente/domínio** em tempo real no wizard |
| **Ops (Spec 029)** | VM122 + Ollama | Vigilância 24/7, inbox humano, runbooks, Copiloto |

Não substituem-se — **complementam**.

---

## Roster onboarding (novos agentes edge)

| Agente edge | Codename | Responsabilidade | Spec 037 |
|-------------|----------|------------------|----------|
| **Orquestrador** | `onboard-maestro` | Triagem: Ligbox CF / BYO / registrador; estado do funil | Fluxo decisão |
| **Identidade** | `proj-mail` | Cria `proj_{id}@ligbox.com.br`, vault senha, entrega wizard | [037-C](./project-email-identity.md) |
| **DNS** | `cf-zone` | `provision-zone`, `apply`, `dns/verify`, multi-conta ligit/itecnologys/ibytera | Fase 1 actual |
| **Handoff** | `cf-handoff` | Convite `admin@dominio` na CF após go-live | [037-B](./client-cf-account-lifecycle.md) |

Cada agente edge tem:
- **Durable Object ID** = `project:{domain}` ou `session:{onboarding_session_id}`
- **Memória** = `project_id`, `ligbox_project_email`, `cf_account_id`, `dns_mode`, passos concluídos
- **MCP tools** = wrappers HTTP para VM112 (`/api/onboarding/...`)

---

## Mapeamento → Roster Spec 029 (A0–A7)

| Agente edge | Delega / reporta a | Human-in-the-loop |
|-------------|-------------------|-------------------|
| `onboard-maestro` | **A0 Maestro** (tick + audit) | `agentic_operator` se BYO token inválido 3× |
| `proj-mail` | **A2 Trilho** (infra mail) | Ops se Carbonio falhar |
| `cf-zone` | **A3 Carta** (deliverability) | Cliente escolhe caminho DNS |
| `cf-handoff` | **A6 Copiloto** (thread cliente) | Confirmação antes de convite gestor CF |
| Falha crítica | **A7 Remediador** | Sempre humano antes de acção |

Role Desk já existente: `agentic_operator` (Spec 027/029).

---

## Human-in-the-loop — pontos obrigatórios

1. **Escolha DNS** — BYO vs Ligbox vs registrador (wizard UI).
2. **Reveal senha** `proj_*` — uma vez; agente pausa até `mark_password_delivered`.
3. **Handoff CF** — convite `admin@cliente` só após `dns/verify` + `account/create` OK.
4. **Purge / delete zona** — nunca automático (Spec 017).

Padrão SDK: agente **planeja** → persiste estado no DO → **aguarda** webhook/UI → retoma.

---

## Conectividade

| Canal | Uso |
|-------|-----|
| **WebSocket** (wizard) | Stream de passos, logs activity, «agente a trabalhar» |
| **MCP → VM112** | `provision-email`, `provision-zone`, `apply`, `account/create` |
| **MCP → CF API** | Nativo no Worker (token scoped por conta cliente) |
| **Webhook → VM122** | Funil 004: `onboard.dns.applied`, `project.email.created` |
| **Scheduling** | Retry DNS verify, lembrete NS registrador D+1 |

---

## Fases de implementação

### Fase A — Hoje (sem Workers)
- VM112 FastAPI + wizard React (Spec 037 Fase 1) ✅
- `project_identity.py` scaffold (037-C)
- Agentes 029 observam via webhooks

### Fase B — Worker orquestrador único
- 1 Durable Object `OnboardSession` por sessão wizard
- Delega a VM112 via HTTP (sem multi-agent ainda)
- WebSocket no wizard

### Fase C — Multi-agent edge
- 4 agentes especializados + MCP
- Estado partilhado via `onboard-maestro` (coordenação)
- Human-in-the-loop nos 4 pontos acima

### Fase D — Conta CF dedicada por cliente
- `cf-zone` + Tenant API `POST /accounts`
- Token scoped por `cf_account_id` no DO storage

---

## Porque Cloudflare Agents aqui

| Benefício | Onboarding Ligbox |
|-----------|-------------------|
| Stateful por cliente | Sessão longa (dias até NS propagar) |
| Hibernação | Milhares de onboardings paralelos, custo ~0 entre passos |
| MCP | VM112/pfSense sem expor tokens no browser |
| Edge | Baixa latência wizard público `onboard.ligbox.com.br` |

---

## Critérios de aceitação (Fase C)

1. Wizard conecta WebSocket ao `onboard-maestro` DO.
2. `proj-mail` cria caixa e orquestrador só avança após senha entregue.
3. `cf-zone` completa apply + verify com estado persistido no DO.
4. Eventos chegam ao Maestro A0 no Desk.
5. Handoff CF exige ack humano na inbox Spec 029.

---

## Referências

- [Cloudflare Agents — multi-agent](https://developers.cloudflare.com/agents/)
- [Agents SDK GitHub](https://github.com/cloudflare/agents)
- Ligbox Spec 029 `agents-roster.md` (A0–A7)
- Ligbox Spec 037 `project-email-identity.md`
