Solução de problemas
O que cada falha significa, o que verificar e qual o próximo passo seguro.
Comece pelo código de saída
Todo comando termina com um de seis códigos, e o código já estreita o problema antes de você ler qualquer outra coisa.
0 sucesso 1 erro de validação o arquivo está bem formado, mas viola uma regra 2 estrutura inválida o workspace não corresponde à especificação 3 desvio detectado a especificação mudou desde o .orv.lock 4 erro de arquivo arquivo ausente, vazio ou ilegível 5 erro interno um defeito no engine
Um caso não vem do engine. Um comando chamado sem um argumento obrigatório — orvienm verify, orvienm new orvienm init sem nada depois — é rejeitado pelo parser de argumentos, que imprime usage: e o nome do argumento que falta, e então sai com 2, como as ferramentas de linha de comando costumam fazer. É um erro de uso, não uma afirmação sobre um workspace: leia a primeira linha da saída para distinguir os dois.
Dois comandos apenas reportam por padrão, em vez de falhar: policy doctor saem ambos com 0 enquanto imprimem o que encontraram. Passe --strict a qualquer um deles para transformar o mesmo achado em saída 2. A detecção é idêntica nos dois modos — só o código de saída muda — então uma etapa que você acrescenta a um pipeline não começa a quebrá-lo sem que você peça.
Leitura do arquivo
File not found: structure.yaml
saída: 4
- Significado
- O caminho passado ao comando não existe. Nada foi lido e nada foi alterado.
- O que verificar
- O nome de arquivo padrão do engine é .orvienm.yaml, não structure.yaml nem example.yaml. Confirme o nome do arquivo e se você está no diretório que imagina.
- Próximo passo
- Passe o caminho correto, ou omita o argumento em plan, apply, graph e policy para deixar o engine encontrar .orvienm.yaml, orvienm.yaml ou orvienm.yml.
Error: Invalid YAML format: mapping values are not allowed here
saída: 4
- Significado
- O arquivo não pôde ser interpretado como YAML. Isso acontece antes de qualquer regra do Orvienm ser aplicada, então a mensagem vem do parser YAML e inclui linha e coluna.
- O que verificar
- Indentação, dois-pontos faltando, colchete não fechado ou um caractere de tabulação onde se esperam espaços.
- Próximo passo
- Corrija a sintaxe na linha indicada e rode o validate de novo.
Error: YAML file is empty. / Root YAML structure must be a dictionary.
saída: 4
- Significado
- O arquivo foi interpretado, mas o nível superior não é um mapping — ele está vazio, ou é uma lista, ou um escalar solto.
- O que verificar
- Se o arquivo começa com chaves como version: e structure:.
- Próximo passo
- Parta do arquivo mínimo da Referência da especificação.
Erros de validação
A validação junta todos os problemas e os reporta de uma vez, um por linha, sob um cabeçalho Validation failed:. As mensagens nomeiam o campo e a falha; elas não trazem número de linha, então localize o campo pelo nome.
Unknown field at root level: 'relationships'.
saída: 1
- Significado
- O conjunto de chaves de raiz é fechado. Só version, structure, style e policy são aceitas, e qualquer outra é rejeitada em vez de ignorada.
- O que verificar
- Chaves herdadas de rascunhos antigos ou de outra ferramenta. relationships, requires, profiles e appendix são todas rejeitadas.
- Próximo passo
- Remova a chave. Se você precisa do que ela expressava, isso não está implementado neste Alpha.
Missing required field 'version'. / Missing required field 'structure'. / Missing required field 'structure.name'.
saída: 1
- Significado
- Uma chave obrigatória está ausente.
- O que verificar
- version e structure na raiz; name e directories dentro de structure.
- Próximo passo
- Acrescente a chave que falta. A validação reporta todos os problemas de uma vez, então uma execução mostra todos eles.
'structure.directories' must be a list. / 'structure.directories' cannot be empty.
saída: 1
- Significado
- directories está presente mas não é uma lista YAML não vazia. Uma causa comum é escrevê-la como um mapping aninhado.
- O que verificar
- Se cada diretório é um item de lista sob directories:, e não uma chave indentada.
- Próximo passo
- Converta mappings aninhados em uma lista plana. Sintaxe de mapping aninhado não é suportada.
Directory '/data' cannot be an absolute path.
saída: 1
- Significado
- As entradas precisam ser relativas. Uma especificação não pode alcançar fora do workspace.
- O que verificar
- Barras iniciais e letras de unidade do Windows, como C:\data.
- Próximo passo
- Expresse o caminho relativo a structure.name.
Directory '../up' cannot contain path traversal ('..').
saída: 1
- Significado
- A travessia é rejeitada, pelo mesmo motivo de contenção.
- O que verificar
- Qualquer segmento .. em qualquer ponto da entrada.
- Próximo passo
- Se o diretório realmente pertence a outro lugar, ele pertence a outra especificação.
Duplicate directory paths are not allowed.
saída: 1
- Significado
- Duas entradas normalizam para o mesmo caminho. Elas não precisam parecer idênticas — a e ./a colidem, assim como docs e docs/.
- O que verificar
- Entradas que diferem apenas por um prefixo ./, uma barra final ou o estilo de separador.
- Próximo passo
- Remova uma delas.
Directory name 'a:b' contains invalid character ':'.
saída: 1
- Significado
- Os caracteres < > : " \ | ? * são rejeitados em entradas de diretório. Barras são permitidas.
- O que verificar
- Dois-pontos em especial, que o YAML também trata de forma especial.
- Próximo passo
- Renomeie o diretório.
Planejamento, aplicação e verificação
Drift detected — Current YAML fingerprint differs from .orv.lock.
saída: 3
- Significado
- O apply é bloqueado por desvio. A especificação mudou desde que o lock file foi escrito, então o apply se recusa a rodar. Nada foi modificado.
- O que verificar
- Se a mudança na especificação é intencional. Note que desvio aqui significa que o arquivo mudou, não o sistema de arquivos — editar version, style, structure.name ou a lista de diretórios altera o fingerprint.
- Próximo passo
- Se a mudança é intencional, apague .orv.lock e aplique de novo; o apply cria o que a mudança acrescentou, mantém tudo o que já estava lá, e um novo lock é escrito. Remover o lock aceita todas as edições do arquivo de uma vez, então leia a especificação antes. Para pré-visualizar sem mexer no bloqueio, use apply --dry-run.
O plan imprime '? undeclared build/' e uma contagem Undeclared diferente de zero.
saída: 0
- Significado
- O plan encontrou um diretório que a especificação não declara. Ele está reportando, não agendando: o apply não tem caminho de exclusão e não vai removê-lo.
- O que verificar
- Se o diretório deveria ser declarado. Saídas de build, ambientes virtuais e diretórios temporários costumam aparecer aqui.
- Próximo passo
- Acrescente-o a directories se ele pertence à estrutura, ou deixe como está — é seguro dos dois jeitos. Nada o remove.
Um diretório adicionado à especificação não foi criado pelo apply.
saída: 3
- Significado
- O apply faz crescer uma estrutura existente, então um diretório recém-declarado é criado normalmente. O que o impede é o bloqueio por desvio: editar a especificação mudou o fingerprint dela, então o apply saiu com 3 sem tocar em nada. O plan continua reportando '+ create' para a entrada porque o plan é somente leitura e não é bloqueado.
- O que verificar
- Se o apply imprimiu 'Drift detected' e saiu com 3, em vez de reportar a estrutura como conforme.
- Próximo passo
- Se a mudança é intencional, apague .orv.lock e aplique de novo. O apply então cria o novo diretório, mantém tudo o que já estava lá e escreve um novo lock. Builds anteriores do Alpha não conseguiam fazer isso — o apply saía com 2 e 'Existing structure is INVALID' mesmo depois de o lock ser removido.
O apply sai com 2 e imprime 'Error while creating structure'.
saída: 2
- Significado
- Um arquivo já ocupa um caminho que a especificação declara como diretório — seja uma entrada declarada, seja um intermediário implicado por uma entrada aninhada. O apply verifica isso antes de tocar o disco, então nada foi criado: nenhuma árvore parcial fica para trás.
- O que verificar
- Os caminhos listados sob 'A file already occupies a path the specification declares as a directory'. Cada um é um arquivo parado onde um diretório é declarado.
- Próximo passo
- Renomeie ou mova o arquivo e aplique de novo. O apply nunca o abre, sobrescreve ou remove — seu arquivo fica byte a byte como estava.
O doctor reporta CRITICAL com diretórios órfãos depois de um apply bem-sucedido.
saída: 0 · 2 com --strict
- Significado
- O workspace contém diretórios que a especificação não declara. Diretórios intermediários criados para uma entrada aninhada não contam aqui — eles fazem parte da estrutura declarada.
- O que verificar
- A lista orphan_directories sob doctor --json. Saídas de build e diretórios temporários são a causa usual.
- Próximo passo
- Declare-os se pertencem à estrutura, ou aceite o relato: nada os remove.
O verify imprime Status: INVALID e sai com 2.
saída: 2
- Significado
- Um diretório declarado — ou um implicado por uma entrada aninhada — está faltando no workspace. Um arquivo comum parado em um caminho declarado também conta como faltante: um diretório declarado só é satisfeito por um diretório. O verify é uma checagem somente leitura e não alterou nada.
- O que verificar
- A lista de diretórios faltantes impressa abaixo da linha de status.
- Próximo passo
- Aplique a estrutura, ou corrija a especificação se o diretório não deveria ser declarado. O código de saída do verify pode ser usado diretamente como portão de pipeline.
O status reporta Lock file: NOT FOUND depois do apply.
saída: 2
- Significado
- Um apply bem-sucedido registra o lock, tenha ele criado a estrutura, feito-a crescer ou encontrado tudo já conforme. NOT FOUND depois de aplicar significa, portanto, que o apply nunca chegou a esse ponto.
- O que verificar
- Se a execução foi um --dry-run, ou se o apply foi bloqueado pelo desvio ou falhou. Nenhum desses casos escreve lock.
- Próximo passo
- Rode o apply sem --dry-run e confirme que ele sai com 0; o lock é escrito na mesma execução.
O policy reporta uma violação, mas o comando ainda assim termina com sucesso.
saída: 0
- Significado
- O comando policy apenas reporta por padrão: ele imprime a violação e sai com 0, de modo que adicionar um bloco policy não pode quebrar um pipeline que estava verde no dia anterior. O --strict é a opção que transforma o mesmo achado em saída 2.
- O que verificar
- A lista de violações impressa, que dá cada caminho relativo à raiz da estrutura.
- Próximo passo
- Aceite o relato, ou passe --strict para usá-lo como portão. doctor --strict, status e verify também saem com 2 diante de um problema estrutural.
UnicodeEncodeError: 'charmap' codec can't encode character
saída: 5
- Significado
- Um console do Windows usando uma code page legada não consegue renderizar os glifos de status que a CLI imprime.
- O que verificar
- Se o terminal está rodando em uma codificação diferente de UTF-8.
- Próximo passo
- Defina PYTHONIOENCODING=utf-8 no ambiente, ou rode o comando em um terminal UTF-8.
Se nada disso corresponder
Confirme primeiro a especificação com orvienm validate .orvienm.yaml, e então inspecione o workspace com orvienm doctor .orvienm.yaml --json, que reporta a raiz, os diretórios faltantes, os diretórios não declarados, a presença do lock e o estado do fingerprint em um único objeto.
A Referência da especificação lista cada chave e regra aceitas, e a Referência da CLI dá o comportamento exato e os códigos de saída de cada comando.