docs(auditoria): remede os numeros e declara a regua de cada um

Revisao de manutencao do PR #60, medida contra origin/main @ b190bbf.
Cada correcao veio de uma contagem refeita, nao de leitura:

- AGENTS.md: "Zod 3" -> Zod 4 (package.json declara ^4.4.3). Importa porque a
  secao e rotulada CONFIRMADO: um agente escreveria idioma zod 3 num repo zod 4.
- AGENTS.md: Playwright 1.61 -> 1.62 (^1.62.0).
- AGENTS.md: o CI roda 22 -> o job `ci` roda 22, mas `perf` ainda builda em 20,
  divergindo de engines >=22. Fica registrado como bug, nao escondido.
- ARCHITECTURE.md: 149 handlers -> 166. O 149 era resquicio da primeira passada;
  169 e a contagem de app/api/**, 166 e a de /api/v1/. Regua declarada nos dois.
- ARCHITECTURE.md: 9 endpoints de cron -> 10.
- index/current-state/harness-audit: 123 docs -> 119 .md em docs/, 23 subpastas,
  com o comando que reproduz o numero.
- threat-model/current-state: 109 PNGs -> 116. O 78 de evidence/ contava so o
  nivel de cima; ha mais 7 em evidence/wave3-pulso/.

Os 97 links internos foram revalidados apos as edicoes: 0 quebrados.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01H4GmcUD87RRTwHonr7v7pr
This commit is contained in:
Rafael Melgaço
2026-07-30 10:49:11 -03:00
co-authored by Claude Opus 5
parent 8fae459f6e
commit 9152ab27df
6 changed files with 26 additions and 17 deletions
+5 -4
View File
@@ -22,15 +22,16 @@ quebra no clone fresco é um bug de produto, não um detalhe de ambiente.
Next.js 16.2 (App Router) · React 19.2 · TypeScript 6.0 estrito · Tailwind 3.4 ·
shadcn/ui · Supabase (Postgres + Auth + Realtime + Storage) · Upstash Redis ·
Vercel AI Gateway (`@ai-sdk/anthropic|openai|google`) · WAHA Plus (engine NOWEB) ·
Zod 3 · Vitest 4 · Playwright 1.61 · Sentry 10.
Runtime: **Node ≥22** (`.nvmrc` = 22, e o CI roda 22). Gerenciador: **pnpm 9.15.9** (`packageManager`).
Zod 4 · Vitest 4 · Playwright 1.62 · Sentry 10.
Runtime: **Node ≥22** (`.nvmrc` = 22; o job `ci` roda 22, mas o `perf` ainda builda em 20 —
divergência com `engines`, registrada como bug). Gerenciador: **pnpm 9.15.9** (`packageManager`).
Versão do produto: **1.0.0** (`CHANGELOG.md`, SemVer — mudança que afeta quem roda VPS entra lá).
## Estrutura que importa
| Path | O quê |
|---|---|
| `app/api/v1/` | 169 route handlers REST (versionado por path) |
| `app/api/v1/` | 166 route handlers REST (versionado por path) — 169 contando `app/api/**` |
| `app/api/internal/`, `app/api/mcp/`, `app/api/v1/cron/` | superfícies não-cookie (secret/bearer próprio) |
| `app/app/` | UI autenticada do tenant · `app/admin/` UI de plataforma |
| `app/actions/` | Server Actions (auth, onboarding, team, settings) |
@@ -126,7 +127,7 @@ usuário, ninguém além de você vai provar que funciona.
env var, adicione nos dois lugares (item 9 do DoD).
- `lib/auth/invite-token.ts` cai em `"dev-fallback"` como secret HMAC se nenhum secret existir
(inalcançável em produção, porque `INTERNAL_SECRET` é obrigatório e derruba o boot).
- **89 dos 169 handlers usam service role** — sem gate automático para o filtro de
- **89 dos 169 handlers de `app/api/**` usam service role** — sem gate automático para o filtro de
`organization_id`. Escrevendo handler novo, o filtro é responsabilidade sua.
- Detalhes e prioridade: [`docs/harness-audit.md`](docs/harness-audit.md),
[`docs/current-state.md`](docs/current-state.md) e [`docs/threat-model.md`](docs/threat-model.md).
+2 -2
View File
@@ -34,7 +34,7 @@ Detalhes: [`docs/specs/01-spec-platform-base.md`](docs/specs/01-spec-platform-ba
## Fluxo de uma requisição
**Rota autenticada de tenant** (`/api/v1/*`, 149 handlers):
**Rota autenticada de tenant** (`/api/v1/*`, 166 handlers):
```
request → proxy.ts (X-Request-Id, x-pathname; isPublicPath? → bypass;
@@ -63,7 +63,7 @@ Triggers Postgres emitem linhas em `event_log`. Workers (cron / Realtime listene
Workers vivem em `workers/` (`ai-response`, `ai-sentiment`, `rag-indexer`, `media-persist`,
`media-derive`, `lgpd-export`, `lgpd-redact`, `storage-cleanup`, `agent-worker`), drenados
pelos 9 endpoints em `app/api/v1/cron/`. Contrato: [`docs/specs/07-spec-events-workers.md`](docs/specs/07-spec-events-workers.md).
pelos 10 endpoints em `app/api/v1/cron/`. Contrato: [`docs/specs/07-spec-events-workers.md`](docs/specs/07-spec-events-workers.md).
## Integrações externas
+8 -2
View File
@@ -21,6 +21,11 @@ screenshots), o que é bom sinal, mas nada aqui foi re-verificado por execução
auditoria — a auditoria é read-only por instrução. Métricas de código, contagem de
arquivos, conteúdo de CI e cobertura de padrão **foram** verificados diretamente.
**Revisão de manutenção (2026-07-30, `origin/main` @ `b190bbf`):** as contagens da §1 e as
versões de biblioteca do `AGENTS.md` foram remedidas por um mantenedor na revisão do PR #60.
Onde a régua divergiu, ela passou a ser declarada junto do número. O estado de épico (§2–§3)
**não** foi re-verificado nesta revisão — segue valendo o aviso acima.
---
## 1. Números do repositório — CONFIRMADO
@@ -36,7 +41,7 @@ o projeto vinha sendo desenvolvido publicamente desde abril de 2026 sem tags.
| Testes unitários (`*.test.ts(x)`) | 221 arquivos |
| Invariantes de banco (`tests/invariants/`) | 56 arquivos |
| Specs E2E (`tests/e2e/`) | 19 |
| Documentos `.md` em `docs/` | 123 |
| Documentos `.md` em `docs/` | 119 (em 23 subpastas) |
| Import cycles | **0** (graphify, medido em árvore anterior) |
| `console.log` fora de `lib/logger.ts` | **0** |
| `: any` / `as any` | 7 |
@@ -175,7 +180,8 @@ ausentes). `.gitignore` cobre `.env*` corretamente — a proteção é só essa
Registrado porque a primeira passada desta auditoria apontou 11 PNGs de evidência
commitados na raiz. **Já foram movidos**: hoje há **zero** PNGs rastreados na raiz — a
evidência vive em `evidence/` (78), `docs/evidence/` (18) e `loop/checkpoints/evidence/` (13).
evidência vive em `evidence/` (85, contando as subpastas), `docs/evidence/` (18) e
`loop/checkpoints/evidence/` (13) — **116** no total.
Dois HANDOFFs também migraram para `docs/handoffs/`. Restam 3 na raiz (`HANDOFF.md`,
`-harness-evolution`, `-operacao-visivel`), o que é consistente com "épico vivo fica visível,
épico encerrado é arquivado".
+1 -1
View File
@@ -23,7 +23,7 @@ verificados por leitura de arquivo, config e workflow.
| Nível | Veredito | Evidência |
|---|---|---|
| H0 — Não documentado | superado | 123 docs, README de 302 linhas em 3 idiomas, PRDs, specs, `CHANGELOG.md` |
| H0 — Não documentado | superado | 119 docs em `docs/`, README de 302 linhas em 3 idiomas, PRDs, specs, `CHANGELOG.md` |
| H1 — Documentado | ✅ | `README.md`, `ARCHITECTURE.md`, `VISION.md`, `CLAUDE.md`, `CONTRIBUTING.md`, `SECURITY.md`, `CHANGELOG.md` (Keep a Changelog + SemVer) |
| H2 — Reproduzível | ✅ | Quickstart no README, `docs/SETUP.md`, `.nvmrc` (22), `packageManager` fixo, `pnpm-lock.yaml`, `docker-compose.yml`, `install.sh` do kit self-host, `baseline.sql` |
| H3 — Verificável | ✅ | `lint` + `typecheck` + `test:unit` + `build`; CI roda os 3 primeiros em PR |
+4 -3
View File
@@ -10,9 +10,10 @@ audited_against: origin/main @ 789dfa6 (v1.0.0, 2026-07-27)
# Índice da documentação — DeskcommCRM
Mapa dos 123 documentos do repositório. Existe porque a documentação cresceu em
19 pastas sem ponto de entrada: sem este índice, humano e agente não acham o que
já foi decidido e reescrevem por cima.
Mapa dos **119** arquivos `.md` de `docs/`, espalhados por **23** subpastas — régua:
`git ls-files 'docs/**/*.md' | wc -l`. Existe porque a documentação cresceu sem ponto
de entrada: sem este índice, humano e agente não acham o que já foi decidido e
reescrevem por cima.
**Regra de precedência quando dois docs discordam:**
`CLAUDE.md` (doutrina) > `docs/specs/` (contrato técnico) > `docs/prd/` (intenção) >
+6 -5
View File
@@ -89,7 +89,8 @@ essas duas vars ficam populadas em toda instalação.
### T3 — 89 handlers com service role, sem gate de escrita 🟠 CONFIRMADO (contagem)
`createAdminClient` (service role, **bypassa RLS**) é importado em **89 dos 169** route
handlers. A regra da doutrina — "filtre `organization_id` manualmente, resolvido de fonte
handlers de `app/api/**` (dos quais 166 estão sob `/api/v1/`). A regra da doutrina —
"filtre `organization_id` manualmente, resolvido de fonte
confiável, nunca do body" — é aplicada por revisão humana. Não há lint rule nem teste que
falhe quando um handler *novo* esquece o filtro.
@@ -159,8 +160,8 @@ Sem gitleaks/trufflehog no CI, sem pre-commit hook (`.husky` e `.pre-commit-conf
ausentes). `.gitignore` cobre `.env*` corretamente, e essa é a única camada.
Agravante específico deste repo: a doutrina de QA visual **incentiva commitar evidência
visual**, e há **109 PNGs rastreados** (78 em `evidence/`, 18 em `docs/evidence/`, 13 em
`loop/checkpoints/evidence/`). Screenshot de tela autenticada pode conter telefone, nome de
visual**, e há **116 PNGs rastreados** (85 em `evidence/` contando subpastas, 18 em
`docs/evidence/`, 13 em `loop/checkpoints/evidence/`). Screenshot de tela autenticada pode conter telefone, nome de
cliente ou token em URL — e várias evidências são explicitamente descritas nos HANDOFFs como
tiradas em **conta e conversa reais de WhatsApp**. Num repo público, é irreversível.
@@ -192,7 +193,7 @@ Não avaliado por falta de execução/instância:
| T3 | Service role sem gate de escrita para handler novo | 🟠 | médio (lint rule) — invariantes já cobrem em CI |
| T4 | `"dev-fallback"` como secret de convite | 🟠 | trivial |
| T5 | 3 secrets fora do `.env.example` | 🟠 | trivial |
| T7 | Sem scan de secret no CI + 109 PNGs de evidência sem revisão de PII | 🟡 | baixo |
| T7 | Sem scan de secret no CI + 116 PNGs de evidência sem revisão de PII | 🟡 | baixo |
| T6 | Guard de SSRF existe; o E2E que o prova não roda no CI | 🟢 | baixo |
**Conclusão honesta:** os *mecanismos* de segurança deste projeto são acima da média para
@@ -212,7 +213,7 @@ construídas.
(decide a severidade de T2)
2. Alguma instância de produção já rodou sem `INTERNAL_SECRET` definido? (decide se T4 já
foi exposto em campo)
3. Os 109 PNGs de evidência foram revisados quanto a PII antes do commit? Vários são
3. Os 116 PNGs de evidência foram revisados quanto a PII antes do commit? Vários são
descritos como tirados em conta e conversa reais de WhatsApp.
4. Existe branch protection exigindo os dois checks do CI verdes no merge? (não é visível
no checkout)