Quick answer: O DeepSeek Harness traz um documento curto de padrões defensivos, cada um escrito como regra geral acompanhada do bug específico que a motivou. É o arquivo mais transferível do repositório: nada ali...

Sete padrões defensivos da documentação do DeepSeek Harness

Updated August 16, 2026 · first published August 16, 2026

O DeepSeek Harness traz um documento curto de padrões defensivos, cada um escrito como regra geral acompanhada do bug específico que a motivou. É o arquivo mais transferível do repositório: nada ali depende de adotar o harness, e cada item corresponde a um modo de falha que aparece em runtimes de agente caseiros.

1. Relate resultados ortogonais de forma independente

Nunca aninhe o relato de uma flag dentro do condicional de outra. Um processo pode estourar o tempo e sair com zero, porque capturou o sinal e desligou limpo. Se o timeout só é relatado dentro do ramo de saída diferente de zero, esse desfecho some. Timeout, sinal e código de saída são fatos independentes e precisam de campos independentes.

Relevância de custo: timeouts engolidos em silêncio são como surgem os laços de retentativa. O chamador vê sucesso, não obtém nada útil e tenta de novo.

2. Honre os contratos públicos dos dois lados

Quando um desfecho tem várias representações válidas, normalize-as antes de expô-las. O exemplo trabalhado são as falhas de requisição ao modelo: implementações podem lançar ou emitir um chunk de finalização com erro, e a fronteira da API normaliza tudo para um chunk terminal. Sem isso, um chamador que captura uma exceção não sabe se ela veio do provedor, do middleware, do logging ou do próprio código.

3. Estado assíncrono não é estado síncrono

Consultas de status não são causalmente ligadas a operações assíncronas específicas. Esperar o estado idle de um agente como sinal de conclusão de uma mensagem é errado, porque múltiplas operações na fila compartilham intervalos de execução — o idle pode chegar antes da sua rodar, ou depois da de outro.

A correção prescrita: um chamador de automação dono de uma execução define seu intervalo explicitamente, do recebimento na caixa até o próximo idle do agente inteiro, e atribui saídas a esse intervalo em vez de a mensagens isoladas. Trate também o ramo de nada-a-esperar, ou o chamador trava indefinidamente.

Um harness de automação que trava esperando o sinal de idle errado mantém uma sessão e seus filhos residentes. A conta disso não é o travamento: é tudo que segue vivo por trás.

4. O dispose deve alcançar a quiescência, não apenas pedi-la

Pedir a terminação não é alcançá-la. O dispose aguarda a terminação real dos filhos antes de retornar. E os registros de ouvintes fecham antes do envio dos sinais de kill, para que finalizações tardias aterrissem em silêncio em vez de disparar callbacks num sistema meio desmontado.

É o padrão com a borda financeira mais clara. Um dispose que retorna cedo deixa subprocessos órfãos e sandboxes não fechadas rodando, e computação medida não para porque o pai esqueceu dela.

5. Contenha exceções de callback no despachante

Envolva os laços de despacho em try/catch. Um assinante que falha não pode rejeitar a promessa de despacho nem matar de fome os ouvintes enfileirados atrás. Num runtime de agentes, o ouvinte faminto costuma ser justamente o que faz a contabilidade, e é assim que registros de uso somem sem nenhum erro aflorar.

6. Nunca entregue a saída não confiável o ambiente ambiente ou caminhos previsíveis

A regra mais forte do documento e a primeira a adotar. Limpe o ambiente dos comandos lançados: remova variáveis que casem com key, secret, token e password antes de o subprocesso iniciar. Use diretórios privados criados com permissões só do dono, nomes de arquivo aleatórios e aberturas exclusivas em vez de caminhos previsíveis.

São duas ameaças distintas. A limpeza de ambiente impede que credenciais do harness vazem na saída do subprocesso que o modelo depois lê — e, uma vez lida, essa saída está no log de sessão e na janela de contexto. Nomes aleatórios e criação exclusiva fecham corridas de symlink em diretórios temporários compartilhados.

7. Desfaça o vínculo de caminhos em forma de link

Verifique se um caminho é um link simbólico antes de removê-lo, e apague o link em vez de segui-lo. Remoção recursiva fica reservada a diretórios reais confirmados, porque pode atravessar symlinks até seus alvos e lança em junctions. Código de limpeza que apaga mais do que criou é um modo de falha sem teto de dano.

Como usar esta lista

  1. Leve hoje os padrões 1 e 4 ao seu código de desmontagem de subprocessos e sandboxes. É ali que o dinheiro vaza.
  2. Leve o padrão 6 a qualquer lugar onde você lança um processo cuja saída o modelo vai ler.
  3. Leve o padrão 3 à sua camada de automação, sobretudo onde uma espera é expressa como "até o agente ficar idle".
  4. Leve o padrão 5 ao seu pipeline de telemetria e confira que um ouvinte falho não consegue matar de fome o da contabilidade.

Related


Want this applied to your own LLM spend? FinOps LLM runs a free audit of your AI costs and shows where the savings are. Book free audit →

Back to research