Aplicação unificada em ASP.NET Core + Blazor WebAssembly (SPA), utilizando PostgreSQL.
Este documento é voltado para devs que precisam:
- entender rapidamente a arquitetura e os padrões do Bud,
- subir o ambiente local,
- executar fluxos principais de desenvolvimento com segurança.
- Arquitetura da aplicação
- Padrões arquiteturais adotados
- Como contribuir
- Como rodar
- Como rodar sem Docker
- Servidor MCP (Missões e Métricas)
- Deploy no Google Cloud
- Onboarding rápido (30 min)
- Testes
- Health checks
- Endpoints principais
- Sistema de Design e Tokens
O Bud segue uma arquitetura em camadas com separação explícita de responsabilidades:
- API/Host (
Bud.Server): exposição HTTP, autenticação/autorização, middleware e composição de dependências. - Application: casos de uso (
Command/Query), contratos de entrada/saída e regras de orquestração. - Domain: conceitos de domínio, value objects e specifications.
- Data: EF Core (
ApplicationDbContext) e mapeamentos. - Client (
Bud.Client): SPA Blazor WASM com consumo da API. - Shared (
Bud.Shared): contratos e modelos compartilhados entre cliente e servidor.
- Controllers recebem requests, validam payloads (FluentValidation) e delegam para UseCases.
Validações dependentes de dados devem passar por abstrações/serviços de aplicação, não por acesso direto de validator ao
DbContext. - UseCases centralizam o fluxo da aplicação e retornam
ServiceResult/ServiceResult<T>. - Services contêm as interfaces (contratos) e suas implementações com regras de negócio e acesso a dados.
- DependencyInjection modulariza bootstrap (
BudApi,BudSecurity,BudData,BudApplication).
- UseCases + Services
Controllers delegam para UseCases, que dependem de interfaces de serviço em
Services/. Referências:docs/adr/ADR-0002-usecases-services.md. - Policy-based Authorization (Requirement/Handler)
Regras de autorização centralizadas em policies e handlers, reduzindo condicionais espalhadas.
Referências:
docs/adr/ADR-0004-autenticacao-autorizacao.md. - Specification Pattern (consultas reutilizáveis)
Filtros de domínio encapsulados em specifications para evitar duplicação de predicados.
Referências:
src/Bud.Server/Domain/Specifications/. - Structured Logging (source-generated)
Logs com
[LoggerMessage]definidos localmente por componente (partial), comEventIdestável e sem catálogo central global. - Governança arquitetural por testes + ADRs
Decisões versionadas (ADR) e proteção contra regressão de fronteiras via testes de arquitetura. Referências:docs/adr/README.mdetests/Bud.Server.Tests/Architecture/ArchitectureTests.cs. - Aggregate Roots explícitas
Entidades raiz de agregado são marcadas com
IAggregateRootpara tornar boundaries verificáveis por testes. Referências:docs/adr/ADR-0012-aggregate-roots-value-objects-invariantes.md. - Invariantes no domínio (modelo rico)
Regras centrais de negócio são aplicadas por métodos de agregado/entidade (Create,Rename,SetScope, etc.) com tradução paraServiceResultna camada de serviço. Inclui Value Objects formais (PersonName,MissionScope,ConfidenceLevel,MetricRange) para reduzir primitive obsession.
Isolamento por organização (OrganizationId) com:
ITenantProviderpara resolver tenant do contexto autenticado.- Query filters globais do EF Core.
TenantRequiredMiddlewarepara reforçar seleção/autorização de tenant em/api/*.- Cabeçalho
X-Tenant-Idenviado pelo client quando uma organização específica está selecionada.
- Request chega no controller.
- Payload é validado.
- Controller chama o UseCase correspondente.
- UseCase aplica regras de autorização/orquestração e delega para portas/serviços.
- Serviço persiste/consulta via
ApplicationDbContext. - UseCase cria notificações quando aplicável (missões, check-ins).
- Resultado (
ServiceResult) é mapeado para resposta HTTP.
- Unit tests: regras de negócio, validações, use cases e componentes de infraestrutura.
- Integration tests: ciclo HTTP completo com PostgreSQL em container.
- Architecture tests: evitam regressão de fronteira entre camadas (ex.: controller depender de service legado), validam tenant isolation, autorização e boundaries de aggregate roots.
A camada de dados exige
IEntityTypeConfiguration<T>dedicada para todas as entidades doApplicationDbContext. - ADRs: decisões arquiteturais versionadas em
docs/adr/.
- Toda mudança arquitetural deve criar/atualizar ADR.
- ADRs seguem convenção
docs/adr/ADR-XXXX-*.md. - Índice e convenções:
docs/adr/README.md. - No PR, inclua explicitamente:
Architectural impact: yes/noADR: ADR-XXXX(quando aplicável)
Para lista atualizada de ADRs e ordem recomendada de leitura, consulte:
docs/adr/README.md.
flowchart LR
A[Bud.Client<br/>Blazor WASM] -->|HTTP + JWT + X-Tenant-Id| B[Bud.Server Controllers]
B --> C[Application UseCases<br/>Command/Query]
C --> D[Services]
D --> E[(PostgreSQL<br/>ApplicationDbContext)]
C --> N[Notifications<br/>INotificationService]
N --> E
sequenceDiagram
participant U as Usuário/Client
participant C as Controller
participant UC as UseCase
participant S as Service
participant NS as NotificationService
participant DB as PostgreSQL
U->>C: Requisição de comando (create/update/delete)
C->>UC: Executa caso de uso
UC->>S: Executa regra de negócio
S->>DB: Persiste entidade
UC->>NS: Cria notificações (quando aplicável)
NS->>DB: Persiste notificações
C-->>U: Resposta HTTP (sucesso)
flowchart TD
O[Organization]
W[Workspace]
T[Team]
ST[SubTeam]
C[Collaborator]
M[Mission]
MM[MissionMetric]
MC[MetricCheckin]
O --> W
W --> T
T --> ST
T --> C
O --> M
W -. escopo .-> M
T -. escopo .-> M
C -. escopo .-> M
M --> MM
MM --> MC
O --> N[Notification]
C --> N
sequenceDiagram
participant UI as Bud.Client
participant API as Bud.Server
participant AUTH as AuthController/AuthUseCase
participant TENANT as TenantRequiredMiddleware
participant CTRL as Controller
UI->>API: POST /api/auth/login
API->>AUTH: Valida e autentica por e-mail
AUTH-->>UI: JWT + dados básicos da sessão
UI->>API: GET /api/auth/my-organizations (X-User-Email)
API-->>UI: Lista de organizações disponíveis
UI->>UI: Usuário seleciona organização (ou "TODOS")
UI->>API: Request com Authorization: Bearer + X-Tenant-Id (opcional)
API->>TENANT: Valida autenticação e tenant selecionado
TENANT->>CTRL: Libera acesso conforme policies
CTRL-->>UI: Resposta filtrada por tenant
sequenceDiagram
participant UI as Bud.Client / Caller
participant API as ASP.NET Core Pipeline
participant AUTH as AuthN/AuthZ
participant TENANT as TenantRequiredMiddleware
participant CTRL as Controller
participant VAL as FluentValidation
participant UC as UseCase
participant SVC as Service
participant DB as ApplicationDbContext/PostgreSQL
UI->>API: HTTP Request
API->>AUTH: Valida JWT/policies
AUTH->>TENANT: Valida contexto de tenant (quando aplicável)
TENANT->>CTRL: Encaminha request autorizado
CTRL->>VAL: Valida payload
alt Payload inválido
VAL-->>CTRL: Erros de validação
CTRL-->>UI: 400 ValidationProblemDetails (pt-BR)
else Payload válido
CTRL->>UC: Executa caso de uso
UC->>SVC: Orquestra regra de negócio
SVC->>DB: Consulta/persistência
UC-->>CTRL: ServiceResult
CTRL-->>UI: 2xx/4xx/5xx + ProblemDetails quando aplicável
end
flowchart TD
A[Request recebido] --> B{JWT válido?}
B -- Não --> C[401 Não autenticado]
B -- Sim --> D{Tenant exigido e selecionado?}
D -- Não --> E[403 Tenant obrigatório]
D -- Sim --> F{Payload válido?}
F -- Não --> G[400 ValidationProblemDetails]
F -- Sim --> H{Entidade existe?}
H -- Não --> I[404 NotFound]
H -- Sim --> J{Conflito de regra?}
J -- Sim --> K[409 Conflict]
J -- Não --> L[2xx Sucesso]
flowchart TB
subgraph Host["Bud.Server Host"]
Controllers
Middleware
DependencyInjection
end
subgraph App["Application"]
UseCases
end
subgraph Domain["Domain"]
Specifications
ValueObjects
end
subgraph Data["Data"]
DbContext
end
Controllers --> UseCases
UseCases --> Services["Services"]
Services --> DbContext
Services --> Specifications
DependencyInjection --> Controllers
DependencyInjection --> UseCases
DependencyInjection --> Services
flowchart LR
subgraph Client["Bud.Client (Blazor WASM)"]
UI["Pages + Layout"]
ApiClient["ApiClient + TenantDelegatingHandler"]
end
subgraph Api["Bud.Server (API/Aplicação)"]
Controllers["Controllers"]
UseCases["UseCases"]
Services["Services"]
Authz["AuthN/AuthZ + Policies"]
end
subgraph Dados["Persistência"]
Db["ApplicationDbContext"]
Pg["PostgreSQL"]
end
UI --> ApiClient
ApiClient --> Controllers
Controllers --> UseCases
UseCases --> Services
Controllers --> Authz
Services --> Db
Db --> Pg
Fluxo recomendado de contribuição para manter qualidade arquitetural e consistência:
- Crie uma branch curta e focada no objetivo da mudança.
- Escreva/atualize testes antes da implementação (TDD: Red -> Green -> Refactor).
- Implemente seguindo os padrões do projeto:
- Controllers -> UseCases -> Services
- autorização por policies/handlers
- mensagens de erro/validação em pt-BR
- Atualize documentação OpenAPI (summary/description/status/errors) quando alterar contratos.
- Se houver mudança arquitetural, atualize/crie ADR em
docs/adr/. - Rode a suíte de testes aplicável e valide Swagger/health checks.
- Abra PR com impacto arquitetural explícito e referência de ADR (quando aplicável).
docker compose up --build- App (UI + API):
http://localhost:8080 - Swagger (ambiente Development):
http://localhost:8080/swagger
- O hot reload do Blazor WASM está desativado por padrão.
- O build usa caches de NuGet e de compilação via volumes nomeados para acelerar o ciclo local.
Se você encontrar assets antigos no browser, limpe os volumes e recompile:
docker compose down -v
docker compose up --buildPré-requisitos:
- .NET SDK 10
- PostgreSQL 16+
Comandos:
dotnet restore
dotnet build
dotnet run --project src/Bud.ServerO repositório inclui um servidor MCP HTTP em src/Bud.Mcp, que consome a API do Bud.Server.
No transporte HTTP do MCP, o endpoint raiz delega o processamento para IMcpRequestProcessor/McpRequestProcessor,
mantendo Program.cs focado em composição e roteamento.
No ambiente local via Docker Compose:
- API + frontend:
http://localhost:8080 - MCP:
http://localhost:8081
O Bud.Mcp lê configuração na seguinte ordem:
appsettings.jsonappsettings.{DOTNET_ENVIRONMENT}.json- variáveis de ambiente (override)
Chaves suportadas:
BudMcp:ApiBaseUrl(ouBUD_API_BASE_URL)BudMcp:UserEmail(ouBUD_USER_EMAIL) opcional, para login automático no bootBudMcp:DefaultTenantId(ouBUD_DEFAULT_TENANT_ID)BudMcp:HttpTimeoutSeconds(ouBUD_HTTP_TIMEOUT_SECONDS)BudMcp:SessionIdleTtlMinutes(ouBUD_SESSION_IDLE_TTL_MINUTES)
docker compose up --buildO serviço mcp é criado no compose usando:
Dockerfile(targetdev-mcp-web)DOTNET_ENVIRONMENT=Development(usasrc/Bud.Mcp/appsettings.Development.json)BUD_API_BASE_URL=http://web:8080para chamadas internas aoBud.Server- mapeamento de porta
8081:8080para evitar conflito com oweb
Health checks do MCP local:
curl -i http://localhost:8081/health/live
curl -i http://localhost:8081/health/readyExemplo de initialize no endpoint MCP:
curl -s http://localhost:8081/ \
-H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","id":1,"method":"initialize"}'A resposta inclui o header MCP-Session-Id, que deve ser enviado nas chamadas seguintes (tools/list, tools/call, etc.).
Fluxo obrigatório para atualizar catálogo MCP:
dotnet run --project src/Bud.Mcp/Bud.Mcp.csproj -- generate-tool-catalog
dotnet run --project src/Bud.Mcp/Bud.Mcp.csproj -- check-tool-catalog --fail-on-diffRegras importantes do catálogo:
- As ferramentas de domínio (
mission_*,mission_metric_*,metric_checkin_*) são carregadas exclusivamente do arquivosrc/Bud.Mcp/Tools/Generated/mcp-tool-catalog.json. - O
Bud.Mcpfalha na inicialização se o catálogo estiver ausente, inválido, vazio ou sem ferramentas de domínio obrigatórias. - O comando
check-tool-catalog --fail-on-difftambém valida o contrato mínimo de camposrequiredpor ferramenta e retorna erro quando houver quebra de contrato.
Se estiver rodando local com DOTNET_ENVIRONMENT=Development, defina:
BUD_API_BASE_URL=http://localhost:8080.
auth_loginauth_whoamitenant_list_availabletenant_set_currentsession_bootstraphelp_list_actionshelp_action_schemamission_create,mission_get,mission_list,mission_update,mission_deletemission_metric_create,mission_metric_get,mission_metric_list,mission_metric_update,mission_metric_deletemetric_checkin_create,metric_checkin_get,metric_checkin_list,metric_checkin_update,metric_checkin_delete
prompts/listé suportado para compatibilidade de clientes MCP e retorna lista vazia quando não há prompts publicados.auth_loginretornawhoami,requiresTenantForDomainToolsenextStepspara orientar o agente nos próximos passos.session_bootstrapretorna snapshot de sessão (whoami,availableTenants, tenant atual) estarterSchemaspara fluxos de criação.help_action_schemaretornarequired,inputSchemaeexamplepara uma ação específica (ou todas as ações, quandoactionnão é informado).- Em erro de validação da API, o MCP retorna
statusCode,title,detaileerrorspor campo quando disponível.
Scripts disponíveis:
scripts/gcp-bootstrap.sh: prepara infraestrutura base (Artifact Registry, Cloud SQL, service account, secrets).scripts/gcp-deploy-web.sh: deploy doBud.Server.scripts/gcp-deploy-mcp.sh: deploy doBud.McpHTTP.scripts/gcp-deploy-all.sh: executa deploy completo (Bud.Server+Bud.Mcp).
Observação: os scripts de deploy remoto usam Cloud Build para gerar imagens no GCP (não dependem de docker build local).
Fluxo recomendado:
# .env.gcp (na raiz, ignorado pelo git)
# PROJECT_ID="getbud-co-dev"
# REGION="us-central1"
# DB_PASS="" # opcional: se vazio, bootstrap gera automaticamente
# JWT_KEY="" # opcional: se vazio, bootstrap gera automaticamente
./scripts/gcp-bootstrap.sh
./scripts/gcp-deploy-all.shSem .env.gcp, use parametros:
./scripts/gcp-bootstrap.sh \
--project-id "getbud-co-dev" \
--region "us-central1" \
--db-pass "senha-forte" \
--jwt-key "chave-jwt-com-32-ou-mais-caracteres"
./scripts/gcp-deploy-all.sh \
--project-id "getbud-co-dev" \
--region "us-central1"Fluxo manual por etapa:
./scripts/gcp-deploy-web.sh
./scripts/gcp-deploy-mcp.shPara detalhes operacionais e troubleshooting de deploy, consulte DEPLOY.md.
Objetivo: validar ponta a ponta (auth, tenant, CRUD básico e leitura) em ambiente local.
Opção A (recomendada):
docker compose up --buildOpção B (sem Docker):
dotnet restore
dotnet build
dotnet run --project src/Bud.ServerDefina a URL base conforme o modo de execução:
# Com Docker Compose
export BUD_BASE_URL="http://localhost:8080"
# Sem Docker (dotnet run, profile padrão)
export BUD_BASE_URL="http://localhost:5096"curl -s -X POST "$BUD_BASE_URL/api/auth/login" \
-H "Content-Type: application/json" \
-d '{"email":"admin@getbud.co"}'Copie o token da resposta e exporte:
export BUD_TOKEN="<jwt>"curl -s "$BUD_BASE_URL/api/auth/my-organizations" \
-H "X-User-Email: admin@getbud.co"Copie um id e exporte:
export BUD_ORG_ID="<organization-id>"curl -s "$BUD_BASE_URL/api/missions?page=1&pageSize=10" \
-H "Authorization: Bearer $BUD_TOKEN" \
-H "X-Tenant-Id: $BUD_ORG_ID"curl -s -X POST "$BUD_BASE_URL/api/missions" \
-H "Authorization: Bearer $BUD_TOKEN" \
-H "X-Tenant-Id: $BUD_ORG_ID" \
-H "Content-Type: application/json" \
-d '{
"name":"Onboarding - Missão",
"description":"Validação ponta a ponta",
"startDate":"2026-01-01T00:00:00Z",
"endDate":"2026-12-31T23:59:59Z",
"status":"Planned",
"scopeType":"Organization",
"scopeId":"'"$BUD_ORG_ID"'"
}'sequenceDiagram
participant Dev as Dev
participant API as Bud.Server
Dev->>API: POST /api/auth/login (email)
API-->>Dev: token JWT
Dev->>API: GET /api/auth/my-organizations (X-User-Email)
API-->>Dev: organizations[]
Dev->>Dev: define BUD_ORG_ID
Dev->>API: GET /api/missions (Bearer + X-Tenant-Id)
API-->>Dev: lista paginada
Dev->>API: POST /api/missions (Bearer + X-Tenant-Id)
API-->>Dev: missão criada
- Acesse
$BUD_BASE_URL/swaggerpara executar os mesmos fluxos pela UI. - Consulte
GET /health/readypara validar PostgreSQL. - Em caso de erro 403, valide se o header
X-Tenant-Idfoi enviado (exceto cenário global admin em "TODOS").
-
Porta 8080 ocupada
Sintoma: erro ao subirdocker compose up --buildcom bind em8080.
Ação: pare o processo/serviço que está usando a porta ou altere o mapeamento nodocker-compose.yml. -
Falha de conexão com PostgreSQL
Sintoma:/health/readyretorna unhealthy para banco.
Ação: confirme se o containerdbsubiu e se a connection string está correta (ConnectionStrings:DefaultConnection). -
401/403 em endpoints protegidos
Sintoma: chamadas autenticadas falham mesmo após login.
Ação: verifiqueAuthorization: Bearer <token>e, para endpoints tenant-scoped, envieX-Tenant-Id. -
Dados/artefatos antigos no browser
Sintoma: UI não reflete mudanças recentes.
Ação: executedocker compose down -v && docker compose up --builde force reload no navegador.
flowchart TD
A[Erro 401/403] --> B{Tem Bearer token?}
B -- Não --> C[Refaça login em /api/auth/login]
B -- Sim --> D{Endpoint é tenant-scoped?}
D -- Não --> E[Validar payload/headers específicos]
D -- Sim --> F{X-Tenant-Id foi enviado?}
F -- Não --> G[Enviar X-Tenant-Id]
F -- Sim --> H{Usuário pertence ao tenant?}
H -- Não --> I[Selecionar tenant válido em /api/auth/my-organizations]
H -- Sim --> J[Validar policy/regra de autorização do endpoint]
# suíte completa
dotnet test
# testes MCP
dotnet test tests/Bud.Mcp.Tests
# apenas unitários
dotnet test tests/Bud.Server.Tests
# apenas integração
dotnet test tests/Bud.Server.IntegrationTestsObservação:
dotnet testusaBud.slnxe executa tambémtests/Bud.Mcp.Tests.- Testes de integração usam PostgreSQL via Testcontainers.
- Use
dotnet test --nologopara saída mais limpa no terminal. - A solução usa
TreatWarningsAsErrors=true; avisos quebram build/test.
- UI interativa (Development):
http://localhost:8080/swagger - Documento OpenAPI bruto:
http://localhost:8080/openapi/v1.json - A documentação é enriquecida com:
ProducesResponseTypepor endpoint- comentários XML (
summary,response,remarks) - metadados de conteúdo (
Consumes/Produces) quando aplicável
- Para campos enum em payload JSON, a API aceita tanto
string(case-insensitive) quantonumber(compatibilidade retroativa).
O Bud 2.0 usa um sistema de tokens de design baseado no Figma Style Guide.
- Primária: Orange (#FF6B35) - CTAs, estados ativos e ações principais
- Secundária: Wine (#E838A3) - acentos, destaques e ações secundárias
- Crimson Pro: fonte serifada para títulos e destaques
- Plus Jakarta Sans: fonte sem serifa para texto e componentes de interface
Todos os valores de design (cores, tipografia, espaçamento e sombras) são definidos como propriedades CSS em src/Bud.Client/wwwroot/css/tokens.css.
Exemplo de uso:
.button {
background: var(--color-brand-primary);
padding: var(--spacing-3) var(--spacing-4);
border-radius: var(--radius-md);
font-size: var(--font-size-base);
}Veja DESIGN_TOKENS.md para:
- Referência completa de tokens
- Processo de atualização a partir do Figma
- Convenções de nomenclatura
- Boas práticas
O schema do banco é criado automaticamente a partir do modelo EF Core via EnsureCreated() no startup em Development. Não são usadas migrations durante o desenvolvimento.
Para recriar o banco após mudanças no modelo:
docker compose down -v && docker compose up --buildQuando o projeto se aproximar de produção, migrations serão reintroduzidas.
GET /health/live: liveness (sempre saudável).GET /health/ready: readiness (PostgreSQL).
Referência completa com exemplos interativos disponível em /swagger (ambiente Development).
POST /api/auth/loginPOST /api/auth/logoutGET /api/auth/my-organizations
POST /api/organizationsGET /api/organizations— listagem paginada (?search=&page=1&pageSize=10)GET /api/organizations/{id}PUT /api/organizations/{id}DELETE /api/organizations/{id}GET /api/organizations/{id}/workspacesGET /api/organizations/{id}/collaborators
POST /api/workspacesGET /api/workspaces— listagem paginada (?organizationId=&search=&page=1&pageSize=10)GET /api/workspaces/{id}PUT /api/workspaces/{id}DELETE /api/workspaces/{id}GET /api/workspaces/{id}/teams
POST /api/teamsGET /api/teams— listagem paginada (?workspaceId=&parentTeamId=&search=&page=1&pageSize=10)GET /api/teams/{id}PUT /api/teams/{id}DELETE /api/teams/{id}GET /api/teams/{id}/subteamsGET /api/teams/{id}/collaboratorsGET /api/teams/{id}/collaborators-summaryPUT /api/teams/{id}/collaboratorsGET /api/teams/{id}/available-collaborators
POST /api/collaboratorsGET /api/collaborators— listagem paginada (?teamId=&search=&page=1&pageSize=10)GET /api/collaborators/{id}PUT /api/collaborators/{id}DELETE /api/collaborators/{id}GET /api/collaborators/leadersGET /api/collaborators/{id}/subordinatesGET /api/collaborators/{id}/teamsPUT /api/collaborators/{id}/teamsGET /api/collaborators/{id}/available-teams
POST /api/missionsGET /api/missions— listagem paginadaGET /api/missions/{id}PUT /api/missions/{id}DELETE /api/missions/{id}GET /api/missions/progressGET /api/missions/my-missions/{collaboratorId}GET /api/missions/{id}/metrics
POST /api/mission-metricsGET /api/mission-metrics— listagem paginadaGET /api/mission-metrics/{id}PUT /api/mission-metrics/{id}DELETE /api/mission-metrics/{id}GET /api/mission-metrics/progress
POST /api/metric-checkinsGET /api/metric-checkins— listagem paginadaGET /api/metric-checkins/{id}PUT /api/metric-checkins/{id}DELETE /api/metric-checkins/{id}
POST /api/mission-templatesGET /api/mission-templates— listagem paginadaGET /api/mission-templates/{id}PUT /api/mission-templates/{id}DELETE /api/mission-templates/{id}
GET /api/notifications— listagem paginadaGET /api/notifications/unread-countPUT /api/notifications/{id}/readPUT /api/notifications/read-all
GET /api/dashboard/my-dashboard
Organization:
{
"name": "acme.com.br",
"ownerId": "00000000-0000-0000-0000-000000000000"
}Workspace:
{
"name": "Produto",
"organizationId": "00000000-0000-0000-0000-000000000000"
}Team:
{
"name": "Time A",
"workspaceId": "00000000-0000-0000-0000-000000000000",
"parentTeamId": null
}Collaborator:
{
"fullName": "Maria Silva",
"email": "maria@acme.com",
"teamId": "00000000-0000-0000-0000-000000000000",
"leaderId": null
}Mission:
{
"name": "Aumentar NPS",
"description": "Melhorar satisfação do cliente",
"startDate": "2026-01-01T00:00:00Z",
"endDate": "2026-03-31T23:59:59Z",
"status": "Planned",
"scopeType": "Workspace",
"scopeId": "00000000-0000-0000-0000-000000000000"
}Metric Checkin:
{
"missionMetricId": "00000000-0000-0000-0000-000000000000",
"value": 42.5,
"text": null,
"checkinDate": "2026-02-07T00:00:00Z",
"note": "Evolução semanal",
"confidenceLevel": 4
}