mirror of
https://github.com/melgarafael/DeskcommCRM.git
synced 2026-10-02 01:28:34 +08:00
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:
co-authored by
Claude Opus 5
parent
8fae459f6e
commit
9152ab27df
@@ -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
@@ -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
|
||||
|
||||
|
||||
@@ -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".
|
||||
|
||||
@@ -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
@@ -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) >
|
||||
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user