Pular para conteúdo

AUR-532 — Ciclo de realimentação melhora a política a partir do uso real

Medido antes (por leitura)

  • Não havia pacote nem comando de realimentação. Os dados já existiam: o review publica a auditoria (aurumcode-audit-<pr>, AUR-521) e o SARIF como artefatos do workflow; alertas de code scanning ficam no GitHub com o motivo da dispensa; exceções e skills vivem no repositório da política.
  • O corpus do AUR-523 (tests/benchmark) mede recall, precisão e "aprovado com defeito" e grava out/multilang-report.json com -update-aur523; o pacote é só leitura para este card.
  • selectProvider() já resolve o modelo (inclusive AURUMCODE_LLM_FIXTURE).

Decisão

  • internal/feedback (arquivo por responsabilidade): signal.go (sinal, id estável de tipo+repo+id da fonte, redação de todo texto na construção), alerts.go (só false positive vira falso positivo; won't fix e used in tests não são sinal), audit.go (achado bloqueante que some entre auditorias consecutivas da mesma PR, com a linha reescrita pelo diff compare, vira verdadeiro positivo), lost.go (/aurum perdeu [<sha>] <descrição> só de OWNER/MEMBER/COLLABORATOR; sem SHA vale o head da PR; issue sem SHA é recusada; caso candidato por sinal), ledger.go (estado em realimentacao/sinais.json no repositório da política), propose.go (modelo agrupa; JSON estrito; descarta proposta sem sinal, com sinal desconhecido ou skill não declarada), skills.go (substitui ou acrescenta a seção ## <secao>), measure.go (antes/depois; "não medido" explícito; regressão destacada), plan.go (arquivos e corpo da PR), github.go, source_github.go, publish.go (REST mínimo; URL absoluta só no host da API, para o token não sair), run.go (orquestração).
  • PR única: branch fixa aurum/realimentacao; com PR aberta, a rodada grava na mesma branch e atualiza o corpo (PATCH), nunca abre outra. Sem sinal novo (registro da base e da branch), nada é gravado.
  • Escrita pela API de conteúdo com o token do workflow; nenhuma identidade git é configurada ou inventada. Leitura com AURUMCODE_SIGNALS_TOKEN, escrita com GITHUB_TOKEN.
  • Medição (AC-005): --medir compara dois relatórios do AUR-523; o workflow reutilizável realimentacao-medicao.yml roda o harness na base e na PR do repositório da política (corpus em corpus/cases, política em .aurumcode/), comenta a tabela e falha em regressão ou lado não medido.
  • cmd/aurumcode/cmd_feedback.go: subcomando realimentacao no registro AUR-572.

Fora dos paths do card (necessário ao Outcome)

docs/index.md (link da seção nova, regra do AUR-560), docs/architecture.md (linha de internal/feedback, exigida por TestAUR558ArchitectureDoc...), CHANGELOG.md (entrada em Unreleased, exigida pelo AUR-509), scripts/ci/realimentacao.sh e scripts/ci/realimentacao-medir.sh (semgrep proíbe sh -c em workflow), cmd/aurumcode/aur572_test.go (lista de comandos).

Varredura de documentação desatualizada

grep -ri "realimenta\|feedback\|perdeu" em docs/, README.md, demo/tutoriais, docs/tutorials: nenhuma menção anterior a corrigir.

Como cada cenário é provado

  • AC-001: TestAUR532AC001DismissedFalsePositiveIsASignal.
  • AC-002: TestAUR532AC002FixedFindingIsATruePositive.
  • AC-003: TestAUR532AC003LostCommandIsAnEscapedDefect.
  • AC-004: TestAUR532AC004ProposalWithoutSignalIsDiscarded e TestAUR532AC004AC006SinglePullRequestAndIdempotentRerun (GitHub fake em httptest: uma PR; rodada nova com sinal novo atualiza a mesma PR).
  • AC-005: TestAUR532AC005MeasurementHighlightsRegression e TestAUR532AC005MeasureCommand.
  • AC-006: TestAUR532AC006RerunWithoutNewSignalsPlansNothing e o teste ponta a ponta (segunda rodada: zero gravações, zero PR).
  • AC-007: TestAUR532AC007SignalsAreRedacted (canário registrado e canário com forma de token, ambos montados em tempo de execução, ausentes do prompt, do corpo e dos arquivos da PR).
  • MUT-001: tests/acceptance/AUR-532.sh MUT-001 grava o falso positivo como verdadeiro positivo; AC-001 fica vermelho.

Limites

  • Exceção aprovada (citada no Outcome) não virou sinal nesta entrega: o registro de exceções aplicadas está na auditoria, mas sem marca temporal de aprovação; fica para um card seguinte.
  • A medição depende de o repositório da política manter o corpus no layout do AUR-523 e de o harness aceitar esse corpus (as asserções de TestAUR523ReportPerLanguage, como ≥ 6 linguagens, valem para ele).
  • Artefatos expirados (retenção do GitHub) deixam de produzir sinais de verdadeiro positivo; a coleta é limitada em páginas e artefatos por rodada.
  • Ao atualizar uma PR aberta, o corpo passa a descrever a rodada atual; as anteriores ficam nos commits da branch.
  • Revisão estática do coordenador (2026-10-07): PR fechada (rejeitada) tem os sinais lidos do registro no head dela e não é reproposta; sem PR aberta a branch é recriada da base; POLICY_TOKEN opcional abre a PR com outra identidade (dispara pull_request); sem ele, a medição é disparada por workflow_dispatch (o único evento que o github.token dispara) e a org precisa permitir que o Actions abra PRs. A medição usa o provedor falso do AUR-523 e a tabela e o corpo da PR dizem isso. Pulls pagina pelo list (Link next), como todas as listagens.