# Reading Reply

Abre o formulário de leitura de KPI a partir do digest no Slack, salva a Observation com evidência e redesenha o checklist.

| Platform | Workflow ID | Status | Version | Last saved | Nodes | Systems |
| --- | --- | --- | --- | --- | --- | --- |
| n8n | wp6F0Xo5M8Nc0YfF | Active | 5a45f2f8-9869-440e-a6ee-361409aa90bf | 2026-11-06T19:40:38.652Z | 50 | KPIs & OKRs, Tooling and Access |

O Reading Reply trata o que uma pessoa faz com um pedido de leitura de KPI no Slack. O [Daily Digest](/pt-br/automations/daily-digest) publica um checklist de leituras. Quando alguém marca um item, o Reading Reply abre um formulário, salva valor, nota e evidência como uma Observation no KPIs & OKRs e reescreve o checklist para o item aparecer como gravado. Fechar o formulário, ou um clique que ele não consegue ler, só atualiza o checklist.

O maintainer do KPIs & OKRs cuida das programações e das Observations gravadas; o maintainer do Tooling and Access cuida das contas de bot do Slack de onde o workflow pega o token.

## Fluxo

Gerado da versão do n8n do quadro acima: cada caixa é um nó e cada seta é uma ligação no n8n. Pílulas rosa são gatilhos, hexágonos amarelos são nós If e Switch com as saídas nas setas, cilindros azuis leem (Airtable, Data Table, HTTP GET), cilindros verdes gravam, caixas roxas chamam outro workflow e setas tracejadas são saídas de erro.

```mermaid
flowchart TD
  subgraph g0["Receber e conferir"]
    n40(["Slack Interaction"]):::trigger
    n10["Config"]:::logic
    n31["Parse Payload"]:::logic
    n47{{"Valid Interaction"}}:::decision
    n1["Ack Reply"]:::logic
    n0["Ack Error"]:::logic
  end
  subgraph g1["Token do Slack"]
    n17["Get Cached Bot<br/><small>Slack — Workspace Token Cache</small>"]:::subflow
    n36["Resolve Slack Account"]:::logic
    n42{{"Token Available?"}}:::decision
    n35["Refresh Workspace in Background<br/><small>Slack — Workspace Token Cache</small>"]:::subflow
    n5{{"Can Reply to Interaction?"}}:::decision
    n37[("Restore Task Selection<br/><small>POST Slack response URL</small>")]:::write
    n28[("Notify Retry<br/><small>POST Slack response URL</small>")]:::write
  end
  subgraph g2["Rota"]
    n29{{"Open Form First"}}:::decision
    n43{{"Trigger Still Fresh?"}}:::decision
    n30[("Open Loading Modal<br/><small>POST Slack views.open</small>")]:::write
    n26["Modal Opened"]:::logic
    n2["Airtable Schema"]:::logic
    n41{{"Switch Route"}}:::decision
  end
  subgraph g3["Abrir o formulário"]
    n20[("Get Schedule<br/><small>GET KPIs Recurrence Configuration</small>")]:::read
    n16[("Find Previous Reading<br/><small>GET KPIs Observation</small>")]:::read
    n3["Build Modal"]:::logic
    n45[("Update Modal<br/><small>POST Slack views.update</small>")]:::write
    n7["Check Modal Update"]:::logic
  end
  subgraph g4["Gravar a leitura"]
    n21[("Get Submitted Schedule<br/><small>GET KPIs Recurrence Configuration</small>")]:::read
    n15[("Find Existing<br/><small>GET KPIs Observation</small>")]:::read
    n33["Prepare Observation"]:::logic
    n38[("Save Observation<br/><small>PATCH KPIs Observation</small>")]:::write
    n39["Saved Observation"]:::logic
    n22{{"Has New Files"}}:::decision
    n24["List Evidence Files"]:::logic
    n18[("Get Evidence Info<br/><small>GET Slack files.info</small>")]:::read
    n48["Validate Evidence"]:::logic
    n11[("Download Evidence<br/><small>GET Slack file download</small>")]:::read
    n12["Encode Evidence"]:::logic
    n46[("Upload Evidence<br/><small>POST KPIs Observation · Evidence Files°</small>")]:::write
    n13["Evidence Uploaded"]:::logic
    n32["Prepare Completion"]:::logic
    n9[("Complete Observation<br/><small>PATCH KPIs Observation</small>")]:::write
  end
  subgraph g5["Atualizar a mensagem do digest"]
    n14[("Fetch Digest Message<br/><small>GET Slack conversations.history</small>")]:::read
    n34["Reading Keys"]:::logic
    n19[("Get Recorded Readings<br/><small>GET KPIs Observation</small>")]:::read
    n4["Build Updated Blocks"]:::logic
    n44[("Update Digest Message<br/><small>POST Slack chat.update</small>")]:::write
    n8["Check Slack Update"]:::logic
  end
  subgraph g6["Falha"]
    n6["Capture Failure"]:::logic
    n23{{"Has Saved Record"}}:::decision
    n25[("Mark Failed<br/><small>PATCH KPIs Observation</small>")]:::write
    n27[("Notify Failure<br/><small>POST Slack chat.postEphemeral</small>")]:::write
  end
  n30 --> n26
  n30 -.->|erro| n6
  n20 --> n16
  n20 -.->|erro| n6
  n16 --> n3
  n16 -.->|erro| n6
  n45 --> n7
  n45 -.->|erro| n6
  n21 --> n15
  n21 -.->|erro| n6
  n15 --> n33
  n15 -.->|erro| n6
  n38 --> n39
  n38 -.->|erro| n6
  n18 --> n48
  n18 -.->|erro| n6
  n11 --> n12
  n11 -.->|erro| n6
  n46 --> n13
  n46 -.->|erro| n6
  n9 --> n14
  n9 -.->|erro| n6
  n14 --> n34
  n14 -.->|erro| n6
  n19 --> n4
  n19 -.->|erro| n6
  n44 --> n8
  n44 -.->|erro| n6
  n36 --> n42
  n36 -.->|erro| n35
  n26 --> n2
  n26 -.->|erro| n6
  n3 --> n45
  n3 -.->|erro| n6
  n7 --> n14
  n7 -.->|erro| n6
  n33 --> n38
  n33 -.->|erro| n6
  n39 --> n22
  n39 -.->|erro| n6
  n24 --> n18
  n24 -.->|erro| n6
  n48 --> n11
  n48 -.->|erro| n6
  n12 --> n46
  n12 -.->|erro| n6
  n13 --> n32
  n13 -.->|erro| n6
  n32 --> n9
  n32 -.->|erro| n6
  n34 --> n19
  n34 -.->|erro| n6
  n4 --> n44
  n4 -.->|erro| n6
  n8 -.->|erro| n6
  n40 --> n10
  n10 --> n31
  n31 --> n47
  n47 -->|sim| n1
  n47 -->|não| n0
  n1 --> n17
  n2 --> n41
  n6 --> n23
  n25 --> n27
  n41 -->|open| n20
  n41 -->|record| n21
  n41 -->|refresh| n14
  n22 -->|sim| n24
  n22 -->|não| n32
  n23 -->|sim| n25
  n23 -->|não| n27
  n29 -->|sim| n43
  n29 -->|não| n2
  n17 --> n36
  n17 -.->|erro| n35
  n42 -->|sim| n29
  n42 -->|não| n35
  n43 -->|sim| n30
  n43 -->|não| n5
  n35 --> n5
  n5 -->|sim| n37
  n37 --> n28
  classDef trigger fill:#fde7f3,stroke:#d6409f,color:#111
  classDef decision fill:#fff7e0,stroke:#c99a00,color:#111
  classDef read fill:#e8f1ff,stroke:#3b82f6,color:#111
  classDef write fill:#e7f8ee,stroke:#16a34a,color:#111
  classDef subflow fill:#f3e8ff,stroke:#9333ea,color:#111
  classDef wait fill:#f1f1f1,stroke:#888,color:#111
  classDef logic fill:#ffffff,stroke:#999,color:#111
```

## Sistemas que ele toca

| Sistema | Tabela | Lê | Grava |
| --- | --- | --- | --- |
| KPIs & OKRs | Recurrence Configuration | Get Schedule, Get Submitted Schedule | Nada |
| KPIs & OKRs | Observation | Find Previous Reading, Find Existing, Get Recorded Readings | Save Observation, Upload Evidence, Complete Observation, Mark Failed |
| Tooling and Access | Tool Account, pelo [Slack — Workspace Token Cache](/pt-br/automations/workspace-token-cache) | Get Cached Bot | Nada; o Refresh Workspace in Background pede ao cache para recarregar |

As chamadas ao Airtable são nós HTTP Request com a credencial "Airtable PAT (Fully Scoped)" e leem e gravam por ID de campo. O Airtable Schema guarda o mapa de IDs de base, tabela e campo que os nós de código usam; ele também lista tabelas do Communication e do Tooling, mas nenhum nó lê ou grava nelas.

As chamadas ao Slack usam a credencial "Systems Slack Automation - Dynamic", que usa o token de bot que o Token Cache devolveu para o workspace da pessoa. O workflow chama `views.open`, `views.update`, `conversations.history`, `chat.update`, `chat.postEphemeral` e `files.info`, baixa os arquivos de evidência e posta na response URL da interação.

## Gatilho e assinatura

O Slack Interaction aceita um POST da URL de interatividade do app do Slack e guarda o body cru. Ele só responde pelo Ack Reply ou pelo Ack Error, então o Slack recebe a resposta depois que o Parse Payload conferiu a requisição e antes de qualquer chamada ao Airtable.

O Config define os valores que o resto do workflow lê:

| Campo do Config | Valor | Usado para |
| --- | --- | --- |
| slackSigningSecret | O signing secret do app do Slack | Conferir a assinatura |
| timezone | America/Chicago | O horário mostrado ao lado de um item gravado |
| confirmInThread | false | Nenhum nó usa |
| requireEvidence | false | Se o campo de evidência é obrigatório |
| allowDecimalValue | false | Se a quantidade aceita decimais |
| maxUploadBytes | 5000000 | Maior arquivo de evidência aceito no formulário |
| testSlackUserId | Um único ID de usuário do Slack | Enquanto preenchido, só esse usuário é aceito |

O Parse Payload recusa a requisição com uma mensagem, que o Ack Error devolve ao Slack, quando:

- o body falta, o header `x-slack-request-timestamp` falta ou tem 300 segundos ou mais, ou o HMAC-SHA256 do `x-slack-signature` não bate (comparação em tempo constante);
- o payload não pode ser decodificado;
- `testSlackUserId` está preenchido e a pessoa é outra ("Collection is being tested; please try again later");
- o item é de outra pessoa, o ID do workspace não é um team ID do Slack, ou a programação, a membership ou o período do item têm formato errado;
- o canal ou a mensagem original são desconhecidos.

Numa submissão de formulário, o Ack Error mostra o erro no campo de quantidade ou de evidência.

### O que o Parse Payload lê da interação

| Interação | Rota | Item vem de |
| --- | --- | --- |
| Clique em checkbox (`reading_reply` ou `checkboxes-action`) que muda exatamente um item | open | O valor da opção alterada: registro da programação, período, registro da membership e usuário do Slack |
| Clique em checkbox que muda nenhum ou vários itens | refresh | Nada; o checklist é redesenhado |
| Botão com os mesmos action IDs | open | O JSON no valor do botão |
| Submissão do formulário (`task_quantity`) | record | O private metadata do formulário, mais quantidade, nota e arquivos |
| Formulário fechado | refresh | O private metadata do formulário |
| Qualquer outra coisa | Recusada | "Unsupported interaction" |

A quantidade precisa ser um número não negativo (inteiro enquanto `allowDecimalValue` é false). Até quatro arquivos, cada um com no máximo `maxUploadBytes`. O Occurrence Key de um item é `<registro da programação>:<período>` e o Submission Key é `<registro da programação>:<período>|<registro da membership>`.

## Token do Slack

Depois do Ack Reply, o Get Cached Bot chama o [Slack — Workspace Token Cache](/pt-br/automations/workspace-token-cache) com o ID do workspace. Na rota open ele pede só o token em cache; em record e refresh deixa o cache carregar do Tooling quando preciso. O Resolve Slack Account só aceita a resposta quando é do mesmo workspace, tem token e não expira no próximo segundo.

Sem token utilizável, o Refresh Workspace in Background pede ao cache para recarregar este workspace e não espera. Quando o Slack mandou uma response URL, o Restore Task Selection devolve o checklist como estava e o Notify Retry avisa "The form is not ready yet. Please click the task again in a few seconds. No response was recorded."

## Abrir o formulário

O Slack só aceita um formulário aberto em até três segundos depois do clique. O Trigger Still Fresh? só deixa a rota open seguir em até 2,5 segundos do clique; depois disso ela vai para a mensagem de nova tentativa acima.

1. O Open Loading Modal abre na hora um formulário "Loading reading", e o Modal Opened guarda o view ID dele.
2. O Get Schedule lê a Recurrence Configuration e o Find Previous Reading procura uma Observation com o mesmo Submission Key.
3. O Build Modal para quando o Accountable Membership* da programação não inclui a membership da pessoa. Depois monta o formulário: nome da programação, período, meta ("At least", "At most" ou "Target", a partir de Target (Value) e Target (Direction)), um campo de quantidade em Target (Unit Text), uma nota e um campo de evidência (até 4 imagens ou PDFs). Uma leitura anterior preenche quantidade e nota.
4. O Update Modal troca o formulário de carregamento, e o Check Modal Update falha quando o Slack recusa.
5. Em seguida o fluxo atualiza a mensagem do digest (abaixo), então o checkbox que a pessoa acabou de marcar volta ao estado gravado.

## Gravar a leitura

1. O Get Submitted Schedule lê a Recurrence Configuration e o Find Existing procura Observations com o Submission Key.
2. O Prepare Observation para quando:
   - a programação não é da membership;
   - mais de uma Observation tem aquele key ("Duplicate collection keys need reconciliation");
   - a existente está em Processing há menos de dois minutos;
   - a programação não tem Target (Metric).

   Depois monta o upsert com Collection Status* Processing e descobre quais arquivos são novos, comparando com Slack File IDs e com os nomes de arquivo já em Evidence Files°.
3. O Save Observation faz o upsert pelo Submission Key e o Saved Observation guarda o ID do registro.
4. Quando há arquivos novos, cada um passa por Get Evidence Info, Validate Evidence, Download Evidence, Encode Evidence e Upload Evidence. Só são aceitas URLs `files.slack.com`, de no máximo 5 MB, dos tipos png, jpg, jpeg, gif, webp ou pdf. Eles são guardados como `<ID do arquivo no Slack>__<nome>`.
5. O Prepare Completion confere que todos os arquivos novos foram enviados, e o Complete Observation põe Recorded.
6. Em seguida o fluxo atualiza a mensagem do digest.

## Atualizar a mensagem do digest

O Fetch Digest Message lê a mensagem original, e o Reading Keys lista os Submission Keys dos checkboxes dela. O Get Recorded Readings lê essas Observations, até 100.

Depois o Build Updated Blocks redesenha o checklist:
- Os itens gravados aparecem riscados, com o horário no fuso do Config.
- O cabeçalho mostra "&lt;n&gt; of &lt;total&gt; responses recorded".
- "All responses in this message are recorded." é acrescentado quando todos os itens estão feitos.

O Update Digest Message grava a mensagem de volta, e o Check Slack Update falha quando o Slack recusa.

## Caminho de falha

A partir do Open Loading Modal, toda chamada ao Airtable e ao Slack e todo nó de código, exceto o Airtable Schema, mandam seus erros para o Capture Failure. O Capture Failure guarda os primeiros 400 caracteres do erro e remove o que parece token do Slack. Ele também descobre se algum registro foi salvo:

- **Salvo mas não concluído:** o Mark Failed põe Collection Status* em Failed com o erro em Collection Error, e o Notify Failure avisa "Your reading could not be completed. Please try again."
- **Concluído, e depois a atualização da mensagem falhou:** o Notify Failure diz que a leitura foi salva mas a mensagem não pôde ser atualizada.
- **Nada salvo na rota open:** o Notify Failure diz que o formulário não pôde ser aberto e que nada foi gravado.

O Notify Failure é uma mensagem privada no canal.

## Campos gravados

### Observation

| Campo | Save Observation | Upload Evidence | Complete Observation | Mark Failed |
| --- | --- | --- | --- | --- |
| Submission Key | O Submission Key do item | Não muda | Não muda | Não muda |
| Occurrence Key | O Occurrence Key do item | Não muda | Não muda | Não muda |
| Recurrence Configuration° | A programação | Não muda | Não muda | Não muda |
| Observation About (Membership)* | A membership | Não muda | Não muda | Não muda |
| Variable Measured* | O Target (Metric) da programação | Não muda | Não muda | Não muda |
| Value* | A quantidade | Não muda | Não muda | Não muda |
| Note° | A nota | Não muda | Não muda | Não muda |
| Period* | O período | Não muda | Não muda | Não muda |
| Unit Text* | O Target (Unit Text) da programação | Não muda | Não muda | Não muda |
| Observation Date* | Agora | Não muda | Não muda | Não muda |
| Collection Status* | Processing | Não muda | Recorded | Failed |
| Collection Error | Vazio | Não muda | Vazio | O erro, no máximo 400 caracteres |
| Evidence° | O valor anterior, ou `slack:<canal>:<ts da mensagem>` | Não muda | Valor anterior, a referência da mensagem no Slack e o permalink de cada arquivo | Não muda |
| Evidence Files° | Não muda | Acrescenta cada arquivo novo | Não muda | Não muda |
| Slack File IDs | Não muda | Não muda | IDs conhecidos mais os submetidos, um por linha | Não muda |

Nenhuma gravação usa typecast, então uma opção de Collection Status* renomeada faz a gravação falhar em vez de criar opção nova.

### Recurrence Configuration (só leitura)

| Campo | Usado para |
| --- | --- |
| Name* | Título do formulário e cabeçalho |
| Accountable Membership* | Conferir o dono |
| Target (Value), Target (Direction), Target (Unit Text) | Texto da meta e rótulo da quantidade |
| Target (Metric) | Variable Measured* da Observation |

## Nós

O workflow tem 50 nós: 49 que executam e uma nota adesiva. Num nó If, a saída 0 é verdadeiro e a saída 1 é falso. Num nó com saída de erro, a saída 1 é o erro.

| Nó | Tipo | O que faz |
| --- | --- | --- |
| Slack Interaction | webhook | Recebe o POST do Slack com o body cru; a resposta sai de Ack Reply ou Ack Error |
| Config | set | Segredo de assinatura, fuso, regras de evidência e o usuário de teste |
| Parse Payload | code | Confere timestamp e assinatura, decodifica a interação, escolhe a rota |
| Valid Interaction | if | Sem erro do Parse Payload |
| Ack Reply | respondToWebhook | Responde ao Slack: limpa o formulário numa submissão, vazio nos outros casos |
| Ack Error | respondToWebhook | Responde ao Slack com o erro, no campo do formulário quando é submissão |
| Get Cached Bot | executeWorkflow | Chama o Slack — Workspace Token Cache pelo token do bot do workspace |
| Resolve Slack Account | code | Aceita o token só se é deste workspace e não está para expirar |
| Token Available? | if | Existe token de bot utilizável |
| Refresh Workspace in Background | executeWorkflow | Pede ao cache para renovar este workspace e não espera |
| Can Reply to Interaction? | if | O Slack mandou uma response URL |
| Restore Task Selection | httpRequest | Devolve o checklist como estava |
| Notify Retry | httpRequest | Pede para a pessoa clicar de novo em alguns segundos |
| Open Form First | if | A rota é open |
| Trigger Still Fresh? | if | Menos de 2,5 s desde o clique |
| Open Loading Modal | httpRequest | Abre um formulário "Loading reading" com o trigger |
| Modal Opened | code | Falha quando o Slack não abriu o formulário; guarda o view ID |
| Airtable Schema | code | Mapa fixo de IDs de base, tabela e campo |
| Switch Route | switch | Manda open, record ou refresh para o ramo certo |
| Get Schedule | httpRequest | A Recurrence Configuration do item |
| Find Previous Reading | httpRequest | Observation com o mesmo Submission Key |
| Build Modal | code | Confere o dono e monta o formulário de quantidade, nota e evidência |
| Update Modal | httpRequest | Troca o formulário de carregamento pelo real |
| Check Modal Update | code | Falha quando o Slack recusou a atualização |
| Get Submitted Schedule | httpRequest | A Recurrence Configuration da submissão |
| Find Existing | httpRequest | Observation com o mesmo Submission Key |
| Prepare Observation | code | Confere dono, duplicata e Metric; monta o upsert como Processing |
| Save Observation | httpRequest | Upsert pelo Submission Key |
| Saved Observation | code | Guarda o ID do registro salvo |
| Has New Files | if | A submissão tem arquivos ainda não guardados |
| List Evidence Files | code | Um item por arquivo novo do Slack |
| Get Evidence Info | httpRequest | Metadados do arquivo no Slack |
| Validate Evidence | code | Confere URL, tamanho e tipo |
| Download Evidence | httpRequest | Baixa o arquivo do Slack |
| Encode Evidence | code | Base64, no máximo 5 MB |
| Upload Evidence | httpRequest | Envia para Evidence Files° |
| Evidence Uploaded | code | Conta os envios |
| Prepare Completion | code | Confere que todos os arquivos chegaram; monta o patch Recorded |
| Complete Observation | httpRequest | PATCH para Recorded |
| Fetch Digest Message | httpRequest | Lê a mensagem original do Daily Digest |
| Reading Keys | code | Lista os Submission Keys daquela mensagem |
| Get Recorded Readings | httpRequest | Observations desses keys (até 100) |
| Build Updated Blocks | code | Risca os itens gravados e conta feitos de total |
| Update Digest Message | httpRequest | Reescreve a mensagem |
| Check Slack Update | code | Falha quando o Slack recusou a atualização |
| Capture Failure | code | Monta um erro curto sem tokens; acha o registro salvo |
| Has Saved Record | if | Uma Observation foi salva mas não concluída |
| Mark Failed | httpRequest | PATCH Collection Status Failed com o erro |
| Notify Failure | httpRequest | Conta à pessoa, em privado, o que aconteceu |
| Collection v5 | stickyNote | Nota de configuração no canvas; não executa |

## Ligações

| De | Saída | Para |
| --- | --- | --- |
| Slack Interaction | 0 | Config |
| Config | 0 | Parse Payload |
| Parse Payload | 0 | Valid Interaction |
| Valid Interaction | 0 | Ack Reply |
| Valid Interaction | 1 | Ack Error |
| Ack Reply | 0 | Get Cached Bot |
| Get Cached Bot | 0 | Resolve Slack Account |
| Get Cached Bot | 1 | Refresh Workspace in Background |
| Resolve Slack Account | 0 | Token Available? |
| Resolve Slack Account | 1 | Refresh Workspace in Background |
| Token Available? | 0 | Open Form First |
| Token Available? | 1 | Refresh Workspace in Background |
| Refresh Workspace in Background | 0 | Can Reply to Interaction? |
| Can Reply to Interaction? | 0 | Restore Task Selection |
| Restore Task Selection | 0 | Notify Retry |
| Open Form First | 0 | Trigger Still Fresh? |
| Open Form First | 1 | Airtable Schema |
| Trigger Still Fresh? | 0 | Open Loading Modal |
| Trigger Still Fresh? | 1 | Can Reply to Interaction? |
| Open Loading Modal | 0 | Modal Opened |
| Open Loading Modal | 1 | Capture Failure |
| Modal Opened | 0 | Airtable Schema |
| Modal Opened | 1 | Capture Failure |
| Airtable Schema | 0 | Switch Route |
| Switch Route | 0 | Get Schedule |
| Switch Route | 1 | Get Submitted Schedule |
| Switch Route | 2 | Fetch Digest Message |
| Get Schedule | 0 | Find Previous Reading |
| Get Schedule | 1 | Capture Failure |
| Find Previous Reading | 0 | Build Modal |
| Find Previous Reading | 1 | Capture Failure |
| Build Modal | 0 | Update Modal |
| Build Modal | 1 | Capture Failure |
| Update Modal | 0 | Check Modal Update |
| Update Modal | 1 | Capture Failure |
| Check Modal Update | 0 | Fetch Digest Message |
| Check Modal Update | 1 | Capture Failure |
| Get Submitted Schedule | 0 | Find Existing |
| Get Submitted Schedule | 1 | Capture Failure |
| Find Existing | 0 | Prepare Observation |
| Find Existing | 1 | Capture Failure |
| Prepare Observation | 0 | Save Observation |
| Prepare Observation | 1 | Capture Failure |
| Save Observation | 0 | Saved Observation |
| Save Observation | 1 | Capture Failure |
| Saved Observation | 0 | Has New Files |
| Saved Observation | 1 | Capture Failure |
| Has New Files | 0 | List Evidence Files |
| Has New Files | 1 | Prepare Completion |
| List Evidence Files | 0 | Get Evidence Info |
| List Evidence Files | 1 | Capture Failure |
| Get Evidence Info | 0 | Validate Evidence |
| Get Evidence Info | 1 | Capture Failure |
| Validate Evidence | 0 | Download Evidence |
| Validate Evidence | 1 | Capture Failure |
| Download Evidence | 0 | Encode Evidence |
| Download Evidence | 1 | Capture Failure |
| Encode Evidence | 0 | Upload Evidence |
| Encode Evidence | 1 | Capture Failure |
| Upload Evidence | 0 | Evidence Uploaded |
| Upload Evidence | 1 | Capture Failure |
| Evidence Uploaded | 0 | Prepare Completion |
| Evidence Uploaded | 1 | Capture Failure |
| Prepare Completion | 0 | Complete Observation |
| Prepare Completion | 1 | Capture Failure |
| Complete Observation | 0 | Fetch Digest Message |
| Complete Observation | 1 | Capture Failure |
| Fetch Digest Message | 0 | Reading Keys |
| Fetch Digest Message | 1 | Capture Failure |
| Reading Keys | 0 | Get Recorded Readings |
| Reading Keys | 1 | Capture Failure |
| Get Recorded Readings | 0 | Build Updated Blocks |
| Get Recorded Readings | 1 | Capture Failure |
| Build Updated Blocks | 0 | Update Digest Message |
| Build Updated Blocks | 1 | Capture Failure |
| Update Digest Message | 0 | Check Slack Update |
| Update Digest Message | 1 | Capture Failure |
| Check Slack Update | 1 | Capture Failure |
| Capture Failure | 0 | Has Saved Record |
| Has Saved Record | 0 | Mark Failed |
| Has Saved Record | 1 | Notify Failure |
| Mark Failed | 0 | Notify Failure |

## Configurações e tratamento de erro

| Configuração | Valor |
| --- | --- |
| Ordem de execução | v1 |
| Workflow de erro | Nenhum |
| Salvar execuções com sucesso | Não |
| Salvar execuções com falha | Não |
| Salvar execuções manuais | Não |
| Salvar progresso da execução | Não |
| Retry on fail | Desligado em todos os nós |
| On error | Saída de erro no Get Cached Bot, no Resolve Slack Account e em todos os nós a partir do Open Loading Modal, exceto o Airtable Schema e os nós If e Switch; Notify Retry, Restore Task Selection e Refresh Workspace in Background continuam no erro; os nós de recebimento param o workflow |
| Caller policy | Workflows do mesmo dono |
| Disponível no MCP | Sim |
| Timeout HTTP | 20 segundos (5 segundos nas chamadas à response URL) |

O n8n não guarda dados de execução deste workflow, então uma falha não deixa rastro no n8n: olhe Collection Status* e Collection Error na Observation. As únicas execuções salvas são falhas de uma versão anterior, de 20/10/2026.

## Lacunas conhecidas

Estas vêm da configuração dos nós; nenhuma execução da versão atual está salva no n8n.

| Lacuna | Efeito |
| --- | --- |
| `testSlackUserId` está preenchido no Config | Todas as outras pessoas recebem "Collection is being tested; please try again later" e nada é salvo |
| O signing secret do Slack fica no nó Config, não numa credencial do n8n | Quem abre o workflow consegue ler, e uma exportação do workflow o leva junto |
| Uma submissão quando não há token disponível | O Ack Reply já fechou o formulário; o Slack não manda response URL numa submissão de formulário, então a leitura se perde sem mensagem |
| Mark Failed e Notify Failure têm saídas de erro sem nada ligado | Quando marcar ou avisar falha, a execução termina em silêncio e, sem dados de execução salvos, nada registra isso |
| O Get Recorded Readings lê uma página de 100 | Um checklist com mais de 100 itens mostra o resto como não gravado |
| Find Existing e Find Previous Reading põem o Submission Key na fórmula sem escapar | Seguro hoje porque o Parse Payload confere o formato de cada parte do key; um formato mais solto quebraria a busca |
| Duas Observations com o mesmo Submission Key | Toda nova submissão daquele item falha até alguém apagar uma |
| `confirmInThread` no Config | Nenhum nó lê |

## Recuperar uma gravação parcial

Veja a Observation com o Submission Key do item antes de pedir para a pessoa tentar de novo.

| O que foi salvo | O que fazer |
| --- | --- |
| Observation em Processing | Espere dois minutos; depois uma nova submissão a substitui |
| Observation em Failed com Collection Error | Leia o erro e corrija a causa; a pessoa submete de novo e o registro é reaproveitado |
| Recorded, mas o checklist ainda mostra o item aberto | Marque qualquer item e feche o formulário; fechar redesenha o checklist a partir das Observations |
| Faltam alguns arquivos de evidência | A pessoa submete de novo com os arquivos; os já guardados são pulados pelo ID do arquivo no Slack |
| Duas Observations para um Submission Key | Fique com a certa, depois apague a outra |

## Manter esta página em dia

O quadro no topo mostra a versão do n8n que esta página descreve. Abra o workflow no n8n: quando o último salvamento dele é mais novo que a data do quadro, esta página está desatualizada até a próxima revisão. Todos os nós e todas as ligações dessa versão estão em [Nós](#nodes) e [Ligações](#connections).