{ "$schema": "http://json-schema.org/draft-07/schema#", "$id": "schema-sd.json", "title": "Solicitação de Demanda (SD) — RMDS / SES-MG", "$comment": "Contrato de saída: o redator (LLM) devolve a SD SEMPRE neste formato. O app renderiza o documento a partir dele e roda o validador de código sobre ele. Versão 1.0.0.", "type": "object", "required": ["cabecalho", "objetivo", "contexto", "entregaveis", "enquadramento_tr", "validacao"], "properties": { "cabecalho": { "type": "object", "required": ["projeto", "numero_sd", "versao", "data_abertura", "periodo_execucao", "itens_tr", "total_ust", "total_ust_extenso", "prazo_execucao_semanas", "quantidade_entregaveis"], "properties": { "titulo": { "type": "string", "description": "Título da SD (nome do produto/resultado)" }, "projeto": { "type": "string", "description": "Nome do projeto real DESTA demanda — campo mais copiado por engano" }, "numero_sd": { "type": "string", "description": "Sequencial, ex.: SD-26" }, "versao": { "type": "string", "description": "V1, V2..." }, "data_abertura": { "type": "string", "format": "date", "description": "DD/MM/AAAA no render; ISO aqui" }, "periodo_execucao": { "type": "object", "required": ["inicio", "fim"], "properties": { "inicio": { "type": "string", "format": "date", "description": "Data inicial do primeiro entregável" }, "fim": { "type": "string", "format": "date", "description": "Data final do último entregável" } } }, "itens_tr": { "type": "array", "items": { "enum": ["I-02", "I-03", "I-04", "I-05"] }, "minItems": 1, "description": "Todos os itens que a SD cruza" }, "total_ust": { "type": "integer", "description": "Soma dos entregáveis — CALCULADO PELO APP, o LLM apenas propõe" }, "total_ust_extenso": { "type": "string", "description": "Número por extenso" }, "prazo_execucao_semanas": { "type": "integer", "description": "Duração de CALENDÁRIO, não soma das semanas quando há paralelismo" }, "quantidade_entregaveis": { "type": "integer" } } }, "objetivo": { "type": "string", "description": "Dois a quatro períodos. O que a SD formaliza e qual resultado permite alcançar. Não repete o contexto." }, "contexto": { "type": "array", "minItems": 3, "maxItems": 5, "items": { "type": "string" }, "description": "Parágrafos na ordem: (1) problema de gestão, (2) insumo disponível e por que não basta, (3) o que a demanda entrega, (4) achado/resultado quando houver, (5) desdobramento. Números reais e verificáveis." }, "entregaveis": { "type": "array", "minItems": 1, "items": { "type": "object", "required": ["n", "nome", "tipo", "item_tr", "semanas", "timebox_h", "ust", "periodo", "resumo", "atividades", "artefatos", "criterios_aceite"], "properties": { "n": { "type": "integer", "description": "Posição no quadro" }, "nome": { "type": "string", "description": "Nome do artefato final, ex.: 'Painel de fila cirúrgica publicado'" }, "tipo": { "enum": ["Descoberta", "Design", "Arquitetura", "Construção"] }, "item_tr": { "enum": ["I-02", "I-03", "I-04", "I-05"] }, "semanas": { "type": "integer", "minimum": 2, "maximum": 4 }, "timebox_h": { "enum": [40, 80], "description": "Derivado de regras-sd.json por tipo × item" }, "ust": { "type": "integer", "description": "timebox_h × semanas — RECALCULADO PELO APP" }, "periodo": { "type": "object", "required": ["inicio", "fim"], "properties": { "inicio": { "type": "string", "format": "date" }, "fim": { "type": "string", "format": "date" } } }, "depende_de": { "type": "array", "items": { "type": "integer" }, "description": "n dos entregáveis dos quais este depende (encadeamento → períodos não podem sobrepor)" }, "paralelo_com": { "type": "array", "items": { "type": "integer" }, "description": "n dos entregáveis paralelos (exige nota_paralelismo e times distintos)" }, "nota_paralelismo": { "type": "string", "description": "Obrigatória quando paralelo_com não é vazio" }, "resumo": { "type": "string", "description": "Três linhas: o que o entregável fez e o que produziu" }, "atividades": { "type": "array", "minItems": 6, "maxItems": 9, "items": { "type": "string" }, "description": "Blocos de trabalho concretos, explicáveis em uma frase" }, "artefatos": { "type": "array", "minItems": 1, "items": { "type": "object", "required": ["nome", "confirmado_pelo_usuario"], "properties": { "nome": { "type": "string", "description": "Nome real do documento" }, "data": { "type": "string", "format": "date", "description": "Quando houver — deve ser <= periodo.fim do entregável" }, "confirmado_pelo_usuario": { "type": "boolean", "description": "TRAVA DE INTEGRIDADE: o LLM sugere TIPOS de artefato; nomes concretos só entram informados/confirmados pelo usuário. false = pendência bloqueante para exportação." } } } }, "criterios_aceite": { "type": "array", "minItems": 2, "items": { "type": "string" }, "description": "Condições verificáveis por terceiro olhando o artefato — nunca 'funcionando adequadamente', 'bem construído', 'documentação completa'" } } } }, "subtotais_por_item": { "type": "array", "description": "Obrigatório quando itens_tr tem mais de um item — é assim que se controla saldo de pool. CALCULADO PELO APP.", "items": { "type": "object", "required": ["item_tr", "ust"], "properties": { "item_tr": { "enum": ["I-02", "I-03", "I-04", "I-05"] }, "ust": { "type": "integer" } } } }, "enquadramento_tr": { "type": "array", "minItems": 1, "description": "Uma entrada por item cruzado (Seção 5 repetida por item)", "items": { "type": "object", "required": ["item_tr", "titulo_literal", "descricao_item", "aderencia", "entregaveis_n"], "properties": { "item_tr": { "enum": ["I-02", "I-03", "I-04", "I-05"] }, "titulo_literal": { "type": "string", "description": "Exatamente como em regras-sd.json / TR" }, "descricao_item": { "type": "string", "description": "Transcrição do escopo do item conforme o TR" }, "aderencia": { "type": "array", "minItems": 3, "maxItems": 5, "items": { "type": "string" }, "description": "Um bullet por componente ENTREGUE, no vocabulário do item. Não citar componente que a SD não tem." }, "entregaveis_n": { "type": "array", "items": { "type": "integer" }, "description": "Quais entregáveis do quadro pertencem a este item" } } } }, "validacao": { "type": "array", "description": "Resultado do checklist (IDs de regras-sd.json). Itens 'codigo' são preenchidos pelo validador do app; itens 'julgamento' pela passada de revisão do LLM; itens 'usuario' pela confirmação explícita.", "items": { "type": "object", "required": ["id", "status"], "properties": { "id": { "type": "string", "description": "Ex.: CAL-02" }, "status": { "enum": ["ok", "alerta", "falha", "pendente"] }, "observacao": { "type": "string", "description": "Obrigatória quando status != ok" } } } }, "pendencias": { "type": "array", "items": { "type": "string" }, "description": "O que ainda precisa de decisão humana antes do envio (ex.: repactuação de prazo, confirmação de artefato)" } } }