canna-br · Componentes

TEMP showcase

EventStormingBoard

Quadro de EventStorming (Brandolini grammar) com suporte a todos os 8 tipos de cards, hotspots, legenda e cards pivotais. Scroll horizontal, zero JS.

src/components/EventStormingBoard.astro

Flavor A — Board completo (5 colunas, pivotal, all types)

Fluxo Membro→Dispensação — canna-br v0.1

Quota reset automático ou manual? SNGPC envio: síncrono ou batch noturno?
Actor Diretor
Actor Membro
Command RegisterMember
Command RecordDispensation
Aggregate Membership
Aggregate Dispensation
Domain Event MemberRegistered
Domain Event DispensationRecorded
Policy Quota Reset Policy
Read Model MemberQuotaView
Read Model DispensationLog
External System SNGPC Gateway
Legenda Domain Event Command Actor Policy Read Model Aggregate External System Hotspot Pivotal (marco)

Flavor B — Mini board (2 colunas, sem hotspots)

Provisionamento de Associação

Command ProvisionAssociation
Actor Admin
Aggregate Association
Domain Event AssociationProvisioned
Legenda Domain Event Command Actor Policy Read Model Aggregate External System Hotspot Pivotal (marco)

UseCaseMatrix

Catálogo de use cases da camada de aplicação com tipo (Command/Query), superfícies expostas (MCP/Web/App) e chips de presença. Golden Circle intro integrado. Zero JS, SSR puro.

src/components/UseCaseMatrix.astro

Flavor único — 3 grupos, 8 use cases, mix command/query, surfaces variadas
Por quê

O domínio precisa ser legível para humano e para o agente. Use cases semânticos = linguagem ubíqua que os dois entendem.

Como

A camada @canna/app-services expõe use cases; o MCP os expõe as-is — 1 use case = 1 tool; cada um aparece numa ou mais superfícies (MCP · Web · MCP App).

O quê

O catálogo abaixo — cada use case, o que faz, e onde é exposto.

Legenda muda estado lê estado exposto como tool (NL → chamada) superfície web própria (REST/página) MCP App que renderiza (query) ou invoca (command) ausente / via chat NL
Use Case
Tipo
MCP
Web
App
Gestão de Associação
ProvisionAssociation Cria tenant + configura infra para nova associação
Command
MCP provision_association
Web
App candidato
UpdateAssociationProfile Atualiza nome, CNPJ, endereço, logo
Command
MCP update_association_profile
Web
App
GetAssociationStatus Retorna estado atual, limites e compliance flags
Query
MCP get_association_status
Web
App candidato
Membros e Dispensações
RegisterMember Admite sócio + provisiona acesso + emite convite
Command
MCP register_member
Web
App MemberRegistrationForm
RecordDispensation Registra retirada respeitando quota ativa do membro
Command
MCP record_dispensation
Web
App DispensationForm
ViewMemberQuota Consulta consumo atual vs. limite mensal
Query
MCP view_member_quota
Web
App
Compliance e Relatórios
GenerateTraceabilityReport Relatório rastreabilidade pronto p/ diretoria
Query
MCP generate_traceability_report
Web
App
SubmitSNGPC Envia dados ao sistema SNGPC da Anvisa
Command
MCP submit_sngpc
Web
App

Use cases sem App ainda são acionados via chat NL (linguagem natural → tool call). App: candidato = widget planejado, ainda não construído. Use cases nomeados (ex: DispensationForm) já têm widget live.


InviteReturnContract

Demonstra o padrão "retorno é o artefato acionável": (1) card de convite MCP App com botão copiar, (2) contrato de retorno JSON, (3) tabela de oportunidades use-case × artefato com badges de versão. Dados baked-in (sem props). Copy button com toast feedback.

src/components/InviteReturnContract.astro

Flavor único — invite card Casa da Mata + JSON contract + opportunity table

MCP Operacional  ·  Resultado da ferramenta

Convite Casa da Mata São Vicente

Olá Thiago, sua associação está provisionada no canna-br. Você é o administrador inicial (Diretor).

Primeiro acesso (credencial temporária):

Login
thiago@casa-da-mata-sv.cannabr.org
Senha
thiago@casa-da-mata-sv.cannabr.org (igual ao login)

No 1º login você define a senha real + ativa 2FA. A credencial temporária expira em 7 dias.

json provision_association + seed_admin_user → output
{
  "association": {
    "id": "assoc_…",
    "slug": "casa-da-mata-sv",
    "name": "Casa da Mata São Vicente",
    "tenant": "casa-da-mata-sv"
  },
  "admin": {
    "name": "Thiago",
    "role": "Diretor",
    "login": "thiago@casa-da-mata-sv.cannabr.org",
    "must_change_credentials": true,
    "expires_at": "2026-06-18T00:00:00Z"
  },
  "invite": {
    "subject": "Convite — Casa da Mata São Vicente no cannabr.org",
    "body_markdown": "…",
    "body_plain": "…",
    "copy_paste": "🌿 Convite — Casa da Mata São Vicente …"
  }
}

A chamada foi provision_association + seed_admin_user via o MCP Operacional; o campo que importa para a UX é invite.copy_paste.

Cada use case devolve hoje apenas o registro. A coluna "Devia devolver" mostra o artefato agent-first que fecha o loop para o operador ou membro.
Use Case Devolve hoje Devia devolver (artefato) Versão
provision / seed_admin ids convite admin copy-paste v0.1.0
reset_credential ok mensagem "nova senha temporária" pronta v0.1.0
registerMember member id boas-vindas + link de 1º acesso do membro (WhatsApp-ready) + carteirinha digital v0.1.0
viewMemberQuota (perto do limite) número nudge "40/45g este mês" pro membro v0.1.0
1º login concluído coach "bem-vindo · próximos 3 passos" v0.1.0
recordDispensation event recibo de dispensação pro paciente (PDF / texto) v0.2
generate_traceability_report data relatório pronto pro grupo da diretoria v0.2
submit_sngpc protocolo confirmação de protocolo copy-paste v0.2
explain_compliance_gap gaps checklist de remediação acionável v0.2
membership / prescrição expirando lembrete de renovação pronto v0.2

CoordMetrics

Dashboard de métricas de coordenação Kanban: KPI strip, gráfico de cycle time (inline SVG + linha SLA dashed amber), cost ledger entry auditável, tabela detalhada por lane e diagrama de fluxo work→barrier→verify. Dados baked-in, zero JS.

src/components/CoordMetrics.astro

Flavor único — missão canna v0.1.0 finalize · 4 lanes · US$2.29
9 min Lead Time missão completa
4 Lanes 3 work + 1 verify
100% SLA <5 min 4 / 4 lanes
1.53× Speedup paralelismo
3 → 1 WIP work → verify
Cost Ledger Entrada #1
Pago por
Gabriel Fonseca
Data
2026-06-11
Modelo
claude-sonnet-4-6
Total
US$ 2,29
Tokens
2.521.557
Missão
task#7hf358
Motivo do custo
Dominado por cache writes (context priming de 3 lanes paralelas)
Próximas entradas pendentes (valores a confirmar com Gabriel): Domínio cannabr.org (Hostinger) + plano e-mail Hostinger — serão registrados como Entradas #2 e #3 ao receber os valores.
Detalhamento por lane — missão canna v0.1.0 finalize · 2026-06-11
Lane Capacidade Ciclo (s) Tokens Custo USD SLA <5 min
page-mdx Domínio canna.br → cannabr.org + 5 linhas v0.2 re-add 89.7 665.265 0.49
invite-comp Domínio canna.br → cannabr.org (convite) 87.1 498.541 0.44
widget-html Remover 3 campos v0.2 do DOM (member-registration) 156.9 1.112.243 0.62
verify Build green (288 pgs) + grep + render check 169.3 245.508 0.73
Total 329.6 2.521.557 2.29 4/4
Motor Claude Code Workflow tool orquestração declarativa de lanes
Modelo por lane claude-sonnet-4-6 coord Opus · sub-agents Sonnet
Padrão 3 lanes paralelas → barrier → verify file-isolated, sem race condition
Timebox < 5 min por lane 100 % das lanes respeitaram

Cada lane opera em arquivo isolado — sem conflito de merge. O Workflow tool garante que a fase verify só inicia após todas as 3 lanes work completarem (barrier semântico). Métricas são registradas no ledger SurrealDB do manager via task task#7hf358 (lead-time medido da abertura ao fechamento da missão). Premissa do projeto: everything is metrified.


ReleasesDashboard

Fonte única de verdade para versões, roadmap e changelog. Fetch client-side de /releases.json (dado fixo em disco). Skeleton shimmer durante carregamento. Suporta 4 views: badge, roadmap, changelog, full.

src/components/marketing/widgets/ReleasesDashboard.astro

view="badge" — inline compact, versão + status + test count

view="roadmap" — current release card + roadmap grid

view="changelog" — releases newest-first + pre-milestones

view="full" — badge + roadmap + changelog combinados

StateSnapshot

Ilha "estado da rede" — lê /state-snapshot.json client-side e renderiza 4 cards: pilotos ativos, módulos entregues, releases recentes, próximos marcos. Skeleton shimmer → hydrate. Carimbo "atualizado em" com pulse dot.

src/components/marketing/widgets/StateSnapshot.astro

Flavor único — lê /state-snapshot.json (fixo em disco)