# Egressos de TI — IFES Campus Serra · Dados abertos > Estudo longitudinal de carreira dos egressos de TI do IFES Campus Serra (coorte de 50, modelo salarial de 49). Reúne trajetória profissional, renda estimada vs. mercado, e o papel de ensino/pesquisa/extensão. Todos os dados aqui são **agregados ou anonimizados** (coorte A–AX); dados de empresa são **informação pública** (LinkedIn/registros). Nenhum dado pessoal identificável. Licença de dado de terceiro: alguns datasets são derivados de fontes externas com licença própria, que continua valendo para quem baixar daqui. Cada arquivo traz a sua no campo `licenca`: `cargos_ao_longo_do_tempo.json` = ODbL 1.0 (base de dados) + DbCL 1.0 (conteúdo) (atribuição: Stack Overflow Annual Developer Survey — survey.stackoverflow.co) · `codigofonte_2026.json` = não declarada pela fonte (atribuição: Pesquisa Código Fonte — pesquisa.codigofonte.com.br) · `codigofonte_historico.json` = não declarada pela fonte (atribuição: Pesquisa Código Fonte — pesquisa.codigofonte.com.br) · `egressos_perfil.json` = CC BY 4.0 (atribuição: Estudo de egressos de TI — Ifes Campus Serra) · `renda_por_senioridade.json` = CC BY 4.0 (atribuição: Estudo de egressos de TI — Ifes Campus Serra) · `so_benchmarks.json` = ODbL 1.0 (base de dados) + DbCL 1.0 (conteúdo) (atribuição: Stack Overflow Annual Developer Survey — survey.stackoverflow.co) Licença: dados CC BY 4.0 · código MIT. Nome de pessoa aparece em DOIS arquivos — `egressos_perfil.json` e `recorte_cursos.json` e `vitrine.json` —, por decisão da coordenação, e é dado de nível LinkedIn: cargo, empresa e cidade que a própria pessoa publica, mais o endereço do perfil de onde isso vem. Nenhum dos dois tem renda por pessoa, e nenhum outro dataset traz nome, slug ou identificador do cadastro. Nome nunca é enviado a serviço externo de IA. Site experimental (dados preliminares). ## Páginas - [Onde estão os egressos](egressos-carreiras.html): vitrine de carreiras — perfis, empresas, países, jornada. - [Impacto na carreira](index.html): visão executiva — renda estimada vs. mercado (anonimizado). - [Trajetória salarial](trajetoria_salarial.html): trajetória ano a ano, renda em salários mínimos da época e comparação com o mercado mundial de devs em US$. - [Panorama por egresso](dashboard_alunos.html): linha do tempo e cards anonimizados (A–AX). - [Metodologia](metodologia.html): fontes, ETL, cálculo salarial, QA e ressalvas. - [Dados abertos](dados-abertos.html): esta página (download de JSON + código). ## API estática (JSON por endpoint) Índice legível por máquina: [api/index.json](api/index.json). Sem chave e sem limite — arquivos estáticos regerados a cada atualização. Use quando quiser um recorte; use os datasets abaixo quando quiser tudo. - [api/coorte.json](api/coorte.json) — Coorte anonimizada A–AX: trilha, anos de carreira, bolsa inicial, renda estimada e crescimento. - [api/coorte/serie-por-experiencia.json](api/coorte/serie-por-experiencia.json) — Curva de carreira por anos de experiência: trajetória real do coorte e o que o mercado paga hoje. - [api/coorte/serie-por-ano.json](api/coorte/serie-por-ano.json) — Mediana do coorte por ano civil, em R$ da época, em reais do ano-base e em salários mínimos. - [api/coorte/trajetoria-destaque.json](api/coorte/trajetoria-destaque.json) — Trajetória individual anonimizada, ano a ano, mais a distribuição de multiplicadores do coorte. - [api/salario-minimo.json](api/salario-minimo.json) — Salário mínimo por ano: valor, reajuste do decreto, INPC, ganho real, deflator IPCA e câmbio. - [api/indices.json](api/indices.json) — IPCA, INPC e câmbio USD→BRL: número-índice mensal, médias anuais e deflatores (IBGE/IPEADATA). - [api/mercado/stackoverflow.json](api/mercado/stackoverflow.json) — Benchmarks do Stack Overflow: mediana em US$ por país, global, e o corte por moeda do contracheque. - [api/mercado/codigofonte.json](api/mercado/codigofonte.json) — Pesquisa Código Fonte: escada de senioridade, contrato e região (2026 + série histórica). - [api/empresas/index.json](api/empresas/index.json) — Índice das empresas: porte, origem e setor, com link para o detalhe de cada uma. - [api/empresas/.json](api/empresas/.json) — Detalhe de uma empresa (204 arquivos): headcount, sede, setor, site, fundação, especialidades, vagas. - [api/analise.json](api/analise.json) — Análises agregadas: clusters, sankey, funções, gênero, internacionalização, extensão. - [api/egressos/perfis.json](api/egressos/perfis.json) — Perfil público de cada egresso: nome, curso, cargo, empresa, cidade e senioridade. Sem renda — a estimativa é por senioridade, no endpoint ao lado. - [api/egressos/renda-por-senioridade.json](api/egressos/renda-por-senioridade.json) — Faixa de renda ESTIMADA por senioridade, com as duas referências lado a lado: a Pesquisa Código Fonte (média, nativa em reais) e o modelo do estudo (mediana com p25–p75, nascida em dólar). Sem nenhuma chave de pessoa. - [api/fomento-fapes.json](api/fomento-fapes.json) — Fomento de bolsas FAPES recebido pela coorte (agregado por projeto). - [api/mapa/base.json](api/mapa/base.json) — Contorno dos continentes projetado para SVG — resolução 110m, leve (domínio público). - [api/mapa/detalhe.json](api/mapa/detalhe.json) — Mesmo contorno em resolução 50m: o mapa da vitrine busca este arquivo ao aproximar. ## Datasets (JSON) — o que há em cada arquivo - [analise.json](dados/analise.json) — **Análises agregadas**. Objeto com chaves de análise: `top_tech` (tecnologias mais citadas), `clusters` (KMeans de perfis de carreira), `funcoes` (distribuição de funções), `lideranca_gestao` (nº em liderança/gestão), `sankey` (fluxo formação→trilha→destino), `intl_timeline` (% internacional por ano), `empresas` (regiao/modalidade/setor/porte agregados), `genero` (distribuição agregada), `extensao` (participação SRC/IFES, agregado), `outros_labs` (labs além do LEDS), `trilha_carreira` (início→meio→atual). Tudo AGREGADO, sem indivíduo. _(estrutura: objeto com 21 chaves; cada valor: `bsi, engenharia`; 21 itens, 38.3 KB)_ - [consolidado.json](dados/consolidado.json) — **Perfis anonimizados**. Objeto `{kpi, perfis[], agregado, pv}`. `perfis[]` = coorte anonimizada, cada item: `perfil` (rótulo A–AX), `trilha` (Software/Dados/…), `em_tech` (bool), `anos` (anos de carreira), `bolsa` (valor mensal da bolsa em anos de bolsa), `med_ini`/`med_atual` (salário estimado inicial/atual, R$2026), `cresc` (múltiplo de crescimento). SEM nome/empresa/local. _(estrutura: objeto com 9 chaves; cada valor: `n, em_tech, cresc_medio, cresc_max, faixa_inicial_med, faixa_atual_lo, faixa_atual_hi, med_atual, med_atual_sm, sm_ano_base`; 9 itens, 126.8 KB)_ - [salario_minimo.json](dados/salario_minimo.json) — **Salário mínimo por ano**. Objeto `{titulo, fonte_*, ano_base_deflator, notas[], por_ano[], sm_por_ano, deflator_ipca_por_ano}`. Cada item de `por_ano[]`: `ano`, `jan`/`dez` (valores vigentes), `media_ponderada` (média dos 12 meses — importa nos anos com dois valores, 2020 e 2023), `reajuste_pct` (o número do decreto: janeiro sobre o último valor vigente), `inpc_ano_anterior_pct`, `ganho_real_pct` (reajuste deflacionado pelo INPC — o índice da política de valorização), `em_reais_de_2026`. Fonte: IPEADATA `MTE12_SALMIN12` + IBGE/SIDRA. _(estrutura: objeto com 12 chaves: `titulo, fonte_salario_minimo, fonte_inflacao, url_salario_minimo, unidade, ano_base_deflator, mes_base_deflator, notas, por_ano, sm_por_ano, deflator_ipca_por_ano, cambio_por_ano`; 12 itens, 5.6 KB)_ - [ibge_series.json](dados/ibge_series.json) — **Séries macro (IBGE/IPEADATA)**. Objeto `{ano_base, mes_base, series:{ipca, inpc, salario_minimo}}`. Cada série traz `fonte`, `url`, `unidade`, `mensal` (AAAAMM -> valor) e `media_anual`; o IPCA traz também `deflator_para_base` (multiplicador para levar R$ de um ano ao mês-base). Baixado direto de IBGE/SIDRA (IPCA tabela 1737 var 2266; INPC tabela 1736 var 2289) e IPEADATA. _(estrutura: objeto com 5 chaves: `titulo, gerado_por, ano_base, mes_base, series`; 5 itens, 23.6 KB)_ - [mapa_mundi.json](dados/mapa_mundi.json) — **Contorno do mapa-múndi**. Objeto `{viewBox, lat_range, projecao, paths[], fonte}`. `paths[]` são strings `d` de SVG já projetadas (equirretangular). Para posicionar um ponto: `x = (lon+180)/360*W`, `y = (lat_max-lat)/(lat_max-lat_min)*H`. Fonte: Natural Earth 110m (domínio público). _(estrutura: objeto com 10 chaves: `titulo, fonte, url, camada, gerado_por, projecao, viewBox, lat_range, nota, paths`; 10 itens, 33.9 KB)_ - [egressos_perfil.json](dados/egressos_perfil.json) — **Perfis dos egressos**. Nome, curso, cargo, empresa e cidade de cada egresso, mais senioridade e anos de carreira. Dado de nível LinkedIn — o que a própria pessoa publica —, divulgado por decisão da coordenação. NÃO contém renda: a estimativa é por SENIORIDADE, no arquivo ao lado. _(estrutura: objeto com 8 chaves: `titulo, gerado_por, cursos, o_que_este_arquivo_nao_tem, origem_do_dado, licenca, atribuicao, egressos`; 8 itens, 111.3 KB)_ - [recorte_cursos.json](dados/recorte_cursos.json) — **Recorte por curso (BSI e ECA)**. Contagens de cobertura da coleta dos formandos do SIGA, distribuição CRUA e AGREGADA de cargos e empresas por curso, e a vitrine nomeada dos confirmados da coleta — nome, cargo, empresa, cidade e endereço do perfil, o mesmo nível LinkedIn dos perfis do estudo, por decisão da coordenação. NÃO contém renda. _(estrutura: objeto com 5 chaves: `titulo, gerado_por, atencao, o_que_este_arquivo_nao_tem, cursos`; 5 itens, 74.6 KB)_ - [renda_por_senioridade.json](dados/renda_por_senioridade.json) — **Renda estimada por senioridade**. Faixa p25–mediana–p75 ESTIMADA por senioridade e trilha, com a amostra de mercado de cada uma. Nenhum salário foi coletado de ninguém: o valor é o que o mercado pagava para aquele nível de experiência, e para uma pessoa concreta pode ser maior ou menor. Sem nenhuma chave de pessoa. _(estrutura: objeto com 15 chaves: `titulo, gerado_por, e_estimativa, aviso, unidade, senioridade_sozinha_nao_fecha, senioridade_nao_e_cargo, ressalva_do_ultimo_nivel, por_que_duas_referencias, minimo_de_pessoas_por_grupo, por_que_o_minimo, licenca, atribuicao, cargos`; 15 itens, 6.9 KB)_ - [cargos_ao_longo_do_tempo.json](dados/cargos_ao_longo_do_tempo.json) — **Renda estimada por cargo, 2018–2025**. Objeto `{unidade, ano_base, edicoes[], minimo_de_respostas_por_ponto, n_respostas_por_edicao{}, cargos[]}`. Cada item de `cargos[]`: `cargo` (chave), `nome`, `pontos[]` com `{ano, real, nominal, n}`, mais `n_edicoes`, `edicoes_ausentes[]` e `variacao_pct` (real; `null` quando há um ponto só). `real` está a preços do `ano_base` (IPCA); `nominal` é o valor da época. Ano cuja amostra não chega ao mínimo NÃO vira ponto — fica em `edicoes_ausentes`, sem interpolação. `DevType` é múltipla escolha, então a soma dos `n` passa do total de respondentes. Fonte: Stack Overflow Developer Survey 2018–2025 (agregado; nenhum microdado é republicado). _(estrutura: objeto com 21 chaves: `e_estimativa, aviso, o_que_mede, nao_e_o_coorte, cargo_nao_e_senioridade, por_que_deflacionado, cambio, devtype_e_multipla_escolha, por_que_o_minimo, amostra_encolheu, rotulos_mudam_de_nome, unidade, ano_base, minimo_de_respostas_por_ponto`; 21 itens, 21.1 KB)_ - [vitrine.json](dados/vitrine.json) — **Onde estão os egressos (nomeado)**. Objeto com o que a página nomeada publica. `perfis[]`: nome, monograma, cargo, empresa, `lugar` já legível ("Vitória, ES", "Londres"), região, trilha, nível e a jornada. Tem também `rotulo` (A–AX), que é o que permite cruzar esta página com as anonimizadas sem publicar o identificador do cadastro. `empresas[]`: uma por empregador distinto, com tamanho, sede e setor quando há dado público verificado, e `contratando` quando havia vaga aberta na coleta. `mapa`: contorno dos continentes, os lugares com coordenada e, para cada ano, quantas pessoas estavam em cada um — mais `mapa_sem_ponto`, que diz quantas NÃO viraram ponto, porque "Remoto" e "Brasil" no centro geográfico do país afirmariam o que o dado não diz. Renda por pessoa não existe neste arquivo: a estimativa vive atrelada a cargo, em renda_por_senioridade. _(estrutura: objeto com 18 chaves: `titulo, excecao, hoje, indicadores, perfis, trilhas, regioes, paises_no_exterior, mapa, mapa_confianca, mapa_sem_ponto, empresas, empresas_verificadas, contratando`; 18 itens, 255.8 KB)_ - [panorama.json](dados/panorama.json) — **Panorama da coorte (anonimizado)**. Objeto com o que a página de panorama publica. `coorte[]`: uma pessoa por entrada, com `rotulo` no lugar do nome — o mesmo rótulo usado nas outras páginas, para que "Egresso C" seja a mesma pessoa em todas. `empregador_atual` é CATEGORIA, nunca o nome de uma empresa privada; instituição pública de fomento aparece pelo nome porque tem centenas de bolsistas e não identifica ninguém. `modalidade` no lugar da cidade. `experiencias[]`: cada posição com `de`/`ate` (o `ate` já resolvido para a data de referência quando está em curso, e `em_curso` dizendo qual é o caso), `duracao` legível, `area` e a `familia` dela — a família é o que ganha cor no gráfico, porque onze matizes numa linha do tempo de 349 barras não se distinguem. `eixo`: o intervalo do gráfico, derivado do dado; a página antiga o tinha cravado e recortava 13 experiências anteriores a 2012 sem avisar. `salto[]`: do ponto de partida à renda estimada de hoje, ordenado pelo multiplicador, com `salto_fora` dizendo quantos ficaram de fora e por quê. _(estrutura: objeto com 12 chaves: `hoje, hoje_extenso, indicadores, origem_comum, eixo, familias, areas, coorte, salto, salto_fora, aviso, privacidade`; 12 itens, 147.4 KB)_ - [impacto.json](dados/impacto.json) — **Painel de impacto na carreira**. Objeto com o que a página de entrada publica. `indicadores[]`: valor e rótulo de cada indicador de topo — o rótulo é parte do dado, porque o número sozinho fica sem unidade e sem ressalva. `por_experiencia[]`: por ano de carreira, `lo`/`hi` (p25–p75), `med` e `n`. `por_experiencia_hoje[]`: o que o mercado de HOJE paga por aquela experiência — a segunda linha do gráfico. `dispersao[]`: mínimo, quartis e máximo por trilha e por origem do empregador, porque a mediana sozinha esconde a variação. `fluxo`: colunas e ligações de formação→trilha→destino. `mercado_br`: a referência nacional (Pesquisa Código Fonte) por senioridade, contrato, região e linguagem, mais a série histórica. `achados[]` e `ressalvas[]`: a leitura e os limites, com os números vindos do dado em vez de escritos no texto. `genero`: agregado, com o método de inferência declarado. Nenhum indivíduo aparece. _(estrutura: objeto com 28 chaves: `e_estimativa, aviso, coorte, indicadores, bolsa, premio_e_artefato, por_experiencia, por_experiencia_hoje, o_que_sao_as_duas_linhas, mercado_br, achados, ressalvas, dispersao, vias_de_formacao`; 28 itens, 23.5 KB)_ - [trajetoria.json](dados/trajetoria.json) — **Trajetória salarial, ano a ano**. Objeto com o que a página de trajetória publica. `serie[]`: por ano, `med_nominal`, `med_real`, `em_sm` (salários mínimos da época), `usd` (convertido pelo câmbio DAQUELE ano) e `n`. `trajetoria[]`: um perfil anonimizado, ano a ano. `trajetoria_indicadores`: múltiplo nominal e real, CAGR e tempo para dobrar — o CAGR sai do valor REAL, porque em nominal a inflação entra como ganho. `regua[]`: comparação internacional em US$, com o `papel` de cada barra (pais, brasil, coorte, global, cenario, referencia). `corroboracao_por_edicao[]`: o mesmo corte medido em edições independentes, que é como se responde "o número de 2023 ainda vale?" sem projetar. `premio_internacional`: o prêmio de +6% que o modelo calcula, e por que ele é artefato. _(estrutura: objeto com 31 chaves: `e_estimativa, aviso, ano_base, referencia, minimo_de_pessoas_por_ano, por_que_o_minimo, cambio_por_ano, serie, bolsa, trajetoria, trajetoria_indicadores, trajetoria_extremos, trajetoria_coorte, salario_minimo`; 31 itens, 17.4 KB)_ - [so_benchmarks.json](dados/so_benchmarks.json) — **Benchmarks internacionais**. Objeto `{edicao_referencia, filtros, global_usd_mes, por_pais[], por_moeda_brasil[], serie_anual[]}`. `por_pais[]`: `pais`, `usd_mes` (mediana), `n`. `por_moeda_brasil[]`: por faixa de experiência, `brl_usd_mes` e `usd_usd_mes` — respondentes DO BRASIL que declaram salário em real vs. em dólar — com `n` de cada lado e a `razao`. `serie_anual[]`: mediana US$/mês por edição, para Brasil, global e EUA. Fonte: Stack Overflow Developer Survey 2018–2023 (agregado; nenhum microdado é republicado). _(estrutura: objeto com 23 chaves: `titulo, fonte, gerado_por, edicao_referencia, edicao_mais_recente_na_serie, criterio_da_edicao_referencia, faixa_referencia_derivada_de, corroboracao, candidatas_a_referencia, licenca, licenca_url, atribuicao, unidade, filtros`; 23 itens, 6.7 KB)_ - [codigofonte_2026.json](dados/codigofonte_2026.json) — **Benchmark de mercado 2026**. Faixas salariais por senioridade no mercado BR (Pesquisa Código Fonte 2026). _(estrutura: objeto com 13 chaves: `fonte, url, coletado_em, licenca, licenca_obs, atribuicao, metodologia, por_senioridade, por_contrato, por_regiao_top10, por_linguagem, recortes_indisponiveis_na_pagina, observacoes`; 13 itens, 2.7 KB)_ - [codigofonte_historico.json](dados/codigofonte_historico.json) — **Benchmark histórico**. Média salarial por senioridade, série histórica (Código Fonte). _(estrutura: objeto com 9 chaves: `fonte, medida, licenca, licenca_obs, atribuicao, n_por_recorte, obs, ipca_fator_para_2026, media_por_senioridade`; 9 itens, 1.6 KB)_ - [fapes_fomento.json](dados/fapes_fomento.json) — **Fomento FAPES**. Fomento de bolsas FAPES recebido pela coorte (valores agregados). _(estrutura: objeto com 4 chaves: `projetos, total, desfecho, fonte`; 4 itens, 1.1 KB)_ - [empresas_porte.json](dados/empresas_porte.json) — **Empresas — classificação**. Objeto `{nomeEmpresa: {...}}`. Campos: `porte`/`origem`/`setor`/`funcionarios` (estimativa por nome, Mistral) + VERIFICADOS do LinkedIn quando houver: `nome_oficial`, `headcount_linkedin` (faixa de funcionários), `hq_local` (sede), `industry_linkedin` (setor LinkedIn), `website`, `founded` (ano), `specialties`, `contratando` (bool), `politica_remoto`, `slug`; derivados: `porte_real` (banda de headcount), `setor_real` (taxonomia via Mistral), `fonte`, `verificado_em`. Dado PÚBLICO de empresa (sem vínculo a pessoa). _(estrutura: objeto com 204 chaves; cada valor: `empresa, porte, origem, setor, funcionarios`; 204 itens, 54.9 KB)_ - [empresas_linkedin_data.json](dados/empresas_linkedin_data.json) — **Empresas — dados LinkedIn**. Objeto `{nomeEmpresa: {...}}` — coleta bruta via browser-use da company page: `nome_oficial`, `industry_linkedin`, `headcount_linkedin`, `hq_local`, `website`, `founded`, `specialties`, `politica_remoto`, `contratando`, `slug`, `verificado_em`. _(estrutura: objeto com 46 chaves; cada valor: `nome_oficial, industry_linkedin, headcount_linkedin, hq_local, website, founded, specialties, politica_remoto, slug, contratando, verificado_em`; 46 itens, 19.3 KB)_ - [empresas_aliases.json](dados/empresas_aliases.json) — **Empresas — nomes canônicos**. Objeto `{nomeCanonico: {aliases[], atual (bool), n_egressos_atual (contagem)}}` — agrupa variantes de nome da mesma empresa. _(estrutura: objeto com 207 chaves; cada valor: `aliases, atual, n_egressos_atual`; 207 itens, 18.2 KB)_ - [empresas_linkedin_urls.json](dados/empresas_linkedin_urls.json) — **Empresas — URLs LinkedIn**. Objeto `{nomeEmpresa: {url, slug, confianca, via}}` — URL verificada da company page. _(estrutura: objeto com 38 chaves; cada valor: `url, slug, confianca, via`; 38 itens, 5.8 KB)_ ## Código do pipeline (Python) Reprodução: `python build_report.py` (gera+valida) · `python build_report.py --publish` (publica anonimizado). - [build_report.py](pipeline/build_report.py) — orquestra o pipeline inteiro (roda todos os passos + QA/PII); `--publish` copia p/ os sites - [ibge_series.py](pipeline/ibge_series.py) — baixa IPCA e INPC (IBGE/SIDRA) e o salário mínimo (IPEADATA) → salario_minimo.json + ibge_series.json - [so_benchmarks.py](pipeline/so_benchmarks.py) — extrai do Stack Overflow as medianas em US$ por país e o corte por moeda do contracheque → so_benchmarks.json - [compute_all.py](pipeline/compute_all.py) — série salarial: cruza perfis × mercado (Stack Overflow) × câmbio × IPCA × salário mínimo → consolidado.json - [analise.py](pipeline/analise.py) — clusters, sankey, gênero, empresas, trilha, internacionalização → analise.json - [genero.py](pipeline/genero.py) — inferência de gênero OFFLINE (gender-guesser + heurística PT-BR) → genero_map (privado) - [fapes_fomento.py](pipeline/fapes_fomento.py) — agrega fomento de bolsas FAPES → fapes_fomento.json - [src_extensao.py](pipeline/src_extensao.py) — cruza egressos × base oficial de extensão SRC/IFES (privado, por nome) - [gen_panorama.py](pipeline/gen_panorama.py) — monta o panorama anonimizado da coorte (A–AX): rótulo no lugar do nome, empregador como categoria, cidade reduzida a modalidade. A anonimização em si vive em egressos_core.panorama, com teste de vazamento - [gen_impacto.py](pipeline/gen_impacto.py) — monta o dataset do painel de impacto: indicadores, renda por experiência, dispersão, fluxo de formação, referência nacional, empresas, gênero e extensão. Projeção do consolidado + análise; quem mostra é a página em Astro - [mapa_base.py](pipeline/mapa_base.py) — baixa o Natural Earth 110m e converte em paths SVG projetados -> mapa_mundi.json - [gen_perfis.py](pipeline/gen_perfis.py) — vitrine nomeada (sem renda) e faixa de renda por cargo (sem nome), em dois arquivos - [gen_vitrine.py](pipeline/gen_vitrine.py) — monta o dataset da vitrine nomeada 'Onde estão os egressos': perfis, empresas verificadas e mapa ano a ano - [gen_trajetoria.py](pipeline/gen_trajetoria.py) — monta o dataset da trajetória: série do coorte em R$/US$/salários mínimos, régua internacional e recorte por moeda. A conta vem de egressos_core.trajetoria; quem mostra é a página em Astro - [gen_api.py](pipeline/gen_api.py) — gera a API estática em egressos/api/ (endpoints anonimizados + índice) - [gen_dados_abertos.py](pipeline/gen_dados_abertos.py) — gera esta aba de dados abertos (copia JSON seguros + código sanitizado + llms.txt) - [gen_cursos.py](pipeline/gen_cursos.py) — recorte por curso (BSI/ECA): contagens da coleta e distribuição crua de cargos/empresas — sem nome, sem renda - [norm_empresas.py](pipeline/norm_empresas.py) — normaliza nomes de empresa e agrupa variantes → empresas_aliases.json - [enrich_empresas.py](pipeline/enrich_empresas.py) — browser-use no LinkedIn: headcount/sede/setor/vagas por empresa (dado público) - [classify_empresas.py](pipeline/classify_empresas.py) — deriva porte_real (headcount) + setor_real (regras) por empresa - [classify_mistral.py](pipeline/classify_mistral.py) — refina setor_real via Mistral (industry+specialties, dado público) - [resolve_company_urls.py](pipeline/resolve_company_urls.py) — resolve a URL LinkedIn da empresa via dork de busca (sem login) - [mistral_porte.py](pipeline/mistral_porte.py) — classifica porte/setor por NOME de empresa (fallback; só nome público) ## Privacidade - Publicado: coorte anonimizada (A–AX) + dados públicos de empresa + código. - NUNCA publicado: nomes/empresa/local por pessoa, mapas id→atributo (gênero, extensão, pesquisa). - O portão de publicação (`egressos_site.portao`, cláusula P2) varre a saída inteira contra o cadastro e bloqueia se qualquer nome real vazar.