# Disponibilidade das demos de projetos A homepage seleciona projetos pelo campo `featured` de `public/portfolio-data.json`. O snapshot de health nunca decide se um card existe; ele serve somente para apresentar o estado do CTA da demo. ## Estados `lib/project-health.ts` deriva quatro estados: | Estado | Condição | Comportamento do CTA | | --- | --- | --- | | `available` | A demo tem URL e a última resposta conhecida foi `200` com `Content-Type: text/html`. | Exibe “Abrir projeto”. | | `unavailable` | A demo tem URL e a última resposta conhecida foi conclusiva, mas não atende ao contrato `200` + HTML. | Exibe “Demo indisponível na última verificação” sem link. | | `unknown` | A demo tem URL, mas não existe observação ou a tentativa terminou em erro/status nulo. | Mantém “Abrir projeto” com aviso acessível de disponibilidade não verificada. | | `none` | O projeto não tem `demoUrl`. | Não exibe CTA de demo. | Links de código e os demais dados do card independem desses estados. ## Leitura durante a renderização `loadFeaturedProjects()` lê `data/project-health.json` quando a homepage é renderizada. - **Produção:** usa a última observação disponível, mesmo antiga. Não faz fetch externo durante render e continua exibindo todos os projetos `featured` se o arquivo estiver ausente ou inválido. - **Desenvolvimento:** usa imediatamente um snapshot com até 15 minutos. Se o snapshot estiver ausente ou antigo, consulta as demos em memória. Uma falha conserva a última observação conclusiva daquele projeto quando ela existe; caso contrário, o estado fica `unknown`. Esse refresh não grava o arquivo. ## Atualização manual opcional Para atualizar a observação versionada: ```bash pnpm check:projects ``` `scripts/check-projects.mjs` lê as demos de `public/portfolio-data.json`, segue redirecionamentos, aplica timeout de 10 segundos e registra status, content type, URL final, latência, horário e eventual erro. A escrita é atômica: o processo grava `data/project-health.json..tmp` e só então renomeia o arquivo para `data/project-health.json`. O comando consulta serviços externos e altera `data/project-health.json`; execute-o apenas quando uma nova observação deva ser revisada e versionada. ## Papel do snapshot `data/project-health.json` é a última observação conhecida, não um gate de build, deploy ou conteúdo. Ele pode estar antigo, ausente ou conter falhas sem esconder os cards selecionados. Nenhum cron é necessário para a aplicação funcionar; uma automação externa pode executar a atualização manual, mas não faz parte deste repositório nem da renderização de produção.