Z Future
Sistemas inteligentes da FAPESB · Edital 027/2025

Quatro empresas, um só produto.

Este guia mostra como Z Future, Myappnow, MTM e a quarta empresa vão construir a plataforma da FAPESB. O objetivo é que ela tenha um login, uma identidade visual e uma qualidade, sem virar um Frankenstein. Cada regra traz o trecho do edital que a fundamenta, e a trilha de estudo no fim leva do básico ao avançado.

Pacotes, não sistemasCada empresa entrega o seu módulo como pacote npm no Verdaccio. A plataforma é a montagem.
Um loginKeycloak da FAPESB para todos. Ninguém faz tela de login própria.
Uma caraPadrão Digital de Governo (DSGov) + Sass + o pacote @fapesb/ui.
Acordo nas fronteirasMudança que afeta outra empresa passa pelo comitê das quatro.

Versão 0.4 · 10/11/2026 · rascunho para discussão entre as empresas. Une o Playbook de Governança Técnica (09/11/2026) e o Guia de Padrões Técnicos da Z Future.

1 · O mapa

O caminho de um projeto, do edital à prestação de contas

Cada etapa é um módulo com dono. O proponente não sabe nem precisa saber que quatro empresas trabalham por trás: para ele, é um sistema só.

Fluxo: Submissão (Z Future), Contratação e Monitoramento (Myappnow), Prestação de Contas (MTM) e Bolsas (Empresa D), com login único no Keycloak e o SEI. Proponente · pesquisador · técnico e gestor da FAPESB Submissão editais, formulários dinâmicos, enquadramento, mérito e IA Z Future Contratação e Monitoramento instrumento jurídico, orçamento, alterações, execução físico-financeira Myappnow (Contratos 4.0) Prestação de Contas comprovação técnica e financeira (38 blocos) MTM Tecnologia Bolsas a confirmar Empresa D SEI assinatura e tramitação o projeto aprovado segue adiante a prestação de contas alimenta o monitoramento Keycloak da FAPESB um login e uma sessão para todos · CPF identifica, e-mail autentica · servidores entram pelo Microsoft 365 · configurado pela MTM
O edital exige essas ligações: a contratação começa "a partir de projetos aprovados e finalizados" na submissão R1 p.50 · Anexo 2 §2.2.1, e se comunica "com os módulos de submissão e prestação de contas" R1 p.52 · Anexo 2 §2.2.8.

Quem faz o quê

  • Z Future: submissão, enquadramento e mérito (módulos F1–F6), e o pacote visual @fapesb/ui. Desafio 5.1.2.1 R1 p.7.
  • Myappnow: contratação e monitoramento ("Contratos 4.0"). Desafio 5.1.2.2 R1 p.7. Contato: Silvio.
  • MTM Tecnologia: prestação de contas e o Keycloak da FAPESB. Responsável pela autenticação: Gustavo.
  • Empresa D: provavelmente bolsas, a confirmar. O desafio de bolsas da Rodada 2 "envie dados para o sistema de prestação de contas" R2 p.8-9 · §5.1.4.1.

Por que precisamos de regras comuns

Os sistemas trocam dados e compartilham login, perfis e chaves (CPF, código do edital, número do pedido e do instrumento). Uma mudança feita sozinha quebra outro sistema, duplica cadastro ou obriga o usuário a entrar duas vezes. E o código fica com a FAPESB depois: ela recebe "acesso ao código-fonte, documentação técnica, modelos de IA" R1 p.32 · §23.4. Quatro jeitos diferentes de construir multiplicam o custo de quem vai manter.

2 · A ideia central

Ninguém constrói o sistema inteiro: cada empresa entrega pacotes

Cada empresa trabalha no próprio GitHub ou GitLab e publica o seu módulo como pacote npm num registry privado, o Verdaccio. Um app hospedeiro, a plataforma-fapesb, instala os pacotes e monta o site inteiro. As APIs de cada empresa rodam como serviços separados.

Cada empresa, no seu próprio Git, publica um pacote no Verdaccio; a plataforma-fapesb instala todos e vira um único site. As APIs viram imagens de contêiner implantadas na infraestrutura da FAPESB. CADA EMPRESA, NO SEU GIT Z Future@fapesb/submissao@fapesb/ui Myappnow@fapesb/contratacao MTM@fapesb/prestacao Empresa D@fapesb/bolsas bun publish pelo CI, ao criar a tag vX.Y.Z Verdaccio registry npm privado @fapesb/* leitura: token por empresa só o dono publica bun install plataforma-fapesb (app hospedeiro) repositório na organização da FAPESB // nuxt.config.ts extends: [ '@fapesb/submissao', '@fapesb/contratacao', '@fapesb/prestacao', ... ] Produção: um site só um domínio · um login · uma cara · um deploy E AS APIs? CADA EMPRESA PUBLICA A SUA COMO IMAGEM DE CONTÊINER submissao-api · contratacao-api prestacao-api · submissao-ia docker push Registry de imagens de cada empresa Infraestrutura da FAPESB cada API é um serviço; o site chama as APIs
Ninguém clona o código de outra empresa. O que circula entre elas são pacotes versionados e contratos de API. Testado: um app Nuxt 4.6 montou a tela de um módulo instalado como pacote, sem copiar código.

O que a sua empresa entrega

  • O pacote de front do seu módulo (uma Nuxt Layer), publicado no Verdaccio.
  • A API do seu módulo, como imagem de contêiner.
  • Os contratos (OpenAPI) das APIs que outros consomem, em fapesb-contratos.
  • Testes, documentação e diagramas C4 do seu módulo.

O que a sua empresa não faz

  • Tela de login, cadastro ou senha: é o Keycloak.
  • Cabeçalho, menu, rodapé, layout geral: vêm do @fapesb/ui e do app hospedeiro.
  • Domínio, deploy do site e certificado: são do app hospedeiro.
  • Acesso ao banco de outra empresa: só por API.

Os pacotes

PacoteO que temQuem publica
@fapesb/uishell (cabeçalho, menu, rodapé, login), modelos de página, ponte Sass do DSGov, textos e glossárioZ Future
@fapesb/submissaotelas do módulo de submissão (Nuxt Layer)Z Future
@fapesb/contratacaotelas de contratação e monitoramento (Nuxt Layer)Myappnow
@fapesb/prestacaotelas da prestação de contas (Nuxt Layer)MTM
@fapesb/bolsastelas de bolsas (Nuxt Layer), se confirmadoEmpresa D
@fapesb/contratostipos e validações (Zod) gerados dos contratos OpenAPICI de fapesb-contratos
@fapesb/basevalidação do token do Keycloak, slug, formato de erro, ID de correlação, logsa definir

Passo a passo: publicar o seu módulo

  1. Crie o pacote no seu próprio Git, a partir do modelo oficial de layer do Nuxt.
    # cria um layer com a pasta .playground para rodar sozinho
    bunx nuxi@latest init -t layer fapesb-submissao-web
  2. Desenvolva isolado. bun run dev sobe o módulo na pasta .playground, com o @fapesb/ui instalado. Você não precisa do código das outras empresas.
  3. Aponte o escopo @fapesb para o Verdaccio. O token fica no cofre do CI, nunca no Git.
    # bunfig.toml
    [install.scopes]
    "@fapesb" = { token = "$FAPESB_NPM_TOKEN", url = "https://pacotes.<domínio-da-plataforma>/" }
  4. Garanta a qualidade: bun check, bun test, lint e testes de acessibilidade passam no CI.
  5. Publique por tag. Crie a tag v0.3.0; o CI roda bun publish e o pacote vai para o Verdaccio.
  6. Peça a atualização no app hospedeiro. Um PR em plataforma-fapesb sobe a versão no package.json. Ele vai para a homologação integrada e, na review da sprint, para produção.

Regras para o pacote do seu módulo (para não brigar com os outros)

ItemRegraExemplo (Submissão)
Páginassó debaixo do prefixo do módulopages/submissao/** → /submissao/...
Componentesprefixo do móduloSubmissaoCartaoEdital.vue
Composablesprefixo do módulouseSubmissaoProposta()
Configuraçãosó no seu namespaceruntimeConfig.public.submissao.apiUrl
Layout, app.vue, CSS global, plugins globaisproibidos: são do app hospedeiro e do @fapesb/ui—
Dependênciasnuxt e @fapesb/ui como peerDependencies"@fapesb/ui": "^1.0.0"
VersãoSemVer; quebra de compatibilidade só com RFC aprovada1.4.0 → 2.0.0

E se alguma empresa preferir Next (React) em vez de Nuxt?

Resposta curta: os pacotes comuns continuam funcionando, mas a montagem muda. Uma Nuxt Layer só entra num app Nuxt. Com Next na mesa, cada módulo vira um app próprio, e um proxy junta todos no mesmo domínio.

PeçaTodos em Nuxt (proposta)Nuxt e Next misturados
@fapesb/uicomponentes Vue + Sassprecisa virar Web Components (<fapesb-cabecalho>) + Sass, usados em Vue e React. O DSGov já faz assim: @govbr-ds/webcomponents-vue e -react 2.6.0
@fapesb/contratos, @fapesb/basefuncionamfuncionam igual (TypeScript puro, sem framework)
Módulospacotes (Nuxt Layers) num app hospedeirocada módulo é um app (imagem de contêiner). O Nginx encaminha /submissao para um e /contratacao para outro. No Next isso se chama Multi-Zones
Sasssimsim: o Next suporta Sass nativamente
Loginuma sessãocontinua um login só (Keycloak), mas trocar de módulo recarrega a página
Deploy1 site1 por módulo
Risco de Frankensteinbaixomédio: o shell é o mesmo, mas navegação, estado e erros são feitos 2 vezes

Recomendação: um framework só para todos é o caminho mais simples (KISS). Mesmo assim, o shell do @fapesb/ui (cabeçalho, menu, rodapé e login) nasce em Web Components. É pouca coisa, e com isso o modelo misto fica possível sem refazer o pacote. A escolha do framework é decisão do comitê (critério A12).

Por que o Verdaccio, e não GitHub Packages ou GitLab Registry? Esses dois exigem que todos tenham conta na mesma plataforma, e as empresas estão divididas entre GitHub e GitLab. O Verdaccio é neutro, gratuito (MIT) e roda em Node 24. Isso atende ao pedido de "soluções não proprietárias, que não necessitem de aquisições" R1 p.53 · Anexo 3 §1.1(ii). Ele também guarda cópia dos pacotes públicos do npm, então o build não para se o npm cair.
# config.yaml do Verdaccio — quem lê e quem publica
packages:
  '@fapesb/ui':          { access: $authenticated, publish: zfuture }
  '@fapesb/submissao':   { access: $authenticated, publish: zfuture }
  '@fapesb/contratacao': { access: $authenticated, publish: myappnow }
  '@fapesb/prestacao':   { access: $authenticated, publish: mtm }
  '@fapesb/contratos':   { access: $authenticated, publish: ci-contratos }
  '**':                  { access: $all, proxy: npmjs }   # o resto vem do npm público, com cache
uplinks:
  npmjs: { url: https://registry.npmjs.org/ }

3 · Governança

Autonomia dentro do módulo, acordo nas fronteiras

A regra-mãe é simples. O que só afeta o seu módulo, a sua empresa decide. O que afeta outra empresa passa pelo Comitê de Arquitetura, com uma pessoa de cada empresa.

Três camadas: fronteira (obrigatória, quórum 4 de 4), base comum (padrões aprovados por ADR) e interno (empresa dona decide). Fronteira · obrigatória · quórum 4 de 4 Base comum · aprovada por ADR, vale para todos Interno a empresa dona decide sozinha Fronteira Keycloak, APIs e dados entre sistemas, catálogo de 38 blocos, chaves de ligação, status, ambientes, login, shell visual Base comum TypeScript, Node 24 + Bun, Vue/Nuxt, Sass + DSGov, PostgreSQL + Patroni, nomes e URLs, metodologia Interno organização do código, telas do módulo, modelo de IA, regras de negócio próprias, refatorações

Quando a mudança vai ao comitê? Basta um critério

#A mudança…Exemplo
A1altera API consumida por outra empresamudar o formato do edital enviado à prestação de contas
A2altera dado enviado ou chave de ligação (CPF, edital, pedido, instrumento)trocar o número do pedido por um ID interno
A3altera o catálogo de 38 blocosenviar um campo novo no bloco 3
A4altera o Keycloak (Realm, perfis, claims, sessão)pedir um perfil transversal novo
A5renomeia ou remove perfil que outro sistema lêrenomear "solicitante"
A6cria integração ou muda o tipo delapassar a enviar em lote noturno
A7altera status compartilhadostatus novo do monitoramento
A8altera disponibilidade, volume ou prazomanutenção da API em horário útil
A9altera dado pessoal que trafega (LGPD)enviar dados da equipe que hoje não vão
A10altera a experiência comum (login, sessão, shell visual)tela de login própria; menu diferente
A11altera ambiente ou credencial compartilhadosmudar a URL do Keycloak de homologação
A12sai da base comumadotar MongoDB; criar componente visual próprio

O A9 tem base direta no Termo de Outorga, que manda "cumprir o disposto na Lei nº 13.709" (LGPD) R1 p.68 · §6.2.33.1.

O caminho de uma mudança

Fluxo: a mudança é classificada; se for local, a empresa decide (notificação de 2 dias úteis quando toca API, dados ou perfis); se for arquitetural, vira RFC, tem 3 dias úteis para objeção e, sem objeção, está aprovada e vira ADR; com objeção, vai à reunião do comitê. Mudançachecklist A1–A12 Afeta outraempresa? não Local: a dona decidese toca API/dados/perfis: aviso + 2 dias úteis sim RFCimpacto + C2 e C3 3 dias úteisjanela de objeções sem objeção Aprovada → ADRe implementa objeção Reunião do comitêconsenso → senão 3 de 4 → empate: coordenador Prazo total: até 5 dias úteis.Emergência: corrige primeiro,RFC retroativa em 48 h.

Comitê

1 titular + 1 suplente por empresa. Decisão padrão: consenso silencioso em 3 dias úteis. Reunião só quando há objeção.

Coordenador técnico

Indicado pela FAPESB, sem vínculo com as empresas. Só vota para desempatar. O edital prevê esse interlocutor: grupos "que interagirão diretamente com a FAPESB e com as empresas" R1 p.31 · §22.6.

Limite do comitê

Não muda escopo de contrato nem decide negócio. Mudança que afeta o mérito técnico vai à FAPESB: só pode ser implementada "após a aprovação formal" R1 p.31 · §22.3.

4 · Identidade

Um login para tudo: o Keycloak da FAPESB

A MTM configura o Realm FAPESB. Cada módulo é um client dele. O Keycloak diz quem é a pessoa e quais perfis ela tem; o que cada perfil pode fazer é decisão de cada módulo.

Sequência de login: usuário acessa a plataforma, é redirecionado ao Keycloak, entra, volta com um código, o servidor da plataforma troca por token e guarda sessão em cookie; as APIs validam o token com as chaves públicas do Realm. Usuário Plataforma (Nuxt) Keycloak APIs 1. acessa /submissao 2. redireciona para o login 3. entra: CPF/e-mail e senha, ou Microsoft 365 (servidor) 4. volta com um código 5. troca o código por token (no servidor) 6. cookie de sessão (o token não vai ao navegador) 7. chama a API com o token 8. valida (JWKS) e lê CPF e perfis

Obrigações de cada módulo

  • Login e logout só pelo Keycloak (OpenID Connect).
  • Tratar o batimento: Conferido entra com perfis; Fora da base entra sem perfil; Não se aplica é servidor.
  • Atribuir os perfis do próprio client pela Admin API.
  • Fazer os controles de acesso da FAPESB, como a restrição de horário.

Na prática, no código

  • O botão de login vem pronto no <FapesbLogin> do @fapesb/ui.
  • As APIs validam o token com o @fapesb/base (biblioteca jose).
  • O serviço de IA em Python não tem usuário: recebe token de serviço.
  • Login gov.br, se a FAPESB quiser, entra como federação dentro do Keycloak, sem mexer nos módulos.

Fundamento: as soluções devem "observar os requisitos de segurança, proteção de dados e conformidade tecnológica" R2 p.5-6 · §4.4.

5 · Integração

Contrato antes de código

Módulos de empresas diferentes conversam só por API, com JSON. O contrato é escrito e aprovado antes da implementação, e nenhum módulo acessa o banco de outro. O edital pede "Arquitetura baseada em microsserviços e integração via API RESTful" R1 p.57 · Anexo 3 §2.2.

O provedor escreve o OpenAPI em fapesb-contratos, outra empresa aprova, o CI gera o pacote @fapesb/contratos no Verdaccio, provedor e consumidor usam os mesmos tipos, e os testes de contrato (Pact) e a homologação integrada validam. 1. OpenAPI 3.1em fapesb-contratosescrito por quem expõe 2. Aprovaçãooutra empresa revisa(CODEOWNERS) 3. @fapesb/contratosCI gera tipos e Zode publica no Verdaccio 4a. Provedor implementae roda os testes Pact do consumidor 4b. Consumidor integracom os mesmos tipos gerados 5. Homologação integrada → produção
RegraPadrão
Chaves de ligaçãoCPF (só dígitos), código do edital, número do pedido ou do instrumento, como emitidos pela origem
Versãona URL: /api/v1/; quebrar o contrato cria v2 (critério A1)
Errorecusa com descrição no formato RFC 9457 (application/problem+json) e código estável
Rastreiocabeçalho X-Correlation-Id em toda chamada, registrado nos dois lados
Datas e dinheiroISO 8601 em UTC; valores em texto decimal ("1500000.00"), nunca número com vírgula flutuante
Eventosoutbox na mesma transação + webhook assinado no formato CloudEvents (ex.: submissao.proposta.aprovada)
// Recusa com descrição: o sistema de origem corrige e reenvia
{
  "type": "https://plataforma.fapesb.ba.gov.br/erros/prestacao/campo-fora-do-catalogo",
  "title": "Campo não previsto no catálogo",
  "status": 422,
  "detail": "O bloco 3 não aceita o campo 'patente_depositada'. Atualize o catálogo por RFC (A3).",
  "codigo": "PRESTACAO_BLOCO_CAMPO_FORA_DO_CATALOGO",
  "correlation_id": "01JC..."
}

6 · Identidade visual

A cara do governo, em Sass, num pacote só

Usamos o Padrão Digital de Governo (DSGov). Ele é escrito em Sass (SCSS), sem Bootstrap nem Tailwind, por isso todo estilo da plataforma é Sass: assim reaproveitamos direto as variáveis, funções e mixins do governo. A acessibilidade é exigência do edital: "Compatibilidade com padrões de acessibilidade e usabilidade institucional (ex: e-MAG)" R1 p.58 · Anexo 3 §2.2.

Camadas visuais: @govbr-ds/core (Sass) na base, @fapesb/ui por cima, os módulos por cima dele e a plataforma no topo. plataforma-fapesb · o que o usuário vê Módulos (layers): telas de cada empresaclasses BEM com prefixo: submissao-formulario__etapa--ativa @fapesb/ui · ponte Sass, shell, modelos de página, textosmarca FAPESB + Governo da Bahia @govbr-ds/core 3.7 (Sass) + Web Components 2.6tokens, grade, foco acessível, componentes br-* · fonte Rawline

Usamos do DSGov

  • Tokens, grade, fonte Rawline, componentes e modelos de página.
  • Mixins e funções Sass, sem copiar valores.

Não usamos

  • A barra e a marca do governo federal. O DSGov só é obrigatório para órgãos federais; a FAPESB é estadual e usa a própria marca com a do Governo da Bahia.

Tokens principais

  • Primária #1351B4 · sucesso #168821 · alerta #FFCD07 · erro #E52207
  • Espaço em base 8 px: var(--spacing-scale-2x)
  • Raios de 4, 8 e 16 px · foco sempre visível

Como se escreve um componente

<style lang="scss" scoped>
@use "@fapesb/ui/scss" as govbr;           // ponte para os mixins e funções do DSGov

.submissao-cartao {
  padding: var(--spacing-scale-2x);        // sempre token, nunca valor solto
  font-size: var(--font-size-scale-up-01);
  border: var(--surface-width-sm) solid var(--border-color);

  &__titulo { font-weight: var(--font-weight-semi-bold); }
  &:focus-visible { @include govbr.focus; }   // foco acessível do próprio DSGov
}
</style>
O que foi testado O DSGov 3.7.0 com o Sass 1.108.1 funcionou. O DSGov ainda usa o @import antigo do Sass, então só a ponte dentro do @fapesb/ui usa @import e o resto do código usa @use. Os avisos do Sass vinham todos do código do DSGov e somem com quietDeps. O Stylelint 17 com stylelint-config-standard-scss barra cor hexadecimal solta.

7 · Stack

TypeScript em primeiro lugar, Python só para IA

O edital diz que Python é a "principal linguagem para IA e NLP" e pede "Node.js e Vue.js/React.js para frontend" R1 p.57 · Anexo 3 §2.2. O resto da plataforma é TypeScript, de ponta a ponta.

CamadaPadrãoPor quê
RuntimeNode 24 LTS em produçãoroda TypeScript direto, sem build (testado com 24.22)
FerramentaBun: bun install, bun test, bun check, bun publishrápido; bun check dá os mesmos erros do tsc (testado)
FrontVue 3 + Nuxt 4, módulos como Nuxt Layersuma montagem só na plataforma-fapesb
EstiloSass (SCSS) + DSGov + @fapesb/uimesma linguagem do design system
APIsFastify 5 + Zod; Drizzle no banco; pg-boss para filastipo e validação de uma só fonte
IA e NLPPython 3.12 + FastAPI; MLflow para versões de modelo"DVC ou MLFlow" R1 p.58
BancoPostgreSQL 17 só (JSONB, pgvector, busca textual, fila)"PostgreSQL (preferencial)" R1 p.57
Alta disponibilidadePatroni 4.1 + etcd (3 nós) + HAProxy + PgBouncer + pgBackRestentrega em produção, "TRL 8" R1 p.5 · §4.3
// tsconfig.json base — testado com bun check e Node 24
{ "compilerOptions": {
    "target": "ES2024", "module": "NodeNext", "moduleResolution": "NodeNext",
    "strict": true, "noUncheckedIndexedAccess": true, "exactOptionalPropertyTypes": true,
    "verbatimModuleSyntax": true, "erasableSyntaxOnly": true,   // sem enum: o Node 24 executa o .ts direto
    "allowImportingTsExtensions": true, "noEmit": true } }
// package.json precisa de "type": "module" — sem isso o bun check acusa TS1295 (testado)

Banco com alta disponibilidade

Cluster Patroni: aplicações passam por PgBouncer e HAProxy; três nós PostgreSQL (um líder e duas réplicas) coordenados por etcd; backup com pgBackRest. APIs dos módulos (um database por módulo) PgBouncer → HAProxy escritaleitura pg-01 · líderPatroni pg-02 · réplica síncronaPatroni pg-03 · réplicaPatroni etcd v3 (3 nós): elege o líder em caso de falha pgBackRest (PITR)
Se o líder cai, o Patroni promove a réplica em menos de 60 s, sem perda de dados (replicação síncrona). O backup completo é semanal, o diferencial diário, e a restauração é testada todo mês.

8 · Nomes, URLs e slugs

A mesma coisa tem o mesmo nome em todo lugar

Em time grande, nome é metade da documentação. O código vai para a FAPESB, que vai mantê-lo R1 p.58 · Anexo 3 §2.3.2; nomes iguais em todos os módulos tornam tudo legível para quem chegar depois.

O quêPadrãoExemplo
Idiomadomínio em português, sem acento nem ç; termos técnicos ficam em inglêsproposta, avaliacao, id, status
Repositóriosfapesb-<modulo>-<peca>fapesb-submissao-web, fapesb-submissao-api
Pacotes@fapesb/<modulo>@fapesb/contratacao
URLsminúsculas, kebab-case, plural; o 1º nível é o módulo/submissao/editais/chamada-universal-2026
SlugsASCII, até 80 caracteres, não mudam depois de publicados (o antigo responde 301)"Chamada Universal 2026 — Inovação" → chamada-universal-2026-inovacao
API/api/v1/ + recurso no plural; JSON em snake_casePOST /api/v1/editais/{codigo_edital}/propostas
Bancosnake_case, tabelas no plural, criado_em/atualizado_emsubmissao.propostas.numero_pedido
Eventos<modulo>.<entidade>.<fato_no_passado>contratacao.instrumento.assinado
Classes CSSBEM com prefixo do módulosubmissao-formulario__etapa--ativa
Variáveis de ambienteFAPESB_<MODULO>_<NOME>FAPESB_SUBMISSAO_DATABASE_URL
CommitsConventional Commits, em portuguêsfeat(submissao): adiciona enquadramento por CNAE
LogsJSON; proibido logar CPF, token, senha ou conteúdo de proposta{"nivel":"info","modulo":"submissao","correlation_id":"…"}

9 · Metodologia

O mesmo ritmo nas quatro empresas

O edital pede "Princípios da metodologia ágil (Scrum)" e "DevOps e CI/CD com versionamento Git" R1 p.57 · Anexo 3 §2.2. Com quatro empresas, o que evita surpresa é a sprint nas mesmas datas e uma demonstração conjunta a cada duas semanas.

Calendário: as quatro empresas fazem sprints de duas semanas nas mesmas datas, com sincronização semanal de integrações e review conjunta com a FAPESB ao fim de cada sprint. Z FutureMyappnowMTMEmpresa D Sprint 1 · 2 semanasSprint 2Sprint 3 review conjunta com a FAPESB + homologação integrada sincronização semanal de integrações (30 min)
A review conjunta também cumpre a obrigação de "apresentar informes à EPP com o acompanhamento e status da implantação" R1 p.58 · §2.3.4(iv).

Pronto quer dizer

  • CI verde: bun check, lint, bun test, cobertura ≥ 90% no domínio, acessibilidade sem erro.
  • Revisado por outra pessoa; ADR citado se tocou fronteira.
  • Só componentes DSGov e @fapesb/ui; estilo só com tokens.
  • Contrato e eventos atualizados; migração reversível.
  • Nenhum dado pessoal em log.

Fluxo de código

  • Trunk-based: branch de até 2 dias, PR pequeno (≈ 400 linhas), main sempre pronta.
  • Conventional Commits e SemVer: o CHANGELOG sai dos commits.
  • ADR para cada decisão que cruza módulos; C4 para os diagramas.
  • Defeito entre módulos: issue no módulo suspeito, com o X-Correlation-Id; resposta em 1 dia útil.

Princípios de código: o básico bem feito

PrincípioAqui significaComo se verifica
KISSa solução mais simples que atende a históriarevisão: "dá para fazer com menos?"
YAGNIsó o que está na sprint; pacote ou serviço novo só por RFCrevisão; RFC
DRY com moderaçãoregra de negócio num lugar só; repetiu 3 vezes, extrairevisão
SOLID: S e Duma responsabilidade por módulo e função; Keycloak, SEI, LLM e banco atrás de uma interfacetestes sem rede
Clean Code essencialnomes do glossário, funções curtas, sem código morto, erro nunca engolidoESLint complexity ≤ 10; ruff C901
Pastas por assuntosrc/propostas/, não controllers/ e services/modelo de projeto

Fica de fora, de propósito: Clean Architecture em camadas, DDD tático completo e padrão de projeto aplicado por obrigação.

10 · Trilha de estudo

Do básico ao avançado, no seu ritmo

Quatro níveis, na ordem em que você vai precisar. Marque o que já estudou: o progresso fica salvo neste navegador. PT indica material em português.

Trilha em quatro níveis: fundamentos, a nossa stack, arquitetura e integração, qualidade e operação. 1 2 3 4 FundamentosA nossa stack Arquitetura e integraçãoQualidade e operação
1Fundamentos
Git, pacotes, TypeScript, Scrum e a web acessível
0/0
2A nossa stack
Node 24, Bun, Vue, Nuxt Layers, Sass e DSGov, Fastify, PostgreSQL
0/0
3Arquitetura e integração
Contratos, login, eventos, diagramas e decisões
0/0
4Qualidade, segurança e operação
Acessibilidade, OWASP, testes, carga, LGPD e banco em alta disponibilidade
0/0

11 · Para decidir

Decisões e pendências

Propostas para o comitê. Cada uma vira um ADR depois de aprovada.

#DecisãoPropostaFundamento
D1Governançacomitê das 4 empresas, quórum 4/4, consenso silencioso em 3 dias úteisR1 p.31 · §22.6
D2LoginKeycloak da FAPESB (MTM); nada de login próprioR2 p.5-6 · §4.4
D3IntegraçãoOpenAPI antes do código, RFC 9457, versão na URL, PactR1 p.57 · Anexo 3 §2.2
D4VisualDSGov + Sass + @fapesb/ui; marca FAPESB e Governo da BahiaR1 p.58 · Anexo 3 §2.2
D5LinguagemTypeScript primeiro; Python só para IAR1 p.57
D6FerramentasNode 24 LTS + Bun (bun check)R1 p.57
D7FrontVue 3 + Nuxt 4; módulos como Nuxt LayersR1 p.57
D8Bancosó PostgreSQL, com PatroniR1 p.57 · R1 p.5 · §4.3
D9Nomesrepositórios, URLs, slugs, API, banco, código num padrão sóR1 p.58 · §2.3.2
D10MétodoScrum sincronizado, trunk-based, Conventional Commits, ADR, C4R1 p.57
D11Pacotescada empresa no seu Git; módulos e peças comuns como pacotes no Verdaccio; app hospedeiro únicoR1 p.53 · §1.1(ii)
D12Aceite da FAPESBofício conjunto pedindo aprovação da base comum antes de implementarR1 p.31 · §22.3 · R1 p.65 · §6.2.2

Pendências que precisam de dono

Imediato

  • Coordenador técnico indicado pela FAPESB
  • ADR-0001: Keycloak (MTM)
  • Escopo da Empresa D
  • Acesso de todos à pasta de decisões

Em até 3 semanas

  • Diagramas C1 e C2 de cada módulo
  • Padrão de integração e catálogo de 38 blocos como contrato
  • Verdaccio, fapesb-contratos, fapesb-governanca e plataforma-fapesb
  • Dono do app hospedeiro

Antes de integrar

  • Modelo comum de orçamento (3 módulos)
  • Evento "aprovado e finalizado" R1 p.50 · §2.2.1
  • Integração com o SEI
  • Homologação integrada; onde roda o Patroni
Atenção à aprovação da FAPESB Alterações "apta[s] a impactar o mérito técnico" do projeto só podem ser implementadas "após a aprovação formal e motivada da Entidade" R1 p.31 · §22.3. A base comum (stack, banco, pacotes) precisa desse aceite antes de entrar no código.

Fontes