DH

Dudata Hub · advisor report

/improve · standard · swarm ×4 · product surface

plans/ Live

O que consertar primeiro no Hub

Authz server-side no Convex é o P0. O resto (status guards, testes de backend, domínio mobile, docs) desbloqueia confiança e paridade.

Produto

Portal + Backoffice para entregas (SL, pós-campanha, performance). Monorepo bun · web Start · mobile Expo · Convex + Better Auth.

P0 security

3

Mutations abertas, list dumps, reset/invite sem master no server

Planos prontos

5

Handoffs self-contained em plans/001-005

Swarm

A Correctness + Security (thorough)
B Performance + Tests
C Debt + Dependencies
D DX + Docs + Direction

Findings da tabela foram vetados no código (trechos de deliveries, users, mobile domain, package backend).

Recon

Stack

  • PM bun (único lockfile)
  • Apps apps/web, apps/mobile
  • Packages backend (Convex), shared (domínio)
  • Web React 19, TanStack Start client-only, RQ, Tailwind
  • Auth Better Auth + @convex-dev/better-auth
  • Deploy app Convex prod + Firebase / Cloud Run

Verificação

bun run test
bun run typecheck
bun run build
bun run dev
bun run dev:mobile

Intent: CONTEXT.md, docs/adr/*, docs/prd/*. BUILD-NOTES parcial stale.

By design (não findings)

ADR-0005 client-only Start ADR-0003 Convex effectiveStatus derivado SL quota só visual Zustand UI-only (0006)

Prioridade (leverage)

Impacto ÷ esforço, com boost para security HIGH.

# ID Finding Cat Eff Conf Plan
1 SEC-01/02/04 Authz + queries scoped + reset/invite master-only security L HIGH 001
2 CORRECT-01 Precondições de status nas transitions bug M HIGH 002
3 CORRECT-05 submitRequest sem auth → PORTAL_COMPANY_ID bug S HIGH 001
4 SEC-03 Deactivate não revoga sessões security M HIGH 001
5 CORRECT-03 Last-master / self-lockout só no client bug S-M HIGH 001
6 TEST-01 Zero testes no packages/backend tests L HIGH 003
7 DEBT-01/02 Domain fork mobile + workflow paralelo debt L HIGH 004
8 PERF-01 deliveries.list full-table perf M-L HIGH -
9 CORRECT-02 requireAnalyst sem face/role/active bug S HIGH 002
10 DX-04 / DOCS-01 CI só no main + README template dx S HIGH 005

Findings (vetted)

SEC-01 · Auth + role em mutations públicas

HIGH · L

Evidence: users.setClientRole, resetPassword (~472, comentário “gating master-only só no client”), deliveries.accept, companies.create sem deny. getAppUserId serve audit, não boundary.

Impact: com a URL do Convex, dá para convidar masters, resetar senhas, demover users e mover pipeline. RoleGuard na UI não conta.

SEC-02 · Bulk reads sem auth

HIGH · M-L

deliveries.list faz .collect() sem args; users/companies/audit idem. Portal filtra no client. Multi-tenant dump de PII e briefings.

SEC-03 / SEC-04 · Deactivate cosmético · reset/invite abertos

HIGH

Desativar só seta active:false sem matar sessão. Reset/invite são o caminho de takeover mais direto (fatia de 001).

CORRECT-01 · Status preconditions

HIGH · M

accept força next status sem checar doc.status. Exemplares bons: requestRework, approve, moveStage.

Outros correctness (HIGH)

  • CORRECT-02 requireAnalyst só confere slug
  • CORRECT-03 last-master só no client
  • CORRECT-04 provision BA + domínio não-transacional
  • CORRECT-05 submitRequest → PORTAL_COMPANY_ID sem auth
  • CORRECT-06 nome em HTML de email sem escape (MED)
  • SEC-05 confirmNps público vs Typeform assinado

Perf · Tests · Debt · DX

Perf

PERF-01 list full · PERF-02 contabilidade triple collect · PERF-03 audit N+1 · PERF-04 events[] · PERF-05 LP assets

Tests

TEST-01 backend zero · TEST-02 mocks ≠ server · TEST-03 read-models fora do default · TEST-04/05 gaps mobile/invite

Debt / deps

DEBT-01/02 mobile fork · DEBT-03 BUILD-NOTES · DEBT-04 RQ incompleto · DEP-01 latest TanStack · DEP-02 skew · DEP-03 resend no web

DX / docs

Sem AGENTS root · lint web · env.example · CI só main · README template · ADR 0005×3

Direction

Opções de produto, não bugs ranqueados.

  1. DIR-01 · Authz server-side como feature

    ADR-0005 desbloqueou a dívida. Sem isso o Hub não é multi-tenant honesto. Effort L; risco de lockout se a matriz errar.

  2. DIR-02 · Usuários portal no Backoffice

    PRD-0001 + setClientRole sem UI. CONTEXT adia; vira gap quando clientes reais entram.

  3. DIR-03 · NPS Typeform + Slack multi-canal

    Código e tabela prontos; sem env vira simulado ou drop silencioso.

Planos 001-005

Plan Título Prio Depends Status
001 Authz + scoped queries P0 - TODO
002 Precondições de status P0 001 ideal TODO
003 Testes backend Convex P1 001-002 TODO
004 Mobile → @dudata/shared P1 paralelo TODO
005 README + AGENTS + env P2 paralelo TODO
001 (authz) ──┬──► 002 (status) ──► 003 (backend tests)
              │
004 (mobile shared)     paralelo
005 (docs)              paralelo

Considered & rejected

  • Falta SSR - ADR-0005
  • Convex vs Postgres - ADR-0003
  • monthlySlQuota não bloqueia - by design
  • effectiveStatus derivado - ADR-0004
  • Zustand = dívida - não; só theme/currentCompanyId
  • Relatórios incompletos - createRecurringPerf + contabilidade SL shipados

Não auditado

  • iOS Pods / build nativo profundo
  • IaC Firebase/Cloud Run além do app
  • Lighthouse métrico da LP
  • CVE matrix transitiva completa
  • Flakiness Maestro em CI real

Próximo passo

  1. Confirmar top-5 ou pedir plano extra (PERF-01, SEC-05…).
  2. Executar 001 (ou fatia reset/invite) primeiro.
  3. 005 (docs) em paralelo, zero risco de runtime.

Skill /improve · artefatos em plans/ · UI product monochrome (Impeccable + Taste) · zinc cool neutrals.