Repository navigation
fix(compression): honor the sent engine config in engine previews - #15604
Merged
diegosouzapw merged 102 commits intoOct 6, 2026
Merged
diegosouzapw merged 102 commits into
diegosouzapw merged 102 commits into
Conversation
The Aggressive/Ultra engine pages send their form values as
{ config: { aggressive | ultra } } and the preview route validates them,
but dispatchCompression built the engineId/pipeline-branch config from
stackedPipeline/headroom/fidelityGate/riskGate only, so the engines read
options.config.<engine>, found nothing, and every preview ran on
built-in defaults — ultra reported identical savings with
compressionRate 1.
Thread cfg.aggressive/cfg.ultra into the synthesized config in both
branches, the same way headroom already is. A preview with no config
keeps built-in defaults: loading saved settings would couple the dry-run
route to the settings store and change Lite/Session-Dedup/CCR previews,
which send no config.
TDD: tests/unit/api/compression-preview-engine-config.test.ts fails on
the unpatched route (savings identical with compressionRate 1) and
passes with the fix.
Review found the aggressive half of the fix untested: dropping the sentConfig.aggressive spreads would pass CI silently. A multi-turn payload makes the case deterministic — the early turn exceeds the configured summarizer cap (256 tokens) but stays under the 2048-token default cap, so only the configured run summarizes it. Red-proved by temporarily removing the sentConfig.aggressive spreads: exactly the new test fails.
Coverage audit flagged the pipeline copy of the aggressive spread as untestable-by-proxy: a regression confined to that line passed all existing tests. Mirrors the engineId=aggressive case for pipeline=[aggressive]. Red-proved in isolation: removing only the pipeline-branch sentConfig.aggressive spread fails exactly this test.
The Ultra page seeds modelPath from the schema default "" and sent it raw, but ultraConfigSchema requires min(1) when present — so the page's Preview (and Save) 400ed on default form state, before the route's config threading could run. Strip empty strings when building the aggressive/ultra payloads for both calls; the only schema string field is ultra.modelPath, which must be non-empty, so no legitimate value is lost. TDD: tests/unit/ui/engineConfigPage.test.tsx gains a preview case and a save case asserting the empty modelPath never reaches the request body; both failed on the unpatched page.
…purify 3.4.16 and patched npm-bundled copies in the image (diegosouzapw#15325) - next/eslint-config-next 16.3.5 -> 16.3.6 (critical RCE in next/og ImageResponse). - override axios ^1.20.0 so ibm-cloud-sdk-core's exact 1.18.0 pin cannot keep the vulnerable copy. - @grpc/grpc-js 1.14.5, dompurify 3.4.16 via lockfile. - Dockerfile npm-internals overlay: undici 6.29.0, brace-expansion 5.0.12, ip-address 10.7.3. node-forge has no patched release yet (dev-only, via promptfoo -> jks-js).
…gosouzapw#15003) Validated in a combined 14-PR board on the current release tip (112313a): 111 focused tests, typecheck:core, open-sse typecheck, gate-manifest, mutation-test-coverage, file-size, changelog-integrity, complexity, env-doc-sync, test-discovery, vitest-exclusions, error-helper, cli-i18n and the i18n new-keys/ui-coverage gates green. Thank you for the contribution.
…zapw#15225) Validated in a combined 14-PR board on the current release tip (112313a): 111 focused tests, typecheck:core, open-sse typecheck, gate-manifest, mutation-test-coverage, file-size, changelog-integrity, complexity, env-doc-sync, test-discovery, vitest-exclusions, error-helper, cli-i18n and the i18n new-keys/ui-coverage gates green. Thank you for the contribution.
… Rule diegosouzapw#16 (diegosouzapw#15389) Validated in a combined 14-PR board on the current release tip (112313a): 111 focused tests, typecheck:core, open-sse typecheck, gate-manifest, mutation-test-coverage, file-size, changelog-integrity, complexity, env-doc-sync, test-discovery, vitest-exclusions, error-helper, cli-i18n and the i18n new-keys/ui-coverage gates green. Thank you for the contribution.
… text (diegosouzapw#15399) Validated in a combined 14-PR board on the current release tip (112313a): 111 focused tests, typecheck:core, open-sse typecheck, gate-manifest, mutation-test-coverage, file-size, changelog-integrity, complexity, env-doc-sync, test-discovery, vitest-exclusions, error-helper, cli-i18n and the i18n new-keys/ui-coverage gates green. Thank you for the contribution.
…alog (diegosouzapw#15396) Validated in a combined 14-PR board on the current release tip (112313a): 111 focused tests, typecheck:core, open-sse typecheck, gate-manifest, mutation-test-coverage, file-size, changelog-integrity, complexity, env-doc-sync, test-discovery, vitest-exclusions, error-helper, cli-i18n and the i18n new-keys/ui-coverage gates green. Thank you for the contribution.
…iegosouzapw#15395) Validated in a combined 14-PR board on the current release tip (112313a): 111 focused tests, typecheck:core, open-sse typecheck, gate-manifest, mutation-test-coverage, file-size, changelog-integrity, complexity, env-doc-sync, test-discovery, vitest-exclusions, error-helper, cli-i18n and the i18n new-keys/ui-coverage gates green. Thank you for the contribution.
…osouzapw#15378) Validated in a combined 14-PR board on the current release tip (112313a): 111 focused tests, typecheck:core, open-sse typecheck, gate-manifest, mutation-test-coverage, file-size, changelog-integrity, complexity, env-doc-sync, test-discovery, vitest-exclusions, error-helper, cli-i18n and the i18n new-keys/ui-coverage gates green. Thank you for the contribution.
diegosouzapw#15432) Validated in a combined 14-PR board on the current release tip (112313a): 111 focused tests, typecheck:core, open-sse typecheck, gate-manifest, mutation-test-coverage, file-size, changelog-integrity, complexity, env-doc-sync, test-discovery, vitest-exclusions, error-helper, cli-i18n and the i18n new-keys/ui-coverage gates green. Thank you for the contribution.
…get (diegosouzapw#15433) Validated in a combined 14-PR board on the current release tip (112313a): 111 focused tests, typecheck:core, open-sse typecheck, gate-manifest, mutation-test-coverage, file-size, changelog-integrity, complexity, env-doc-sync, test-discovery, vitest-exclusions, error-helper, cli-i18n and the i18n new-keys/ui-coverage gates green. Thank you for the contribution.
…#15434) Validated in a combined 14-PR board on the current release tip (112313a): 111 focused tests, typecheck:core, open-sse typecheck, gate-manifest, mutation-test-coverage, file-size, changelog-integrity, complexity, env-doc-sync, test-discovery, vitest-exclusions, error-helper, cli-i18n and the i18n new-keys/ui-coverage gates green. Thank you for the contribution.
…pw#15463) Validated in a combined 14-PR board on the current release tip (112313a): 111 focused tests, typecheck:core, open-sse typecheck, gate-manifest, mutation-test-coverage, file-size, changelog-integrity, complexity, env-doc-sync, test-discovery, vitest-exclusions, error-helper, cli-i18n and the i18n new-keys/ui-coverage gates green. Thank you for the contribution.
) Validated in a combined 14-PR board on the current release tip (112313a): 111 focused tests, typecheck:core, open-sse typecheck, gate-manifest, mutation-test-coverage, file-size, changelog-integrity, complexity, env-doc-sync, test-discovery, vitest-exclusions, error-helper, cli-i18n and the i18n new-keys/ui-coverage gates green. Thank you for the contribution.
…pass (diegosouzapw#15560) Validated in a combined 14-PR board on the current release tip (112313a): 111 focused tests, typecheck:core, open-sse typecheck, gate-manifest, mutation-test-coverage, file-size, changelog-integrity, complexity, env-doc-sync, test-discovery, vitest-exclusions, error-helper, cli-i18n and the i18n new-keys/ui-coverage gates green. Thank you for the contribution.
…ead of failing silently (diegosouzapw#15362) Validated in a combined 14-PR board on the current release tip (112313a): 111 focused tests, typecheck:core, open-sse typecheck, gate-manifest, mutation-test-coverage, file-size, changelog-integrity, complexity, env-doc-sync, test-discovery, vitest-exclusions, error-helper, cli-i18n and the i18n new-keys/ui-coverage gates green. Thank you for the contribution.
…zapw#15224) Validated in a combined board on the current release tip: focused node:test + vitest suites, typecheck:core, open-sse typecheck, gate-manifest, mutation-test-coverage, file-size, changelog-integrity, complexity, env-doc-sync, test-discovery, vitest-exclusions, error-helper, cli-i18n and the i18n new-keys/ui-coverage gates green. Thank you for the contribution.
…umn name" (diegosouzapw#15236) Validated in a combined board on the current release tip: focused node:test + vitest suites, typecheck:core, open-sse typecheck, gate-manifest, mutation-test-coverage, file-size, changelog-integrity, complexity, env-doc-sync, test-discovery, vitest-exclusions, error-helper, cli-i18n and the i18n new-keys/ui-coverage gates green. Thank you for the contribution.
…guard (diegosouzapw#15239) Validated in a combined board on the current release tip: focused node:test + vitest suites, typecheck:core, open-sse typecheck, gate-manifest, mutation-test-coverage, file-size, changelog-integrity, complexity, env-doc-sync, test-discovery, vitest-exclusions, error-helper, cli-i18n and the i18n new-keys/ui-coverage gates green. Thank you for the contribution.
…rt failures (diegosouzapw#15248) Validated in a combined board on the current release tip: focused node:test + vitest suites, typecheck:core, open-sse typecheck, gate-manifest, mutation-test-coverage, file-size, changelog-integrity, complexity, env-doc-sync, test-discovery, vitest-exclusions, error-helper, cli-i18n and the i18n new-keys/ui-coverage gates green. Thank you for the contribution.
… in pool visibility (diegosouzapw#15374) Validated in a combined board on the current release tip: focused node:test + vitest suites, typecheck:core, open-sse typecheck, gate-manifest, mutation-test-coverage, file-size, changelog-integrity, complexity, env-doc-sync, test-discovery, vitest-exclusions, error-helper, cli-i18n and the i18n new-keys/ui-coverage gates green. Thank you for the contribution.
…ouzapw#15375) Validated in a combined board on the current release tip: focused node:test + vitest suites, typecheck:core, open-sse typecheck, gate-manifest, mutation-test-coverage, file-size, changelog-integrity, complexity, env-doc-sync, test-discovery, vitest-exclusions, error-helper, cli-i18n and the i18n new-keys/ui-coverage gates green. Thank you for the contribution.
…osouzapw#15398) Validated in a combined board on the current release tip: focused node:test + vitest suites, typecheck:core, open-sse typecheck, gate-manifest, mutation-test-coverage, file-size, changelog-integrity, complexity, env-doc-sync, test-discovery, vitest-exclusions, error-helper, cli-i18n and the i18n new-keys/ui-coverage gates green. Thank you for the contribution.
…diegosouzapw#15402) Validated in a combined board on the current release tip: focused node:test + vitest suites, typecheck:core, open-sse typecheck, gate-manifest, mutation-test-coverage, file-size, changelog-integrity, complexity, env-doc-sync, test-discovery, vitest-exclusions, error-helper, cli-i18n and the i18n new-keys/ui-coverage gates green. Thank you for the contribution.
…zapw#15443) Brought the tip into the branch (the stacked parent commit had landed as a squash) and revalidated: focused tests, typecheck:core, open-sse typecheck, file-size, changelog-integrity, complexity and mutation-test-coverage green. Thank you for the contribution.
…ner (diegosouzapw#15363) Onda 2 (HouMinXi) validada num único board em `.claude/worktrees/batch-w2` sobre `origin/release/v3.8.52` (`e05f1bd78bac`), 26 PRs, superfícies protegidas 0. Evidência: `typecheck:core` limpo. changelog-integrity, complexity (2973/3218) e cognitive-complexity (1356/1437) dentro do baseline. Testes focados: 235 passaram. Os 5 vermelhos não são deste diff: o `.test.tsx` do cloudflared passa no Vitest (1/1); o intervalo do Codex usage passou 3/3 isolado (flake sob carga); o banner no-auth cai no mesmo `useContext` nulo de `tests/unit/request-log-detail-stream.test.ts`, que já existe no tip, por causa do React duplicado em `node_modules/node_modules` desta worktree. O file-size do board ainda vê o teto antigo de `gateways.ts` (já corrigido em diegosouzapw#15679) e o crescimento próprio desta onda em RoutingTab, auth, responseSanitizer, search, proxyFetch e stream. Esse rebaseline entra no follow-up, fora do squash.⚠️ base-red inherited: diegosouzapw#15306 (timeouts de suíte no tip, não neste diff). Obrigado, @HouMinXi.
…x_tokens (diegosouzapw#15418) Onda 2 (HouMinXi) validada num único board em `.claude/worktrees/batch-w2` sobre `origin/release/v3.8.52` (`e05f1bd78bac`), 26 PRs, superfícies protegidas 0. Evidência: `typecheck:core` limpo. changelog-integrity, complexity (2973/3218) e cognitive-complexity (1356/1437) dentro do baseline. Testes focados: 235 passaram. Os 5 vermelhos não são deste diff: o `.test.tsx` do cloudflared passa no Vitest (1/1); o intervalo do Codex usage passou 3/3 isolado (flake sob carga); o banner no-auth cai no mesmo `useContext` nulo de `tests/unit/request-log-detail-stream.test.ts`, que já existe no tip, por causa do React duplicado em `node_modules/node_modules` desta worktree. O file-size do board ainda vê o teto antigo de `gateways.ts` (já corrigido em diegosouzapw#15679) e o crescimento próprio desta onda em RoutingTab, auth, responseSanitizer, search, proxyFetch e stream. Esse rebaseline entra no follow-up, fora do squash.⚠️ base-red inherited: diegosouzapw#15306 (timeouts de suíte no tip, não neste diff). Obrigado, @HouMinXi.
Onda 2 (HouMinXi) validada num único board em `.claude/worktrees/batch-w2` sobre `origin/release/v3.8.52` (`e05f1bd78bac`), 26 PRs, superfícies protegidas 0. Evidência: `typecheck:core` limpo. changelog-integrity, complexity (2973/3218) e cognitive-complexity (1356/1437) dentro do baseline. Testes focados: 235 passaram. Os 5 vermelhos não são deste diff: o `.test.tsx` do cloudflared passa no Vitest (1/1); o intervalo do Codex usage passou 3/3 isolado (flake sob carga); o banner no-auth cai no mesmo `useContext` nulo de `tests/unit/request-log-detail-stream.test.ts`, que já existe no tip, por causa do React duplicado em `node_modules/node_modules` desta worktree. O file-size do board ainda vê o teto antigo de `gateways.ts` (já corrigido em diegosouzapw#15679) e o crescimento próprio desta onda em RoutingTab, auth, responseSanitizer, search, proxyFetch e stream. Esse rebaseline entra no follow-up, fora do squash.⚠️ base-red inherited: diegosouzapw#15306 (timeouts de suíte no tip, não neste diff). Obrigado, @HouMinXi.
…w#15472) Onda 2 (HouMinXi) validada num único board em `.claude/worktrees/batch-w2` sobre `origin/release/v3.8.52` (`e05f1bd78bac`), 26 PRs, superfícies protegidas 0. Evidência: `typecheck:core` limpo. changelog-integrity, complexity (2973/3218) e cognitive-complexity (1356/1437) dentro do baseline. Testes focados: 235 passaram. Os 5 vermelhos não são deste diff: o `.test.tsx` do cloudflared passa no Vitest (1/1); o intervalo do Codex usage passou 3/3 isolado (flake sob carga); o banner no-auth cai no mesmo `useContext` nulo de `tests/unit/request-log-detail-stream.test.ts`, que já existe no tip, por causa do React duplicado em `node_modules/node_modules` desta worktree. O file-size do board ainda vê o teto antigo de `gateways.ts` (já corrigido em diegosouzapw#15679) e o crescimento próprio desta onda em RoutingTab, auth, responseSanitizer, search, proxyFetch e stream. Esse rebaseline entra no follow-up, fora do squash.⚠️ base-red inherited: diegosouzapw#15306 (timeouts de suíte no tip, não neste diff). Obrigado, @HouMinXi.
…diegosouzapw#15516) Onda 2 (HouMinXi) validada num único board em `.claude/worktrees/batch-w2` sobre `origin/release/v3.8.52` (`e05f1bd78bac`), 26 PRs, superfícies protegidas 0. Evidência: `typecheck:core` limpo. changelog-integrity, complexity (2973/3218) e cognitive-complexity (1356/1437) dentro do baseline. Testes focados: 235 passaram. Os 5 vermelhos não são deste diff: o `.test.tsx` do cloudflared passa no Vitest (1/1); o intervalo do Codex usage passou 3/3 isolado (flake sob carga); o banner no-auth cai no mesmo `useContext` nulo de `tests/unit/request-log-detail-stream.test.ts`, que já existe no tip, por causa do React duplicado em `node_modules/node_modules` desta worktree. O file-size do board ainda vê o teto antigo de `gateways.ts` (já corrigido em diegosouzapw#15679) e o crescimento próprio desta onda em RoutingTab, auth, responseSanitizer, search, proxyFetch e stream. Esse rebaseline entra no follow-up, fora do squash.⚠️ base-red inherited: diegosouzapw#15306 (timeouts de suíte no tip, não neste diff). Obrigado, @HouMinXi.
…gosouzapw#15356) Onda 2 (HouMinXi) validada num único board em `.claude/worktrees/batch-w2` sobre `origin/release/v3.8.52` (`e05f1bd78bac`), 26 PRs, superfícies protegidas 0. Evidência: `typecheck:core` limpo. changelog-integrity, complexity (2973/3218) e cognitive-complexity (1356/1437) dentro do baseline. Testes focados: 235 passaram. Os 5 vermelhos não são deste diff: o `.test.tsx` do cloudflared passa no Vitest (1/1); o intervalo do Codex usage passou 3/3 isolado (flake sob carga); o banner no-auth cai no mesmo `useContext` nulo de `tests/unit/request-log-detail-stream.test.ts`, que já existe no tip, por causa do React duplicado em `node_modules/node_modules` desta worktree. O file-size do board ainda vê o teto antigo de `gateways.ts` (já corrigido em diegosouzapw#15679) e o crescimento próprio desta onda em RoutingTab, auth, responseSanitizer, search, proxyFetch e stream. Esse rebaseline entra no follow-up, fora do squash.⚠️ base-red inherited: diegosouzapw#15306 (timeouts de suíte no tip, não neste diff). Obrigado, @HouMinXi.
diegosouzapw#15553) Onda 2 (HouMinXi) validada num único board em `.claude/worktrees/batch-w2` sobre `origin/release/v3.8.52` (`e05f1bd78bac`), 26 PRs, superfícies protegidas 0. Evidência: `typecheck:core` limpo. changelog-integrity, complexity (2973/3218) e cognitive-complexity (1356/1437) dentro do baseline. Testes focados: 235 passaram. Os 5 vermelhos não são deste diff: o `.test.tsx` do cloudflared passa no Vitest (1/1); o intervalo do Codex usage passou 3/3 isolado (flake sob carga); o banner no-auth cai no mesmo `useContext` nulo de `tests/unit/request-log-detail-stream.test.ts`, que já existe no tip, por causa do React duplicado em `node_modules/node_modules` desta worktree. O file-size do board ainda vê o teto antigo de `gateways.ts` (já corrigido em diegosouzapw#15679) e o crescimento próprio desta onda em RoutingTab, auth, responseSanitizer, search, proxyFetch e stream. Esse rebaseline entra no follow-up, fora do squash.⚠️ base-red inherited: diegosouzapw#15306 (timeouts de suíte no tip, não neste diff). Obrigado, @HouMinXi.
Onda 2 (HouMinXi) validada num único board em `.claude/worktrees/batch-w2` sobre `origin/release/v3.8.52` (`e05f1bd78bac`), 26 PRs, superfícies protegidas 0. Evidência: `typecheck:core` limpo. changelog-integrity, complexity (2973/3218) e cognitive-complexity (1356/1437) dentro do baseline. Testes focados: 235 passaram. Os 5 vermelhos não são deste diff: o `.test.tsx` do cloudflared passa no Vitest (1/1); o intervalo do Codex usage passou 3/3 isolado (flake sob carga); o banner no-auth cai no mesmo `useContext` nulo de `tests/unit/request-log-detail-stream.test.ts`, que já existe no tip, por causa do React duplicado em `node_modules/node_modules` desta worktree. O file-size do board ainda vê o teto antigo de `gateways.ts` (já corrigido em diegosouzapw#15679) e o crescimento próprio desta onda em RoutingTab, auth, responseSanitizer, search, proxyFetch e stream. Esse rebaseline entra no follow-up, fora do squash.⚠️ base-red inherited: diegosouzapw#15306 (timeouts de suíte no tip, não neste diff). Obrigado, @HouMinXi.
…gosouzapw#15035) Onda 2 (HouMinXi) validada num único board em `.claude/worktrees/batch-w2` sobre `origin/release/v3.8.52` (`e05f1bd78bac`), 26 PRs, superfícies protegidas 0. Evidência: `typecheck:core` limpo. changelog-integrity, complexity (2973/3218) e cognitive-complexity (1356/1437) dentro do baseline. Testes focados: 235 passaram. Os 5 vermelhos não são deste diff: o `.test.tsx` do cloudflared passa no Vitest (1/1); o intervalo do Codex usage passou 3/3 isolado (flake sob carga); o banner no-auth cai no mesmo `useContext` nulo de `tests/unit/request-log-detail-stream.test.ts`, que já existe no tip, por causa do React duplicado em `node_modules/node_modules` desta worktree. O file-size do board ainda vê o teto antigo de `gateways.ts` (já corrigido em diegosouzapw#15679) e o crescimento próprio desta onda em RoutingTab, auth, responseSanitizer, search, proxyFetch e stream. Esse rebaseline entra no follow-up, fora do squash.⚠️ base-red inherited: diegosouzapw#15306 (timeouts de suíte no tip, não neste diff). Obrigado, @HouMinXi.
…iegosouzapw#15642) Onda 2 (HouMinXi) validada num único board em `.claude/worktrees/batch-w2` sobre `origin/release/v3.8.52` (`e05f1bd78bac`), 26 PRs, superfícies protegidas 0. Evidência: `typecheck:core` limpo. changelog-integrity, complexity (2973/3218) e cognitive-complexity (1356/1437) dentro do baseline. Testes focados: 235 passaram. Os 5 vermelhos não são deste diff: o `.test.tsx` do cloudflared passa no Vitest (1/1); o intervalo do Codex usage passou 3/3 isolado (flake sob carga); o banner no-auth cai no mesmo `useContext` nulo de `tests/unit/request-log-detail-stream.test.ts`, que já existe no tip, por causa do React duplicado em `node_modules/node_modules` desta worktree. O file-size do board ainda vê o teto antigo de `gateways.ts` (já corrigido em diegosouzapw#15679) e o crescimento próprio desta onda em RoutingTab, auth, responseSanitizer, search, proxyFetch e stream. Esse rebaseline entra no follow-up, fora do squash.⚠️ base-red inherited: diegosouzapw#15306 (timeouts de suíte no tip, não neste diff). Obrigado, @HouMinXi.
Follow-up da onda 2. Seis arquivos que já estavam acima do teto cresceram com o squash dos 26 PRs de @HouMinXi. O teto acompanha o tamanho medido com `split("\n").length` no tip `ef3b71c68778`: - `RoutingTab.tsx` 1618 → 1678 - `auth.ts` 3640 → 3642 - `responseSanitizer.ts` 1204 → 1210 - `search.ts` 1789 → 1805 - `proxyFetch.ts` 1404 → 1405 - `stream.ts` 3298 → 3313 `gateways.ts` permanece em 1547 (diegosouzapw#15679). `node scripts/check/check-file-size.mjs` neste branch: OK.⚠️ base-red inherited: diegosouzapw#15306 (timeouts de suíte no tip, não neste diff).
… PR base sha, integration port race (diegosouzapw#15590) Onda 3 (woodsonl) validada num único board em `.claude/worktrees/batch-w3` sobre `origin/release/v3.8.52` (`4f4c983347b9`), 27 PRs, superfícies protegidas 0. Evidência: `typecheck:core` limpo. i18n drift limpo no board. changelog-integrity ok. file-size ok (170 congelados). complexity 2975/3218 e cognitive-complexity 1357/1437 dentro do baseline. node:test focado: 1868 passaram, 0 falharam. Vitest da UI: 150 passaram em 12 arquivos. Os 38 do RTK caem no `useCallback` nulo de `node_modules/node_modules/react` via zustand, o mesmo React duplicado desta worktree. Onde dois PRs mexiam no mesmo save, o board ficou com os dois comportamentos: escrita parcial de engine por id e a fila/resync do PR que entrou depois. O hash de `.i18n-state.json` do guia de quality-gates entra no follow-up, fora do squash.⚠️ base-red inherited: diegosouzapw#15306 (timeouts de suíte no tip, não neste diff). Obrigado, @woodsonl.
…ouzapw#15298) Onda 3 (woodsonl) validada num único board em `.claude/worktrees/batch-w3` sobre `origin/release/v3.8.52` (`4f4c983347b9`), 27 PRs, superfícies protegidas 0. Evidência: `typecheck:core` limpo. i18n drift limpo no board. changelog-integrity ok. file-size ok (170 congelados). complexity 2975/3218 e cognitive-complexity 1357/1437 dentro do baseline. node:test focado: 1868 passaram, 0 falharam. Vitest da UI: 150 passaram em 12 arquivos. Os 38 do RTK caem no `useCallback` nulo de `node_modules/node_modules/react` via zustand, o mesmo React duplicado desta worktree. Onde dois PRs mexiam no mesmo save, o board ficou com os dois comportamentos: escrita parcial de engine por id e a fila/resync do PR que entrou depois. O hash de `.i18n-state.json` do guia de quality-gates entra no follow-up, fora do squash.⚠️ base-red inherited: diegosouzapw#15306 (timeouts de suíte no tip, não neste diff). Obrigado, @woodsonl.
Onda 3 (woodsonl) validada num único board em `.claude/worktrees/batch-w3` sobre `origin/release/v3.8.52` (`4f4c983347b9`), 27 PRs, superfícies protegidas 0. Evidência: `typecheck:core` limpo. i18n drift limpo no board. changelog-integrity ok. file-size ok (170 congelados). complexity 2975/3218 e cognitive-complexity 1357/1437 dentro do baseline. node:test focado: 1868 passaram, 0 falharam. Vitest da UI: 150 passaram em 12 arquivos. Os 38 do RTK caem no `useCallback` nulo de `node_modules/node_modules/react` via zustand, o mesmo React duplicado desta worktree. Onde dois PRs mexiam no mesmo save, o board ficou com os dois comportamentos: escrita parcial de engine por id e a fila/resync do PR que entrou depois. O hash de `.i18n-state.json` do guia de quality-gates entra no follow-up, fora do squash.⚠️ base-red inherited: diegosouzapw#15306 (timeouts de suíte no tip, não neste diff). Obrigado, @woodsonl.
…egosouzapw#15607) Onda 3 (woodsonl) validada num único board em `.claude/worktrees/batch-w3` sobre `origin/release/v3.8.52` (`4f4c983347b9`), 27 PRs, superfícies protegidas 0. Evidência: `typecheck:core` limpo. i18n drift limpo no board. changelog-integrity ok. file-size ok (170 congelados). complexity 2975/3218 e cognitive-complexity 1357/1437 dentro do baseline. node:test focado: 1868 passaram, 0 falharam. Vitest da UI: 150 passaram em 12 arquivos. Os 38 do RTK caem no `useCallback` nulo de `node_modules/node_modules/react` via zustand, o mesmo React duplicado desta worktree. Onde dois PRs mexiam no mesmo save, o board ficou com os dois comportamentos: escrita parcial de engine por id e a fila/resync do PR que entrou depois. O hash de `.i18n-state.json` do guia de quality-gates entra no follow-up, fora do squash.⚠️ base-red inherited: diegosouzapw#15306 (timeouts de suíte no tip, não neste diff). Obrigado, @woodsonl.
…map derivation (diegosouzapw#15601) Onda 3 (woodsonl) validada num único board em `.claude/worktrees/batch-w3` sobre `origin/release/v3.8.52` (`4f4c983347b9`), 27 PRs, superfícies protegidas 0. Evidência: `typecheck:core` limpo. i18n drift limpo no board. changelog-integrity ok. file-size ok (170 congelados). complexity 2975/3218 e cognitive-complexity 1357/1437 dentro do baseline. node:test focado: 1868 passaram, 0 falharam. Vitest da UI: 150 passaram em 12 arquivos. Os 38 do RTK caem no `useCallback` nulo de `node_modules/node_modules/react` via zustand, o mesmo React duplicado desta worktree. Onde dois PRs mexiam no mesmo save, o board ficou com os dois comportamentos: escrita parcial de engine por id e a fila/resync do PR que entrou depois. O hash de `.i18n-state.json` do guia de quality-gates entra no follow-up, fora do squash.⚠️ base-red inherited: diegosouzapw#15306 (timeouts de suíte no tip, não neste diff). Obrigado, @woodsonl.
… row (diegosouzapw#15613) Onda 3 (woodsonl) validada num único board em `.claude/worktrees/batch-w3` sobre `origin/release/v3.8.52` (`4f4c983347b9`), 27 PRs, superfícies protegidas 0. Evidência: `typecheck:core` limpo. i18n drift limpo no board. changelog-integrity ok. file-size ok (170 congelados). complexity 2975/3218 e cognitive-complexity 1357/1437 dentro do baseline. node:test focado: 1868 passaram, 0 falharam. Vitest da UI: 150 passaram em 12 arquivos. Os 38 do RTK caem no `useCallback` nulo de `node_modules/node_modules/react` via zustand, o mesmo React duplicado desta worktree. Onde dois PRs mexiam no mesmo save, o board ficou com os dois comportamentos: escrita parcial de engine por id e a fila/resync do PR que entrou depois. O hash de `.i18n-state.json` do guia de quality-gates entra no follow-up, fora do squash.⚠️ base-red inherited: diegosouzapw#15306 (timeouts de suíte no tip, não neste diff). Obrigado, @woodsonl.
diegosouzapw#15609) Onda 3 (woodsonl) validada num único board em `.claude/worktrees/batch-w3` sobre `origin/release/v3.8.52` (`4f4c983347b9`), 27 PRs, superfícies protegidas 0. Evidência: `typecheck:core` limpo. i18n drift limpo no board. changelog-integrity ok. file-size ok (170 congelados). complexity 2975/3218 e cognitive-complexity 1357/1437 dentro do baseline. node:test focado: 1868 passaram, 0 falharam. Vitest da UI: 150 passaram em 12 arquivos. Os 38 do RTK caem no `useCallback` nulo de `node_modules/node_modules/react` via zustand, o mesmo React duplicado desta worktree. Onde dois PRs mexiam no mesmo save, o board ficou com os dois comportamentos: escrita parcial de engine por id e a fila/resync do PR que entrou depois. O hash de `.i18n-state.json` do guia de quality-gates entra no follow-up, fora do squash.⚠️ base-red inherited: diegosouzapw#15306 (timeouts de suíte no tip, não neste diff). Obrigado, @woodsonl.
…w#15614) Onda 3 (woodsonl) validada num único board em `.claude/worktrees/batch-w3` sobre `origin/release/v3.8.52` (`4f4c983347b9`), 27 PRs, superfícies protegidas 0. Evidência: `typecheck:core` limpo. i18n drift limpo no board. changelog-integrity ok. file-size ok (170 congelados). complexity 2975/3218 e cognitive-complexity 1357/1437 dentro do baseline. node:test focado: 1868 passaram, 0 falharam. Vitest da UI: 150 passaram em 12 arquivos. Os 38 do RTK caem no `useCallback` nulo de `node_modules/node_modules/react` via zustand, o mesmo React duplicado desta worktree. Onde dois PRs mexiam no mesmo save, o board ficou com os dois comportamentos: escrita parcial de engine por id e a fila/resync do PR que entrou depois. O hash de `.i18n-state.json` do guia de quality-gates entra no follow-up, fora do squash.⚠️ base-red inherited: diegosouzapw#15306 (timeouts de suíte no tip, não neste diff). Obrigado, @woodsonl.
…zapw#15591) Onda 3 (woodsonl) validada num único board em `.claude/worktrees/batch-w3` sobre `origin/release/v3.8.52` (`4f4c983347b9`), 27 PRs, superfícies protegidas 0. Evidência: `typecheck:core` limpo. i18n drift limpo no board. changelog-integrity ok. file-size ok (170 congelados). complexity 2975/3218 e cognitive-complexity 1357/1437 dentro do baseline. node:test focado: 1868 passaram, 0 falharam. Vitest da UI: 150 passaram em 12 arquivos. Os 38 do RTK caem no `useCallback` nulo de `node_modules/node_modules/react` via zustand, o mesmo React duplicado desta worktree. Onde dois PRs mexiam no mesmo save, o board ficou com os dois comportamentos: escrita parcial de engine por id e a fila/resync do PR que entrou depois. O hash de `.i18n-state.json` do guia de quality-gates entra no follow-up, fora do squash.⚠️ base-red inherited: diegosouzapw#15306 (timeouts de suíte no tip, não neste diff). Obrigado, @woodsonl.
…e catalogs (diegosouzapw#15599) Onda 3 (woodsonl) validada num único board em `.claude/worktrees/batch-w3` sobre `origin/release/v3.8.52` (`4f4c983347b9`), 27 PRs, superfícies protegidas 0. Evidência: `typecheck:core` limpo. i18n drift limpo no board. changelog-integrity ok. file-size ok (170 congelados). complexity 2975/3218 e cognitive-complexity 1357/1437 dentro do baseline. node:test focado: 1868 passaram, 0 falharam. Vitest da UI: 150 passaram em 12 arquivos. Os 38 do RTK caem no `useCallback` nulo de `node_modules/node_modules/react` via zustand, o mesmo React duplicado desta worktree. Onde dois PRs mexiam no mesmo save, o board ficou com os dois comportamentos: escrita parcial de engine por id e a fila/resync do PR que entrou depois. O hash de `.i18n-state.json` do guia de quality-gates entra no follow-up, fora do squash.⚠️ base-red inherited: diegosouzapw#15306 (timeouts de suíte no tip, não neste diff). Obrigado, @woodsonl.
…pw#15346) Onda 3 (woodsonl) validada num único board em `.claude/worktrees/batch-w3` sobre `origin/release/v3.8.52` (`4f4c983347b9`), 27 PRs, superfícies protegidas 0. Evidência: `typecheck:core` limpo. i18n drift limpo no board. changelog-integrity ok. file-size ok (170 congelados). complexity 2975/3218 e cognitive-complexity 1357/1437 dentro do baseline. node:test focado: 1868 passaram, 0 falharam. Vitest da UI: 150 passaram em 12 arquivos. Os 38 do RTK caem no `useCallback` nulo de `node_modules/node_modules/react` via zustand, o mesmo React duplicado desta worktree. Onde dois PRs mexiam no mesmo save, o board ficou com os dois comportamentos: escrita parcial de engine por id e a fila/resync do PR que entrou depois. O hash de `.i18n-state.json` do guia de quality-gates entra no follow-up, fora do squash.⚠️ base-red inherited: diegosouzapw#15306 (timeouts de suíte no tip, não neste diff). Obrigado, @woodsonl.
…thrown save (diegosouzapw#15600) Onda 3 (woodsonl) validada num único board em `.claude/worktrees/batch-w3` sobre `origin/release/v3.8.52` (`4f4c983347b9`), 27 PRs, superfícies protegidas 0. Evidência: `typecheck:core` limpo. i18n drift limpo no board. changelog-integrity ok. file-size ok (170 congelados). complexity 2975/3218 e cognitive-complexity 1357/1437 dentro do baseline. node:test focado: 1868 passaram, 0 falharam. Vitest da UI: 150 passaram em 12 arquivos. Os 38 do RTK caem no `useCallback` nulo de `node_modules/node_modules/react` via zustand, o mesmo React duplicado desta worktree. Onde dois PRs mexiam no mesmo save, o board ficou com os dois comportamentos: escrita parcial de engine por id e a fila/resync do PR que entrou depois. O hash de `.i18n-state.json` do guia de quality-gates entra no follow-up, fora do squash.⚠️ base-red inherited: diegosouzapw#15306 (timeouts de suíte no tip, não neste diff). Obrigado, @woodsonl.
diegosouzapw#15583) Onda 3 (woodsonl) validada num único board em `.claude/worktrees/batch-w3` sobre `origin/release/v3.8.52` (`4f4c983347b9`), 27 PRs, superfícies protegidas 0. Evidência: `typecheck:core` limpo. i18n drift limpo no board. changelog-integrity ok. file-size ok (170 congelados). complexity 2975/3218 e cognitive-complexity 1357/1437 dentro do baseline. node:test focado: 1868 passaram, 0 falharam. Vitest da UI: 150 passaram em 12 arquivos. Os 38 do RTK caem no `useCallback` nulo de `node_modules/node_modules/react` via zustand, o mesmo React duplicado desta worktree. Onde dois PRs mexiam no mesmo save, o board ficou com os dois comportamentos: escrita parcial de engine por id e a fila/resync do PR que entrou depois. O hash de `.i18n-state.json` do guia de quality-gates entra no follow-up, fora do squash.⚠️ base-red inherited: diegosouzapw#15306 (timeouts de suíte no tip, não neste diff). Obrigado, @woodsonl.
…pw#15593) Onda 3 (woodsonl) validada num único board em `.claude/worktrees/batch-w3` sobre `origin/release/v3.8.52` (`4f4c983347b9`), 27 PRs, superfícies protegidas 0. Evidência: `typecheck:core` limpo. i18n drift limpo no board. changelog-integrity ok. file-size ok (170 congelados). complexity 2975/3218 e cognitive-complexity 1357/1437 dentro do baseline. node:test focado: 1868 passaram, 0 falharam. Vitest da UI: 150 passaram em 12 arquivos. Os 38 do RTK caem no `useCallback` nulo de `node_modules/node_modules/react` via zustand, o mesmo React duplicado desta worktree. Onde dois PRs mexiam no mesmo save, o board ficou com os dois comportamentos: escrita parcial de engine por id e a fila/resync do PR que entrou depois. O hash de `.i18n-state.json` do guia de quality-gates entra no follow-up, fora do squash.⚠️ base-red inherited: diegosouzapw#15306 (timeouts de suíte no tip, não neste diff). Obrigado, @woodsonl.
…ig saves (diegosouzapw#15592) Onda 3 (woodsonl) validada num único board em `.claude/worktrees/batch-w3` sobre `origin/release/v3.8.52` (`4f4c983347b9`), 27 PRs, superfícies protegidas 0. Evidência: `typecheck:core` limpo. i18n drift limpo no board. changelog-integrity ok. file-size ok (170 congelados). complexity 2975/3218 e cognitive-complexity 1357/1437 dentro do baseline. node:test focado: 1868 passaram, 0 falharam. Vitest da UI: 150 passaram em 12 arquivos. Os 38 do RTK caem no `useCallback` nulo de `node_modules/node_modules/react` via zustand, o mesmo React duplicado desta worktree. Onde dois PRs mexiam no mesmo save, o board ficou com os dois comportamentos: escrita parcial de engine por id e a fila/resync do PR que entrou depois. O hash de `.i18n-state.json` do guia de quality-gates entra no follow-up, fora do squash.⚠️ base-red inherited: diegosouzapw#15306 (timeouts de suíte no tip, não neste diff). Obrigado, @woodsonl.
…d fails (diegosouzapw#15587) Onda 3 (woodsonl) validada num único board em `.claude/worktrees/batch-w3` sobre `origin/release/v3.8.52` (`4f4c983347b9`), 27 PRs, superfícies protegidas 0. Evidência: `typecheck:core` limpo. i18n drift limpo no board. changelog-integrity ok. file-size ok (170 congelados). complexity 2975/3218 e cognitive-complexity 1357/1437 dentro do baseline. node:test focado: 1868 passaram, 0 falharam. Vitest da UI: 150 passaram em 12 arquivos. Os 38 do RTK caem no `useCallback` nulo de `node_modules/node_modules/react` via zustand, o mesmo React duplicado desta worktree. Onde dois PRs mexiam no mesmo save, o board ficou com os dois comportamentos: escrita parcial de engine por id e a fila/resync do PR que entrou depois. O hash de `.i18n-state.json` do guia de quality-gates entra no follow-up, fora do squash.⚠️ base-red inherited: diegosouzapw#15306 (timeouts de suíte no tip, não neste diff). Obrigado, @woodsonl.
…ouzapw#15612) Onda 3 (woodsonl) validada num único board em `.claude/worktrees/batch-w3` sobre `origin/release/v3.8.52` (`4f4c983347b9`), 27 PRs, superfícies protegidas 0. Evidência: `typecheck:core` limpo. i18n drift limpo no board. changelog-integrity ok. file-size ok (170 congelados). complexity 2975/3218 e cognitive-complexity 1357/1437 dentro do baseline. node:test focado: 1868 passaram, 0 falharam. Vitest da UI: 150 passaram em 12 arquivos. Os 38 do RTK caem no `useCallback` nulo de `node_modules/node_modules/react` via zustand, o mesmo React duplicado desta worktree. Onde dois PRs mexiam no mesmo save, o board ficou com os dois comportamentos: escrita parcial de engine por id e a fila/resync do PR que entrou depois. O hash de `.i18n-state.json` do guia de quality-gates entra no follow-up, fora do squash.⚠️ base-red inherited: diegosouzapw#15306 (timeouts de suíte no tip, não neste diff). Obrigado, @woodsonl.
The wave-3 board already validated this overlap. This commit is that resolution.
diegosouzapw
merged commit Oct 6, 2026
39f788b
into
diegosouzapw:release/v3.8.52
5 of 9 checks passed
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.
release/v3.8.52carries hard failures (unit/integration/package gate timeouts, one MCP audit vitest test, an ai-attribution range error). None touch the compression preview route; every lane this PR needs is green locally and recorded below.Summary
The Aggressive and Ultra engine pages send their form values as preview config (
{ config: { aggressive: ... } }/{ config: { ultra: ... } }viaEngineConfigPage.handlePreview), and the preview route validated those keys, butdispatchCompressionbuilt the engineId/pipeline-branch config fromstackedPipeline,headroom,fidelityGate,riskGateand the QuantumLock patch only. The engines readoptions?.config?.aggressive/options?.config?.ultra(cavemanAdapter.ts), found nothing, and every preview ran on built-in defaults: ultra reported identical 46% savings with no config, withcompressionRate: 1, and withminScoreThreshold: 0.What changed:
POST /api/compression/preview: the engineId branch and the pipeline branch now threadconfig.aggressiveandconfig.ultrainto the synthesized config, the same wayheadroomalready was. The engines fill missing fields from their defaults.EngineConfigPage:handlePreviewandhandleSavestrip empty-string form values before building theaggressive/ultrapayloads. The Ultra page seedsmodelPath: ""from the schema default, andultraConfigSchemarequiresmin(1)when present, so preview and save 400ed on default form state before the threading could run. The only string field in any engine schema isultra.modelPath, which must be non-empty, so no legitimate value is lost.Decision: a preview with no config keeps the engines' built-in defaults and does not load saved settings. Loading saved settings would couple the dry-run route to the settings store and silently change the Lite, Session Dedup and CCR previews, which send no config at all. Operators who want the saved values in a preview send them, and after the page fix the Aggressive/Ultra pages do exactly that.
Test Coverage
Tests: 2 test files before → 1 new file (
tests/unit/api/compression-preview-engine-config.test.ts, 4 tests) + 1 extended (tests/unit/ui/engineConfigPage.test.tsx, +2 cases). Coverage: 100% of changed branch-states (the coverage audit initially flagged the pipeline-branch aggressive thread as a gap; its diagram showed 9/10 protected and commit 106a2fa closed the tenth).Test value: 6 tests written, 0 rejected by the authoring gate, 1 existing test file extended, 0 paths weakly covered.
Regression proofs:
compressionRate: 1), passes after the fix.sentConfig.aggressivespreads fails exactly that test; restored, it passes.modelPath: ""; both tests failed and pass after the strip.Pre-Landing Review
Final checklist pass on the full diff: clean (two-pass CRITICAL/INFORMATIONAL, enum completeness traced to the engine adapters, frontend helper verified to keep
0/falseand only strip"", lite save path unaffected).Adversarial and review cycles across the branch surfaced four pre-existing issues. They are out of scope here and need their own TDD'd PRs:
preserveSystemPromptclobber (lead follow-up). Both engine adapters end their config merge withpreserveSystemPrompt: options?.config?.preserveSystemPrompt !== false, reading the top-level key, so the per-engine value the form sends and saves is discarded at apply time. This branch delivers the sub-object to the adapter; the adapter then overwrites it. Fixing it means changing production merge precedence against the documented T05/C5 top-level authority (preserveSystemPromptMode), so it should not ride along here.modelPath/slmFallbackToAggressivestay inert because the SLM resolver is reachable only via the mode-based production path.settings.aggressive/settings.ultrafor saved steps (resolveStepDetailConfigmaps only lite/headroom/session-dedup/ccr).modelPath(e.g." ") survives the empty-string strip and fails the schema with a generic UI error. Schema-accurate, but the page could pre-trim.Exploratory QA
Functional run against the route handler in-process (temp
DATA_DIR, isolated DB, no network). Contract outcomes, all pass:compressionRate: 1→ 0 savings while the default run prunes).maxTokensPerMessage: 256forces the fallback summarizer,[COMPRESSED:summary]marker present).compressionRate: 5→ HTTP 400 before dispatch.Red/green proofs recorded above. Evidence materialized with verdict pass; report at
.gstack/qa-reports/run-20261005T220555Z/.Design Review
No visual UI changes — the page diff is data-flow only (payload construction in
handlePreview/handleSave); design review skipped.Eval Results
No prompt-related files changed — evals skipped.
Scope Drift
Scope Check: CLEAN — every changed line traces to the threading fix, its regression tests, or the empty-string strip that unblocks the Ultra page's own preview path.
Plan Completion
7/7 items DONE (fallback intent sources: commit messages + the task statement): thread aggressive/ultra in the engineId branch, thread in the pipeline branch, end-to-end contract verified against
EngineConfigPage's real payload shape, failing test undertests/unit/withcompressionRate: 1, output-differs assertion, both-branch and both-engine coverage, no-saved-settings decision stated in this PR.Verification Results
4 lanes executed on the exact reviewed tree, all FRESH at check time: focused suite 36/36 (
node --import tsx/esm --testover the 15 preview/compression test files), vitest 493/493 (npm run test:vitest),npm run typecheck:coreclean, eslint clean on all four changed files. Production build is CI's responsibility per CONTRIBUTING.md (#8084). Coverage gate and full unit shards run in CI on the PR.Documentation
Status: current — read-only ship-owned audit found no documentation the diff makes stale; no edits needed. Audited every English doc claiming preview-endpoint behavior:
docs/openapi.yaml(config isadditionalProperties: true, so the threaded sub-objects are accepted, not contradicted),docs/reference/API_REFERENCE.md,docs/compression/*,docs/architecture/ARCHITECTURE.md,docs/README.md— all current. Debt (predates this diff): the preview endpoint's threaded config sub-keys have reference-only coverage; a how-to section indocs/compression/COMPRESSION_ENGINES.mdis suggested follow-up work.Test plan
node --import tsx/esm --test(15 focused preview/compression files): 36 pass, 0 failnpm run test:vitest: 493 pass, 0 failnpm run typecheck:core: cleaneslinton the four changed files: clean