Skip to content

feat(sync): o motor versão 2 das cópias (U3 de O Sync de qualquer conector) - #978

Draft
leandrotcawork wants to merge 4 commits into
mainfrom
feat/conexus-sync-u3-build
Draft

leandrotcawork wants to merge 4 commits into
mainfrom
feat/conexus-sync-u3-build

Conversation

@leandrotcawork

Copy link
Copy Markdown
Collaborator

O que é

A U3 de O Sync de qualquer conector: o motor versão 2 das cópias. Uma cópia passa a ler uma ou mais conexões, cada uma com a sua conta, a sua posição, a sua passada e a sua espera (copies.copy_source). A rodada lê uma leitura de lista do conector por readThrough; um 429 termina PARTIAL WAIT; um cursor vencido recomeça a passada da fonte; o teto da leitura termina COPY_SOURCE_CEILING; os conectores que contam o limite pelo aplicativo têm uma chamada de cópia por vez. O Desligar tira na hora as linhas da conta e encerra, com a tabela, a cópia de que a conexão era a última fonte (#953). listConnectionCopies diz antes o que o Desligar apaga.

Este pull request fica em rascunho. A lista de permissões das fontes (#977, data D11) já está no main; origin/main entrou nesta branch por merge.

Commits

  • 9df1bbce: a declaração de paginação das cinco leituras de lista do Mercado Livre (U2b, sem as gravações), num commit próprio, como o Firstmate decidiu (opção A).
  • O commit da U3.

Critérios

# Teste Local
12 run-v2.test.ts "a passada de uma leitura de lista" verde
13 run-v2.test.ts "o fornecedor pede para esperar" e os dois casos (aplicativo, conta) verde
14 run-v2.test.ts "o cursor vencido recomeça" verde
15 run-v2.test.ts "o teto da leitura" verde
16 run-v2.test.ts "duas contas numa tabela" verde
17 run-v2.test.ts "o nome da conta segue a conexão" verde
18 copy-lane.test.ts "uma chamada de cópia por vez por conector" e dois casos verde; o primeiro e o terceiro falham com a fila tirada de copy-port.ts (medido)
19 copy-sql.test.ts "json, chave de texto e descrições" e três casos verde
20 run-v2.test.ts e run.test.ts "a primeira passada sem filtro" verde
21 run.test.ts sem mudar o que vê; migrate-copy-source.test.ts; copy.test.ts "as duas versões" verde
22 run-v2.test.ts "a conta desligada" verde
23 run-v2.test.ts "o registro não leva dado" verde
24 copy-list.test.tsx "a rodada que esperou" verde
39 unlink-copies.test.ts "desligar tira as linhas e a leitura do app" e três casos verde
40 connection-copies.test.ts "as cópias que o Desligar apaga" e a conexão sem cópia verde

O que rodei

  • Os testes de hub/copies, hub/connectors, builder/copy-clock e hub/apps/copy-data.test.ts no PostgreSQL local: 248 passaram, 0 falharam. Depois das últimas mudanças rodei de novo os arquivos que elas tocaram, e passaram 50 de 50.
  • packages/connectors (copy.test.ts, operations.test.ts, operations-list.test.ts, copy-read.test.ts): 30 passaram. packages/hub-api: 8 passaram.
  • apps/web src/hub/copies e src/hub/connectors no vitest: 107 passaram. Os dublês do Desligar agora respondem com tablesLeft.
  • Rodei o tsc do servidor, do web, de connectors e de hub-api, biome check (só os avisos que já estão no main), npm run deps, npm run docs, e migrations, method-freeze e approval com --base origin/main: tudo limpo.

Desvios declarados (delivery L7)

  • Arquivos fora das pastas do cartão: packages/connectors/src/index.ts (exporta CopyDefinitionV1 e Rows, que o servidor lê); packages/connectors/src/kernel/definition.ts e sankhya/copies.ts (os modelos de hoje validados por CopyDefinitionV1, já que CopyDefinition virou a união); packages/hub-api/src/connection-copies.ts e index.ts (listConnectionCopies e CopyOfConnection num arquivo próprio: em connectors.ts fariam ciclo com copies.ts, e copies.ts passaria de 300 linhas); hub/identity/test-hub.ts, platform/test-app-ports.ts, platform/copy-sql.test.ts, apps/web/src/hub/copies/copy-list.test.tsx, apps/web/src/hub/connectors/test-hub.tsx e integrations-states.test.tsx (dublês e testes); packages/connectors/src/mercado-livre/operations-list.test.ts (os testes de lista do U2b saíram de operations.test.ts, que passava de 300 linhas).
  • CopyRead tem um STALE que o cartão não nomeia: o cursor vencido sai da porta sem chamar, e a rodada recomeça a passada.
  • A versão 2 mostra shown.query vazio até a U4 dar shown.source; a lista segue mostrando copy.connectionId como a conexão da cópia.
  • A tabela que sobrou do Desligar sai por DELETE … RETURNING na mesma transação do DROP TABLE (o papel do Hub não tem UPDATE em copy_table_left para travar a linha), e volta se o banco da empresa calar.
  • O catálogo injetável (tuning.catalog) vale no caminho da cópia, na validação de connectorApps e no revoke; os testes usam o Mercado Livre com o mesmo id declarado ACCOUNT ou com teto 100.
  • Os testes plantam as cópias versão 2 direto no banco (U4 faz o caminho do Ligar).
  • MISFIT e UNREADABLE da página de lista viram COPY_SOURCE_UNREADABLE; o mesmo vale para uma resposta que não é Rows.
  • O log COPIES_LEFT da rota não é visto pelas linhas do Hub de teste e não é afirmado.
  • O teste da migração simula, num banco já migrado, uma cópia de antes das fontes (a fonte apagada, a passada de volta na cópia) e aplica de novo o SQL da migração.
  • O NO_MORE_SIGNAL vem do U2b: uma varredura sem scroll_id e sem deslocamento não diz quando acaba.

O que não provei

  • Nenhuma tela olhada no navegador: a única mudança de tela é a frase de WAIT na lista das cópias, provada por copy-list.test.tsx.
  • Nenhuma chamada ao Mercado Livre ou ao Sankhya de verdade; tudo pelos dublês do kit.
  • A suíte inteira e o npm run quality (Stryker) ficam para o CI e para a revisão.

…m como paginam, e o dublê pagina (U2b, sem gravações)

O Sync de qualquer conector, U2, a parte de código, pela decisão do
firstmate de 2026-11-11 (a U3 prova o motor pelo dublê do Mercado Livre):
pedidos declara OFFSET (offset, limit, 50, sem teto) e o filtro do que
mudou (changedFrom, date_last_updated); anuncios e perguntas declaram
CURSOR (scrollId, limit, 100 e 50, a primeira página com scan, 5 minutos);
reclamacoes e periodosDeFaturamento, OFFSET; mensagensDoPacote não declara.
O dublê tem 120 pedidos com a data de alteração e o filtro, 1.300 anúncios
e a varredura com scroll_id em anúncios e perguntas. A skill deixa de dizer
que não há como passar de mil. As quatro respostas gravadas (critério 11,
T29) entram quando a gravação chegar; se divergirem do dublê, o dublê muda.
…a, a fila por conector e o Desligar que apaga na hora (U3)

Uma cópia lê uma ou mais conexões, cada uma com a sua conta, a sua posição, a sua passada e a sua
espera (copies.copy_source, com a migração que dá a cada cópia de hoje a sua fonte). A rodada lê a
leitura de lista do conector por readThrough; o 429 termina PARTIAL WAIT; o cursor vencido recomeça
a passada da fonte; o teto termina COPY_SOURCE_CEILING; quem conta o limite pelo aplicativo tem uma
chamada de cópia por vez. No banco da empresa, json, chave de texto, _account e _account_name, o fim
de passada por conta e as descrições como COMMENT ON. O Desligar tira na hora as linhas da conta e
encerra, com a tabela, a cópia de que a conexão era a última fonte (#953); listConnectionCopies diz
antes o que some. Critérios 12 a 24, 39 e 40.

This branch has not been deployed

No deployments
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.

2 participants