Skip to content

fix(compression): gate de estágio não derruba o pipeline com engine sem metadata - #10655

Merged
diegosouzapw merged 2 commits into
release/v3.8.50from
fix/release-v3.8.50-basereds
Aug 18, 2026
Merged

diegosouzapw merged 2 commits into
release/v3.8.50from
fix/release-v3.8.50-basereds

Conversation

@diegosouzapw

@diegosouzapw diegosouzapw commented Aug 18, 2026 •

Copy link
Copy Markdown
Owner

Refs #9985

Drena um dos vermelhos da base do release/v3.8.50.

Defeito

assertValidEngine() (open-sse/services/compression/engines/registry.ts) valida id,
apply, compress, getConfigSchema e validateConfig — não exige metadata. Uma
engine registrada sem esse campo é, portanto, um registro legal do runtime.

canRunAtCompressionStage lia engine.metadata.executionStages sem guarda. Resultado: uma
engine legal derrubava o pipeline de compressão inteiro com TypeError: Cannot read properties of undefined (reading 'executionStages') — em vez de falhar aberto, que é o
contrato da compressão. É o único acesso desprotegido a .metadata em
open-sse/services/compression/ (verificado por varredura).

O fallback documentado para quem não declara executionStages é "só pre-translation".
Metadata ausente é o mesmo caso de "não declarou" e passa a cair no mesmo fallback.

Como aparecia

tests/unit/compression/pipeline-circuit-breaker.test.ts registra uma engine de teste sem
metadata para exercitar o breaker. Na base fechava 8/9; com o fix, 9/9.

Essa reprodução era incidental — o teste é sobre o circuit breaker, não sobre o contrato de
metadata. tests/unit/compression/engine-stage-gate-metadata.test.ts torna o contrato
explícito: uma engine sem metadata roda em pre-translation e é pulada em post-translation,
sem derrubar o pipeline nos dois casos. RED antes do fix (2/2 falhando com o mesmo
TypeError), GREEN depois.

Validação

Executado no worktree cortado de origin/release/v3.8.50:

Gate Resultado
tests/unit/compression/engine-stage-gate-metadata.test.ts (novo) 2/2 — RED→GREEN
tests/unit/compression/pipeline-circuit-breaker.test.ts 9/9 (era 8/9)
tests/unit/compression/*.test.ts (pasta inteira) 1408/1410
ESLint (arquivos alterados) PASS
npm run check:cycles PASS — 419 arquivos

Os outros vermelhos da base que encontrei validando

Não estão neste PR, com motivo em cada caso:

  1. tests/unit/compression/omniglyph-chatcore-plumbing.test.ts — casa por literal de
    texto em chatCore.ts com janela de 80 caracteres. Alguém acrescentou openai e xai
    à lista de transporte direto e o literal estourou a janela. Já corrigido pelo feat(compression): adota omniglyph 1.4.0, perfis semânticos e contabilidade com evidência #10647,
    que substitui a ramificação por nome de provider por um módulo de política; tocar aqui só
    criaria conflito.

  2. npm run typecheck:core — omniglyphAdapter.ts(126,54): Property 'applied' does not exist on type 'OmniGlyphTransformResult | {...}'. A narrowing por wireFormat não
    correlaciona com o membro da união. Também já corrigido pelo feat(compression): adota omniglyph 1.4.0, perfis semânticos e contabilidade com evidência #10647 (usa
    "applied" in result). Confirmado que não é artefato de node_modules: o omniglyph
    instalado é 1.3.1, igual ao lockfile da base.

  3. tests/unit/compression/ccr-mcp-integration.test.ts — "refuses oversized full MCP
    responses and recommends ranged modes" (actual: false, expected: true). Subsistema
    independente, sem relação com o gate de estágio. Fica para um PR próprio.

Veredito do CI deste PR

16 verdes, 3 vermelhos — nenhum deles é o defeito corrigido aqui: executionStages e
pipeline-circuit-breaker não aparecem mais em nenhum log de falha.

Vermelho Natureza
Fast Quality Gates → omniglyphAdapter.ts(126,54) TS2339 base-red nº 2 acima; corrigido pelo #10647
Unit Tests fast-path → omniglyph-chatcore-plumbing base-red nº 1 acima; corrigido pelo #10647
Unit Tests fast-path → probe-7134-claude-web-empty-error-body passa 2/2 localmente nesta mesma branch; sensível ao ambiente do runner, não determinístico

Ou seja: com o #10647 mergeado, os dois primeiros somem e a base fica com o probe flaky e o
ccr-mcp-integration (nº 3 acima) como resíduo.

backryun and others added 2 commits August 18, 2026 07:56
…em metadata

`assertValidEngine()` valida id, apply, compress, getConfigSchema e
validateConfig — não exige `metadata`. Uma engine registrada sem esse campo é,
portanto, um registro legal. Mas `canRunAtCompressionStage` lia
`engine.metadata.executionStages` sem guarda, então essa engine legal derrubava o
pipeline inteiro com `TypeError: Cannot read properties of undefined` em vez de
falhar aberto, que é o contrato da compressão.

Metadata ausente é o mesmo caso de "não declarou executionStages" e passa a cair
no mesmo fallback documentado: só pre-translation.

Isso destravava também `tests/unit/compression/pipeline-circuit-breaker.test.ts`,
que registra uma engine de teste sem metadata e vinha 8/9 na base — agora 9/9. O
teste novo torna o contrato explícito, em vez de deixá-lo dependendo de uma
reprodução incidental noutro arquivo.
@diegosouzapw
diegosouzapw merged commit 397a0e3 into release/v3.8.50 Aug 18, 2026
6 of 9 checks passed
HouMinXi pushed a commit to HouMinXi/OmniRoute that referenced this pull request Aug 20, 2026
…em metadata (diegosouzapw#10655)

`assertValidEngine()` valida id, apply, compress, getConfigSchema e
validateConfig — não exige `metadata`. Uma engine registrada sem esse campo é,
portanto, um registro legal. Mas `canRunAtCompressionStage` lia
`engine.metadata.executionStages` sem guarda, então essa engine legal derrubava o
pipeline inteiro com `TypeError: Cannot read properties of undefined` em vez de
falhar aberto, que é o contrato da compressão.

Metadata ausente é o mesmo caso de "não declarou executionStages" e passa a cair
no mesmo fallback documentado: só pre-translation.

Isso destravava também `tests/unit/compression/pipeline-circuit-breaker.test.ts`,
que registra uma engine de teste sem metadata e vinha 8/9 na base — agora 9/9. O
teste novo torna o contrato explícito, em vez de deixá-lo dependendo de uma
reprodução incidental noutro arquivo.

Co-authored-by: Xiangzhe <bakryun0718@proton.me>
Co-authored-by: adevwithpurpose <adevwithpurpose@users.noreply.github.com>
giauphan pushed a commit to giauphan/OmniRoute that referenced this pull request Aug 20, 2026
…em metadata (diegosouzapw#10655)

`assertValidEngine()` valida id, apply, compress, getConfigSchema e
validateConfig — não exige `metadata`. Uma engine registrada sem esse campo é,
portanto, um registro legal. Mas `canRunAtCompressionStage` lia
`engine.metadata.executionStages` sem guarda, então essa engine legal derrubava o
pipeline inteiro com `TypeError: Cannot read properties of undefined` em vez de
falhar aberto, que é o contrato da compressão.

Metadata ausente é o mesmo caso de "não declarou executionStages" e passa a cair
no mesmo fallback documentado: só pre-translation.

Isso destravava também `tests/unit/compression/pipeline-circuit-breaker.test.ts`,
que registra uma engine de teste sem metadata e vinha 8/9 na base — agora 9/9. O
teste novo torna o contrato explícito, em vez de deixá-lo dependendo de uma
reprodução incidental noutro arquivo.

Co-authored-by: Xiangzhe <bakryun0718@proton.me>
Co-authored-by: adevwithpurpose <adevwithpurpose@users.noreply.github.com>
muhamadgalihsaputra pushed a commit to niyatna/NiyatnaRoute that referenced this pull request Sep 27, 2026
…em metadata (diegosouzapw#10655)

`assertValidEngine()` valida id, apply, compress, getConfigSchema e
validateConfig — não exige `metadata`. Uma engine registrada sem esse campo é,
portanto, um registro legal. Mas `canRunAtCompressionStage` lia
`engine.metadata.executionStages` sem guarda, então essa engine legal derrubava o
pipeline inteiro com `TypeError: Cannot read properties of undefined` em vez de
falhar aberto, que é o contrato da compressão.

Metadata ausente é o mesmo caso de "não declarou executionStages" e passa a cair
no mesmo fallback documentado: só pre-translation.

Isso destravava também `tests/unit/compression/pipeline-circuit-breaker.test.ts`,
que registra uma engine de teste sem metadata e vinha 8/9 na base — agora 9/9. O
teste novo torna o contrato explícito, em vez de deixá-lo dependendo de uma
reprodução incidental noutro arquivo.

Co-authored-by: Xiangzhe <bakryun0718@proton.me>
Co-authored-by: adevwithpurpose <adevwithpurpose@users.noreply.github.com>
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.

3 participants