You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Protected develop@622e5e6c3d534f230c390f10e3832efadfc01825 exposes CdcSourceConnector.validate(Map<String,String>) as the source-configuration validation boundary and start(config) as the control surface. The production PostgresDebeziumCdcSource historically accepted any non-null map and then delegated to CdcService.start(), whose live Debezium configuration is built from deployment environment variables. Caller-supplied host/slot/credential/include-list values were therefore silently ignored.
That is an API-integrity defect: a caller can believe a supplied configuration was validated/applied even though it cannot affect the running source. Silent ignore is worse than an explicit unsupported boundary because it can route capture from an unintended deployment-configured database while the caller believes a different source was selected.
RCA
Immediate cause: protected PostgresDebeziumCdcSource.validate checked only config != null.
Technical root cause: the generic SPI was introduced before the live PostgreSQL adapter gained per-call configuration ownership; the adapter delegates lifecycle but not configuration.
Systemic/control failure: prior tests proved empty-map delegation only and did not assert that non-empty caller configuration cannot be silently discarded.
Smallest safe remedy
Until the adapter is actually wired to a reviewed per-call configuration model, fail closed for non-empty maps with a stable, non-sensitive exception. Preserve Map.of()/empty-map delegation to the existing deployment-owned CdcService configuration. Do not invent database credentials or partially translate only some keys.
This is intentionally narrower than redesigning the entire source SPI. A future implementation may replace the rejection only when caller-supplied configuration is fully validated and becomes the authoritative Debezium input.
exact current GREEN source: 75065b5c675408f69b0eab918d58fef991950e0f;
current synthetic merge preview: 2a369886794b7d031ba952ac38ad6ceb2375d230;
exact live-base comparison: two commits ahead, zero behind, merge base exactly protected develop;
Draft / mergeable: true / true;
formal reviews: none;
unresolved review threads: zero.
RED
CI 31391184511, macOS job 93463055955, compiled normally and reached the real PostgresDebeziumCdcSource.start(config) boundary on synthetic merge ab39fd93fae3456cbeb5cbf6d7b55d2a9827f355. ETL passed 275/275. CDC ran 107 tests with exactly the new configuration test failing and zero errors/skips because production threw no IllegalArgumentException for a non-empty credential-like map. This is valid development RED rather than setup/import/dependency failure.
GREEN
Exact current source 75065b5c675408f69b0eab918d58fef991950e0f:
rejects null as before;
rejects every non-empty per-call map before service lookup/start;
emits a stable rejection message containing neither key nor value;
preserves empty-map delegation to deployment-configured CdcService;
documents the deployment-owned configuration boundary in public Javadocs.
All exposed current-head aggregates are terminal-success: CI 31392884219, Dependency Review 31392881274, CycloneDX SBOM 31392878898, SAST Semgrep 31392877894, and Security Scan 31392877892. CI macOS job 93468612634 checked synthetic merge 2a369886...; the full reactor completed BUILD SUCCESS, including ETL 275/275, CDC 107/107 and the focused configuration test 1/1.
Remaining acceptance boundary
This issue remains open because active PR behavior is not shipped truth. Current hosted proof is synthetic-merge development evidence rather than accepted literal-source proof. The same CI still reproduces the inherited Analyzed bundle 'etl-service' with 0 classes JaCoCo false-green; #162/#164 and #205 own non-vacuous applicable/repository-wide coverage, and #196 owns dependency-resolution/scanner completeness. No qualifying independent non-author formal approval exists on #239's unchanged current head.
TDD acceptance
Fail-first test reaches the real PostgresDebeziumCdcSource.start(config) boundary with a non-empty map and proves protected code accepts/ignores it. Satisfied as development RED on fix(cdc): reject ignored PostgreSQL source SPI config #239.
validate(Map.of()) and start(Map.of()) preserve current deployment-owned behavior. Satisfied by focused + existing lifecycle tests on the current candidate.
Null configuration remains rejected. Preserved by production validation contract.
Focused/full CDC and current CI/security/dependency/SBOM gates regenerate on the current head. Current aggregates are green, but literal-source, complete scanner, non-vacuous coverage and independent-review gates remain separate and non-passing.
Close this issue only after the accepted implementation is integrated into protected develop and protected-develop acceptance confirms the invariant. MySQL/SQL Server scaffold-retirement work remains separate.
Contract defect
Protected
develop@622e5e6c3d534f230c390f10e3832efadfc01825exposesCdcSourceConnector.validate(Map<String,String>)as the source-configuration validation boundary andstart(config)as the control surface. The productionPostgresDebeziumCdcSourcehistorically accepted any non-null map and then delegated toCdcService.start(), whose live Debezium configuration is built from deployment environment variables. Caller-supplied host/slot/credential/include-list values were therefore silently ignored.That is an API-integrity defect: a caller can believe a supplied configuration was validated/applied even though it cannot affect the running source. Silent ignore is worse than an explicit unsupported boundary because it can route capture from an unintended deployment-configured database while the caller believes a different source was selected.
RCA
PostgresDebeziumCdcSource.validatechecked onlyconfig != null.Smallest safe remedy
Until the adapter is actually wired to a reviewed per-call configuration model, fail closed for non-empty maps with a stable, non-sensitive exception. Preserve
Map.of()/empty-map delegation to the existing deployment-ownedCdcServiceconfiguration. Do not invent database credentials or partially translate only some keys.This is intentionally narrower than redesigning the entire source SPI. A future implementation may replace the rejection only when caller-supplied configuration is fully validated and becomes the authoritative Debezium input.
Live implementation state — active PR #239
Draft PR #239, branch
fix/postgres-spi-config-truth-622e5e6, now owns this bounded repair.develop@622e5e6c3d534f230c390f10e3832efadfc01825;9b98a3b74274c9488422638f2eca7640a34f8057;75065b5c675408f69b0eab918d58fef991950e0f;2a369886794b7d031ba952ac38ad6ceb2375d230;develop;RED
CI
31391184511, macOS job93463055955, compiled normally and reached the realPostgresDebeziumCdcSource.start(config)boundary on synthetic mergeab39fd93fae3456cbeb5cbf6d7b55d2a9827f355. ETL passed 275/275. CDC ran 107 tests with exactly the new configuration test failing and zero errors/skips because production threw noIllegalArgumentExceptionfor a non-empty credential-like map. This is valid development RED rather than setup/import/dependency failure.GREEN
Exact current source
75065b5c675408f69b0eab918d58fef991950e0f:nullas before;CdcService;All exposed current-head aggregates are terminal-success: CI
31392884219, Dependency Review31392881274, CycloneDX SBOM31392878898, SAST Semgrep31392877894, and Security Scan31392877892. CI macOS job93468612634checked synthetic merge2a369886...; the full reactor completedBUILD SUCCESS, including ETL 275/275, CDC 107/107 and the focused configuration test 1/1.Remaining acceptance boundary
This issue remains open because active PR behavior is not shipped truth. Current hosted proof is synthetic-merge development evidence rather than accepted literal-source proof. The same CI still reproduces the inherited
Analyzed bundle 'etl-service' with 0 classesJaCoCo false-green; #162/#164 and #205 own non-vacuous applicable/repository-wide coverage, and #196 owns dependency-resolution/scanner completeness. No qualifying independent non-author formal approval exists on #239's unchanged current head.TDD acceptance
PostgresDebeziumCdcSource.start(config)boundary with a non-empty map and proves protected code accepts/ignores it. Satisfied as development RED on fix(cdc): reject ignored PostgreSQL source SPI config #239.CdcServiceinteraction, with a stable message that does not echo keys or values. Satisfied on fix(cdc): reject ignored PostgreSQL source SPI config #239 current source.validate(Map.of())andstart(Map.of())preserve current deployment-owned behavior. Satisfied by focused + existing lifecycle tests on the current candidate.Close this issue only after the accepted implementation is integrated into protected
developand protected-develop acceptance confirms the invariant. MySQL/SQL Server scaffold-retirement work remains separate.