{
  "schemaVersion": 1,
  "id": "data-engineer",
  "title": "Engenharia de Dados",
  "version": "2026-10-12.51d51124",
  "language": "pt-BR",
  "license": "MIT",
  "source": "https://github.com/flaviojmendes/trilhainfo/tree/main/src/roadmaps",
  "audience": "Para quem quer construir pipelines e preparar dados para análise.",
  "outcome": "Um pipeline incremental com testes de qualidade, agendamento e recuperação de falhas.",
  "stages": [
    {
      "id": "dataEngineering.comece-com-programacao-e-dados",
      "title": "Comece com programação e dados",
      "description": "Engenharia de Dados exige programação, SQL e operação de pipelines. Análise de dados, BI e estágio em dados também podem servir como etapas de entrada.",
      "optional": false,
      "kind": "study",
      "groupIds": [
        "dataEngineering.python-para-dados",
        "curriculum.controle-de-versao",
        "dataEngineering.carreira-em-dados",
        "aiLearning.seu-assistente-de-estudos"
      ]
    },
    {
      "id": "dataEngineering.sql-antes-de-ferramentas-distribuidas",
      "title": "SQL antes de ferramentas distribuídas",
      "description": "",
      "optional": false,
      "kind": "study",
      "groupIds": [
        "curriculum.sql-e-postgresql",
        "dataEngineering.sql-analitico"
      ]
    },
    {
      "id": "aiLearning.ia-prompting-e-contexto",
      "title": "IA: prompting e contexto",
      "description": "Depois dos primeiros fundamentos, pratique transformar uma dúvida em uma tarefa verificável. Use uma ferramenta por vez.",
      "optional": false,
      "kind": "ai",
      "groupIds": [
        "aiLearning.prompts-para-aprender-e-construir",
        "aiLearning.contexto-util-e-dados-protegidos"
      ]
    },
    {
      "id": "dataEngineering.analise-reproduzivel.stage",
      "title": "Projeto: Análise reproduzível",
      "description": "Construa antes de avançar. Registre as decisões e peça uma revisão.",
      "optional": false,
      "kind": "project",
      "groupIds": [
        "dataEngineering.analise-reproduzivel"
      ]
    },
    {
      "id": "dataEngineering.modelagem-e-armazenamento",
      "title": "Modelagem e armazenamento",
      "description": "",
      "optional": false,
      "kind": "study",
      "groupIds": [
        "dataEngineering.modelagem-analitica-e-formatos"
      ]
    },
    {
      "id": "dataEngineering.ingestao-e-transformacao",
      "title": "Ingestão e transformação",
      "description": "",
      "optional": false,
      "kind": "study",
      "groupIds": [
        "dataEngineering.pipelines-batch",
        "dataEngineering.transformacoes-com-dbt"
      ]
    },
    {
      "id": "aiLearning.ia-programacao-em-parceria",
      "title": "IA: programação em parceria",
      "description": "Use o primeiro projeto como contexto. Alterne pequenas implementações, leitura de código, depuração e testes.",
      "optional": false,
      "kind": "ai",
      "groupIds": [
        "aiLearning.planejar-implementar-e-revisar",
        "aiLearning.depuracao-com-evidencias"
      ]
    },
    {
      "id": "dataEngineering.pipeline-local-de-dados.stage",
      "title": "Projeto: Pipeline local de dados",
      "description": "Construa antes de avançar. Registre as decisões e peça uma revisão.",
      "optional": false,
      "kind": "project",
      "groupIds": [
        "dataEngineering.pipeline-local-de-dados"
      ]
    },
    {
      "id": "dataEngineering.orquestracao-e-confiabilidade",
      "title": "Orquestração e confiabilidade",
      "description": "",
      "optional": false,
      "kind": "study",
      "groupIds": [
        "dataEngineering.orquestracao-com-airflow",
        "dataEngineering.qualidade-e-governanca"
      ]
    },
    {
      "id": "dataEngineering.entrega-e-armazenamento-em-nuvem",
      "title": "Entrega e armazenamento em nuvem",
      "description": "Conceitos de nuvem são úteis, mas o portfólio pode rodar localmente. Serviços e warehouses podem ter custo.",
      "optional": false,
      "kind": "study",
      "groupIds": [
        "dataEngineering.containers-ci-e-nuvem"
      ]
    },
    {
      "id": "aiLearning.ia-agentes-regras-e-verificacao",
      "title": "IA: agentes, regras e verificação",
      "description": "Depois de conseguir ler diffs, depurar e testar, delegue uma tarefa limitada no repositório de laboratório.",
      "optional": false,
      "kind": "ai",
      "groupIds": [
        "aiLearning.instrucoes-do-projeto-e-escopo-do-agente",
        "aiLearning.validar-trabalho-gerado-por-ia"
      ]
    },
    {
      "id": "dataEngineering.pipeline-operavel.stage",
      "title": "Projeto: Pipeline operável",
      "description": "Construa antes de avançar. Registre as decisões e peça uma revisão.",
      "optional": false,
      "kind": "project",
      "groupIds": [
        "dataEngineering.pipeline-operavel"
      ]
    },
    {
      "id": "curriculum.preparacao-para-oportunidades",
      "title": "Preparação para oportunidades",
      "description": "Comece a buscar estágio ou vagas compatíveis com seus projetos. Ajuste o estudo aos requisitos recorrentes da sua região; concluir a trilha não garante contratação.",
      "optional": false,
      "kind": "study",
      "groupIds": [
        "curriculum.portfolio-e-candidatura",
        "curriculum.ia-no-fluxo-de-trabalho"
      ]
    },
    {
      "id": "dataEngineering.escala-e-streaming-opcionais",
      "title": "Escala e streaming opcionais",
      "description": "Spark, Kafka, lakehouse e processamento distribuído vêm depois de SQL e pipelines locais. Escolha quando volume ou latência justificarem.",
      "optional": true,
      "kind": "study",
      "groupIds": [
        "dataEngineering.spark-e-streaming"
      ]
    }
  ],
  "groups": {
    "dataEngineering.python-para-dados": {
      "id": "dataEngineering.python-para-dados",
      "title": "Python para dados",
      "description": "Aprenda funções, coleções, arquivos, ambientes virtuais, dependências, erros e testes. Use pandas depois de conseguir ler CSV e JSON com Python.",
      "stageId": "dataEngineering.comece-com-programacao-e-dados",
      "requiredIds": [
        "dataEngineering.python-para-dados.basics",
        "dataEngineering.python-para-dados.practice"
      ],
      "variants": {
        "simple": {
          "summary": "Comece por uma referência de Python para dados e faça a prática essencial.",
          "stepIds": [
            "dataEngineering.python-para-dados.basics",
            "dataEngineering.python-para-dados.practice"
          ]
        },
        "standard": {
          "summary": "Aprenda funções, coleções, arquivos, ambientes virtuais, dependências, erros e testes. Use pandas depois de conseguir ler CSV e JSON com Python.",
          "stepIds": [
            "dataEngineering.python-para-dados.basics",
            "dataEngineering.python-para-dados.practice"
          ]
        },
        "deep": {
          "summary": "Aprofunde Python para dados comparando soluções e demonstrando suas decisões.",
          "stepIds": [
            "dataEngineering.python-para-dados.basics",
            "dataEngineering.python-para-dados.practice",
            "dataEngineering.python-para-dados.deepening"
          ]
        }
      }
    },
    "curriculum.controle-de-versao": {
      "id": "curriculum.controle-de-versao",
      "title": "Controle de Versão",
      "description": "Use Git desde o primeiro exercício: commits pequenos, branches, pull requests, revisão e resolução de conflitos. Não publique credenciais.",
      "stageId": "dataEngineering.comece-com-programacao-e-dados",
      "requiredIds": [
        "curriculum.controle-de-versao.basics",
        "curriculum.controle-de-versao.practice"
      ],
      "variants": {
        "simple": {
          "summary": "Comece por uma referência de Controle de Versão e faça a prática essencial.",
          "stepIds": [
            "curriculum.controle-de-versao.basics",
            "curriculum.controle-de-versao.practice"
          ]
        },
        "standard": {
          "summary": "Use Git desde o primeiro exercício: commits pequenos, branches, pull requests, revisão e resolução de conflitos. Não publique credenciais.",
          "stepIds": [
            "curriculum.controle-de-versao.basics",
            "curriculum.controle-de-versao.practice"
          ]
        },
        "deep": {
          "summary": "Aprofunde Controle de Versão comparando soluções e demonstrando suas decisões.",
          "stepIds": [
            "curriculum.controle-de-versao.basics",
            "curriculum.controle-de-versao.practice",
            "curriculum.controle-de-versao.deepening"
          ]
        }
      }
    },
    "dataEngineering.carreira-em-dados": {
      "id": "dataEngineering.carreira-em-dados",
      "title": "Carreira em dados",
      "description": "Entenda o que faz um engenheiro de dados, quais habilidades as vagas de entrada pedem e como projetos de dados se conectam ao trabalho real.",
      "stageId": "dataEngineering.comece-com-programacao-e-dados",
      "requiredIds": [
        "dataEngineering.carreira-em-dados.basics",
        "dataEngineering.carreira-em-dados.practice"
      ],
      "variants": {
        "simple": {
          "summary": "Comece por uma referência de Carreira em dados e faça a prática essencial.",
          "stepIds": [
            "dataEngineering.carreira-em-dados.basics",
            "dataEngineering.carreira-em-dados.practice"
          ]
        },
        "standard": {
          "summary": "Entenda o que faz um engenheiro de dados, quais habilidades as vagas de entrada pedem e como projetos de dados se conectam ao trabalho real.",
          "stepIds": [
            "dataEngineering.carreira-em-dados.basics",
            "dataEngineering.carreira-em-dados.practice"
          ]
        },
        "deep": {
          "summary": "Aprofunde Carreira em dados comparando soluções e demonstrando suas decisões.",
          "stepIds": [
            "dataEngineering.carreira-em-dados.basics",
            "dataEngineering.carreira-em-dados.practice",
            "dataEngineering.carreira-em-dados.deepening"
          ]
        }
      }
    },
    "aiLearning.seu-assistente-de-estudos": {
      "id": "aiLearning.seu-assistente-de-estudos",
      "title": "Seu assistente de estudos",
      "description": "Aprenda programação e uso de IA em paralelo. Escolha uma ferramenta a que já tenha acesso; os exercícios também funcionam em um chat, compartilhando trechos pequenos. Documentação gratuita não significa serviço gratuito: consulte os limites da sua conta. Você não precisa assinar nem dominar três ferramentas.",
      "stageId": "dataEngineering.comece-com-programacao-e-dados",
      "ai": "focused",
      "requiredIds": [
        "aiLearning.escolha-uma-ferramenta",
        "aiLearning.pratique-tutoria"
      ],
      "variants": {
        "simple": {
          "summary": "Comece por uma referência de Seu assistente de estudos e faça a prática essencial.",
          "stepIds": [
            "aiLearning.escolha-uma-ferramenta",
            "aiLearning.pratique-tutoria"
          ]
        },
        "standard": {
          "summary": "Aprenda programação e uso de IA em paralelo. Escolha uma ferramenta a que já tenha acesso; os exercícios também funcionam em um chat, compartilhando trechos pequenos. Documentação gratuita não significa serviço gratuito: consulte os limites da sua conta. Você não precisa assinar nem dominar três ferramentas.",
          "stepIds": [
            "aiLearning.escolha-uma-ferramenta",
            "aiLearning.pratique-tutoria"
          ]
        },
        "deep": {
          "summary": "Aprofunde Seu assistente de estudos comparando soluções e demonstrando suas decisões.",
          "stepIds": [
            "aiLearning.escolha-uma-ferramenta",
            "aiLearning.pratique-tutoria",
            "aiLearning.seu-assistente-de-estudos.deepening"
          ]
        }
      }
    },
    "curriculum.sql-e-postgresql": {
      "id": "curriculum.sql-e-postgresql",
      "title": "SQL e PostgreSQL",
      "description": "Aprenda SELECT, filtros, JOIN, agregações, CTEs, chaves, constraints, transações, índices e migrações. Comece com um banco relacional.",
      "stageId": "dataEngineering.sql-antes-de-ferramentas-distribuidas",
      "requiredIds": [
        "curriculum.sql-e-postgresql.basics",
        "curriculum.sql-e-postgresql.practice"
      ],
      "variants": {
        "simple": {
          "summary": "Comece por uma referência de SQL e PostgreSQL e faça a prática essencial.",
          "stepIds": [
            "curriculum.sql-e-postgresql.basics",
            "curriculum.sql-e-postgresql.practice"
          ]
        },
        "standard": {
          "summary": "Aprenda SELECT, filtros, JOIN, agregações, CTEs, chaves, constraints, transações, índices e migrações. Comece com um banco relacional.",
          "stepIds": [
            "curriculum.sql-e-postgresql.basics",
            "curriculum.sql-e-postgresql.practice"
          ]
        },
        "deep": {
          "summary": "Aprofunde SQL e PostgreSQL comparando soluções e demonstrando suas decisões.",
          "stepIds": [
            "curriculum.sql-e-postgresql.basics",
            "curriculum.sql-e-postgresql.practice",
            "curriculum.sql-e-postgresql.deepening"
          ]
        }
      }
    },
    "dataEngineering.sql-analitico": {
      "id": "dataEngineering.sql-analitico",
      "title": "SQL analítico",
      "description": "Pratique agregações, CTEs, window functions, deduplicação e análise de plano. Diferencie granularidade e chaves ao combinar tabelas.",
      "stageId": "dataEngineering.sql-antes-de-ferramentas-distribuidas",
      "requiredIds": [
        "dataEngineering.sql-analitico.basics",
        "dataEngineering.sql-analitico.practice"
      ],
      "variants": {
        "simple": {
          "summary": "Comece por uma referência de SQL analítico e faça a prática essencial.",
          "stepIds": [
            "dataEngineering.sql-analitico.basics",
            "dataEngineering.sql-analitico.practice"
          ]
        },
        "standard": {
          "summary": "Pratique agregações, CTEs, window functions, deduplicação e análise de plano. Diferencie granularidade e chaves ao combinar tabelas.",
          "stepIds": [
            "dataEngineering.sql-analitico.basics",
            "dataEngineering.sql-analitico.practice"
          ]
        },
        "deep": {
          "summary": "Aprofunde SQL analítico comparando soluções e demonstrando suas decisões.",
          "stepIds": [
            "dataEngineering.sql-analitico.basics",
            "dataEngineering.sql-analitico.practice",
            "dataEngineering.sql-analitico.deepening"
          ]
        }
      }
    },
    "aiLearning.prompts-para-aprender-e-construir": {
      "id": "aiLearning.prompts-para-aprender-e-construir",
      "title": "Prompts para aprender e construir",
      "description": "Expresse objetivo, contexto, limites e como conferir o resultado. Mostre sua tentativa e exemplos de entrada/saída. Peça uma resposta no nível de quem está aprendendo e faça perguntas quando algo não estiver claro. Ajuste o prompt a partir do resultado, sem decorar fórmulas.",
      "stageId": "aiLearning.ia-prompting-e-contexto",
      "ai": "focused",
      "requiredIds": [
        "aiLearning.prompts-para-aprender-e-construir.basics",
        "aiLearning.prompts-para-aprender-e-construir.practice"
      ],
      "variants": {
        "simple": {
          "summary": "Comece por uma referência de Prompts para aprender e construir e faça a prática essencial.",
          "stepIds": [
            "aiLearning.prompts-para-aprender-e-construir.basics",
            "aiLearning.prompts-para-aprender-e-construir.practice"
          ]
        },
        "standard": {
          "summary": "Expresse objetivo, contexto, limites e como conferir o resultado. Mostre sua tentativa e exemplos de entrada/saída. Peça uma resposta no nível de quem está aprendendo e faça perguntas quando algo não estiver claro. Ajuste o prompt a partir do resultado, sem decorar fórmulas.",
          "stepIds": [
            "aiLearning.prompts-para-aprender-e-construir.basics",
            "aiLearning.prompts-para-aprender-e-construir.practice"
          ]
        },
        "deep": {
          "summary": "Aprofunde Prompts para aprender e construir comparando soluções e demonstrando suas decisões.",
          "stepIds": [
            "aiLearning.prompts-para-aprender-e-construir.basics",
            "aiLearning.prompts-para-aprender-e-construir.practice",
            "aiLearning.prompts-para-aprender-e-construir.deepening"
          ]
        }
      }
    },
    "aiLearning.contexto-util-e-dados-protegidos": {
      "id": "aiLearning.contexto-util-e-dados-protegidos",
      "title": "Contexto útil e dados protegidos",
      "description": "Forneça os arquivos relevantes, o erro completo sanitizado, a versão usada e o comportamento esperado. Diferencie conversar sobre código de permitir edição e execução. Use dados de laboratório; não compartilhe senhas, tokens ou dados pessoais.",
      "stageId": "aiLearning.ia-prompting-e-contexto",
      "ai": "focused",
      "requiredIds": [
        "aiLearning.contexto-util-e-dados-protegidos.basics",
        "aiLearning.contexto-util-e-dados-protegidos.practice"
      ],
      "variants": {
        "simple": {
          "summary": "Comece por uma referência de Contexto útil e dados protegidos e faça a prática essencial.",
          "stepIds": [
            "aiLearning.contexto-util-e-dados-protegidos.basics",
            "aiLearning.contexto-util-e-dados-protegidos.practice"
          ]
        },
        "standard": {
          "summary": "Forneça os arquivos relevantes, o erro completo sanitizado, a versão usada e o comportamento esperado. Diferencie conversar sobre código de permitir edição e execução. Use dados de laboratório; não compartilhe senhas, tokens ou dados pessoais.",
          "stepIds": [
            "aiLearning.contexto-util-e-dados-protegidos.basics",
            "aiLearning.contexto-util-e-dados-protegidos.practice"
          ]
        },
        "deep": {
          "summary": "Aprofunde Contexto útil e dados protegidos comparando soluções e demonstrando suas decisões.",
          "stepIds": [
            "aiLearning.contexto-util-e-dados-protegidos.basics",
            "aiLearning.contexto-util-e-dados-protegidos.practice",
            "aiLearning.contexto-util-e-dados-protegidos.deepening"
          ]
        }
      }
    },
    "dataEngineering.analise-reproduzivel": {
      "id": "dataEngineering.analise-reproduzivel",
      "title": "Análise reproduzível",
      "description": "Importe um conjunto de dados públicos em PostgreSQL ou DuckDB e responda perguntas de negócio com SQL.",
      "stageId": "dataEngineering.analise-reproduzivel.stage",
      "ai": "assisted",
      "requiredIds": [
        "dataEngineering.analise-reproduzivel.criteria",
        "dataEngineering.analise-reproduzivel.ai-practice",
        "dataEngineering.analise-reproduzivel.verification"
      ],
      "variants": {
        "simple": {
          "summary": "Comece por uma referência de Análise reproduzível e faça a prática essencial.",
          "stepIds": [
            "dataEngineering.analise-reproduzivel.criteria",
            "dataEngineering.analise-reproduzivel.ai-practice",
            "dataEngineering.analise-reproduzivel.verification"
          ]
        },
        "standard": {
          "summary": "Importe um conjunto de dados públicos em PostgreSQL ou DuckDB e responda perguntas de negócio com SQL.",
          "stepIds": [
            "dataEngineering.analise-reproduzivel.criteria",
            "dataEngineering.analise-reproduzivel.ai-practice",
            "dataEngineering.analise-reproduzivel.verification"
          ]
        },
        "deep": {
          "summary": "Aprofunde Análise reproduzível comparando soluções e demonstrando suas decisões.",
          "stepIds": [
            "dataEngineering.analise-reproduzivel.criteria",
            "dataEngineering.analise-reproduzivel.ai-practice",
            "dataEngineering.analise-reproduzivel.verification",
            "dataEngineering.analise-reproduzivel.deepening"
          ]
        }
      }
    },
    "dataEngineering.modelagem-analitica-e-formatos": {
      "id": "dataEngineering.modelagem-analitica-e-formatos",
      "title": "Modelagem analítica e formatos",
      "description": "Entenda tabelas fato/dimensão, esquema estrela, granularidade, histórico e particionamento. Compare CSV, JSON e Parquet; diferencie OLTP de OLAP.",
      "stageId": "dataEngineering.modelagem-e-armazenamento",
      "requiredIds": [
        "dataEngineering.modelagem-analitica-e-formatos.basics",
        "dataEngineering.modelagem-analitica-e-formatos.practice"
      ],
      "variants": {
        "simple": {
          "summary": "Comece por uma referência de Modelagem analítica e formatos e faça a prática essencial.",
          "stepIds": [
            "dataEngineering.modelagem-analitica-e-formatos.basics",
            "dataEngineering.modelagem-analitica-e-formatos.practice"
          ]
        },
        "standard": {
          "summary": "Entenda tabelas fato/dimensão, esquema estrela, granularidade, histórico e particionamento. Compare CSV, JSON e Parquet; diferencie OLTP de OLAP.",
          "stepIds": [
            "dataEngineering.modelagem-analitica-e-formatos.basics",
            "dataEngineering.modelagem-analitica-e-formatos.practice"
          ]
        },
        "deep": {
          "summary": "Aprofunde Modelagem analítica e formatos comparando soluções e demonstrando suas decisões.",
          "stepIds": [
            "dataEngineering.modelagem-analitica-e-formatos.basics",
            "dataEngineering.modelagem-analitica-e-formatos.practice",
            "dataEngineering.modelagem-analitica-e-formatos.deepening"
          ]
        }
      }
    },
    "dataEngineering.pipelines-batch": {
      "id": "dataEngineering.pipelines-batch",
      "title": "Pipelines batch",
      "description": "Extraia arquivos ou APIs, valide esquema e separe dados brutos de transformados. Trate paginação, limites, carga incremental e idempotência.",
      "stageId": "dataEngineering.ingestao-e-transformacao",
      "requiredIds": [
        "dataEngineering.pipelines-batch.basics",
        "dataEngineering.pipelines-batch.practice"
      ],
      "variants": {
        "simple": {
          "summary": "Comece por uma referência de Pipelines batch e faça a prática essencial.",
          "stepIds": [
            "dataEngineering.pipelines-batch.basics",
            "dataEngineering.pipelines-batch.practice"
          ]
        },
        "standard": {
          "summary": "Extraia arquivos ou APIs, valide esquema e separe dados brutos de transformados. Trate paginação, limites, carga incremental e idempotência.",
          "stepIds": [
            "dataEngineering.pipelines-batch.basics",
            "dataEngineering.pipelines-batch.practice"
          ]
        },
        "deep": {
          "summary": "Aprofunde Pipelines batch comparando soluções e demonstrando suas decisões.",
          "stepIds": [
            "dataEngineering.pipelines-batch.basics",
            "dataEngineering.pipelines-batch.practice",
            "dataEngineering.pipelines-batch.deepening"
          ]
        }
      }
    },
    "dataEngineering.transformacoes-com-dbt": {
      "id": "dataEngineering.transformacoes-com-dbt",
      "title": "Transformações com dbt",
      "description": "Versione transformações SQL, dependências, testes e documentação. Comece com um banco local e uma ferramenta por vez; a documentação não exige contratar uma plataforma.",
      "stageId": "dataEngineering.ingestao-e-transformacao",
      "requiredIds": [
        "dataEngineering.transformacoes-com-dbt.basics",
        "dataEngineering.transformacoes-com-dbt.practice"
      ],
      "variants": {
        "simple": {
          "summary": "Comece por uma referência de Transformações com dbt e faça a prática essencial.",
          "stepIds": [
            "dataEngineering.transformacoes-com-dbt.basics",
            "dataEngineering.transformacoes-com-dbt.practice"
          ]
        },
        "standard": {
          "summary": "Versione transformações SQL, dependências, testes e documentação. Comece com um banco local e uma ferramenta por vez; a documentação não exige contratar uma plataforma.",
          "stepIds": [
            "dataEngineering.transformacoes-com-dbt.basics",
            "dataEngineering.transformacoes-com-dbt.practice"
          ]
        },
        "deep": {
          "summary": "Aprofunde Transformações com dbt comparando soluções e demonstrando suas decisões.",
          "stepIds": [
            "dataEngineering.transformacoes-com-dbt.basics",
            "dataEngineering.transformacoes-com-dbt.practice",
            "dataEngineering.transformacoes-com-dbt.deepening"
          ]
        }
      }
    },
    "aiLearning.planejar-implementar-e-revisar": {
      "id": "aiLearning.planejar-implementar-e-revisar",
      "title": "Planejar, implementar e revisar",
      "description": "Defina um recorte pequeno e peça um plano. Decida o que implementar você e o que delegar. Revise cada diff, rode a aplicação e confira o comportamento antes de seguir para outra tarefa. A IA pode gerar código, testes e documentação, mas a evidência precisa ser executada.",
      "stageId": "aiLearning.ia-programacao-em-parceria",
      "ai": "focused",
      "requiredIds": [
        "aiLearning.planejar-implementar-e-revisar.basics",
        "aiLearning.planejar-implementar-e-revisar.practice"
      ],
      "variants": {
        "simple": {
          "summary": "Comece por uma referência de Planejar, implementar e revisar e faça a prática essencial.",
          "stepIds": [
            "aiLearning.planejar-implementar-e-revisar.basics",
            "aiLearning.planejar-implementar-e-revisar.practice"
          ]
        },
        "standard": {
          "summary": "Defina um recorte pequeno e peça um plano. Decida o que implementar você e o que delegar. Revise cada diff, rode a aplicação e confira o comportamento antes de seguir para outra tarefa. A IA pode gerar código, testes e documentação, mas a evidência precisa ser executada.",
          "stepIds": [
            "aiLearning.planejar-implementar-e-revisar.basics",
            "aiLearning.planejar-implementar-e-revisar.practice"
          ]
        },
        "deep": {
          "summary": "Aprofunde Planejar, implementar e revisar comparando soluções e demonstrando suas decisões.",
          "stepIds": [
            "aiLearning.planejar-implementar-e-revisar.basics",
            "aiLearning.planejar-implementar-e-revisar.practice",
            "aiLearning.planejar-implementar-e-revisar.deepening"
          ]
        }
      }
    },
    "aiLearning.depuracao-com-evidencias": {
      "id": "aiLearning.depuracao-com-evidencias",
      "title": "Depuração com evidências",
      "description": "Reproduza o problema e registre esperado versus observado. Peça hipóteses e uma forma de distinguir entre elas antes de tentar correções. Não confunda uma explicação plausível com uma causa confirmada.",
      "stageId": "aiLearning.ia-programacao-em-parceria",
      "ai": "focused",
      "requiredIds": [
        "aiLearning.depuracao-com-evidencias.basics",
        "aiLearning.depuracao-com-evidencias.practice"
      ],
      "variants": {
        "simple": {
          "summary": "Comece por uma referência de Depuração com evidências e faça a prática essencial.",
          "stepIds": [
            "aiLearning.depuracao-com-evidencias.basics",
            "aiLearning.depuracao-com-evidencias.practice"
          ]
        },
        "standard": {
          "summary": "Reproduza o problema e registre esperado versus observado. Peça hipóteses e uma forma de distinguir entre elas antes de tentar correções. Não confunda uma explicação plausível com uma causa confirmada.",
          "stepIds": [
            "aiLearning.depuracao-com-evidencias.basics",
            "aiLearning.depuracao-com-evidencias.practice"
          ]
        },
        "deep": {
          "summary": "Aprofunde Depuração com evidências comparando soluções e demonstrando suas decisões.",
          "stepIds": [
            "aiLearning.depuracao-com-evidencias.basics",
            "aiLearning.depuracao-com-evidencias.practice",
            "aiLearning.depuracao-com-evidencias.deepening"
          ]
        }
      }
    },
    "dataEngineering.pipeline-local-de-dados": {
      "id": "dataEngineering.pipeline-local-de-dados",
      "title": "Pipeline local de dados",
      "description": "Construa uma carga batch de dados públicos com camadas bruta, tratada e analítica.",
      "stageId": "dataEngineering.pipeline-local-de-dados.stage",
      "ai": "assisted",
      "requiredIds": [
        "dataEngineering.pipeline-local-de-dados.criteria",
        "dataEngineering.pipeline-local-de-dados.ai-practice",
        "dataEngineering.pipeline-local-de-dados.verification"
      ],
      "variants": {
        "simple": {
          "summary": "Comece por uma referência de Pipeline local de dados e faça a prática essencial.",
          "stepIds": [
            "dataEngineering.pipeline-local-de-dados.criteria",
            "dataEngineering.pipeline-local-de-dados.ai-practice",
            "dataEngineering.pipeline-local-de-dados.verification"
          ]
        },
        "standard": {
          "summary": "Construa uma carga batch de dados públicos com camadas bruta, tratada e analítica.",
          "stepIds": [
            "dataEngineering.pipeline-local-de-dados.criteria",
            "dataEngineering.pipeline-local-de-dados.ai-practice",
            "dataEngineering.pipeline-local-de-dados.verification"
          ]
        },
        "deep": {
          "summary": "Aprofunde Pipeline local de dados comparando soluções e demonstrando suas decisões.",
          "stepIds": [
            "dataEngineering.pipeline-local-de-dados.criteria",
            "dataEngineering.pipeline-local-de-dados.ai-practice",
            "dataEngineering.pipeline-local-de-dados.verification",
            "dataEngineering.pipeline-local-de-dados.deepening"
          ]
        }
      }
    },
    "dataEngineering.orquestracao-com-airflow": {
      "id": "dataEngineering.orquestracao-com-airflow",
      "title": "Orquestração com Airflow",
      "description": "Aprenda tarefas, dependências, agendamento, retries, backfill e logs. Use Airflow ou uma alternativa depois de ter um pipeline que funciona sem o orquestrador.",
      "stageId": "dataEngineering.orquestracao-e-confiabilidade",
      "requiredIds": [
        "dataEngineering.orquestracao-com-airflow.basics",
        "dataEngineering.orquestracao-com-airflow.practice"
      ],
      "variants": {
        "simple": {
          "summary": "Comece por uma referência de Orquestração com Airflow e faça a prática essencial.",
          "stepIds": [
            "dataEngineering.orquestracao-com-airflow.basics",
            "dataEngineering.orquestracao-com-airflow.practice"
          ]
        },
        "standard": {
          "summary": "Aprenda tarefas, dependências, agendamento, retries, backfill e logs. Use Airflow ou uma alternativa depois de ter um pipeline que funciona sem o orquestrador.",
          "stepIds": [
            "dataEngineering.orquestracao-com-airflow.basics",
            "dataEngineering.orquestracao-com-airflow.practice"
          ]
        },
        "deep": {
          "summary": "Aprofunde Orquestração com Airflow comparando soluções e demonstrando suas decisões.",
          "stepIds": [
            "dataEngineering.orquestracao-com-airflow.basics",
            "dataEngineering.orquestracao-com-airflow.practice",
            "dataEngineering.orquestracao-com-airflow.deepening"
          ]
        }
      }
    },
    "dataEngineering.qualidade-e-governanca": {
      "id": "dataEngineering.qualidade-e-governanca",
      "title": "Qualidade e governança",
      "description": "Defina contratos, testes de completude e atualidade, linhagem, controle de acesso e retenção. Use dados públicos ou sintéticos; reduza a exposição de dados pessoais.",
      "stageId": "dataEngineering.orquestracao-e-confiabilidade",
      "requiredIds": [
        "dataEngineering.qualidade-e-governanca.basics",
        "dataEngineering.qualidade-e-governanca.practice"
      ],
      "variants": {
        "simple": {
          "summary": "Comece por uma referência de Qualidade e governança e faça a prática essencial.",
          "stepIds": [
            "dataEngineering.qualidade-e-governanca.basics",
            "dataEngineering.qualidade-e-governanca.practice"
          ]
        },
        "standard": {
          "summary": "Defina contratos, testes de completude e atualidade, linhagem, controle de acesso e retenção. Use dados públicos ou sintéticos; reduza a exposição de dados pessoais.",
          "stepIds": [
            "dataEngineering.qualidade-e-governanca.basics",
            "dataEngineering.qualidade-e-governanca.practice"
          ]
        },
        "deep": {
          "summary": "Aprofunde Qualidade e governança comparando soluções e demonstrando suas decisões.",
          "stepIds": [
            "dataEngineering.qualidade-e-governanca.basics",
            "dataEngineering.qualidade-e-governanca.practice",
            "dataEngineering.qualidade-e-governanca.deepening"
          ]
        }
      }
    },
    "dataEngineering.containers-ci-e-nuvem": {
      "id": "dataEngineering.containers-ci-e-nuvem",
      "title": "Containers, CI e nuvem",
      "description": "Empacote o pipeline, rode testes em CI e entenda object storage, IAM, custos e warehouse. Escolha um provedor conforme o contexto.",
      "stageId": "dataEngineering.entrega-e-armazenamento-em-nuvem",
      "requiredIds": [
        "dataEngineering.containers-ci-e-nuvem.basics",
        "dataEngineering.containers-ci-e-nuvem.practice"
      ],
      "variants": {
        "simple": {
          "summary": "Comece por uma referência de Containers, CI e nuvem e faça a prática essencial.",
          "stepIds": [
            "dataEngineering.containers-ci-e-nuvem.basics",
            "dataEngineering.containers-ci-e-nuvem.practice"
          ]
        },
        "standard": {
          "summary": "Empacote o pipeline, rode testes em CI e entenda object storage, IAM, custos e warehouse. Escolha um provedor conforme o contexto.",
          "stepIds": [
            "dataEngineering.containers-ci-e-nuvem.basics",
            "dataEngineering.containers-ci-e-nuvem.practice"
          ]
        },
        "deep": {
          "summary": "Aprofunde Containers, CI e nuvem comparando soluções e demonstrando suas decisões.",
          "stepIds": [
            "dataEngineering.containers-ci-e-nuvem.basics",
            "dataEngineering.containers-ci-e-nuvem.practice",
            "dataEngineering.containers-ci-e-nuvem.deepening"
          ]
        }
      }
    },
    "aiLearning.instrucoes-do-projeto-e-escopo-do-agente": {
      "id": "aiLearning.instrucoes-do-projeto-e-escopo-do-agente",
      "title": "Instruções do projeto e escopo do agente",
      "description": "Documente como rodar, testar e organizar o projeto. Pratique regras do Cursor, CLAUDE.md ou AGENTS.md conforme a ferramenta escolhida. Defina arquivos, tarefa, limites e permissões. Comece com uma branch e uma alteração pequena; deixe MCP, múltiplos agentes e automações amplas para aprofundamento.",
      "stageId": "aiLearning.ia-agentes-regras-e-verificacao",
      "ai": "focused",
      "requiredIds": [
        "aiLearning.instrucoes-do-projeto-e-escopo-do-agente.basics",
        "aiLearning.instrucoes-do-projeto-e-escopo-do-agente.practice"
      ],
      "variants": {
        "simple": {
          "summary": "Comece por uma referência de Instruções do projeto e escopo do agente e faça a prática essencial.",
          "stepIds": [
            "aiLearning.instrucoes-do-projeto-e-escopo-do-agente.basics",
            "aiLearning.instrucoes-do-projeto-e-escopo-do-agente.practice"
          ]
        },
        "standard": {
          "summary": "Documente como rodar, testar e organizar o projeto. Pratique regras do Cursor, CLAUDE.md ou AGENTS.md conforme a ferramenta escolhida. Defina arquivos, tarefa, limites e permissões. Comece com uma branch e uma alteração pequena; deixe MCP, múltiplos agentes e automações amplas para aprofundamento.",
          "stepIds": [
            "aiLearning.instrucoes-do-projeto-e-escopo-do-agente.basics",
            "aiLearning.instrucoes-do-projeto-e-escopo-do-agente.practice"
          ]
        },
        "deep": {
          "summary": "Aprofunde Instruções do projeto e escopo do agente comparando soluções e demonstrando suas decisões.",
          "stepIds": [
            "aiLearning.instrucoes-do-projeto-e-escopo-do-agente.basics",
            "aiLearning.instrucoes-do-projeto-e-escopo-do-agente.practice",
            "aiLearning.instrucoes-do-projeto-e-escopo-do-agente.deepening"
          ]
        }
      }
    },
    "aiLearning.validar-trabalho-gerado-por-ia": {
      "id": "aiLearning.validar-trabalho-gerado-por-ia",
      "title": "Validar trabalho gerado por IA",
      "description": "Confira comportamento e requisitos além dos testes produzidos pelo próprio agente. Verifique casos negativos, dependências, documentação da versão e o resultado dos comandos. Para interface, faça inspeção visual e por teclado; para dados, use uma amostra com resultado conhecido.",
      "stageId": "aiLearning.ia-agentes-regras-e-verificacao",
      "ai": "focused",
      "requiredIds": [
        "aiLearning.validar-trabalho-gerado-por-ia.basics",
        "aiLearning.validar-trabalho-gerado-por-ia.practice"
      ],
      "variants": {
        "simple": {
          "summary": "Comece por uma referência de Validar trabalho gerado por IA e faça a prática essencial.",
          "stepIds": [
            "aiLearning.validar-trabalho-gerado-por-ia.basics",
            "aiLearning.validar-trabalho-gerado-por-ia.practice"
          ]
        },
        "standard": {
          "summary": "Confira comportamento e requisitos além dos testes produzidos pelo próprio agente. Verifique casos negativos, dependências, documentação da versão e o resultado dos comandos. Para interface, faça inspeção visual e por teclado; para dados, use uma amostra com resultado conhecido.",
          "stepIds": [
            "aiLearning.validar-trabalho-gerado-por-ia.basics",
            "aiLearning.validar-trabalho-gerado-por-ia.practice"
          ]
        },
        "deep": {
          "summary": "Aprofunde Validar trabalho gerado por IA comparando soluções e demonstrando suas decisões.",
          "stepIds": [
            "aiLearning.validar-trabalho-gerado-por-ia.basics",
            "aiLearning.validar-trabalho-gerado-por-ia.practice",
            "aiLearning.validar-trabalho-gerado-por-ia.deepening"
          ]
        }
      }
    },
    "dataEngineering.pipeline-operavel": {
      "id": "dataEngineering.pipeline-operavel",
      "title": "Pipeline operável",
      "description": "Entregue ingestão incremental, transformação, orquestração e uma camada analítica documentada.",
      "stageId": "dataEngineering.pipeline-operavel.stage",
      "ai": "assisted",
      "requiredIds": [
        "dataEngineering.pipeline-operavel.criteria",
        "dataEngineering.pipeline-operavel.ai-practice",
        "dataEngineering.pipeline-operavel.verification"
      ],
      "variants": {
        "simple": {
          "summary": "Comece por uma referência de Pipeline operável e faça a prática essencial.",
          "stepIds": [
            "dataEngineering.pipeline-operavel.criteria",
            "dataEngineering.pipeline-operavel.ai-practice",
            "dataEngineering.pipeline-operavel.verification"
          ]
        },
        "standard": {
          "summary": "Entregue ingestão incremental, transformação, orquestração e uma camada analítica documentada.",
          "stepIds": [
            "dataEngineering.pipeline-operavel.criteria",
            "dataEngineering.pipeline-operavel.ai-practice",
            "dataEngineering.pipeline-operavel.verification"
          ]
        },
        "deep": {
          "summary": "Aprofunde Pipeline operável comparando soluções e demonstrando suas decisões.",
          "stepIds": [
            "dataEngineering.pipeline-operavel.criteria",
            "dataEngineering.pipeline-operavel.ai-practice",
            "dataEngineering.pipeline-operavel.verification",
            "dataEngineering.pipeline-operavel.deepening"
          ]
        }
      }
    },
    "curriculum.portfolio-e-candidatura": {
      "id": "curriculum.portfolio-e-candidatura",
      "title": "Portfólio e candidatura",
      "description": "Publique projetos com problema, instruções de execução, testes, decisões e limitações. Prepare currículo conciso, uma demonstração e exemplos de colaboração. Pratique leitura de documentação em inglês aos poucos.",
      "stageId": "curriculum.preparacao-para-oportunidades",
      "requiredIds": [
        "curriculum.portfolio-e-candidatura.basics",
        "curriculum.portfolio-e-candidatura.practice"
      ],
      "variants": {
        "simple": {
          "summary": "Comece por uma referência de Portfólio e candidatura e faça a prática essencial.",
          "stepIds": [
            "curriculum.portfolio-e-candidatura.basics",
            "curriculum.portfolio-e-candidatura.practice"
          ]
        },
        "standard": {
          "summary": "Publique projetos com problema, instruções de execução, testes, decisões e limitações. Prepare currículo conciso, uma demonstração e exemplos de colaboração. Pratique leitura de documentação em inglês aos poucos.",
          "stepIds": [
            "curriculum.portfolio-e-candidatura.basics",
            "curriculum.portfolio-e-candidatura.practice"
          ]
        },
        "deep": {
          "summary": "Aprofunde Portfólio e candidatura comparando soluções e demonstrando suas decisões.",
          "stepIds": [
            "curriculum.portfolio-e-candidatura.basics",
            "curriculum.portfolio-e-candidatura.practice",
            "curriculum.portfolio-e-candidatura.deepening"
          ]
        }
      }
    },
    "curriculum.ia-no-fluxo-de-trabalho": {
      "id": "curriculum.ia-no-fluxo-de-trabalho",
      "title": "IA no fluxo de trabalho",
      "description": "Use IA para explicar erros, propor testes e revisar hipóteses. Confira a documentação, o diff e os resultados. Proteja dados privados e segredos.",
      "stageId": "curriculum.preparacao-para-oportunidades",
      "ai": "focused",
      "requiredIds": [
        "curriculum.ia-no-fluxo-de-trabalho.basics",
        "curriculum.ia-no-fluxo-de-trabalho.practice"
      ],
      "variants": {
        "simple": {
          "summary": "Comece por uma referência de IA no fluxo de trabalho e faça a prática essencial.",
          "stepIds": [
            "curriculum.ia-no-fluxo-de-trabalho.basics",
            "curriculum.ia-no-fluxo-de-trabalho.practice"
          ]
        },
        "standard": {
          "summary": "Use IA para explicar erros, propor testes e revisar hipóteses. Confira a documentação, o diff e os resultados. Proteja dados privados e segredos.",
          "stepIds": [
            "curriculum.ia-no-fluxo-de-trabalho.basics",
            "curriculum.ia-no-fluxo-de-trabalho.practice"
          ]
        },
        "deep": {
          "summary": "Aprofunde IA no fluxo de trabalho comparando soluções e demonstrando suas decisões.",
          "stepIds": [
            "curriculum.ia-no-fluxo-de-trabalho.basics",
            "curriculum.ia-no-fluxo-de-trabalho.practice",
            "curriculum.ia-no-fluxo-de-trabalho.deepening"
          ]
        }
      }
    },
    "dataEngineering.spark-e-streaming": {
      "id": "dataEngineering.spark-e-streaming",
      "title": "Spark e streaming",
      "description": "Compare batch e streaming, particionamento, checkpoints, eventos atrasados e semântica de entrega. Meça o problema antes de distribuir.",
      "stageId": "dataEngineering.escala-e-streaming-opcionais",
      "requiredIds": [
        "dataEngineering.spark-e-streaming.basics",
        "dataEngineering.spark-e-streaming.practice"
      ],
      "variants": {
        "simple": {
          "summary": "Comece por uma referência de Spark e streaming e faça a prática essencial.",
          "stepIds": [
            "dataEngineering.spark-e-streaming.basics",
            "dataEngineering.spark-e-streaming.practice"
          ]
        },
        "standard": {
          "summary": "Compare batch e streaming, particionamento, checkpoints, eventos atrasados e semântica de entrega. Meça o problema antes de distribuir.",
          "stepIds": [
            "dataEngineering.spark-e-streaming.basics",
            "dataEngineering.spark-e-streaming.practice"
          ]
        },
        "deep": {
          "summary": "Aprofunde Spark e streaming comparando soluções e demonstrando suas decisões.",
          "stepIds": [
            "dataEngineering.spark-e-streaming.basics",
            "dataEngineering.spark-e-streaming.practice",
            "dataEngineering.spark-e-streaming.deepening"
          ]
        }
      }
    }
  },
  "nodes": {
    "dataEngineering.python-para-dados.basics": {
      "id": "dataEngineering.python-para-dados.basics",
      "groupId": "dataEngineering.python-para-dados",
      "title": "O básico",
      "description": "",
      "requires": [],
      "resourceIds": [
        "resource.pythonCourse",
        "resource.python",
        "resource.pandas",
        "resource.youtubePythonCourse",
        "resource.youtubeDunossauro",
        "resource.youtubeLetsData"
      ],
      "kind": "concept",
      "legacyIds": [
        "Python para dados-O básico",
        "O básico-Python para dados"
      ]
    },
    "dataEngineering.python-para-dados.practice": {
      "id": "dataEngineering.python-para-dados.practice",
      "groupId": "dataEngineering.python-para-dados",
      "title": "Pratique e confira",
      "description": "Leia um CSV, valide tipos e valores faltantes e produza uma saída com um relatório de rejeições.",
      "requires": [
        "dataEngineering.python-para-dados.basics"
      ],
      "resourceIds": [
        "resource.pythonCourse",
        "resource.python",
        "resource.pandas",
        "resource.youtubePythonCourse",
        "resource.youtubeDunossauro",
        "resource.youtubeLetsData"
      ],
      "kind": "practice",
      "legacyIds": [
        "Python para dados-Pratique e confira",
        "Pratique e confira-Python para dados"
      ]
    },
    "dataEngineering.python-para-dados.deepening": {
      "id": "dataEngineering.python-para-dados.deepening",
      "groupId": "dataEngineering.python-para-dados",
      "title": "Desafio de aprofundamento",
      "kind": "challenge",
      "description": "Escolha uma decisão de Python para dados no seu projeto. Construa uma segunda solução, compare os resultados com um caso de teste e explique os limites de cada abordagem. Use as referências para verificar sua conclusão.",
      "requires": [
        "dataEngineering.python-para-dados.basics",
        "dataEngineering.python-para-dados.practice"
      ],
      "resourceIds": [
        "resource.pythonCourse",
        "resource.python",
        "resource.pandas",
        "resource.youtubePythonCourse",
        "resource.youtubeDunossauro",
        "resource.youtubeLetsData"
      ],
      "legacyIds": []
    },
    "curriculum.controle-de-versao.basics": {
      "id": "curriculum.controle-de-versao.basics",
      "groupId": "curriculum.controle-de-versao",
      "title": "O básico",
      "description": "",
      "requires": [],
      "resourceIds": [
        "resource.git",
        "resource.contribute",
        "resource.youtubeGitJusten",
        "resource.youtubeGitCourse"
      ],
      "kind": "concept",
      "legacyIds": [
        "Controle de Versão-O básico",
        "O básico-Controle de Versão"
      ]
    },
    "curriculum.controle-de-versao.practice": {
      "id": "curriculum.controle-de-versao.practice",
      "groupId": "curriculum.controle-de-versao",
      "title": "Pratique e confira",
      "description": "Crie um repositório com README, abra um pull request e resolva um conflito em uma branch de exercício. Peça à IA que explique o diff e confira a explicação no histórico do Git.",
      "requires": [
        "curriculum.controle-de-versao.basics"
      ],
      "resourceIds": [
        "resource.git",
        "resource.contribute",
        "resource.youtubeGitJusten",
        "resource.youtubeGitCourse"
      ],
      "kind": "practice",
      "legacyIds": [
        "Controle de Versão-Pratique e confira",
        "Pratique e confira-Controle de Versão"
      ]
    },
    "curriculum.controle-de-versao.deepening": {
      "id": "curriculum.controle-de-versao.deepening",
      "groupId": "curriculum.controle-de-versao",
      "title": "Desafio de aprofundamento",
      "kind": "challenge",
      "description": "Escolha uma decisão de Controle de Versão no seu projeto. Construa uma segunda solução, compare os resultados com um caso de teste e explique os limites de cada abordagem. Use as referências para verificar sua conclusão.",
      "requires": [
        "curriculum.controle-de-versao.basics",
        "curriculum.controle-de-versao.practice"
      ],
      "resourceIds": [
        "resource.git",
        "resource.contribute",
        "resource.youtubeGitJusten",
        "resource.youtubeGitCourse"
      ],
      "legacyIds": []
    },
    "dataEngineering.carreira-em-dados.basics": {
      "id": "dataEngineering.carreira-em-dados.basics",
      "groupId": "dataEngineering.carreira-em-dados",
      "title": "O básico",
      "description": "",
      "requires": [],
      "resourceIds": [
        "resource.youtubeSionekCareer",
        "resource.youtubeComunidadeDsCareer"
      ],
      "kind": "concept",
      "legacyIds": [
        "Carreira em dados-O básico",
        "O básico-Carreira em dados"
      ]
    },
    "dataEngineering.carreira-em-dados.practice": {
      "id": "dataEngineering.carreira-em-dados.practice",
      "groupId": "dataEngineering.carreira-em-dados",
      "title": "Pratique e confira",
      "description": "Escreva o que faz um engenheiro de dados, compare três vagas de entrada e marque as habilidades que ainda faltam.",
      "requires": [
        "dataEngineering.carreira-em-dados.basics"
      ],
      "resourceIds": [
        "resource.youtubeSionekCareer",
        "resource.youtubeComunidadeDsCareer"
      ],
      "kind": "practice",
      "legacyIds": [
        "Carreira em dados-Pratique e confira",
        "Pratique e confira-Carreira em dados"
      ]
    },
    "dataEngineering.carreira-em-dados.deepening": {
      "id": "dataEngineering.carreira-em-dados.deepening",
      "groupId": "dataEngineering.carreira-em-dados",
      "title": "Desafio de aprofundamento",
      "kind": "challenge",
      "description": "Escolha uma decisão de Carreira em dados no seu projeto. Construa uma segunda solução, compare os resultados com um caso de teste e explique os limites de cada abordagem. Use as referências para verificar sua conclusão.",
      "requires": [
        "dataEngineering.carreira-em-dados.basics",
        "dataEngineering.carreira-em-dados.practice"
      ],
      "resourceIds": [
        "resource.youtubeSionekCareer",
        "resource.youtubeComunidadeDsCareer"
      ],
      "legacyIds": []
    },
    "aiLearning.escolha-uma-ferramenta": {
      "id": "aiLearning.escolha-uma-ferramenta",
      "groupId": "aiLearning.seu-assistente-de-estudos",
      "title": "Escolha uma ferramenta",
      "description": "Experimente uma opção neste momento. Para concluir esta etapa, basta abrir um exercício em uma ferramenta e localizar como conversar, fornecer contexto e revisar uma mudança.\n\nCursor: abra um projeto no editor, converse sobre um arquivo e forneça trechos ou arquivos como contexto. Peça uma alteração pequena, examine o diff e execute o exemplo.\n\nClaude: use o chat com trechos fornecidos por você, ou Claude Code para trabalhar no projeto por terminal ou integrações de editor, se já tiver acesso. Siga o quickstart e peça uma explicação do repositório antes da primeira mudança.\n\nCodex: consulte o quickstart e escolha a superfície disponível para sua conta, como aplicativo, editor ou terminal. Peça que explique o projeto e como executar o exercício; depois experimente uma mudança pequena.\n\nSe ainda não tiver acesso a uma IA, siga os exercícios de programação e retome estas práticas quando uma opção estiver disponível.",
      "requires": [],
      "resourceIds": [
        "resource.cursor",
        "resource.cursorPrompts",
        "resource.claude",
        "resource.claudePractices",
        "resource.codex",
        "resource.codexPrompts"
      ],
      "kind": "concept",
      "ai": "focused",
      "legacyIds": [
        "Seu assistente de estudos-Escolha uma ferramenta",
        "Escolha uma ferramenta-Seu assistente de estudos"
      ]
    },
    "aiLearning.pratique-tutoria": {
      "id": "aiLearning.pratique-tutoria",
      "groupId": "aiLearning.seu-assistente-de-estudos",
      "title": "Pratique tutoria",
      "description": "Faça uma tentativa, peça uma explicação ou pista e confira o resultado executando o exemplo. Solicite perguntas e exercícios de revisão. Quando a IA gerar código, leia, altere e teste esse código. Conclua esta etapa após responder uma pergunta sobre o exemplo e resolver uma pequena variação.",
      "requires": [
        "aiLearning.escolha-uma-ferramenta"
      ],
      "resourceIds": [
        "resource.codexPrompts",
        "resource.claudePractices",
        "resource.ai"
      ],
      "kind": "practice",
      "ai": "focused",
      "prompt": "Estou aprendendo [conceito] na trilha [nome].\nMeu objetivo é [resultado pequeno e observável].\nJá tentei [tentativa] e observei [resultado ou erro].\nUse este trecho como contexto: [código ou exemplo sem dados privados].\nExplique a ideia com um exemplo curto e faça uma pergunta para conferir minha compreensão.\nDepois proponha uma variação do exercício. Aguarde minha tentativa antes de dar feedback.",
      "legacyIds": [
        "Seu assistente de estudos-Pratique tutoria",
        "Pratique tutoria-Seu assistente de estudos"
      ]
    },
    "aiLearning.seu-assistente-de-estudos.deepening": {
      "id": "aiLearning.seu-assistente-de-estudos.deepening",
      "groupId": "aiLearning.seu-assistente-de-estudos",
      "title": "Desafio de aprofundamento",
      "kind": "challenge",
      "ai": "focused",
      "description": "Escolha uma decisão de Seu assistente de estudos no seu projeto. Construa uma segunda solução, compare os resultados com um caso de teste e explique os limites de cada abordagem. Use as referências para verificar sua conclusão.",
      "requires": [
        "aiLearning.escolha-uma-ferramenta",
        "aiLearning.pratique-tutoria"
      ],
      "resourceIds": [
        "resource.cursor",
        "resource.cursorPrompts",
        "resource.claude",
        "resource.claudePractices",
        "resource.codex",
        "resource.codexPrompts",
        "resource.ai"
      ],
      "legacyIds": []
    },
    "curriculum.sql-e-postgresql.basics": {
      "id": "curriculum.sql-e-postgresql.basics",
      "groupId": "curriculum.sql-e-postgresql",
      "title": "O básico",
      "description": "",
      "requires": [],
      "resourceIds": [
        "resource.sql",
        "resource.postgres"
      ],
      "kind": "concept",
      "legacyIds": [
        "SQL e PostgreSQL-O básico",
        "O básico-SQL e PostgreSQL"
      ]
    },
    "curriculum.sql-e-postgresql.practice": {
      "id": "curriculum.sql-e-postgresql.practice",
      "groupId": "curriculum.sql-e-postgresql",
      "title": "Pratique e confira",
      "description": "Modele usuários e pedidos, consulte com JOIN e execute uma transação. Peça à IA uma consulta e compare o resultado com uma amostra calculada manualmente. Compare um plano de consulta antes e depois de um índice.",
      "requires": [
        "curriculum.sql-e-postgresql.basics"
      ],
      "resourceIds": [
        "resource.sql",
        "resource.postgres"
      ],
      "kind": "practice",
      "legacyIds": [
        "SQL e PostgreSQL-Pratique e confira",
        "Pratique e confira-SQL e PostgreSQL"
      ]
    },
    "curriculum.sql-e-postgresql.deepening": {
      "id": "curriculum.sql-e-postgresql.deepening",
      "groupId": "curriculum.sql-e-postgresql",
      "title": "Desafio de aprofundamento",
      "kind": "challenge",
      "description": "Compare o plano de uma consulta com e sem índice. Demonstre uma transação que falha, verifique o rollback e justifique as constraints escolhidas.",
      "requires": [
        "curriculum.sql-e-postgresql.basics",
        "curriculum.sql-e-postgresql.practice"
      ],
      "resourceIds": [
        "resource.sql",
        "resource.postgres"
      ],
      "legacyIds": []
    },
    "dataEngineering.sql-analitico.basics": {
      "id": "dataEngineering.sql-analitico.basics",
      "groupId": "dataEngineering.sql-analitico",
      "title": "O básico",
      "description": "",
      "requires": [],
      "resourceIds": [
        "resource.postgres",
        "resource.sql",
        "resource.youtubeMysqlCourse",
        "resource.youtubeHashtagSql"
      ],
      "kind": "concept",
      "legacyIds": [
        "SQL analítico-O básico",
        "O básico-SQL analítico"
      ]
    },
    "dataEngineering.sql-analitico.practice": {
      "id": "dataEngineering.sql-analitico.practice",
      "groupId": "dataEngineering.sql-analitico",
      "title": "Pratique e confira",
      "description": "Calcule totais por período e ranking, evitando dupla contagem em JOINs. Explique a granularidade do resultado.",
      "requires": [
        "dataEngineering.sql-analitico.basics"
      ],
      "resourceIds": [
        "resource.postgres",
        "resource.sql",
        "resource.youtubeMysqlCourse",
        "resource.youtubeHashtagSql"
      ],
      "kind": "practice",
      "legacyIds": [
        "SQL analítico-Pratique e confira",
        "Pratique e confira-SQL analítico"
      ]
    },
    "dataEngineering.sql-analitico.deepening": {
      "id": "dataEngineering.sql-analitico.deepening",
      "groupId": "dataEngineering.sql-analitico",
      "title": "Desafio de aprofundamento",
      "kind": "challenge",
      "description": "Escolha uma decisão de SQL analítico no seu projeto. Construa uma segunda solução, compare os resultados com um caso de teste e explique os limites de cada abordagem. Use as referências para verificar sua conclusão.",
      "requires": [
        "dataEngineering.sql-analitico.basics",
        "dataEngineering.sql-analitico.practice"
      ],
      "resourceIds": [
        "resource.postgres",
        "resource.sql",
        "resource.youtubeMysqlCourse",
        "resource.youtubeHashtagSql"
      ],
      "legacyIds": []
    },
    "aiLearning.prompts-para-aprender-e-construir.basics": {
      "id": "aiLearning.prompts-para-aprender-e-construir.basics",
      "groupId": "aiLearning.prompts-para-aprender-e-construir",
      "title": "O básico",
      "description": "",
      "requires": [],
      "resourceIds": [
        "resource.codexPrompts",
        "resource.cursorPrompts",
        "resource.claudePractices"
      ],
      "kind": "concept",
      "ai": "focused",
      "legacyIds": [
        "Prompts para aprender e construir-O básico",
        "O básico-Prompts para aprender e construir"
      ]
    },
    "aiLearning.prompts-para-aprender-e-construir.practice": {
      "id": "aiLearning.prompts-para-aprender-e-construir.practice",
      "groupId": "aiLearning.prompts-para-aprender-e-construir",
      "title": "Pratique e confira",
      "description": "Compare um pedido vago com um pedido que inclui sua tentativa e critérios. Execute os exemplos e registre qual informação melhorou a resposta.",
      "requires": [
        "aiLearning.prompts-para-aprender-e-construir.basics"
      ],
      "resourceIds": [
        "resource.codexPrompts",
        "resource.cursorPrompts",
        "resource.claudePractices"
      ],
      "kind": "practice",
      "ai": "focused",
      "prompt": "Estou aprendendo [conceito] na trilha [nome].\nMeu objetivo é [resultado pequeno e observável].\nJá tentei [tentativa] e observei [resultado ou erro].\nUse este trecho como contexto: [código ou exemplo sem dados privados].\nExplique a ideia com um exemplo curto e faça uma pergunta para conferir minha compreensão.\nDepois proponha uma variação do exercício. Aguarde minha tentativa antes de dar feedback.",
      "legacyIds": [
        "Prompts para aprender e construir-Pratique e confira",
        "Pratique e confira-Prompts para aprender e construir"
      ]
    },
    "aiLearning.prompts-para-aprender-e-construir.deepening": {
      "id": "aiLearning.prompts-para-aprender-e-construir.deepening",
      "groupId": "aiLearning.prompts-para-aprender-e-construir",
      "title": "Desafio de aprofundamento",
      "kind": "challenge",
      "ai": "focused",
      "description": "Escolha uma decisão de Prompts para aprender e construir no seu projeto. Construa uma segunda solução, compare os resultados com um caso de teste e explique os limites de cada abordagem. Use as referências para verificar sua conclusão.",
      "requires": [
        "aiLearning.prompts-para-aprender-e-construir.basics",
        "aiLearning.prompts-para-aprender-e-construir.practice"
      ],
      "resourceIds": [
        "resource.codexPrompts",
        "resource.cursorPrompts",
        "resource.claudePractices"
      ],
      "legacyIds": []
    },
    "aiLearning.contexto-util-e-dados-protegidos.basics": {
      "id": "aiLearning.contexto-util-e-dados-protegidos.basics",
      "groupId": "aiLearning.contexto-util-e-dados-protegidos",
      "title": "O básico",
      "description": "",
      "requires": [],
      "resourceIds": [
        "resource.cursorPrompts",
        "resource.codexPrompts",
        "resource.ai"
      ],
      "kind": "concept",
      "ai": "focused",
      "legacyIds": [
        "Contexto útil e dados protegidos-O básico",
        "O básico-Contexto útil e dados protegidos"
      ]
    },
    "aiLearning.contexto-util-e-dados-protegidos.practice": {
      "id": "aiLearning.contexto-util-e-dados-protegidos.practice",
      "groupId": "aiLearning.contexto-util-e-dados-protegidos",
      "title": "Pratique e confira",
      "description": "Peça ajuda para a mesma dúvida com e sem o trecho relevante. Identifique uma suposição incorreta e corrija o contexto antes de aceitar a solução.",
      "requires": [
        "aiLearning.contexto-util-e-dados-protegidos.basics"
      ],
      "resourceIds": [
        "resource.cursorPrompts",
        "resource.codexPrompts",
        "resource.ai"
      ],
      "kind": "practice",
      "ai": "focused",
      "legacyIds": [
        "Contexto útil e dados protegidos-Pratique e confira",
        "Pratique e confira-Contexto útil e dados protegidos"
      ]
    },
    "aiLearning.contexto-util-e-dados-protegidos.deepening": {
      "id": "aiLearning.contexto-util-e-dados-protegidos.deepening",
      "groupId": "aiLearning.contexto-util-e-dados-protegidos",
      "title": "Desafio de aprofundamento",
      "kind": "challenge",
      "ai": "focused",
      "description": "Escolha uma decisão de Contexto útil e dados protegidos no seu projeto. Construa uma segunda solução, compare os resultados com um caso de teste e explique os limites de cada abordagem. Use as referências para verificar sua conclusão.",
      "requires": [
        "aiLearning.contexto-util-e-dados-protegidos.basics",
        "aiLearning.contexto-util-e-dados-protegidos.practice"
      ],
      "resourceIds": [
        "resource.cursorPrompts",
        "resource.codexPrompts",
        "resource.ai"
      ],
      "legacyIds": []
    },
    "dataEngineering.analise-reproduzivel.criteria": {
      "id": "dataEngineering.analise-reproduzivel.criteria",
      "groupId": "dataEngineering.analise-reproduzivel",
      "title": "Critérios de conclusão",
      "description": "Registre origem e licença, valide dados, explique granularidade e entregue consultas reproduzíveis com resultados e limitações.",
      "requires": [],
      "resourceIds": [
        "resource.postgres",
        "resource.duckdb",
        "resource.pandas"
      ],
      "kind": "criteria",
      "legacyIds": [
        "Análise reproduzível-Critérios de conclusão",
        "Critérios de conclusão-Análise reproduzível"
      ]
    },
    "dataEngineering.analise-reproduzivel.ai-practice": {
      "id": "dataEngineering.analise-reproduzivel.ai-practice",
      "groupId": "dataEngineering.analise-reproduzivel",
      "title": "Prática de IA neste projeto",
      "description": "Planeje e explique o primeiro recorte antes de implementar. Adapte o prompt ao que você já construiu nesta etapa. Insira um registro duplicado ou nulo e demonstre como o teste detecta o problema.",
      "requires": [
        "dataEngineering.analise-reproduzivel.criteria"
      ],
      "resourceIds": [
        "resource.codexPrompts",
        "resource.cursorPrompts",
        "resource.claudePractices"
      ],
      "kind": "practice",
      "ai": "assisted",
      "prompt": "Projeto: Análise reproduzível.\nObjetivo: revisar uma consulta ou etapa do pipeline e procurar dupla contagem, nulos ou duplicação após reexecução.\nContexto: [schema, granularidade esperada, consulta ou código e uma pequena amostra pública ou sintética].\nNesta etapa: Planeje e explique o primeiro recorte antes de implementar.\nLimites: apenas este projeto de laboratório; use as ferramentas já escolhidas, dados públicos ou sintéticos e não exponha segredos.\nCritérios: o resultado é comparado com uma amostra calculada manualmente; cargas repetidas não duplicam dados quando aplicável.\nMostre as hipóteses e como verificá-las. Informe o que foi executado e o que ainda falta conferir.",
      "legacyIds": [
        "Análise reproduzível-Prática de IA neste projeto",
        "Prática de IA neste projeto-Análise reproduzível"
      ]
    },
    "dataEngineering.analise-reproduzivel.verification": {
      "id": "dataEngineering.analise-reproduzivel.verification",
      "groupId": "dataEngineering.analise-reproduzivel",
      "title": "Registre sua verificação",
      "description": "Registre um prompt sanitizado, uma sugestão aceita ou corrigida, a verificação executada e seu resultado. Explique a mudança com suas palavras. Conclua o projeto após demonstrar os critérios, mesmo quando parte do código vier de IA.",
      "requires": [
        "dataEngineering.analise-reproduzivel.criteria"
      ],
      "resourceIds": [
        "resource.git",
        "resource.ai"
      ],
      "kind": "practice",
      "ai": "assisted",
      "legacyIds": [
        "Análise reproduzível-Registre sua verificação",
        "Registre sua verificação-Análise reproduzível"
      ]
    },
    "dataEngineering.analise-reproduzivel.deepening": {
      "id": "dataEngineering.analise-reproduzivel.deepening",
      "groupId": "dataEngineering.analise-reproduzivel",
      "title": "Desafio de aprofundamento",
      "kind": "challenge",
      "description": "Escolha uma decisão de Análise reproduzível no seu projeto. Construa uma segunda solução, compare os resultados com um caso de teste e explique os limites de cada abordagem. Use as referências para verificar sua conclusão.",
      "requires": [
        "dataEngineering.analise-reproduzivel.criteria",
        "dataEngineering.analise-reproduzivel.ai-practice",
        "dataEngineering.analise-reproduzivel.verification"
      ],
      "resourceIds": [
        "resource.postgres",
        "resource.duckdb",
        "resource.pandas",
        "resource.codexPrompts",
        "resource.cursorPrompts",
        "resource.claudePractices",
        "resource.git",
        "resource.ai"
      ],
      "legacyIds": []
    },
    "dataEngineering.modelagem-analitica-e-formatos.basics": {
      "id": "dataEngineering.modelagem-analitica-e-formatos.basics",
      "groupId": "dataEngineering.modelagem-analitica-e-formatos",
      "title": "O básico",
      "description": "",
      "requires": [],
      "resourceIds": [
        "resource.dbt",
        "resource.duckdb",
        "resource.youtubeComunidadeDsWarehouse",
        "resource.youtubeDataHackers"
      ],
      "kind": "concept",
      "legacyIds": [
        "Modelagem analítica e formatos-O básico",
        "O básico-Modelagem analítica e formatos"
      ]
    },
    "dataEngineering.modelagem-analitica-e-formatos.practice": {
      "id": "dataEngineering.modelagem-analitica-e-formatos.practice",
      "groupId": "dataEngineering.modelagem-analitica-e-formatos",
      "title": "Pratique e confira",
      "description": "Modele vendas com fato e dimensões e compare tamanho e leitura do mesmo conjunto em CSV e Parquet.",
      "requires": [
        "dataEngineering.modelagem-analitica-e-formatos.basics"
      ],
      "resourceIds": [
        "resource.dbt",
        "resource.duckdb",
        "resource.youtubeComunidadeDsWarehouse",
        "resource.youtubeDataHackers"
      ],
      "kind": "practice",
      "legacyIds": [
        "Modelagem analítica e formatos-Pratique e confira",
        "Pratique e confira-Modelagem analítica e formatos"
      ]
    },
    "dataEngineering.modelagem-analitica-e-formatos.deepening": {
      "id": "dataEngineering.modelagem-analitica-e-formatos.deepening",
      "groupId": "dataEngineering.modelagem-analitica-e-formatos",
      "title": "Desafio de aprofundamento",
      "kind": "challenge",
      "description": "Escolha uma decisão de Modelagem analítica e formatos no seu projeto. Construa uma segunda solução, compare os resultados com um caso de teste e explique os limites de cada abordagem. Use as referências para verificar sua conclusão.",
      "requires": [
        "dataEngineering.modelagem-analitica-e-formatos.basics",
        "dataEngineering.modelagem-analitica-e-formatos.practice"
      ],
      "resourceIds": [
        "resource.dbt",
        "resource.duckdb",
        "resource.youtubeComunidadeDsWarehouse",
        "resource.youtubeDataHackers"
      ],
      "legacyIds": []
    },
    "dataEngineering.pipelines-batch.basics": {
      "id": "dataEngineering.pipelines-batch.basics",
      "groupId": "dataEngineering.pipelines-batch",
      "title": "O básico",
      "description": "",
      "requires": [],
      "resourceIds": [
        "resource.python",
        "resource.pandas",
        "resource.duckdb"
      ],
      "kind": "concept",
      "legacyIds": [
        "Pipelines batch-O básico",
        "O básico-Pipelines batch"
      ]
    },
    "dataEngineering.pipelines-batch.practice": {
      "id": "dataEngineering.pipelines-batch.practice",
      "groupId": "dataEngineering.pipelines-batch",
      "title": "Pratique e confira",
      "description": "Execute a mesma carga duas vezes sem duplicar registros e reprocesse um período com falha.",
      "requires": [
        "dataEngineering.pipelines-batch.basics"
      ],
      "resourceIds": [
        "resource.python",
        "resource.pandas",
        "resource.duckdb"
      ],
      "kind": "practice",
      "legacyIds": [
        "Pipelines batch-Pratique e confira",
        "Pratique e confira-Pipelines batch"
      ]
    },
    "dataEngineering.pipelines-batch.deepening": {
      "id": "dataEngineering.pipelines-batch.deepening",
      "groupId": "dataEngineering.pipelines-batch",
      "title": "Desafio de aprofundamento",
      "kind": "challenge",
      "description": "Escolha uma decisão de Pipelines batch no seu projeto. Construa uma segunda solução, compare os resultados com um caso de teste e explique os limites de cada abordagem. Use as referências para verificar sua conclusão.",
      "requires": [
        "dataEngineering.pipelines-batch.basics",
        "dataEngineering.pipelines-batch.practice"
      ],
      "resourceIds": [
        "resource.python",
        "resource.pandas",
        "resource.duckdb"
      ],
      "legacyIds": []
    },
    "dataEngineering.transformacoes-com-dbt.basics": {
      "id": "dataEngineering.transformacoes-com-dbt.basics",
      "groupId": "dataEngineering.transformacoes-com-dbt",
      "title": "O básico",
      "description": "",
      "requires": [],
      "resourceIds": [
        "resource.dbt",
        "resource.postgres"
      ],
      "kind": "concept",
      "legacyIds": [
        "Transformações com dbt-O básico",
        "O básico-Transformações com dbt"
      ]
    },
    "dataEngineering.transformacoes-com-dbt.practice": {
      "id": "dataEngineering.transformacoes-com-dbt.practice",
      "groupId": "dataEngineering.transformacoes-com-dbt",
      "title": "Pratique e confira",
      "description": "Crie modelos staging e analíticos, teste unicidade e relacionamentos e documente a linhagem.",
      "requires": [
        "dataEngineering.transformacoes-com-dbt.basics"
      ],
      "resourceIds": [
        "resource.dbt",
        "resource.postgres"
      ],
      "kind": "practice",
      "legacyIds": [
        "Transformações com dbt-Pratique e confira",
        "Pratique e confira-Transformações com dbt"
      ]
    },
    "dataEngineering.transformacoes-com-dbt.deepening": {
      "id": "dataEngineering.transformacoes-com-dbt.deepening",
      "groupId": "dataEngineering.transformacoes-com-dbt",
      "title": "Desafio de aprofundamento",
      "kind": "challenge",
      "description": "Escolha uma decisão de Transformações com dbt no seu projeto. Construa uma segunda solução, compare os resultados com um caso de teste e explique os limites de cada abordagem. Use as referências para verificar sua conclusão.",
      "requires": [
        "dataEngineering.transformacoes-com-dbt.basics",
        "dataEngineering.transformacoes-com-dbt.practice"
      ],
      "resourceIds": [
        "resource.dbt",
        "resource.postgres"
      ],
      "legacyIds": []
    },
    "aiLearning.planejar-implementar-e-revisar.basics": {
      "id": "aiLearning.planejar-implementar-e-revisar.basics",
      "groupId": "aiLearning.planejar-implementar-e-revisar",
      "title": "O básico",
      "description": "",
      "requires": [],
      "resourceIds": [
        "resource.claudePractices",
        "resource.codexPrompts",
        "resource.cursor"
      ],
      "kind": "concept",
      "ai": "focused",
      "legacyIds": [
        "Planejar, implementar e revisar-O básico",
        "O básico-Planejar, implementar e revisar"
      ]
    },
    "aiLearning.planejar-implementar-e-revisar.practice": {
      "id": "aiLearning.planejar-implementar-e-revisar.practice",
      "groupId": "aiLearning.planejar-implementar-e-revisar",
      "title": "Pratique e confira",
      "description": "Implemente uma pequena mudança em parceria. Explique o diff, rejeite ou ajuste uma sugestão e acrescente um caso de teste que não veio da mesma proposta.",
      "requires": [
        "aiLearning.planejar-implementar-e-revisar.basics"
      ],
      "resourceIds": [
        "resource.claudePractices",
        "resource.codexPrompts",
        "resource.cursor"
      ],
      "kind": "practice",
      "ai": "focused",
      "prompt": "Quero implementar [mudança pequena] neste projeto.\nContexto: [arquivos relevantes, comportamento atual e versão].\nResultado esperado: [exemplo de entrada e saída].\nLimites: [arquivos que podem mudar e requisitos que devem ser preservados].\nPrimeiro proponha um plano curto e a verificação. Depois trabalharemos uma etapa por vez.\nAo implementar, mostre o diff, explique as decisões e informe os comandos executados e seus resultados.",
      "legacyIds": [
        "Planejar, implementar e revisar-Pratique e confira",
        "Pratique e confira-Planejar, implementar e revisar"
      ]
    },
    "aiLearning.planejar-implementar-e-revisar.deepening": {
      "id": "aiLearning.planejar-implementar-e-revisar.deepening",
      "groupId": "aiLearning.planejar-implementar-e-revisar",
      "title": "Desafio de aprofundamento",
      "kind": "challenge",
      "ai": "focused",
      "description": "Escolha uma decisão de Planejar, implementar e revisar no seu projeto. Construa uma segunda solução, compare os resultados com um caso de teste e explique os limites de cada abordagem. Use as referências para verificar sua conclusão.",
      "requires": [
        "aiLearning.planejar-implementar-e-revisar.basics",
        "aiLearning.planejar-implementar-e-revisar.practice"
      ],
      "resourceIds": [
        "resource.claudePractices",
        "resource.codexPrompts",
        "resource.cursor"
      ],
      "legacyIds": []
    },
    "aiLearning.depuracao-com-evidencias.basics": {
      "id": "aiLearning.depuracao-com-evidencias.basics",
      "groupId": "aiLearning.depuracao-com-evidencias",
      "title": "O básico",
      "description": "",
      "requires": [],
      "resourceIds": [
        "resource.claudePractices",
        "resource.codexPrompts"
      ],
      "kind": "concept",
      "ai": "focused",
      "legacyIds": [
        "Depuração com evidências-O básico",
        "O básico-Depuração com evidências"
      ]
    },
    "aiLearning.depuracao-com-evidencias.practice": {
      "id": "aiLearning.depuracao-com-evidencias.practice",
      "groupId": "aiLearning.depuracao-com-evidencias",
      "title": "Pratique e confira",
      "description": "Introduza um bug no laboratório, confirme uma hipótese por log, breakpoint ou teste e verifique uma correção mínima.",
      "requires": [
        "aiLearning.depuracao-com-evidencias.basics"
      ],
      "resourceIds": [
        "resource.claudePractices",
        "resource.codexPrompts"
      ],
      "kind": "practice",
      "ai": "focused",
      "prompt": "Problema reproduzível: [passos].\nEsperado: [resultado]. Observado: [resultado ou erro sanitizado].\nContexto: [trecho, configuração e versões relevantes].\nListe até três hipóteses e uma verificação para distinguir cada uma.\nPrimeiro vamos confirmar a causa. Depois proponha a menor correção e um teste de regressão.",
      "legacyIds": [
        "Depuração com evidências-Pratique e confira",
        "Pratique e confira-Depuração com evidências"
      ]
    },
    "aiLearning.depuracao-com-evidencias.deepening": {
      "id": "aiLearning.depuracao-com-evidencias.deepening",
      "groupId": "aiLearning.depuracao-com-evidencias",
      "title": "Desafio de aprofundamento",
      "kind": "challenge",
      "ai": "focused",
      "description": "Escolha uma decisão de Depuração com evidências no seu projeto. Construa uma segunda solução, compare os resultados com um caso de teste e explique os limites de cada abordagem. Use as referências para verificar sua conclusão.",
      "requires": [
        "aiLearning.depuracao-com-evidencias.basics",
        "aiLearning.depuracao-com-evidencias.practice"
      ],
      "resourceIds": [
        "resource.claudePractices",
        "resource.codexPrompts"
      ],
      "legacyIds": []
    },
    "dataEngineering.pipeline-local-de-dados.criteria": {
      "id": "dataEngineering.pipeline-local-de-dados.criteria",
      "groupId": "dataEngineering.pipeline-local-de-dados",
      "title": "Critérios de conclusão",
      "description": "A execução é reproduzível e idempotente, tem testes de qualidade e produz uma tabela para consumo. Documente como corrigir uma carga inválida.",
      "requires": [],
      "resourceIds": [
        "resource.python",
        "resource.duckdb",
        "resource.dbt"
      ],
      "kind": "criteria",
      "legacyIds": [
        "Pipeline local de dados-Critérios de conclusão",
        "Critérios de conclusão-Pipeline local de dados"
      ]
    },
    "dataEngineering.pipeline-local-de-dados.ai-practice": {
      "id": "dataEngineering.pipeline-local-de-dados.ai-practice",
      "groupId": "dataEngineering.pipeline-local-de-dados",
      "title": "Prática de IA neste projeto",
      "description": "Implemente em parceria uma etapa pequena e compare com sua própria solução. Adapte o prompt ao que você já construiu nesta etapa. Insira um registro duplicado ou nulo e demonstre como o teste detecta o problema.",
      "requires": [
        "dataEngineering.pipeline-local-de-dados.criteria"
      ],
      "resourceIds": [
        "resource.codexPrompts",
        "resource.cursorPrompts",
        "resource.claudePractices"
      ],
      "kind": "practice",
      "ai": "assisted",
      "prompt": "Projeto: Pipeline local de dados.\nObjetivo: revisar uma consulta ou etapa do pipeline e procurar dupla contagem, nulos ou duplicação após reexecução.\nContexto: [schema, granularidade esperada, consulta ou código e uma pequena amostra pública ou sintética].\nNesta etapa: Implemente em parceria uma etapa pequena e compare com sua própria solução.\nLimites: apenas este projeto de laboratório; use as ferramentas já escolhidas, dados públicos ou sintéticos e não exponha segredos.\nCritérios: o resultado é comparado com uma amostra calculada manualmente; cargas repetidas não duplicam dados quando aplicável.\nMostre as hipóteses e como verificá-las. Informe o que foi executado e o que ainda falta conferir.",
      "legacyIds": [
        "Pipeline local de dados-Prática de IA neste projeto",
        "Prática de IA neste projeto-Pipeline local de dados"
      ]
    },
    "dataEngineering.pipeline-local-de-dados.verification": {
      "id": "dataEngineering.pipeline-local-de-dados.verification",
      "groupId": "dataEngineering.pipeline-local-de-dados",
      "title": "Registre sua verificação",
      "description": "Registre um prompt sanitizado, uma sugestão aceita ou corrigida, a verificação executada e seu resultado. Explique a mudança com suas palavras. Conclua o projeto após demonstrar os critérios, mesmo quando parte do código vier de IA.",
      "requires": [
        "dataEngineering.pipeline-local-de-dados.criteria"
      ],
      "resourceIds": [
        "resource.git",
        "resource.ai"
      ],
      "kind": "practice",
      "ai": "assisted",
      "legacyIds": [
        "Pipeline local de dados-Registre sua verificação",
        "Registre sua verificação-Pipeline local de dados"
      ]
    },
    "dataEngineering.pipeline-local-de-dados.deepening": {
      "id": "dataEngineering.pipeline-local-de-dados.deepening",
      "groupId": "dataEngineering.pipeline-local-de-dados",
      "title": "Desafio de aprofundamento",
      "kind": "challenge",
      "description": "Escolha uma decisão de Pipeline local de dados no seu projeto. Construa uma segunda solução, compare os resultados com um caso de teste e explique os limites de cada abordagem. Use as referências para verificar sua conclusão.",
      "requires": [
        "dataEngineering.pipeline-local-de-dados.criteria",
        "dataEngineering.pipeline-local-de-dados.ai-practice",
        "dataEngineering.pipeline-local-de-dados.verification"
      ],
      "resourceIds": [
        "resource.python",
        "resource.duckdb",
        "resource.dbt",
        "resource.codexPrompts",
        "resource.cursorPrompts",
        "resource.claudePractices",
        "resource.git",
        "resource.ai"
      ],
      "legacyIds": []
    },
    "dataEngineering.orquestracao-com-airflow.basics": {
      "id": "dataEngineering.orquestracao-com-airflow.basics",
      "groupId": "dataEngineering.orquestracao-com-airflow",
      "title": "O básico",
      "description": "",
      "requires": [],
      "resourceIds": [
        "resource.airflow",
        "resource.youtubeSionekAirflow"
      ],
      "kind": "concept",
      "legacyIds": [
        "Orquestração com Airflow-O básico",
        "O básico-Orquestração com Airflow"
      ]
    },
    "dataEngineering.orquestracao-com-airflow.practice": {
      "id": "dataEngineering.orquestracao-com-airflow.practice",
      "groupId": "dataEngineering.orquestracao-com-airflow",
      "title": "Pratique e confira",
      "description": "Agende o pipeline, simule uma falha e recupere apenas a etapa necessária; execute um backfill sem duplicar dados.",
      "requires": [
        "dataEngineering.orquestracao-com-airflow.basics"
      ],
      "resourceIds": [
        "resource.airflow",
        "resource.youtubeSionekAirflow"
      ],
      "kind": "practice",
      "legacyIds": [
        "Orquestração com Airflow-Pratique e confira",
        "Pratique e confira-Orquestração com Airflow"
      ]
    },
    "dataEngineering.orquestracao-com-airflow.deepening": {
      "id": "dataEngineering.orquestracao-com-airflow.deepening",
      "groupId": "dataEngineering.orquestracao-com-airflow",
      "title": "Desafio de aprofundamento",
      "kind": "challenge",
      "description": "Escolha uma decisão de Orquestração com Airflow no seu projeto. Construa uma segunda solução, compare os resultados com um caso de teste e explique os limites de cada abordagem. Use as referências para verificar sua conclusão.",
      "requires": [
        "dataEngineering.orquestracao-com-airflow.basics",
        "dataEngineering.orquestracao-com-airflow.practice"
      ],
      "resourceIds": [
        "resource.airflow",
        "resource.youtubeSionekAirflow"
      ],
      "legacyIds": []
    },
    "dataEngineering.qualidade-e-governanca.basics": {
      "id": "dataEngineering.qualidade-e-governanca.basics",
      "groupId": "dataEngineering.qualidade-e-governanca",
      "title": "O básico",
      "description": "",
      "requires": [],
      "resourceIds": [
        "resource.dbt",
        "resource.otel",
        "resource.security"
      ],
      "kind": "concept",
      "legacyIds": [
        "Qualidade e governança-O básico",
        "O básico-Qualidade e governança"
      ]
    },
    "dataEngineering.qualidade-e-governanca.practice": {
      "id": "dataEngineering.qualidade-e-governanca.practice",
      "groupId": "dataEngineering.qualidade-e-governanca",
      "title": "Pratique e confira",
      "description": "Bloqueie uma carga com esquema inválido, alerte sobre atraso e documente acesso e retenção das tabelas.",
      "requires": [
        "dataEngineering.qualidade-e-governanca.basics"
      ],
      "resourceIds": [
        "resource.dbt",
        "resource.otel",
        "resource.security"
      ],
      "kind": "practice",
      "legacyIds": [
        "Qualidade e governança-Pratique e confira",
        "Pratique e confira-Qualidade e governança"
      ]
    },
    "dataEngineering.qualidade-e-governanca.deepening": {
      "id": "dataEngineering.qualidade-e-governanca.deepening",
      "groupId": "dataEngineering.qualidade-e-governanca",
      "title": "Desafio de aprofundamento",
      "kind": "challenge",
      "description": "Escolha uma decisão de Qualidade e governança no seu projeto. Construa uma segunda solução, compare os resultados com um caso de teste e explique os limites de cada abordagem. Use as referências para verificar sua conclusão.",
      "requires": [
        "dataEngineering.qualidade-e-governanca.basics",
        "dataEngineering.qualidade-e-governanca.practice"
      ],
      "resourceIds": [
        "resource.dbt",
        "resource.otel",
        "resource.security"
      ],
      "legacyIds": []
    },
    "dataEngineering.containers-ci-e-nuvem.basics": {
      "id": "dataEngineering.containers-ci-e-nuvem.basics",
      "groupId": "dataEngineering.containers-ci-e-nuvem",
      "title": "O básico",
      "description": "",
      "requires": [],
      "resourceIds": [
        "resource.compose",
        "resource.actions",
        "resource.cloud",
        "resource.youtubeComunidadeDsCloud",
        "resource.youtubeLinuxtipsAzure"
      ],
      "kind": "concept",
      "legacyIds": [
        "Containers, CI e nuvem-O básico",
        "O básico-Containers, CI e nuvem"
      ]
    },
    "dataEngineering.containers-ci-e-nuvem.practice": {
      "id": "dataEngineering.containers-ci-e-nuvem.practice",
      "groupId": "dataEngineering.containers-ci-e-nuvem",
      "title": "Pratique e confira",
      "description": "Reproduza o ambiente local por Compose e faça um teste de qualidade falhar na CI. Estime custos antes de criar recursos externos.",
      "requires": [
        "dataEngineering.containers-ci-e-nuvem.basics"
      ],
      "resourceIds": [
        "resource.compose",
        "resource.actions",
        "resource.cloud",
        "resource.youtubeComunidadeDsCloud",
        "resource.youtubeLinuxtipsAzure"
      ],
      "kind": "practice",
      "legacyIds": [
        "Containers, CI e nuvem-Pratique e confira",
        "Pratique e confira-Containers, CI e nuvem"
      ]
    },
    "dataEngineering.containers-ci-e-nuvem.deepening": {
      "id": "dataEngineering.containers-ci-e-nuvem.deepening",
      "groupId": "dataEngineering.containers-ci-e-nuvem",
      "title": "Desafio de aprofundamento",
      "kind": "challenge",
      "description": "Escolha uma decisão de Containers, CI e nuvem no seu projeto. Construa uma segunda solução, compare os resultados com um caso de teste e explique os limites de cada abordagem. Use as referências para verificar sua conclusão.",
      "requires": [
        "dataEngineering.containers-ci-e-nuvem.basics",
        "dataEngineering.containers-ci-e-nuvem.practice"
      ],
      "resourceIds": [
        "resource.compose",
        "resource.actions",
        "resource.cloud",
        "resource.youtubeComunidadeDsCloud",
        "resource.youtubeLinuxtipsAzure"
      ],
      "legacyIds": []
    },
    "aiLearning.instrucoes-do-projeto-e-escopo-do-agente.basics": {
      "id": "aiLearning.instrucoes-do-projeto-e-escopo-do-agente.basics",
      "groupId": "aiLearning.instrucoes-do-projeto-e-escopo-do-agente",
      "title": "O básico",
      "description": "",
      "requires": [],
      "resourceIds": [
        "resource.cursorRules",
        "resource.claudePractices",
        "resource.codexRules"
      ],
      "kind": "concept",
      "ai": "focused",
      "legacyIds": [
        "Instruções do projeto e escopo do agente-O básico",
        "O básico-Instruções do projeto e escopo do agente"
      ]
    },
    "aiLearning.instrucoes-do-projeto-e-escopo-do-agente.practice": {
      "id": "aiLearning.instrucoes-do-projeto-e-escopo-do-agente.practice",
      "groupId": "aiLearning.instrucoes-do-projeto-e-escopo-do-agente",
      "title": "Pratique e confira",
      "description": "Escreva instruções curtas com comandos reais do projeto. Peça uma alteração pequena e confira que as instruções foram usadas e que o diff respeita o escopo.",
      "requires": [
        "aiLearning.instrucoes-do-projeto-e-escopo-do-agente.basics"
      ],
      "resourceIds": [
        "resource.cursorRules",
        "resource.claudePractices",
        "resource.codexRules"
      ],
      "kind": "practice",
      "ai": "focused",
      "legacyIds": [
        "Instruções do projeto e escopo do agente-Pratique e confira",
        "Pratique e confira-Instruções do projeto e escopo do agente"
      ]
    },
    "aiLearning.instrucoes-do-projeto-e-escopo-do-agente.deepening": {
      "id": "aiLearning.instrucoes-do-projeto-e-escopo-do-agente.deepening",
      "groupId": "aiLearning.instrucoes-do-projeto-e-escopo-do-agente",
      "title": "Desafio de aprofundamento",
      "kind": "challenge",
      "ai": "focused",
      "description": "Escolha uma decisão de Instruções do projeto e escopo do agente no seu projeto. Construa uma segunda solução, compare os resultados com um caso de teste e explique os limites de cada abordagem. Use as referências para verificar sua conclusão.",
      "requires": [
        "aiLearning.instrucoes-do-projeto-e-escopo-do-agente.basics",
        "aiLearning.instrucoes-do-projeto-e-escopo-do-agente.practice"
      ],
      "resourceIds": [
        "resource.cursorRules",
        "resource.claudePractices",
        "resource.codexRules"
      ],
      "legacyIds": []
    },
    "aiLearning.validar-trabalho-gerado-por-ia.basics": {
      "id": "aiLearning.validar-trabalho-gerado-por-ia.basics",
      "groupId": "aiLearning.validar-trabalho-gerado-por-ia",
      "title": "O básico",
      "description": "",
      "requires": [],
      "resourceIds": [
        "resource.claudePractices",
        "resource.ai",
        "resource.codexPrompts"
      ],
      "kind": "concept",
      "ai": "focused",
      "legacyIds": [
        "Validar trabalho gerado por IA-O básico",
        "O básico-Validar trabalho gerado por IA"
      ]
    },
    "aiLearning.validar-trabalho-gerado-por-ia.practice": {
      "id": "aiLearning.validar-trabalho-gerado-por-ia.practice",
      "groupId": "aiLearning.validar-trabalho-gerado-por-ia",
      "title": "Pratique e confira",
      "description": "Revise uma proposta que parece correta, mas tem um caso-limite errado. Acrescente uma verificação independente, corrija e documente a evidência.",
      "requires": [
        "aiLearning.validar-trabalho-gerado-por-ia.basics"
      ],
      "resourceIds": [
        "resource.claudePractices",
        "resource.ai",
        "resource.codexPrompts"
      ],
      "kind": "practice",
      "ai": "focused",
      "legacyIds": [
        "Validar trabalho gerado por IA-Pratique e confira",
        "Pratique e confira-Validar trabalho gerado por IA"
      ]
    },
    "aiLearning.validar-trabalho-gerado-por-ia.deepening": {
      "id": "aiLearning.validar-trabalho-gerado-por-ia.deepening",
      "groupId": "aiLearning.validar-trabalho-gerado-por-ia",
      "title": "Desafio de aprofundamento",
      "kind": "challenge",
      "ai": "focused",
      "description": "Escolha uma decisão de Validar trabalho gerado por IA no seu projeto. Construa uma segunda solução, compare os resultados com um caso de teste e explique os limites de cada abordagem. Use as referências para verificar sua conclusão.",
      "requires": [
        "aiLearning.validar-trabalho-gerado-por-ia.basics",
        "aiLearning.validar-trabalho-gerado-por-ia.practice"
      ],
      "resourceIds": [
        "resource.claudePractices",
        "resource.ai",
        "resource.codexPrompts"
      ],
      "legacyIds": []
    },
    "dataEngineering.pipeline-operavel.criteria": {
      "id": "dataEngineering.pipeline-operavel.criteria",
      "groupId": "dataEngineering.pipeline-operavel",
      "title": "Critérios de conclusão",
      "description": "Demonstre idempotência, testes, backfill, logs, recuperação de falha e uma consulta de negócio. Inclua diagrama, origem/licença dos dados e execução local.",
      "requires": [],
      "resourceIds": [
        "resource.airflow",
        "resource.dbt",
        "resource.compose"
      ],
      "kind": "criteria",
      "legacyIds": [
        "Pipeline operável-Critérios de conclusão",
        "Critérios de conclusão-Pipeline operável"
      ]
    },
    "dataEngineering.pipeline-operavel.ai-practice": {
      "id": "dataEngineering.pipeline-operavel.ai-practice",
      "groupId": "dataEngineering.pipeline-operavel",
      "title": "Prática de IA neste projeto",
      "description": "Delegue uma tarefa pequena e revise o diff e a evidência de execução. Adapte o prompt ao que você já construiu nesta etapa. Insira um registro duplicado ou nulo e demonstre como o teste detecta o problema.",
      "requires": [
        "dataEngineering.pipeline-operavel.criteria"
      ],
      "resourceIds": [
        "resource.codexPrompts",
        "resource.cursorPrompts",
        "resource.claudePractices"
      ],
      "kind": "practice",
      "ai": "assisted",
      "prompt": "Projeto: Pipeline operável.\nObjetivo: revisar uma consulta ou etapa do pipeline e procurar dupla contagem, nulos ou duplicação após reexecução.\nContexto: [schema, granularidade esperada, consulta ou código e uma pequena amostra pública ou sintética].\nNesta etapa: Delegue uma tarefa pequena e revise o diff e a evidência de execução.\nLimites: apenas este projeto de laboratório; use as ferramentas já escolhidas, dados públicos ou sintéticos e não exponha segredos.\nCritérios: o resultado é comparado com uma amostra calculada manualmente; cargas repetidas não duplicam dados quando aplicável.\nMostre as hipóteses e como verificá-las. Informe o que foi executado e o que ainda falta conferir.",
      "legacyIds": [
        "Pipeline operável-Prática de IA neste projeto",
        "Prática de IA neste projeto-Pipeline operável"
      ]
    },
    "dataEngineering.pipeline-operavel.verification": {
      "id": "dataEngineering.pipeline-operavel.verification",
      "groupId": "dataEngineering.pipeline-operavel",
      "title": "Registre sua verificação",
      "description": "Registre um prompt sanitizado, uma sugestão aceita ou corrigida, a verificação executada e seu resultado. Explique a mudança com suas palavras. Conclua o projeto após demonstrar os critérios, mesmo quando parte do código vier de IA.",
      "requires": [
        "dataEngineering.pipeline-operavel.criteria"
      ],
      "resourceIds": [
        "resource.git",
        "resource.ai"
      ],
      "kind": "practice",
      "ai": "assisted",
      "legacyIds": [
        "Pipeline operável-Registre sua verificação",
        "Registre sua verificação-Pipeline operável"
      ]
    },
    "dataEngineering.pipeline-operavel.deepening": {
      "id": "dataEngineering.pipeline-operavel.deepening",
      "groupId": "dataEngineering.pipeline-operavel",
      "title": "Desafio de aprofundamento",
      "kind": "challenge",
      "description": "Escolha uma decisão de Pipeline operável no seu projeto. Construa uma segunda solução, compare os resultados com um caso de teste e explique os limites de cada abordagem. Use as referências para verificar sua conclusão.",
      "requires": [
        "dataEngineering.pipeline-operavel.criteria",
        "dataEngineering.pipeline-operavel.ai-practice",
        "dataEngineering.pipeline-operavel.verification"
      ],
      "resourceIds": [
        "resource.airflow",
        "resource.dbt",
        "resource.compose",
        "resource.codexPrompts",
        "resource.cursorPrompts",
        "resource.claudePractices",
        "resource.git",
        "resource.ai"
      ],
      "legacyIds": []
    },
    "curriculum.portfolio-e-candidatura.basics": {
      "id": "curriculum.portfolio-e-candidatura.basics",
      "groupId": "curriculum.portfolio-e-candidatura",
      "title": "O básico",
      "description": "",
      "requires": [],
      "resourceIds": [
        "resource.git",
        "resource.contribute"
      ],
      "kind": "concept",
      "legacyIds": [
        "Portfólio e candidatura-O básico",
        "O básico-Portfólio e candidatura"
      ]
    },
    "curriculum.portfolio-e-candidatura.practice": {
      "id": "curriculum.portfolio-e-candidatura.practice",
      "groupId": "curriculum.portfolio-e-candidatura",
      "title": "Pratique e confira",
      "description": "Peça feedback sobre um projeto, corrija uma issue e explique sua contribuição. Compare vagas de entrada e escolha uma lacuna concreta para estudar.",
      "requires": [
        "curriculum.portfolio-e-candidatura.basics"
      ],
      "resourceIds": [
        "resource.git",
        "resource.contribute"
      ],
      "kind": "practice",
      "legacyIds": [
        "Portfólio e candidatura-Pratique e confira",
        "Pratique e confira-Portfólio e candidatura"
      ]
    },
    "curriculum.portfolio-e-candidatura.deepening": {
      "id": "curriculum.portfolio-e-candidatura.deepening",
      "groupId": "curriculum.portfolio-e-candidatura",
      "title": "Desafio de aprofundamento",
      "kind": "challenge",
      "description": "Escolha uma decisão de Portfólio e candidatura no seu projeto. Construa uma segunda solução, compare os resultados com um caso de teste e explique os limites de cada abordagem. Use as referências para verificar sua conclusão.",
      "requires": [
        "curriculum.portfolio-e-candidatura.basics",
        "curriculum.portfolio-e-candidatura.practice"
      ],
      "resourceIds": [
        "resource.git",
        "resource.contribute"
      ],
      "legacyIds": []
    },
    "curriculum.ia-no-fluxo-de-trabalho.basics": {
      "id": "curriculum.ia-no-fluxo-de-trabalho.basics",
      "groupId": "curriculum.ia-no-fluxo-de-trabalho",
      "title": "O básico",
      "description": "",
      "requires": [],
      "resourceIds": [
        "resource.ai"
      ],
      "kind": "concept",
      "ai": "focused",
      "legacyIds": [
        "IA no fluxo de trabalho-O básico",
        "O básico-IA no fluxo de trabalho"
      ]
    },
    "curriculum.ia-no-fluxo-de-trabalho.practice": {
      "id": "curriculum.ia-no-fluxo-de-trabalho.practice",
      "groupId": "curriculum.ia-no-fluxo-de-trabalho",
      "title": "Pratique e confira",
      "description": "Compare uma sugestão de IA com sua solução, identifique uma limitação e teste a mudança. Explique o código sem depender da ferramenta.",
      "requires": [
        "curriculum.ia-no-fluxo-de-trabalho.basics"
      ],
      "resourceIds": [
        "resource.ai"
      ],
      "kind": "practice",
      "ai": "focused",
      "legacyIds": [
        "IA no fluxo de trabalho-Pratique e confira",
        "Pratique e confira-IA no fluxo de trabalho"
      ]
    },
    "curriculum.ia-no-fluxo-de-trabalho.deepening": {
      "id": "curriculum.ia-no-fluxo-de-trabalho.deepening",
      "groupId": "curriculum.ia-no-fluxo-de-trabalho",
      "title": "Desafio de aprofundamento",
      "kind": "challenge",
      "ai": "focused",
      "description": "Escolha uma decisão de IA no fluxo de trabalho no seu projeto. Construa uma segunda solução, compare os resultados com um caso de teste e explique os limites de cada abordagem. Use as referências para verificar sua conclusão.",
      "requires": [
        "curriculum.ia-no-fluxo-de-trabalho.basics",
        "curriculum.ia-no-fluxo-de-trabalho.practice"
      ],
      "resourceIds": [
        "resource.ai"
      ],
      "legacyIds": []
    },
    "dataEngineering.spark-e-streaming.basics": {
      "id": "dataEngineering.spark-e-streaming.basics",
      "groupId": "dataEngineering.spark-e-streaming",
      "title": "O básico",
      "description": "",
      "requires": [],
      "resourceIds": [
        "resource.spark",
        "resource.kafka",
        "resource.youtubeSionekSpark",
        "resource.youtubeLuanMorenoSpark",
        "resource.youtubeMichelliMessaging",
        "resource.youtubeFullCycleKafka"
      ],
      "kind": "concept",
      "legacyIds": [
        "Spark e streaming-O básico",
        "O básico-Spark e streaming"
      ]
    },
    "dataEngineering.spark-e-streaming.practice": {
      "id": "dataEngineering.spark-e-streaming.practice",
      "groupId": "dataEngineering.spark-e-streaming",
      "title": "Pratique e confira",
      "description": "Compare uma transformação local com a versão distribuída e documente quando o custo adicional se justifica.",
      "requires": [
        "dataEngineering.spark-e-streaming.basics"
      ],
      "resourceIds": [
        "resource.spark",
        "resource.kafka",
        "resource.youtubeSionekSpark",
        "resource.youtubeLuanMorenoSpark",
        "resource.youtubeMichelliMessaging",
        "resource.youtubeFullCycleKafka"
      ],
      "kind": "practice",
      "legacyIds": [
        "Spark e streaming-Pratique e confira",
        "Pratique e confira-Spark e streaming"
      ]
    },
    "dataEngineering.spark-e-streaming.deepening": {
      "id": "dataEngineering.spark-e-streaming.deepening",
      "groupId": "dataEngineering.spark-e-streaming",
      "title": "Desafio de aprofundamento",
      "kind": "challenge",
      "description": "Escolha uma decisão de Spark e streaming no seu projeto. Construa uma segunda solução, compare os resultados com um caso de teste e explique os limites de cada abordagem. Use as referências para verificar sua conclusão.",
      "requires": [
        "dataEngineering.spark-e-streaming.basics",
        "dataEngineering.spark-e-streaming.practice"
      ],
      "resourceIds": [
        "resource.spark",
        "resource.kafka",
        "resource.youtubeSionekSpark",
        "resource.youtubeLuanMorenoSpark",
        "resource.youtubeMichelliMessaging",
        "resource.youtubeFullCycleKafka"
      ],
      "legacyIds": []
    }
  },
  "resources": {
    "resource.pythonCourse": {
      "id": "resource.pythonCourse",
      "title": "Curso em Vídeo: Python, mundo 1 (português; conteúdo gratuito, certificado opcional pago)",
      "url": "https://www.cursoemvideo.com/curso/python-3-mundo-1/",
      "language": "pt-BR",
      "kind": "Leia",
      "free": true,
      "estimatedMinutes": null,
      "lastReviewedAt": null
    },
    "resource.python": {
      "id": "resource.python",
      "title": "Python: tutorial oficial (português)",
      "url": "https://docs.python.org/pt-br/3/tutorial/",
      "language": "pt-BR",
      "kind": "Leia",
      "free": true,
      "estimatedMinutes": null,
      "lastReviewedAt": null
    },
    "resource.pandas": {
      "id": "resource.pandas",
      "title": "pandas: tutoriais introdutórios (inglês)",
      "url": "https://pandas.pydata.org/docs/getting_started/intro_tutorials/index.html",
      "language": "en",
      "kind": "Leia",
      "free": true,
      "estimatedMinutes": null,
      "lastReviewedAt": null
    },
    "resource.youtubePythonCourse": {
      "id": "resource.youtubePythonCourse",
      "title": "Curso em Vídeo: Python 3, mundo 1 (português; playlist gratuita no YouTube)",
      "url": "https://www.youtube.com/playlist?list=PLHz_AreHm4dlKP6QQCekuIPky1CiwmdI6",
      "language": "pt-BR",
      "kind": "Assista",
      "free": true,
      "estimatedMinutes": null,
      "lastReviewedAt": null
    },
    "resource.youtubeDunossauro": {
      "id": "resource.youtubeDunossauro",
      "title": "Eduardo Mendes: Python profundo (português; vídeos gratuitos no YouTube)",
      "url": "https://www.youtube.com/@Dunossauro",
      "language": "pt-BR",
      "kind": "Assista",
      "free": true,
      "estimatedMinutes": null,
      "lastReviewedAt": null
    },
    "resource.youtubeLetsData": {
      "id": "resource.youtubeLetsData",
      "title": "Let's Data: Python para dados (português; vídeos gratuitos no YouTube)",
      "url": "https://www.youtube.com/@letsdataAI",
      "language": "pt-BR",
      "kind": "Assista",
      "free": true,
      "estimatedMinutes": null,
      "lastReviewedAt": null
    },
    "resource.git": {
      "id": "resource.git",
      "title": "Pro Git: livro gratuito (português)",
      "url": "https://git-scm.com/book/pt-br/v2",
      "language": "pt-BR",
      "kind": "Leia",
      "free": true,
      "estimatedMinutes": null,
      "lastReviewedAt": null
    },
    "resource.contribute": {
      "id": "resource.contribute",
      "title": "GitHub: como contribuir com projetos (português)",
      "url": "https://docs.github.com/pt/get-started/exploring-projects-on-github/contributing-to-a-project",
      "language": "pt-BR",
      "kind": "Leia",
      "free": true,
      "estimatedMinutes": null,
      "lastReviewedAt": null
    },
    "resource.youtubeGitJusten": {
      "id": "resource.youtubeGitJusten",
      "title": "Willian Justen: Git e GitHub para iniciantes (português; playlist gratuita no YouTube)",
      "url": "https://www.youtube.com/playlist?list=PLlAbYrWSYTiPA2iEiQ2PF_A9j__C4hi0A",
      "language": "pt-BR",
      "kind": "Assista",
      "free": true,
      "estimatedMinutes": null,
      "lastReviewedAt": null
    },
    "resource.youtubeGitCourse": {
      "id": "resource.youtubeGitCourse",
      "title": "Curso em Vídeo: Git e GitHub (português; playlist gratuita no YouTube)",
      "url": "https://www.youtube.com/playlist?list=PLHz_AreHm4dm7ZULPAmadvNhH6vk9oNZA",
      "language": "pt-BR",
      "kind": "Assista",
      "free": true,
      "estimatedMinutes": null,
      "lastReviewedAt": null
    },
    "resource.youtubeSionekCareer": {
      "id": "resource.youtubeSionekCareer",
      "title": "André Sionek: carreira em engenharia de dados (português; vídeos gratuitos no YouTube)",
      "url": "https://www.youtube.com/c/AndreSionek",
      "language": "pt-BR",
      "kind": "Assista",
      "free": true,
      "estimatedMinutes": null,
      "lastReviewedAt": null
    },
    "resource.youtubeComunidadeDsCareer": {
      "id": "resource.youtubeComunidadeDsCareer",
      "title": "Comunidade DS: jornada e profissões em dados (português; vídeos gratuitos no YouTube)",
      "url": "https://www.youtube.com/@ComunidadeDS",
      "language": "pt-BR",
      "kind": "Assista",
      "free": true,
      "estimatedMinutes": null,
      "lastReviewedAt": null
    },
    "resource.cursor": {
      "id": "resource.cursor",
      "title": "Cursor: uso do agente (inglês; documentação gratuita)",
      "url": "https://cursor.com/docs/agent/overview",
      "language": "en",
      "kind": "Leia",
      "free": true,
      "estimatedMinutes": null,
      "lastReviewedAt": null
    },
    "resource.cursorPrompts": {
      "id": "resource.cursorPrompts",
      "title": "Cursor: prompts e contexto (inglês; documentação gratuita)",
      "url": "https://cursor.com/docs/agent/prompting",
      "language": "en",
      "kind": "Leia",
      "free": true,
      "estimatedMinutes": null,
      "lastReviewedAt": null
    },
    "resource.claude": {
      "id": "resource.claude",
      "title": "Claude Code: primeiros passos (inglês; documentação gratuita)",
      "url": "https://code.claude.com/docs/en/quickstart",
      "language": "en",
      "kind": "Leia",
      "free": true,
      "estimatedMinutes": null,
      "lastReviewedAt": null
    },
    "resource.claudePractices": {
      "id": "resource.claudePractices",
      "title": "Claude Code: boas práticas (inglês; documentação gratuita)",
      "url": "https://code.claude.com/docs/en/best-practices",
      "language": "en",
      "kind": "Leia",
      "free": true,
      "estimatedMinutes": null,
      "lastReviewedAt": null
    },
    "resource.codex": {
      "id": "resource.codex",
      "title": "OpenAI: primeiros passos com Codex (inglês; documentação gratuita)",
      "url": "https://developers.openai.com/codex/quickstart/",
      "language": "en",
      "kind": "Leia",
      "free": true,
      "estimatedMinutes": null,
      "lastReviewedAt": null
    },
    "resource.codexPrompts": {
      "id": "resource.codexPrompts",
      "title": "OpenAI: prompting para tarefas de código (inglês; documentação gratuita)",
      "url": "https://developers.openai.com/codex/prompting/",
      "language": "en",
      "kind": "Leia",
      "free": true,
      "estimatedMinutes": null,
      "lastReviewedAt": null
    },
    "resource.ai": {
      "id": "resource.ai",
      "title": "GitHub: uso responsável de sugestões de IA (português)",
      "url": "https://docs.github.com/pt/copilot/responsible-use/copilot-code-completion",
      "language": "pt-BR",
      "kind": "Leia",
      "free": true,
      "estimatedMinutes": null,
      "lastReviewedAt": null
    },
    "resource.sql": {
      "id": "resource.sql",
      "title": "Microsoft Learn: introdução a Transact-SQL (português)",
      "url": "https://learn.microsoft.com/pt-br/training/paths/get-started-querying-with-transact-sql/",
      "language": "pt-BR",
      "kind": "Leia",
      "free": true,
      "estimatedMinutes": null,
      "lastReviewedAt": null
    },
    "resource.postgres": {
      "id": "resource.postgres",
      "title": "PostgreSQL: tutorial de SQL (inglês)",
      "url": "https://www.postgresql.org/docs/current/tutorial.html",
      "language": "en",
      "kind": "Leia",
      "free": true,
      "estimatedMinutes": null,
      "lastReviewedAt": null
    },
    "resource.youtubeMysqlCourse": {
      "id": "resource.youtubeMysqlCourse",
      "title": "Curso em Vídeo: bancos de dados e MySQL (português; playlist gratuita no YouTube)",
      "url": "https://www.youtube.com/playlist?list=PLHz_AreHm4dkBs-795Dsgvau_ekxg8g1r",
      "language": "pt-BR",
      "kind": "Assista",
      "free": true,
      "estimatedMinutes": null,
      "lastReviewedAt": null
    },
    "resource.youtubeHashtagSql": {
      "id": "resource.youtubeHashtagSql",
      "title": "Hashtag Treinamentos: SQL para análise de dados (português; vídeos gratuitos no YouTube)",
      "url": "https://www.youtube.com/c/HashtagTreinamentos",
      "language": "pt-BR",
      "kind": "Assista",
      "free": true,
      "estimatedMinutes": null,
      "lastReviewedAt": null
    },
    "resource.duckdb": {
      "id": "resource.duckdb",
      "title": "DuckDB: introdução (inglês)",
      "url": "https://duckdb.org/docs/stable/",
      "language": "en",
      "kind": "Leia",
      "free": true,
      "estimatedMinutes": null,
      "lastReviewedAt": null
    },
    "resource.dbt": {
      "id": "resource.dbt",
      "title": "dbt: introdução às transformações de dados (inglês)",
      "url": "https://docs.getdbt.com/docs/introduction",
      "language": "en",
      "kind": "Leia",
      "free": true,
      "estimatedMinutes": null,
      "lastReviewedAt": null
    },
    "resource.youtubeComunidadeDsWarehouse": {
      "id": "resource.youtubeComunidadeDsWarehouse",
      "title": "Comunidade DS: data warehouse e data lake (português; vídeos gratuitos no YouTube)",
      "url": "https://www.youtube.com/@ComunidadeDS",
      "language": "pt-BR",
      "kind": "Assista",
      "free": true,
      "estimatedMinutes": null,
      "lastReviewedAt": null
    },
    "resource.youtubeDataHackers": {
      "id": "resource.youtubeDataHackers",
      "title": "Data Hackers: arquitetura de dados modernas (português; vídeos gratuitos no YouTube)",
      "url": "https://www.youtube.com/c/DataHackers",
      "language": "pt-BR",
      "kind": "Assista",
      "free": true,
      "estimatedMinutes": null,
      "lastReviewedAt": null
    },
    "resource.airflow": {
      "id": "resource.airflow",
      "title": "Apache Airflow: tutoriais de orquestração (inglês)",
      "url": "https://airflow.apache.org/docs/apache-airflow/stable/tutorial/index.html",
      "language": "en",
      "kind": "Leia",
      "free": true,
      "estimatedMinutes": null,
      "lastReviewedAt": null
    },
    "resource.youtubeSionekAirflow": {
      "id": "resource.youtubeSionekAirflow",
      "title": "André Sionek: Apache Airflow (português; vídeos gratuitos no YouTube)",
      "url": "https://www.youtube.com/c/AndreSionek",
      "language": "pt-BR",
      "kind": "Assista",
      "free": true,
      "estimatedMinutes": null,
      "lastReviewedAt": null
    },
    "resource.otel": {
      "id": "resource.otel",
      "title": "OpenTelemetry: conceitos de observabilidade (português)",
      "url": "https://opentelemetry.io/pt/docs/concepts/observability-primer/",
      "language": "pt-BR",
      "kind": "Leia",
      "free": true,
      "estimatedMinutes": null,
      "lastReviewedAt": null
    },
    "resource.security": {
      "id": "resource.security",
      "title": "OWASP: guia de segurança de aplicações (inglês)",
      "url": "https://cheatsheetseries.owasp.org/",
      "language": "en",
      "kind": "Leia",
      "free": true,
      "estimatedMinutes": null,
      "lastReviewedAt": null
    },
    "resource.compose": {
      "id": "resource.compose",
      "title": "Docker Compose: primeiros passos (inglês)",
      "url": "https://docs.docker.com/compose/gettingstarted/",
      "language": "en",
      "kind": "Leia",
      "free": true,
      "estimatedMinutes": null,
      "lastReviewedAt": null
    },
    "resource.actions": {
      "id": "resource.actions",
      "title": "GitHub Actions: integração contínua (português)",
      "url": "https://docs.github.com/pt/actions/get-started/continuous-integration",
      "language": "pt-BR",
      "kind": "Leia",
      "free": true,
      "estimatedMinutes": null,
      "lastReviewedAt": null
    },
    "resource.cloud": {
      "id": "resource.cloud",
      "title": "Microsoft Learn: conceitos de nuvem (português; laboratório local recomendado)",
      "url": "https://learn.microsoft.com/pt-br/training/paths/microsoft-azure-fundamentals-describe-cloud-concepts/",
      "language": "pt-BR",
      "kind": "Leia",
      "free": true,
      "estimatedMinutes": null,
      "lastReviewedAt": null
    },
    "resource.youtubeComunidadeDsCloud": {
      "id": "resource.youtubeComunidadeDsCloud",
      "title": "Comunidade DS: cloud AWS para dados (português; vídeos gratuitos no YouTube)",
      "url": "https://www.youtube.com/@ComunidadeDS",
      "language": "pt-BR",
      "kind": "Assista",
      "free": true,
      "estimatedMinutes": null,
      "lastReviewedAt": null
    },
    "resource.youtubeLinuxtipsAzure": {
      "id": "resource.youtubeLinuxtipsAzure",
      "title": "LINUXtips: certificações de nuvem e Azure (português; vídeos gratuitos no YouTube)",
      "url": "https://www.youtube.com/c/linuxtips",
      "language": "pt-BR",
      "kind": "Assista",
      "free": true,
      "estimatedMinutes": null,
      "lastReviewedAt": null
    },
    "resource.cursorRules": {
      "id": "resource.cursorRules",
      "title": "Cursor: regras do projeto (inglês; documentação gratuita)",
      "url": "https://cursor.com/docs/rules",
      "language": "en",
      "kind": "Leia",
      "free": true,
      "estimatedMinutes": null,
      "lastReviewedAt": null
    },
    "resource.codexRules": {
      "id": "resource.codexRules",
      "title": "OpenAI: instruções de projeto com AGENTS.md (inglês; documentação gratuita)",
      "url": "https://developers.openai.com/codex/guides/agents-md/",
      "language": "en",
      "kind": "Leia",
      "free": true,
      "estimatedMinutes": null,
      "lastReviewedAt": null
    },
    "resource.spark": {
      "id": "resource.spark",
      "title": "Apache Spark: primeiros passos (inglês)",
      "url": "https://spark.apache.org/docs/latest/quick-start.html",
      "language": "en",
      "kind": "Leia",
      "free": true,
      "estimatedMinutes": null,
      "lastReviewedAt": null
    },
    "resource.kafka": {
      "id": "resource.kafka",
      "title": "Apache Kafka: introdução e primeiros passos (inglês)",
      "url": "https://kafka.apache.org/quickstart",
      "language": "en",
      "kind": "Leia",
      "free": true,
      "estimatedMinutes": null,
      "lastReviewedAt": null
    },
    "resource.youtubeSionekSpark": {
      "id": "resource.youtubeSionekSpark",
      "title": "André Sionek: Apache Spark e Databricks (português; vídeos gratuitos no YouTube)",
      "url": "https://www.youtube.com/c/AndreSionek",
      "language": "pt-BR",
      "kind": "Assista",
      "free": true,
      "estimatedMinutes": null,
      "lastReviewedAt": null
    },
    "resource.youtubeLuanMorenoSpark": {
      "id": "resource.youtubeLuanMorenoSpark",
      "title": "Luan Moreno: engenharia de dados na prática (português; vídeos gratuitos no YouTube)",
      "url": "https://www.youtube.com/@LuanMorenoMMaciel",
      "language": "pt-BR",
      "kind": "Assista",
      "free": true,
      "estimatedMinutes": null,
      "lastReviewedAt": null
    },
    "resource.youtubeMichelliMessaging": {
      "id": "resource.youtubeMichelliMessaging",
      "title": "Michelli Brito: RabbitMQ e Kafka na prática (português; vídeos gratuitos no YouTube)",
      "url": "https://www.youtube.com/c/MichelliBrito",
      "language": "pt-BR",
      "kind": "Assista",
      "free": true,
      "estimatedMinutes": null,
      "lastReviewedAt": null
    },
    "resource.youtubeFullCycleKafka": {
      "id": "resource.youtubeFullCycleKafka",
      "title": "Full Cycle: Apache Kafka descomplicado (português; vídeos gratuitos no YouTube)",
      "url": "https://www.youtube.com/c/FullCycle",
      "language": "pt-BR",
      "kind": "Assista",
      "free": true,
      "estimatedMinutes": null,
      "lastReviewedAt": null
    }
  }
}