# Changelog

## Score

- CAI 53 → 59 (+5.4)
- Rubric changed (rubric-2026.08.17 → rubric-2026.08.18) — scores are not directly comparable.

## Lenses

- Code Health 75 → 74 (-1.2)
- Architecture 98 → 97 (-0.7)
- Maturity 75 → 72 (-2.2)
- Readiness 73 → 73 (+0.0)
- Security 28 → 41 (+12.6)

## Resolved (422)

- Boundary-crossing change coupling: CmdNamespaces.java ↔ PolicyName.java (pulsar-client-tools/src/main/java/org/apache/pulsar/admin/cli/CmdNamespaces.java)
- Boundary-crossing change coupling: ConsumerBuilder.java ↔ ConsumerConfigurationData.java (pulsar-client-api/src/main/java/org/apache/pulsar/client/api/ConsumerBuilder.java)
- Boundary-crossing change coupling: PersistentSubscription.java ↔ SubscriptionStats.java (pulsar-broker/src/main/java/org/apache/pulsar/broker/service/persistent/PersistentSubscription.java)
- ConsumerImpl.hasMessageAvailableAsync (cyclomatic 18) (pulsar-client/src/main/java/org/apache/pulsar/client/impl/ConsumerImpl.java)
- Critical IaC: AWS-0104 (deployment/terraform-ansible/aws/security.tf)
- Dependency hygiene not measured — no supported dependency manifest was read
- Duplicated block (10 lines × 2) (pulsar-broker-common/src/main/java/org/apache/pulsar/broker/web/plugin/servlet/AdditionalServletWithClassLoader.java)
- Duplicated block (10 lines × 2) (pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/impl/BrokersBase.java)
- Duplicated block (10 lines × 2) (pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/impl/PersistentTopicsBase.java)
- Duplicated block (10 lines × 2) (pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/impl/PersistentTopicsBase.java)
- Duplicated block (10 lines × 2) (pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/impl/TransactionsBase.java)
- Duplicated block (10 lines × 2) (pulsar-broker/src/main/java/org/apache/pulsar/broker/loadbalance/extensions/ExtensibleLoadManagerImpl.java)
- Duplicated block (10 lines × 2) (pulsar-broker/src/main/java/org/apache/pulsar/broker/service/Consumer.java)
- Duplicated block (10 lines × 2) (pulsar-broker/src/main/java/org/apache/pulsar/broker/service/persistent/GeoPersistentReplicator.java)
- Duplicated block (10 lines × 2) (pulsar-broker/src/main/java/org/apache/pulsar/broker/service/persistent/PersistentDispatcherMultipleConsumers.java)
- Duplicated block (10 lines × 2) (pulsar-broker/src/main/java/org/apache/pulsar/broker/service/persistent/PersistentDispatcherMultipleConsumers.java)
- Duplicated block (10 lines × 2) (pulsar-broker/src/main/java/org/apache/pulsar/broker/service/persistent/PersistentSubscription.java)
- Duplicated block (10 lines × 2) (pulsar-broker/src/main/java/org/apache/pulsar/broker/service/persistent/PersistentTopic.java)
- Duplicated block (10 lines × 2) (pulsar-broker/src/main/java/org/apache/pulsar/broker/service/persistent/PersistentTopic.java)
- Duplicated block (10 lines × 2) (pulsar-broker/src/main/java/org/apache/pulsar/broker/service/persistent/PersistentTopic.java)
- …and 402 more

## New (605)

- Boundary-crossing change coupling: Namespaces.java ↔ PolicyName.java (pulsar-client-admin-api/src/main/java/org/apache/pulsar/client/admin/Namespaces.java)
- Boundary-crossing change coupling: PersistentTopic.java ↔ TopicStats.java (pulsar-broker/src/main/java/org/apache/pulsar/broker/service/persistent/PersistentTopic.java)
- BucketDelayedDeliveryTracker.selectMergedBuckets (cognitive 16) (pulsar-broker/src/main/java/org/apache/pulsar/broker/delayed/bucket/BucketDelayedDeliveryTracker.java)
- Build action pinned to a mutable branch
- Change coupling clique: PersistentSubscription.java, AggregatedSubscriptionStats.java, SubscriptionStats.java (pulsar-broker/src/main/java/org/apache/pulsar/broker/service/persistent/PersistentSubscription.java)
- Dependency hygiene not measured — dependency manifest found but not parsed for hygiene
- Duplicated block (10 lines × 10) (pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/v2/PersistentTopics.java)
- Duplicated block (10 lines × 19) (pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/v2/Namespaces.java)
- Duplicated block (10 lines × 2) (pulsar-broker-common/src/main/java/org/apache/pulsar/broker/authorization/PulsarAuthorizationProvider.java)
- Duplicated block (10 lines × 2) (pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/impl/NamespacesBase.java)
- Duplicated block (10 lines × 2) (pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/impl/NamespacesBase.java)
- Duplicated block (10 lines × 2) (pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/impl/PersistentTopicsBase.java)
- Duplicated block (10 lines × 2) (pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/impl/PersistentTopicsBase.java)
- Duplicated block (10 lines × 2) (pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/impl/PersistentTopicsBase.java)
- Duplicated block (10 lines × 2) (pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/impl/PersistentTopicsBase.java)
- Duplicated block (10 lines × 2) (pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/impl/PersistentTopicsBase.java)
- Duplicated block (10 lines × 2) (pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/impl/TransactionsBase.java)
- Duplicated block (10 lines × 2) (pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/v2/Namespaces.java)
- Duplicated block (10 lines × 2) (pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/v2/Namespaces.java)
- Duplicated block (10 lines × 2) (pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/v2/PersistentTopics.java)
- …and 585 more

## Changes since last survey

- 37 commits — 6 feature/other, 31 fixes

## By area

- pulsar-broker/src — 17 commits
- managed-ledger/src — 4 commits
- pulsar-metadata/src — 4 commits
- distribution/server — 3 commits
- pulsar-common/src — 3 commits
- docker/pulsar — 1 commit
- pulsar-client/src — 1 commit
- pulsar-function-go/examples — 1 commit
- pulsar-function-go/go.mod — 1 commit
- pulsar-functions/instance — 1 commit
- pulsar-functions/utils — 1 commit

## Notable commits

- fix: [fix][broker] Check deliverAt before containsMessage in bucket addMessage (#26230)
- fix: [fix][broker] Fix Key_Shared delivery stall when look-ahead triggers at the end of the topic (#26236)
- fix: [fix][broker] Fix TableViewLoadDataStoreImpl close deadlock that stalls broker shutdown (#26243)
- fix: [fix][broker] Fix `getEstimatedSizeSinceMarkDeletePosition` throw `IllegalArgumentException` (#26184)
- fix: [fix][broker] Fix delayed message index data loss when trimming overlapping bucket snapshots (#26240)
- fix: [fix][broker] Fix delayed-delivery bucket merge failures when delayedDeliveryMaxNumBuckets is 1-3 (#26242)
- fix: [fix][broker] Fix incorrect listener URLs returned by ModularLoadManager lookups (#26245)
- fix: [fix][broker] Fix silently dropped acknowledgement failures in PulsarMetadataEventSynchronizer (#26237)
- fix: [fix][broker] Log exception in PulsarMetadataEventSynchronizer failure path (#26203)
- fix: [fix][broker] Prevent completing replicated snapshot before marker publish (#26119)
- fix: [fix][broker] Prevent stale read completions from stranding Failover subscriptions (#26174)
- fix: [fix][broker] Prevent stale service unit callbacks from dropping active lookup and cleanup jobs (#26146)
- fix: [fix][broker] Prevent stale topic unload cleanup from removing active cache entries (#26145)
- fix: [fix][broker] Release entry on GetLastMessageId when parseMessageMetadata throws (#26089)
- fix: [fix][broker] Trigger max read position callback for messages published during transaction buffer recovery (#26234)
- fix: [fix][client] Avoid exception in ConsumerImpl hasMessageAvailable before first receive (#25857)
- fix: [fix][client] Fix unAckedMessageTracker cleanup on multi-topics batch ack (#26001)
- fix: [fix][client] Preserve null values in pulsar-admin schema output (#26196)
- fix: [fix][fn] Forward source message properties in Python runtime (#26191)
- fix: [fix][fn] Return inputSpecs consumerProperties in function GET info (#26217)
- …and 17 more
