182 lines
8.3 KiB
JSON
182 lines
8.3 KiB
JSON
{
|
||
"$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)"
|
||
}
|
||
}
|
||
}
|