Repository navigation
fix(compression): gate de estágio não derruba o pipeline com engine sem metadata - #10655
Merged
Merged
Conversation
…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.
…e-v3.8.50-basereds
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>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Refs #9985
Drena um dos vermelhos da base do
release/v3.8.50.Defeito
assertValidEngine()(open-sse/services/compression/engines/registry.ts) validaid,apply,compress,getConfigSchemaevalidateConfig— não exigemetadata. Umaengine registrada sem esse campo é, portanto, um registro legal do runtime.
canRunAtCompressionStageliaengine.metadata.executionStagessem guarda. Resultado: umaengine legal derrubava o pipeline de compressão inteiro com
TypeError: Cannot read properties of undefined (reading 'executionStages')— em vez de falhar aberto, que é ocontrato da compressão. É o único acesso desprotegido a
.metadataemopen-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.tsregistra uma engine de teste semmetadatapara 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.tstorna o contratoexplí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:tests/unit/compression/engine-stage-gate-metadata.test.ts(novo)tests/unit/compression/pipeline-circuit-breaker.test.tstests/unit/compression/*.test.ts(pasta inteira)npm run check:cyclesOs outros vermelhos da base que encontrei validando
Não estão neste PR, com motivo em cada caso:
tests/unit/compression/omniglyph-chatcore-plumbing.test.ts— casa por literal detexto em
chatCore.tscom janela de 80 caracteres. Alguém acrescentouopenaiexaià 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.
npm run typecheck:core—omniglyphAdapter.ts(126,54): Property 'applied' does not exist on type 'OmniGlyphTransformResult | {...}'. A narrowing porwireFormatnãocorrelaciona 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 denode_modules: oomniglyphinstalado é
1.3.1, igual ao lockfile da base.tests/unit/compression/ccr-mcp-integration.test.ts— "refuses oversized full MCPresponses and recommends ranged modes" (
actual: false, expected: true). Subsistemaindependente, 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:
executionStagesepipeline-circuit-breakernão aparecem mais em nenhum log de falha.Fast Quality Gates→omniglyphAdapter.ts(126,54)TS2339Unit Tests fast-path→omniglyph-chatcore-plumbingUnit Tests fast-path→probe-7134-claude-web-empty-error-bodyOu 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.