Skip to content

Enriquecer a Central com Herdr, forjas e Taiga e publicar pelo orq daemon orq #4 - #3

Merged
cedric-lamalle merged 2 commits into
mainfrom
TG-4
Oct 11, 2026
Merged

cedric-lamalle merged 2 commits into
mainfrom
TG-4

Conversation

@cedric-lamalle

Copy link
Copy Markdown
Member

US #4 — Enriquecedores e daemon

Story: https://agile.basis.com.br/project/orq/us/4

Estado vivo na Central e o daemon que o publica.

  • Enriquecedores (internal/enriquecer) com cache no SQLite (migration 0002_enriquecimento.sql: cache, suspensao, token_publicado) e TTL por fonte:
    • Herdr a cada tick (5 s) via herdr api snapshot (session.snapshot: os registros de agent list mais panes sem agente e tokens de pane/workspace numa chamada só). Pane que sumiu = ausente.
    • MR (TTL 60 s): glab api --hostname <host> projects/<path%2F>/merge_requests/<iid> e gh api repos/<o>/<r>/pulls/<n>, normalizado para draft|aberta|pronta|mesclada|fechada. Mudança de estado vai para mr.estado e gera evento no diário.
    • Taiga (TTL 5 min): taiga story get --output json → título, status, url.
    • Falha fica no cache com código (binario_ausente, autenticacao, nao_encontrado, tempo_esgotado, falha_comando, resposta_invalida), e o snapshot mostra o último valor bom junto com o erro. Erro de autenticação suspende a ferramenta por 30 min (ou até --forcar), sem login.
    • Ferramentas por caminho absoluto: ORQ_<X>_BIN, $HERDR_BIN_PATH, diretórios conhecidos; o PATH nunca entra.
  • Snapshot com campos novos, ainda versao: 1 (tudo aditivo; estado da MR já estava declarado): herdr no coordenador e na US, taiga na US, atualizado_em/erro na MR e fontes na raiz. docs/snapshot.md atualizado.
  • orq atualizar [--fonte herdr|mr|taiga] [--forcar]: atualização única, que também confere os tokens.
  • orq daemon: um por diretório de estado (flock em daemon.lock; o segundo sai com daemon_ativo, exit 4), em primeiro plano. Tick do Herdr, TTLs remotos e events.subscribe no socket do Herdr (pane.agent_status_changed dos panes das ondas abertas mais o ciclo de vida de pane). Em events_lost, reassina e reconcilia. Sai limpo com SIGTERM/SIGINT e limpa os tokens.
  • Tokens de sidebar (--source orq): orq no pane do coordenador (⚠ 1 Wait·2 Exec·1 Rev·1 pend, até 80 caracteres) e mrs_prontas no workspace (!32 skills#29, com +N quando não cabe). Conferidos a cada tick contra os tokens que o Herdr devolve; republicados quando somem e limpos quando deixam de valer. Só vão para pane/workspace que existe.

Testes

gofmt -l . vazio, go vet ./... e go test -race ./... verdes. Binários falsos de herdr/glab/gh/taiga (scripts em diretório temporário, apontados por ORQ_*_BIN, que capturam o argv) cobrem a normalização de MR, TTL e cache, o erro que preserva o valor bom, a suspensão por autenticação, o pane ausente, a publicação/conferência/limpeza de tokens, o resumo ≤ 80 e o daemon único. Um servidor NDJSON falso cobre assinatura, evento, recusa e events_lost → reassinatura e reconciliação no daemon.

Validação ao vivo no relatório da rodada: o daemon rodou com env -i (PATH mínimo) contra o Herdr real; publicou o token, republicou 5 s depois de limpo à mão e, por evento, ~0,3 s depois de blocked; marcou orq#1 e skills#29 como mesclada, trouxe a US orq/4 do Taiga e limpou o token ao receber SIGTERM.

@cedric-lamalle

Copy link
Copy Markdown
Member Author

Revisão adversarial r1 da US orq #4 no SHA 28d8e6746bd255f0e7acdfc4b7a354c4ee6765f6: com achados. CI run 38148955161 conferido no mesmo SHA, success; build, vet, go test -race -count=1 ./... e gofmt passaram localmente.

Sério — propriedade dos tokens, internal/enriquecer/tokens.go:216, :226, :249: quando um token de outra fonte já contém o valor desejado, o orq não publica nada, mas o registra em token_publicado; ao encerrar a onda, apaga esse token. Executado no Herdr 0.9.3 em pane próprio: orquestrador publicou orq=1 Wait; o refresh retornou publicados=[], mas marcou a chave; depois de encerrar a onda, retornou a chave em limpos e o Herdr ficou sem o token. Reprodução com Herdr falso confirmou a mesma sequência para workspace/mrs_prontas. --source orq não protege a limpeza: os tokens são por nome. Ocorre na coexistência prevista entre a Central e os coordenadores que publicam mrs_prontas manualmente; w1/colaboradados já tem essa chave, embora não tenha sido constatado seu registro atual no banco orq. Esperado: preservar tokens de outras fontes e definir propriedade para os dois publicadores. A limpeza ao sair também não verifica o valor/origem atuais.

Menor — force após auth, internal/enriquecer/enriquecedor.go:197: com três US e --forcar, um novo session_expired suspende no banco, mas não impede as duas chamadas seguintes. Reprodução com CLI falsa: consultadas=3, suspensas=0, três recusas. O force deveria liberar uma tentativa após a suspensão anterior e respeitar uma nova recusa. Limitado ao refresh manual; o daemon normal respeita a suspensão.

Menor — códigos de credencial, internal/enriquecer/fontes.go:249: keyring_unavailable (erro real do contrato da taiga-cli, exit 3) vira falha_comando; três US produzem três chamadas sem suspensão. A classificação só reconhece auth_*/session_*. Falha simulada; não observada na sessão real desta revisão.

O que tentei e não quebrou: cinco MRs reais GitLab/GitHub deram estados corretos (mesclada/pronta/draft/conflito); SQLite travado por 17 s gerou banco_ocupado e o daemon sobreviveu; socket falso cobriu events_lost, queda e reconexão; daemon único recusou o segundo processo; SIGTERM encerrou com limpeza; subprocesso sem resposta virou tempo_esgotado em 30 s. O ensaio curto de recursos não prova estabilidade por dias.

Relatório completo e evidências: /home/cedric/tmp/orquestrador/orq/TG-4/revisao/r1/relatorio.md. Worktree preservada; pane e processos de teste encerrados. Sem aprovação, merge ou alteração de story/Draft, conforme as autorizações do pacote.

@cedric-lamalle

Copy link
Copy Markdown
Member Author

Revisão adversarial r2 da US orq #4 no SHA 7708b7735a874e89ab0568985ec0182213815ff6: aprovada, com um Menor que não abre rodada. CI 38149812808 conferido no mesmo SHA, success. Build, vet, go test -race -count=1 ./... e gofmt passaram localmente.

Confirmei pessoalmente as três correções da r1:

  • LIVE em pane próprio: token alheio idêntico não é adotado nem apagado ao encerrar a onda. A publicação de workspace passou a orq_mrs; mrs_prontas não é tocado.
  • Force com três US e novo session_expired: uma consulta, duas suspensas.
  • keyring_unavailable/exit 3: uma consulta, código autenticacao, duas suspensas.

Aceito a decisão extra de não sobrescrever valor alheio: os nomes próprios evitam a colisão com a skill manual. Testei ao vivo a preservação, a retomada quando a chave fica vazia, a atualização do token próprio e a republicação quando desaparece. SIGTERM preservou um valor escrito por outra fonte imediatamente antes de encerrar, e limpou o próprio em outro ensaio. Com Herdr falso, publicação recusada não registrou propriedade; limpeza recusada manteve o registro e a segunda tentativa funcionou.

Menor no delta: internal/cli/daemon.go:86/:101 não exibe o novo ResultadoTokens.Avisos no formato texto. No mesmo estado com orq=1 Wait alheio e resumo desejado 1 Exec, JSON mostra o aviso, mas --output text imprime apenas herdr consultadas 1 ... erros 0, exit 0. JSON e log do daemon continuam mostrando o conflito, e o token é preservado; não bloqueia a revisão.

Relatório e evidências: /home/cedric/tmp/orquestrador/orq/TG-4/revisao/r2/relatorio.md. Worktree preservada, pane próprio fechado e processos/estados de teste limpos. Sem aprovação formal do PR, merge ou alteração de story/Draft.

@cedric-lamalle
cedric-lamalle merged commit 77e56c8 into main Oct 11, 2026
1 check passed
@cedric-lamalle
cedric-lamalle deleted the TG-4 branch October 11, 2026 16:17
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant