Redator de SD - preparado para deploy

This commit is contained in:
2026-08-11 19:00:04 -03:00
commit 18ae589d3a
35 changed files with 5832 additions and 0 deletions
+181
View File
@@ -0,0 +1,181 @@
{
"$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)"
}
}
}