generative-ai-e2
Bootcamp Gen AI E2 da TCS.
o_problema
Numa operação de ITSM o chamado nasce no Freshservice e o trabalho acontece no Jira. O tombamento de um para o outro é manual, e o vínculo entre os dois sistemas só existe como texto livre que alguém digitou no título do card.
o_que_faz
- Freshservice para Jira: ingestão de tickets, roteamento para a squad correta, criação idempotente de issue, rastreabilidade e auditoria.
- Um workspace ágil (sprint, backlog, quadro com drag-and-drop) projetado do Jira em tempo de requisição, sem cache.
- Um laboratório de RAG local sobre a documentação do próprio repositório, indexado em SQLite com sqlite-vec e exposto por MCP.
- Um assistente conversacional com upload de documento e busca em árvore.
stack
frontend
Next.js (App Router) · React 19 · Tailwind CSS v4 · shadcn/ui on Base UI
backend
Python 3.11+ · FastAPI · SQLAlchemy 2 · Alembic · PostgreSQL 16
outros
SQLite + sqlite-vec · sentence-transformers · OpenRouter · Model Context Protocol · GitHub Spec Kit
medido
- Cobertura de vínculo, processo manual
- 72.9%312 de 428 cards exportados bateram com um chamado real
- Campo oficial de chamado preenchido
- 1 / 428campo de chamado do Freshservice no export histórico
- Acurácia do classificador
- 83.33%golden set de 19 casos, medido em 30/07/2026
- Vetores de prompt injection que passaram
- 1 / 3a razão de o classificador ser entregue desligado
como_foi_construido
Spec-driven via GitHub Spec Kit: treze specs numeradas, cada uma com spec, plano, pesquisa, modelo de dados, lista de tarefas, quickstart, contratos e checklist de requisitos. Uma constituição de projeto que prevalece sobre o resto. Decisões arquiteturais registradas como ADRs numerados, 005 a 013.
O problema foi medido contra exports reais, não estimado. De 428 cards exportados, 368 traziam número de chamado extraível do título e 312 batiam com um chamado real, ou seja 72,9% de cobertura de vínculo. O campo oficial de chamado do Freshservice estava preenchido em exatamente um card entre 428. Contra a automação, onde o identificador vai num rótulo estruturado da issue em vez de depender de alguém digitá-lo, a cobertura é 100% por construção.
O README dedica mais espaço às limitações deliberadas do que às funcionalidades, e cada uma traz a razão e a condição de saída. Esse é o ponto do projeto, não uma ressalva a ele.
limitacoes_conhecidas
- O classificador por LLM está implementado, testado e desligado por padrão. Contra um golden set de 19 casos medido em 30/07/2026: 83,33% de acurácia, 37,50% de abstenção, e um de três vetores de prompt injection passou. Assunto e descrição do chamado são entrada não confiável, escrita por quem abre o chamado, então ativar o classificador transferiria a escolha da squad de destino para essa pessoa. Enum fechado protege contra saída malformada, não contra saída válida-porém-manipulada.
- A queda de acurácia frente ao provedor anterior, 100% para 83,33%, é declarada como esperada e não reportada como regressão: modelos diferentes, cada um medido honestamente contra o próprio provedor. O golden set decide, não confirma.
- Situação de SLA não existe na origem. A fila tem coluna de SLA porque o requisito pede, mas nenhum prazo chega do Freshservice, então a coluna mostra um travessão com o rótulo "sem prazo conhecido na origem". Derivar um prazo do timestamp de retentativa seria inventar número que ninguém consegue auditar numa apresentação.
- O workspace ágil não funciona offline, por decisão: cache de sprint mentiria numa demonstração ao vivo. Sem credencial, as telas renderizam estado nomeado (não configurado, não autorizado, indisponível, com rate limit) em vez de erro.
- O Freshservice roda contra mock e não contra o tenant real, porque o administrador do cliente nunca liberou a API key. O enum de squad virou genérico, e a suíte de testes roda verde sem credencial e sem rede.
- Uma dependência foi adicionada contra a própria regra do projeto de não adicionar dependência onde a instalada resolve. Está registrada como decisão consciente, não deixada quieta.
tempo de código rastreado
32 hrs 8 mins Fonte: WakaTime · rastreado desde 2026-03-17 até agora