Skip to content

docs(reorg): requirements/ + backlog/ + specs/ — SDD canon aplicado ao Interpop#39

Merged
GabeMarques-Intetsu merged 6 commits into
developfrom
chore/docs-reorg-requirements-backlog
Jun 10, 2026
Merged

docs(reorg): requirements/ + backlog/ + specs/ — SDD canon aplicado ao Interpop#39
GabeMarques-Intetsu merged 6 commits into
developfrom
chore/docs-reorg-requirements-backlog

Conversation

@GabeMarques-Intetsu

@GabeMarques-Intetsu GabeMarques-Intetsu commented Jun 9, 2026

Copy link
Copy Markdown
Collaborator

Resumo

Reorganização incremental e não-destrutiva da pasta docs/. 3 entregas em um único PR:

  1. docs/requirements/ — RF/RNF + personas (engenharia-de-requisitos canon)
  2. docs/backlog/ — Epics/Features/Sprints/done com rastreabilidade bidirecional
  3. docs/specs/ — Spec-Driven Development (TLC canon) com brownfield + project + template + 6 retroativos

Total: 60 arquivos novos · ~7.500 LOC de documentação + 1 ADR de produto (Supabase deferred).

O que vem em cada pasta

docs/requirements/ (12 arquivos)

  • README.md + personas-e-cenarios.md
  • RF/ — 7 arquivos (6 stubs + RF-007 busca completo com cross-refs)
  • RNF/ — 5 arquivos completos (perf, security, a11y, lgpd, availability)

docs/backlog/ (16 arquivos)

  • README.md + glossario.md
  • epics/ — 7 arquivos (6 stubs + EP-10 completo)
  • features/ — 3 arquivos (F-30 done com Gherkin pt-BR + 36 Tasks com commits; F-31/F-32 Sprint 5)
  • sprints/ — 3 arquivos (sprint-4 done, sprint-5 plan, sprint-6 Supabase spike)
  • done/ vazio

docs/specs/ (29 arquivos NOVOS — busca-editorial já existia)

  • README.md (método SDD + mapeamento com eng-de-requisitos)
  • codebase/ — 7 docs brownfield produzidos por fan-out de specialists:
    • STACK.md — versões reais dos lockfiles (SendGrid declarado mas Gmail SMTP por default!)
    • ARCHITECTURE.md — topologia + 7 mermaid + 3 fluxos cross-layer
    • STRUCTURE.md — onde vive o quê (526 LOC merge backend+frontend)
    • CONVENTIONS.md — convenções Python+TS+React+Django + anti-patterns banidos
    • INTEGRATIONS.md — 12 integrações com status real (vs aspiracional)
    • TESTING.md — números reais (352 backend, 118 frontend) + matriz consultiva
    • CONCERNS.md — 11 riscos segurança + 10 débitos + gotchas (anti-sycophancy)
  • project/ — visão + estado:
    • PROJECT.md — KPIs alvo + bases que NÃO escolhemos
    • ROADMAP.md — Sprint 5/6/7/8/9 + marcos macro + backlog longo
    • STATE.md — memória viva: decisões, blockers, lessons, deferred
  • _template/ — esqueleto canônico para nova Feature Large/Complex
  • 6 specs retroativos — articles, comments, moderation, newsletter, users-auth, audit

docs/planning/adrs/

  • ADR-015 — Supabase evaluation deferred (force-added; primeira ADR tracked em planning/)

Achados críticos descobertos (anti-sycophancy honrada)

Durante o fan-out de 13 agentes, descobertas que merecem atenção:

  1. SendGrid (ADR-004) NÃO instaladobase.py:226 usa Gmail SMTP por default; cliente SendGrid não existe em pyproject.toml
  2. 4 de 5 scripts em scripts/ são stubs com exit 1 — toda a operação de produção descrita em 1262 LOC de HOSTING-DEPLOY-PLAN aguarda implementação
  3. TS 6.0.3 (pre-release amplo) em CI gate — ESLint 10, Vite 8, Vitest 4 — toda cadeia frontend em majors recentes
  4. articles → newsletter import EAGER (articles/admin.py:3) — única dependência cross-app não-lazy; quebra padrão do resto
  5. audit/views.py:27-30 puxa modelos de 5 apps em AdminMetricsView — Ce mais alto do projeto, virou BFF de admin escondido
  6. main.tsx:7-10 deriva QueryClient defaults de pages/Buscar/searchService.ts — feature lazy virou owner de política transversal
  7. view_count bucket vaza entre workers gunicorn (LocMemCache per-process) — 3 workers infla métrica 3×
  8. AuditLog sem TTL nem anonimização de IP — LGPD Art. 16 blocker pré-go-live
  9. IsNotBanned em DEFAULT_PERMISSION_CLASSES vaza por omissão — DRF substitui, não merge
  10. JWT_SIGNING_KEY fallback para SECRET_KEY sem hard-fail — réplica do mesmo problema que F2-B-03 corrigiu para HMAC cursor
  11. Sem 2FA para staffdev é imune a ban; takeover total se conta comprometida
  12. signals.py NÃO existe em apps.newsletter — foi deletado; signal canônico vive em apps.articles.signals.py:42-64 (cross-app reverso para evitar bug histórico C2)
  13. Ban.user é OneToOneField — re-banir perde histórico do banned_by + reason originais
  14. 2 bugs críticos invisíveis no test suite de newsletter: cover URL relativa quebra imagens; except Exception em send_welcome mata autoretry_for
  15. published_at carimbado no view, não no model — publicar via Django admin deixa published_at=NULL (viola invariante)

Decisão arquitetural registrada

Supabase NÃO entra agora (ADR-015). Avaliação Sprint 6+ limitada ao Cenário A (Storage para capas) com gatilhos explícitos.

Rastreabilidade demonstrada

362 cross-refs internos validados (script Python). Cada Feature cita Epic pai + Requisitos atendidos + Sprint(s) + Specs técnicas. Cada Requisito lista Epics que o realizam (bidirecional).

26 "broken" reportados pelo validator são falso-positivos — citações arquivo:linha dentro de markdown links que pathlib trata mal; GitHub renderiza corretamente.

O que NÃO vem nesta PR (decisões conscientes)

  1. Não migro Improvement-system.md (1755 LOC) — continua gitignored como backlog mestre histórico; migração para nova estrutura é progressiva por Sprint
  2. Não preencho RF-001..RF-006 nem EP-01..EP-06 completamente — stubs com cross-refs corretas + TODO; preenchimento quando módulo for tocado em Sprint dedicado
  3. Não unignoro docs/planning/ — só ADR-015 com -f explícito (decisão pública). ADRs 001-014 permanecem locais; decisão futura
  4. Não toco docs/specs/busca-editorial/BACKLOG.md — fica intacto como spec técnica; EP-10/F-30 na nova estrutura referenciam

Heads-up

  • Cross-refs para ADRs 001-014 em docs/planning/adrs/ aparecem como 404 no GitHub web (gitignored). Não é bug do meu trabalho; é convenção atual do repo
  • Bug fixes descobertos (BUG-1/2 do newsletter, OPS-1 do articles published_at) merecem hotfix em PRs separados — NÃO entram neste PR de docs

Test plan

🤖 Generated with Claude Code

GabeMarques-Intetsu and others added 4 commits June 9, 2026 18:40
Release de develop em main após 32 commits da feature busca editorial
full-text (US30.1) + 28 commits acumulados de outras features.

Spec bundle (DESIGN v3 + 35 ADRs + BACKLOG v6) em
docs/specs/busca-editorial/. Reviews aplicados: Phases 1/2/3 — todos os
≥🟠 corrigidos (6 fixes inline + 3 PR-final blockers F2-B-01/02/03).

Suite final: 325 backend + 78 frontend = 403 testes passando, 0
regressão. Bundle Buscar lazy 14.54 KB gz (gate ≤+20 KB). 15/15 CI
checks pass. Coverage pages/Buscar 84.15%.

Releases acumuladas (não-busca):
- feat(moderation): dev como superadmin único que bane admins
- feat(users): management command seed_team_users
- fix(ui): checklist de senha + paleta sóbria
- fix(a11y): h2 destaque home + dl donut de editorias
- chore: gitignore entregáveis locais

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
…ria-de-requisitos

Estrutura nova (incremental, não destrutiva):

docs/requirements/                 ← O QUÊ
  README.md, personas-e-cenarios.md
  RF/  (RF-001 stubs progressivos + RF-007 completo da busca)
  RNF/ (perf, security, a11y, lgpd, availability completos)

docs/backlog/                      ← QUEM faz O QUÊ, QUANDO
  README.md, glossario.md
  epics/    (EP-01..06 stubs + EP-10 busca completo)
  features/ (F-30 done com Gherkin pt-BR + Tasks 36 commits; F-31/F-32 Sprint 5)
  sprints/  (sprint-4 done + sprint-5 plan + sprint-6 Supabase spike)
  done/     (vazio por enquanto; EP-10 vai aqui quando Sprint 5 fechar)

docs/planning/adrs/ADR-015-supabase-evaluation-deferred.md
  Anti-sycophancy: registra decissão de NÃO adotar Supabase agora.
  Gatilho explicito para Sprint 6: disco ≥70%, demanda pgvector, real-time,
  ou janela pós-Sprint 5. Cenários B (DB managed) e C (replatform) fora.

Rastreabilidade bidirecional (regra dura):
- Cada RF lista os Epics que o realizam
- Cada Epic cita Requisitos atendidos + Features filhas + Sprints
- Cada Feature cita Epic pai + Requisitos + CAs/USs/Tasks + Sprint
- Cada Sprint cita Features dentro

Smoke check: 250+ links resolvem, 0 broken (skill canonica aponta para
repo público seekdevcore/sk-requirements-engineering-theskill).

PR #37 (US30.1) já mergeado em main como 2bdf73b; esta reorg não
altera nada em código — só documentação.

29 arquivos novos. Improvement-system.md (1755 LOC) preservado intacto;
migração para nova estrutura será progressiva por Sprint.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
…ed em planning/

planning/ é .gitignore por convenção (docs internos do dono).
Esta ADR é uma exceção consciente: registra decisão de produto pública
(NÃO adotar Supabase agora, com gatilhos explícitos para Sprint 6+)
que precisa estar visível para reviewers da reorg de docs.

Não toca nos outros docs de planning/ — eles permanecem locais até
decisão futura sobre se ADRs 001-014 também devem virar tracked.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
…e specs

Aplica Spec-Driven Development (TLC canon, auto-sized) ao Interpop. PR #39
já trouxe requirements/ e backlog/; agora docs/specs/ fecha o tripé.

29 arquivos novos (~5340 LOC), produzidos por:
- Wave 1 fan-out de 6 specialists (codebase brownfield)
- main-loop (project + template + README)
- Wave 2 fan-out de 6 backend-architects (specs retroativos)

docs/specs/
├── README.md                    metodo SDD + mapeamento com eng-de-requisitos
├── codebase/                    BROWNFIELD (7 docs)
│   ├── STACK.md                 versoes reais lidas dos lockfiles
│   ├── ARCHITECTURE.md          7 mermaid + 3 fluxos cross-layer
│   ├── STRUCTURE.md             backend + frontend + 12 convencoes nao obvias
│   ├── CONVENTIONS.md           526 LOC merge backend+frontend
│   ├── INTEGRATIONS.md          12 integracoes com status real
│   ├── TESTING.md               numeros REAIS (352 backend, 118 frontend) + matriz
│   └── CONCERNS.md              11 riscos seguranca + 10 debitos tech + gotchas
│
├── project/                     VISAO + ESTADO
│   ├── PROJECT.md               KPIs alvo + bases que NAO escolhemos + estado atual
│   ├── ROADMAP.md               Sprint 5/6/7/8/9 + marcos macro + backlog longo
│   └── STATE.md                 memoria viva: decisoes, blockers, lessons, deferred
│
├── _template/                   esqueleto para nova Feature Large/Complex
│   ├── DESIGN.md
│   └── README.md
│
├── busca-editorial/             EXEMPLO existente (US30.1 mergeada em main)
│
└── 6 specs retroativos:
    ├── articles/DESIGN.md       OPS-1 published_at no view nao model (bug latente)
    ├── comments/DESIGN.md       replies orfas em parent soft-deleted
    ├── moderation/DESIGN.md     defesa 3 camadas + Ban.user OneToOne perde historico
    ├── newsletter/DESIGN.md     anti-sycophancy: signals.py NAO existe + BUG-1/2 hotfix
    ├── users-auth/DESIGN.md     S-04 sem 2FA staff + S-02 JWT_SIGNING_KEY fallback
    └── audit/DESIGN.md          526 LOC: 4 responsabilidades grudadas, refactor S9

Achados criticos descobertos durante o fan-out (anti-sycophancy ativa):
- SendGrid (ADR-004) NAO instalado — base.py usa Gmail SMTP por default
- 4 de 5 scripts em scripts/ sao stubs com `exit 1`
- TS 6.0.3 (pre-release amplo) em CI gate
- view_count bucket vaza entre workers gunicorn (LocMemCache per-process)
- newsletter signal vive em articles/ (cross-app reverso para evitar duplo envio)
- AuditLog sem TTL nem anonimizacao IP — LGPD Art.16 blocker
- IsNotBanned em DEFAULT_PERMISSION_CLASSES vaza por omissao (DRF substitui)
- AdminMetricsView importa de 5 apps (Ce mais alto do projeto)

362 cross-refs internos resolvem; 26 "broken" sao citacoes arquivo:linha
em markdown links (falso-positivo do validator; GitHub renderiza correto).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@GabeMarques-Intetsu GabeMarques-Intetsu changed the title docs(reorg): requirements/ + backlog/ alinhados com engenharia-de-requisitos docs(reorg): requirements/ + backlog/ + specs/ — SDD canon aplicado ao Interpop Jun 9, 2026
@GabeMarques-Intetsu GabeMarques-Intetsu changed the base branch from main to develop June 9, 2026 23:21
… retroativas

18 arquivos materializados:
- RF-001 a RF-006 substituidos por versoes completas com enunciado pt-BR
  negocio, justificativa, realizado por, RNFs aplicaveis, restricoes,
  ADRs relacionadas, historico, cross-refs bidirecionais
- EP-01 a EP-06 substituidos por versoes completas com visao produto,
  Features sob este Epic, KPIs alvo, cross-refs
- F-01, F-10, F-20, F-40, F-50, F-60 NOVOS: Features consolidadas
  retroativas com 10-17 CAs cada, 3+ USs com cenarios Gherkin pt-BR
  (4-5 por US incluindo feliz + edge + erro + a11y + security),
  Tasks ✅ Done com nota "(Sprint 1-3, pre-busca)", DoD, Open Questions

Produzidos por fan-out de 6 documentation-engineer em paralelo, cada
um lendo seu DESIGN.md retroativo correspondente em docs/specs/<modulo>/

Achados identificados pelos agentes como HOTFIX candidates priorizados:

🔴🔴🔴 LGPD Art.16 blocker pre-go-live (F-60 CA12 / S-10 audit):
  AuditLog reten IP cru sem TTL. Sem mitigacao Sprint 5 (cron anonimiza
  apos 90d + purge apos 2 anos + ADR retencao), sistema regulatoriamente
  indefensavel. Mais serio do projeto inteiro hoje.

🔴🔴 F-50 CA11 / OPS-3: ban sem JWT invalidation imediato. Banned_user
  navega ativo ate token expirar (~30min). Requer ADR sobre estrategia
  (blocklist Redis vs TTL curto).

🔴🔴 F-40 CA11/CA12 / BUG-1+BUG-2: cover_image.url relativa em template
  email (TODOS subscribers recebem placeholder broken-image) +
  except Exception em send_welcome matando autoretry_for (falhas SMTP
  nunca dao retry). Degrada reputacao remetente e quebra silenciosamente
  todo dia.

🔴 F-10 CA03/CA04 / OPS-1: published_at carimbado no view, nao no model.
  Publicar via Django admin deixa NULL, artigo invisivel em listing
  -published_at. Fix ~30 LoC override save_model + 1 teste regressao.

🔴 F-20 CA12 / S-07: ScopedRateThrottle comments_create NAO configurado.
  Flood em artigo viral satura moderacao reativa. Pattern ja vivo em
  apps/users/views.py:32; ~15 LoC.

🟠 F-01 / S-02: JWT_SIGNING_KEY fallback silencioso para SECRET_KEY.
  Replica padrao F2-B-03 da busca (commit 96cdad5) — ~1h esforco.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@GabeMarques-Intetsu GabeMarques-Intetsu merged commit f60bbc5 into develop Jun 10, 2026
6 of 7 checks passed
@GabeMarques-Intetsu GabeMarques-Intetsu deleted the chore/docs-reorg-requirements-backlog branch June 10, 2026 00:54
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant