# Changelog

## Score

- CAI 52 → 55 (+2.5)
- Rubric changed (rubric-2026.09.11 → rubric-2026.09.18) — scores are not directly comparable.

## Lenses

- Code Health 65 → 65 (+0.7)
- Architecture 96 → 98 (+2.2)
- Maturity 77 → 76 (-0.3)
- Readiness 43 → 47 (+3.1)
- Security 44 → 55 (+11.0)
- Event Sourcing 100 → 100 (+0.0)
- Performance 70 → 57 (-13.0)

## Resolved (100)

- Change coupling: metadata.rs ↔ iggy_partitions.rs (core/metadata/src/impls/metadata.rs)
- Change coupling: plane_helpers.rs ↔ lib.rs (core/consensus/src/plane_helpers.rs)
- DiskReadPlan::read_disk (cyclomatic 20) (core/partitions/src/poll_plan.rs)
- Documentation: no installation or build instructions (README.md)
- Documentation: no usage examples (README.md)
- Duplicated block (10 lines × 2) (core/connectors/sources/postgres_source/src/lib.rs)
- Duplicated block (10 lines × 2) (core/partitions/src/iggy_partition.rs)
- Duplicated block (10 lines × 3) (core/server/src/segment_recovery.rs)
- Duplicated block (10–13 lines × 2) (core/consensus/src/plane_helpers.rs)
- Duplicated block (11 lines × 2) (core/binary_protocol/src/requests/messages/flush_unsaved_buffer.rs)
- Duplicated block (11 lines × 2) (core/consensus/src/plane_helpers.rs)
- Duplicated block (11 lines × 2) (core/server/src/partition_helpers.rs)
- Duplicated block (11 lines × 3) (core/server/src/partition_helpers.rs)
- Duplicated block (14 lines × 2) (core/integration/src/harness/seeds.rs)
- Duplicated block (14 lines × 2) (core/message_bus/src/transports/tcp_tls.rs)
- Duplicated block (14 lines × 2) (core/sdk/src/quic/quic_client.rs)
- Duplicated block (15 lines × 2) (core/integration/src/harness/handle/connectors_runtime.rs)
- Duplicated block (15 lines × 2) (core/server/src/dispatch/partition.rs)
- Duplicated block (17 lines × 2) (core/message_bus/src/transports/wss.rs)
- Duplicated block (20 lines × 2) (core/connectors/sinks/postgres_sink/src/lib.rs)
- …and 80 more

## New (301)

- Ambiguous naming for similar operations. `ReceiveAsync` returns `ReceivedMessage` (which wraps `MessageResponse`), while `ReceiveRentedAsync` returns `ReceivedRentedMessage` (which wraps `RentedMessageResponse`). The distinction between 'Message' and 'RentedMessage' is not immediately obvious to a user and suggests a potential naming inconsistency regarding memory ownership semantics.
- Change coupling: iggy_partition.rs ↔ metrics.rs (core/partitions/src/iggy_partition.rs)
- CommandResponseStream._pollOnPrimary (cognitive 86) (foreign/node/src/client/client.socket.ts)
- CommandResponseStream._pollOnPrimary (cyclomatic 40) (foreign/node/src/client/client.socket.ts)
- CommandResponseStream._rememberCredentials (cognitive 18) (foreign/node/src/client/client.socket.ts)
- DiskReadPlan::walk_segment (cognitive 23) (core/partitions/src/poll_plan.rs)
- Documentation: no architecture or design documentation (core/server/README.md)
- Duplicate intent across generic and non-generic builders. The non-generic `IggyConsumerBuilder` and generic `IggyConsumerBuilder<T>` have nearly identical `Create` signatures, differing only by the presence of a deserializer. This forces users to choose between two parallel builder hierarchies for essentially the same operation.
- Duplicated block (10 lines × 2) (core/connectors/sources/postgres_source/src/lib.rs)
- Duplicated block (10 lines × 2) (core/partitions/src/partition_storage.rs)
- Duplicated block (10 lines × 2) (examples/csharp/src/Basic/Iggy_SDK.Examples.Basic.Consumer/Settings.cs)
- Duplicated block (10 lines × 2) (examples/python/high-level/background_producer.py)
- Duplicated block (10 lines × 2) (foreign/java/bench/src/main/java/org/apache/iggy/bench/report/FinalReportBuilder.java)
- Duplicated block (10 lines × 3) (core/partitions/src/segment_recovery.rs)
- Duplicated block (11 lines × 2) (core/partitions/src/partition_storage.rs)
- Duplicated block (11 lines × 2) (examples/java/src/main/java/org/apache/iggy/examples/multitenant/consumer/MultiTenantConsumer.java)
- Duplicated block (11 lines × 2) (examples/java/src/main/java/org/apache/iggy/examples/multitenant/consumer/MultiTenantConsumer.java)
- Duplicated block (11 lines × 2) (examples/python/basic/consumer.py)
- Duplicated block (11 lines × 2) (foreign/go/contracts/node_status.go)
- Duplicated block (11 lines × 3) (core/partitions/src/partition_storage.rs)
- …and 281 more

## Changes since last survey

- 87 commits — 63 feature/other, 24 fixes

## By area

- gateways/kafka — 13 commits
- .github/workflows — 8 commits
- core/connectors — 7 commits
- core/server — 6 commits
- core/integration — 5 commits
- (root) — 4 commits
- core/partitions — 4 commits
- core/message_bus — 3 commits
- foreign/cpp — 3 commits
- foreign/csharp — 3 commits
- foreign/go — 3 commits
- foreign/java — 3 commits
- foreign/node — 3 commits
- foreign/swift — 3 commits
- web/package-lock.json — 3 commits
- .github/review-bot — 2 commits
- bdd/go — 2 commits
- core/configs — 2 commits
- examples/python — 2 commits
- foreign/python — 2 commits

## Notable commits

- fix: fix(ci): don't mark PRs stale while they wait on review (#4172)
- fix: fix(ci): edit the Codecov PR comment once per run, not per test leg (#4326)
- fix: fix(ci): let committers with private org membership run PR commands (#4319)
- fix: fix(ci): retry flaky downloads and stop dry runs promising new tags (#4216)
- fix: fix(cluster): preserve group membership and reduce produce/poll overhead (#4169)
- fix: fix(cluster): prevent spurious heartbeat elections (#4194)
- fix: fix(cluster): stop partition repair asking for an inverted op range (#4246)
- fix: fix(configs): check server env vars once and refuse boot only in debug (#4200)
- fix: fix(connectors): defer postgres source progress until ack (#3957)
- fix: fix(connectors): defer source checkpoints and surface sink failures (#4153)
- fix: fix(connectors): disable SELinux label checks for WireMock test containers (#4265)
- fix: fix(connectors): meilisearch_sink URL scheme check is case-sensitive (#4158)
- fix: fix(connectors): refuse http_source bodies Iggy cannot store (#4302)
- fix: fix(connectors): tag sink batches with the payload's schema (#4204)
- fix: fix(connectors): validate sink writes and startup readiness (#4154)
- fix: fix(node): stop dropping and corrupting tokens in list responses (#4171)
- fix: fix(partitions): account for segment-backed append batches (#4202)
- fix: fix(partitions): handle clippy with poll diagnostics disabled (#4203)
- fix: fix(partitions): reject queued offsets after history resets (#4325)
- fix: fix(partitions): sync checkpoints through original writers (#4253)
- …and 67 more
