---
fonte: 01-canonicos/seed-componentes.md
versao_da_fonte: v1.43
secao: 91
titulo: "CONFLITO DE EDIÇÃO CONCORRENTE · **`estável`** (2026-08-24, F7.7-P5, duas decisões dele no gate) · CE1–CE8"
sequencia: 97 de 98
bytes_do_corpo: 9202
md5_do_corpo: a94485bfacd78be14a4520c723202b00
gerado_por: 06-validacao/geradores/gen-camada-ia.py
nota: fatia GERADA — o corpo abaixo é byte a byte o trecho do canônico; edite o canônico, nunca esta fatia. Canônico inteiro em https://ds.seed.eng.br/01-canonicos/seed-componentes.md
---
## 91. CONFLITO DE EDIÇÃO CONCORRENTE · **`estável`** (2026-08-24, F7.7-P5, duas decisões dele no gate) · CE1–CE8

**O que esta seção é.** O contrato de quando duas pessoas editam o mesmo objeto.
Fecha a segunda linha **❌ AUSENTE** do §6.1.

**Medido antes de escrever:** **0 de 40** artefatos têm qualquer estado de
conflito, e hoje **uma única tela** tem gravação explícita — a
`tela-configuracoes.html` (*"Salvar alterações"*, regime CF do §86). É a única
exposta à atualização perdida hoje; o ERP inteiro estará amanhã.

### 91.1 CE1 — detectar é OBRIGATÓRIO, e é do servidor

O problema tem nome antigo — *lost update* — e solução padronizada na **RFC
9110**: lê-se o recurso com `ETag`, grava-se com `If-Match: <etag>`, e o servidor
devolve **412 Precondition Failed** em vez de sobrescrever.

**Aviso na interface não impede perda nenhuma: informa.** O que impede é a
pré-condição no servidor. Logo:

- **CE1-a** — toda gravação de objeto compartilhado envia a pré-condição de
  versão. Gravação sem pré-condição é defeito, não escolha de implementação.
- **CE1-b** — o que esta seção especifica é o que a pessoa vê **quando o 412
  chega**.

### 91.2 CE2 — o regime padrão é OTIMISTA (decisão dele: (b))

Ninguém trava. A pessoa edita, e o conflito aparece **na gravação**.

**Alternativa descartada e por quê:** o regime **pessimista** (o objeto trava
enquanto alguém edita), que é o do SAP Fiori e é referência madura de ERP, foi
recusado como padrão porque **quem perde conexão em campo deixa o objeto travado
até a trava expirar**, e trava indevida bloqueia trabalho legítimo — na operação
da SEED isso não é hipótese.

**Custo declarado do otimista, e a literatura o registra:** dá para digitar vinte
minutos e descobrir o conflito no fim. A CE3 existe para reduzir isso.

### 91.3 CE3 — presença AVISA, nunca bloqueia

Quando outra pessoa está com o mesmo objeto aberto em edição, a tela mostra
**aviso de presença** — quem é e desde quando —, em superfície discreta e
**sem desabilitar nada**. É informação para a pessoa decidir, não permissão.

⚠ O aviso nomeia um colega, e isso é uso interno legítimo. **Nunca** exibir dado
pessoal além do necessário para identificar quem edita.

### 91.4 CE4 — a EXCEÇÃO: trava exclusiva para objeto que gera documento com ART

**Objeto cujo conteúdo sai em documento assinado com Anotação de
Responsabilidade Técnica — memorial, laudo, projeto, proposta técnica — trava em
regime EXCLUSIVO.**

**A razão é nossa e não vem de nenhuma fonte externa:** quem assina responde pelo
que está lá, e **conteúdo mesclado em silêncio num documento com ART é risco que
a interface não pode criar**. É a mesma família da MC3, que decidiu a voz do erro
pelo mesmo motivo.

Regras da trava:

- **CE4-a** — quem chega depois vê **leitura, com o motivo dito**: quem está
  editando e desde quando. Ler nunca é bloqueado.
- **CE4-b** — a trava **expira** por inatividade, e o rascunho do dono sobrevive
  à expiração. Trava sem expiração é objeto perdido quando alguém fecha o
  notebook no canteiro.
- **CE4-c** — expirada a trava com rascunho pendente, o objeto mostra
  **"Alterações não salvas de <quem>"** — estado distinto de "livre" e de
  "travado".
- **CE4-d** — quem é dono da trava e volta antes de outra pessoa assumir
  **retoma** o próprio rascunho.
- **CE4-e** — a classe do objeto (gera documento com ART, ou não) é **declarada
  pelo objeto**, nunca inferida do nome da tela. Mesma regra do MM1: quem é peça
  impressa é decidido pelo que o artefato declara.

### 91.5 CE5 — o diálogo de conflito tem TRÊS saídas (decisão dele: (a))

Quando o 412 chega, o diálogo (§30) oferece, nesta ordem:

1. **Ver o que mudou** — a comparação, antes de qualquer decisão. É a saída
   padrão e a de menor risco.
2. **Manter o meu e sobrescrever** — destrutiva. Entra sob a **MC4** (verbo
   específico no rótulo, nunca "OK") e a **MC5** (o corpo declara a
   consequência, com o dado identificador: o que será descartado e de quem).
3. **Descartar o meu e recarregar** — também destrutiva, e também sob MC4/MC5.

**Alternativa descartada:** as duas saídas ("recarregar e perder" ou "salvar como
cópia"). Recusada porque "recarregar e perder" faz a pessoa refazer o trabalho, e
essa é exatamente a queixa que a literatura registra como o custo do padrão
otimista — oferecê-la como única saída é escolher pagar o custo inteiro.

### 91.6 CE6 — o que NUNCA se faz

- **Mesclar em silêncio.** Nunca, em nenhum regime.
- **Perder sem oferecer saída.** Nenhum caminho do diálogo termina com trabalho
  perdido sem a pessoa ter escolhido isso, com a consequência dita.
- **Bloquear a leitura.** Trava é de escrita.

### 91.7 CE7 — o conflito é ANUNCIADO como alerta

Diferente do offline: aqui a interrupção é apropriada. O diálogo de conflito
chega por `role="alertdialog"` com foco movido, porque a pessoa está prestes a
gravar e precisa saber **antes** de repetir a ação.

### 91.8 CE8 — fronteira do design system

**Não** são desta seção: mesclagem automática, edição simultânea de verdade
(CRDT, cursores de várias pessoas), histórico de versões navegável e a política
de expiração em minutos. O DS fecha os **estados**: presença, trava, alterações
não salvas de terceiro, e o diálogo de conflito.

### 91.9 CE4-f — a fronteira COLETA × EMISSÃO (emenda de 2026-08-24, tarde)

**O problema que a emenda resolve, e ele é uma colisão real entre duas cláusulas
aprovadas no mesmo gate.** A CE4 manda travar em regime exclusivo o objeto que
gera documento com ART. A §90 admite trabalho offline. **Não se adquire trava sem
rede.** Se as duas valessem sobre o mesmo objeto, a equipe de campo ficaria
impedida de preencher a OS no canteiro — que é exatamente o caso de uso que o
app existe para servir.

A saída não é afrouxar nenhuma das duas: é **reconhecer que são objetos
diferentes em momentos diferentes**.

| Momento | O que é | Regime |
|---|---|---|
| **COLETA** — a OS preenchida em campo, a medição, a foto, o apontamento, a marcação de ponto | dado bruto, de autoria de quem coletou, ainda não é documento | **offline-first, SEM trava** — §90 governa |
| **EMISSÃO** — o laudo, o memorial, o projeto, a proposta técnica que o engenheiro assina | documento que sai com ART e responsabiliza quem assina | **online, com trava exclusiva** — CE4 governa |

**CE4-f — a trava exclusiva é do DOCUMENTO, nunca da coleta que o alimenta.** O
que a CE4 protege é o ato de compor e assinar; nada nela impede que o dado de
campo chegue depois, por sincronização.

⭐ **A razão de isso não afrouxar a CE4:** a preocupação que a fundou era conteúdo
**mesclado em silêncio** dentro de documento assinado. Dado de campo que chega por
sincronização **não se mescla em silêncio** — ele entra como material novo, com
autoria e horário, e quem assina decide se incorpora. A trava segue protegendo
exatamente o que precisava.

### 91.10 CE9 — conflito detectado na SINCRONIZAÇÃO

O conflito da CE5 é **interativo**: a pessoa aperta gravar e a resposta vem na
hora. O conflito de sincronização é outro animal, e as três diferenças mudam o
desenho:

1. **Chega em lote**, com muitos itens de uma vez.
2. **Chega tarde** — horas depois da edição, às vezes no dia seguinte.
3. **Chega sem ação em curso** — a pessoa pode estar dirigindo, ou nem estar com
   o app aberto.

Logo:

- **CE9-a — nunca resolver sozinho.** Nem "o servidor ganha", nem "o dispositivo
  ganha". Resolução automática de conflito é a mesma família da mesclagem em
  silêncio que a CE6 proíbe.
- **CE9-b — nunca descartar.** O item conflitado **fica retido** num estado
  próprio (*"precisa da sua atenção"*), com o conteúdo do dispositivo
  preservado. Trabalho de campo não se perde porque o servidor mudou.
- **CE9-c — a notificação é ASSÍNCRONA, não é diálogo.** Diferente da CE7: aqui
  **não** se usa `alertdialog` nem se move o foco, porque não há ação em curso
  para interromper. É aviso persistente na lista de pendências, do mesmo tipo do
  resultado de sincronização da OF10-b.
- **CE9-d — a resolução usa as MESMAS três saídas da CE5** (ver o que mudou ·
  manter o meu e sobrescrever · descartar o meu), no momento em que a pessoa
  abrir o item. Mesma gramática, momento diferente — quem aprendeu uma sabe a
  outra.
- **CE9-e — o lote não vira um diálogo por item.** Muitos conflitos se resolvem
  na lista, com o item aberto um a um. Trinta diálogos em sequência é a forma de
  fazer a pessoa clicar em "sobrescrever" sem ler.

**Fronteira:** a marcação de **ponto** não entra aqui. Pela Portaria 671/2021 o
registro não se altera, logo ele não tem conflito de edição — tem apenas
transmissão bem ou malsucedida, que é a OF10.

---

