Kafka KIP Matrix

This document tracks Krabka’s implementation status against the Apache Kafka Improvement Proposals (KIPs) that define Kafka’s compatibility surface: the wire protocol, message format, storage, replication, KRaft metadata quorum, security, authorization, quotas, admin APIs, queues (share groups), and the streams rebalance protocol.

It complements the wire-compatibility targets on the versions page. Where the two disagree, the differential test results behind the versions page win, and this matrix is corrected to match.

Target surface. Apache Kafka 4.x message schemas. The wire codec is generated from, and validated against, the Kafka schema corpus (the codec generator in krabka-protocol validates the 4.2 corpus, 197 schema files, and the 4.3.0 schemas are the target). Encode/decode is checked byte-for-byte against kafka-clients, and a JVM acceptance suite drives the official cp-kafka / apache/kafka admin tools against a live Krabka broker.

Legend: ✅ fully implemented · ⚠️ partial (gap noted) · ❌ in scope but not yet implemented · ⛔ out of scope by design.

Scope honesty. Kafka has ~1300 KIP numbers, but a large fraction are unassigned, withdrawn/discarded, folded into another KIP, or purely JVM-client-library / Kafka Connect / Kafka Streams-library internal with no broker or wire surface. This matrix is exhaustive over the KIPs that define Krabka’s actual compatibility contract; the rest are handled categorically in §4 and §7. Numbers are not invented to pad a one-row-per-integer table.


1. Fully implemented (✅)

Wire protocol & message format

KIPTitleGrounding
KIP-31Relative offsets in compressed message setsrecords-legacy, log
KIP-32Add timestamps to messagesREADME
KIP-74Fetch response size limit (max_bytes / partition_max_bytes)fetch handler honors limits
KIP-82Add record headersREADME
KIP-110Zstandard compression codec (message format v2 only)compression
KIP-219Improve quota communication (throttle-then-respond)dispatch loop patches leading ThrottleTimeMs
KIP-227Incremental fetch sessionsfetch-session cache + forget/merge model
KIP-394Require member.id for initial JoinGroupREADME
KIP-464CreateTopics with broker-default partitions / replication factorschema CreateTopicsRequest v4
KIP-467Augmented ProduceResponse per-record errorsschema ProduceResponse RecordErrors
KIP-482Optional tagged fields (flexible versions)README
KIP-511Collect & expose client software name / versionREADME
KIP-559Protocol-type / name on coordination responses (L7-proxy friendly)README
KIP-734ListOffsets MAX_TIMESTAMP (-3)list_offsets handler
KIP-903Fence stale-broker-epoch replicas from the ISRREADME, kip903 spec
KIP-951Leader-discovery hint (current leader in Produce/Fetch)produce handler

Producer — idempotence, transactions & EOS

KIPTitleGrounding
KIP-98Exactly-once delivery & transactional messagingtxn coordinator
KIP-360Reliable idempotent / transactional producer (safe epoch bump)README
KIP-447Producer scalability for EOSkip447 spec
KIP-480Sticky partitioner (client)README
KIP-679Idempotence on by default (client)README
KIP-794Strictly-uniform sticky partitioner (client)README
KIP-890Transactions server-side defense (transaction.version=2)feature-pins note (byte-verified)
KIP-915Txn/group coordinator record flexible-version downgrade foundationtxn log v1, feature-pins note
KIP-939Two-phase-commit participation (prepareTransaction, recovery completion, and Admin force termination)broker 2PC model + native producer/Admin APIs + transactions_2pc_client live recovery test
KIP-1228Transaction version on WriteTxnMarkersREADME

Consumer groups & queues

KIPTitleGrounding
KIP-62Background-thread heartbeat (session vs poll timeout)README
KIP-345Static membershipstatic-membership stateright model
KIP-429Cooperative incremental rebalance protocolREADME
KIP-496OffsetDelete admin APIREADME
KIP-518List groups by state (StatesFilter / GroupState)schema ListGroupsRequest v4
KIP-699Batched FindCoordinatorschema FindCoordinator v4
KIP-800Reason field on Join/Leave groupschema Join/LeaveGroup
KIP-848Next-generation consumer rebalance protocol (+ live classic↔next-gen migration)specs 64a–64e
KIP-1043Admin of all group types (GROUP_ID_NOT_FOUND)schema DescribeGroups v6
KIP-1082Client-generated member ID (ConsumerGroupHeartbeat)schema; KIP-848 path
KIP-1099MemberType in ConsumerGroupDescribeschema
KIP-932Queues for Kafka / share groupsshare-group specs + model
KIP-1206 / KIP-1222ShareFetch ShareAcquireMode / Renew acknowledgementschema ShareFetch v2; share-group slice F
KIP-1226Share-group lagshare-group slice F
KIP-1319Member-epoch fencing (next-gen / txn coordinator)txn coordinator

Storage & log

KIPTitleGrounding
KIP-63Streams record cache / changelog dedupstreams state-store spec
KIP-112Handle disk failure for JBODkip-112 spec
KIP-113Replica movement between log dirs (AlterReplicaLogDirs)README
KIP-204DeleteRecords via the Admin clientREADME
KIP-405Tiered storage (topic-backed RLMM default; copy/read/retention; RLMM snapshots; metadata, segment layout, and producer snapshots validated against Kafka 4.0 JVM)specs 48a–48r + jvm_tiered_storage
KIP-534Log retention with delete-horizon (tombstone retention)kip534 spec
KIP-1005ListOffsets last-tiered offsetv9 handler semantics + remote-storage tests
KIP-1023ListOffsets earliest-pending-upload offsetv11 handler semantics + upload-pending tests
KIP-1075Async remote ListOffsetsv10 delayed remote lookup, timeout/parallelism config, and handler tests

Replication & availability

KIPTitleGrounding
KIP-36Rack-aware replica assignmentrebalancer specs
KIP-73Replication quotas (throttled replication)token-bucket stateright model
KIP-101Leader-epoch-based truncationREADME
KIP-207Monotonic ListOffsets across leader changedata-path model
KIP-279Fix leader/follower log divergenceREADME
KIP-320Detect & handle log truncation (leader epoch in Fetch)kip-320 spec
KIP-392Fetch from closest replica (rack-aware)kip-392 spec
KIP-455AlterPartitionReassignments / ListPartitionReassignmentsREADME
KIP-460Admin ElectLeaders (PREFERRED + UNCLEAN)README
KIP-497Inter-broker AlterPartition (AlterIsr)ISR state model
KIP-704Leader-recovery-state hint in AlterPartitionunclean-recovery path
KIP-841Fence stale-epoch replicas / unclean-recovery toggleREADME
KIP-858JBOD in KRaft (PartitionRecord.Directories)partition record v1
KIP-966Eligible leader replicas / offset-aware unclean recovery; DescribeTopicPartitionskip966 spec
KIP-996Pre-votekip-996 spec
KIP-1102Native-client re-bootstrap on stale metadatacore, producer, and Admin recovery tests (timeout, error 129, all-known-node exhaustion, and retired seed)

KRaft metadata quorum

KIPTitleGrounding
KIP-500Replace ZooKeeper with a self-managed metadata quorumREADME
KIP-584Feature versioning (metadata / group / transaction.version)feature-versioning framework
KIP-595Raft protocol for the metadata quorum (wire)kip595-* specs
KIP-630Kafka Raft snapshot + FetchSnapshotkip630 spec
KIP-631Quorum-based controller (metadata records, RPCs)kip631 spec
KIP-836DescribeQuorum voter-lag timestampsschema v1
KIP-853Dynamic KRaft voters (Add/Remove/UpdateRaftVoter)deterministic Raft model + snapshot recovery + operator lifecycle tests; Kafka 4.3.1 kafka-features and kafka-metadata-quorum oracle
KIP-919AdminClient ↔ controller routing (bootstrap.controllers; controller Admin RPCs; endpoint-type validation; controller registration; UnregisterBroker)controller-bootstrap integration tests (supported routing + client-side error 115 preflight) + controller handler registry + schema DescribeCluster v1
KIP-1022Formatting & updating features (krabka format --feature)JVM kafka-features validated
KIP-1073IncludeFencedBrokers / IsFenced in DescribeClusterschema v2

Admin, configs & topics

KIPTitleGrounding
KIP-4Admin protocol foundationREADME
KIP-133Describe & Alter ConfigsREADME
KIP-195CreatePartitionsREADME
KIP-226Dynamic broker configurationREADME
KIP-339IncrementalAlterConfigsREADME
KIP-430Authorized operations in describe responsesREADME
KIP-516Topic identifierskip-516 spec
KIP-525Return configs in CreateTopics responseREADME
KIP-664DescribeProducers / ListTransactions / DescribeTransactionsREADME
KIP-700DescribeCluster APIREADME
KIP-827DescribeLogDirs total / usable bytes (v4)describe_log_dirs handler
KIP-919UnregisterBroker admin API (api_key 64)dispatch + handler (repo previously mislabeled this KIP-185; see §6)
KIP-994ListTransactions v1 minor additionsschema
KIP-1142ListConfigResources admin APIlist_config_resources handler
KIP-1152ListTransactions TransactionalIdPatternschema v2

Security & authentication

KIPTitleGrounding
KIP-11Authorization interfaceREADME
KIP-12SSL & SASL/KerberosREADME
KIP-43SASL mechanism negotiationREADME
KIP-48 / KIP-373Delegation tokens (+ for other users)specs 51 / 51b
KIP-84SASL/SCRAMREADME
KIP-140ACL admin APIs (Create / Delete / Describe)README
KIP-152SASL authentication-failure diagnosticsREADME
KIP-255SASL/OAUTHBEARER, including inter-broker/controller outboundREADME + client-core/sasl + broker/raft_handshake
KIP-290Prefixed ACLsREADME
KIP-368Periodic SASL re-authenticationspec 49e
KIP-504New Java authorizer API (semantics)README
KIP-554Broker-side SCRAM config APIslices 12 / 17a
KIP-768OAUTHBEARER OIDC (JWKS / signed-JWT / introspection)security/oauthbearer, operator-e2e interop
KIP-801KRaft-native StandardAuthorizerauthz

Quotas & throttling

KIPTitleGrounding
KIP-13Quota design (byte-rate)quota precedence model
KIP-124Request-rate quotasREADME
KIP-257Configurable quota managementquota module
KIP-546Client-quota admin APIsREADME
KIP-599Controller mutation quotasslice 16c
KIP-612IP / connection-creation-rate quotasslice 16b

Operator and Schema Registry compatibility

AreaImplemented surfaceGrounding
External listenersInternal, NodePort, LoadBalancer, Ingress, and OpenShift Route listener reconciliationoperator listener reconciliation tests
Secured external Schema Registry bootstrapExternal broker bootstrap with the configured TLS and SASL security materialSchema Registry CRD/controller tests

Observability & streams DSL/runtime (in the Rust Streams client)

The streams sub-KIPs below are implemented in krabka-client-streams, which is itself ⚠️ partial versus the JVM Kafka Streams library (see §2). They are listed here because the individual DSL/runtime features exist and are golden-tested against JVM capture.

KIPTitleGrounding
KIP-714Client metrics & observability pushkip-714 spec
KIP-1000List client-metrics configuration resourceskip-714 spec
KIP-129Streams exactly-once semanticsstreams EOS
KIP-150 / KIP-213Cogroup / KTable foreign-key joinstreams DSL
KIP-328 / KIP-825Suppress / emit-final (EmitStrategy)streams DSL
KIP-401 / KIP-444Streams stores() auto-connect / metricsstreams specs
KIP-450Sliding-window aggregationsstreams DSL
KIP-617 / KIP-796 / KIP-960 / KIP-968IQv2 (range / versioned / multi-versioned key queries)streams IQv2
KIP-633Drop 24h grace default; stream-time-driven left/outer join emissionstreams stream-join
KIP-820processValues fixed-key Processor APIstreams
KIP-889 / KIP-914 / KIP-962Versioned state stores / DSL semantics / relax non-null keystreams
KIP-923Grace period on stream-table joinstreams
KIP-1024statestore.cache.max.bytesstreams record-caching spec

2. Partially implemented (⚠️) — what is left

KIP / areaDoneWhat’s left for full parity
KIP-778 / proposed KIP-1155 — KRaft upgrades and metadata-version downgradesmetadata.version level model (7–25), runtime enforcement, bootstrap/format, operator ordered roll + MV bump; Krabka-native safe/unsafe record-loss projection; all-node downgrade-capability and target-range checks; mandatory lower-version snapshot reload + log-prefix prune on every quorum node, with fail-closed retry and restart rediscovery; pre-KIP-1155 Kafka 4.0 nodes are rejected without changing cluster stateSuccessful mixed-JVM rolling software downgrade awaits an upstream Kafka release that assigns and advertises KIP-1155’s promised capability metadata version. Kafka 4.0 correctly cannot be treated as downgrade-capable. Operator Admin RPCs over secured internal listeners still need TLS/SASL credential loading.
KIP-1071 — streams rebalance protocolBroker side fully done: StreamsGroupHeartbeat / StreamsGroupDescribe, topology ingestion, internal repartition/changelog topic creation, active/standby/warmup assignment with changelog catch-up, __consumer_offsets persistence, streams.version gate. Rust client DSL/runtime/state-stores/joins/windows/suppress/IQv2/EOS are broad. Kafka supports only offline classic→streams migration.Future accepted protocol revisions are tracked as bounded items; replacing the full JVM Kafka Streams library is outside this matrix’s compatibility contract.
Geo-replicationThe native replicator runs selective topic flows, loop prevention, residency routing, offset-sync/checkpoint/heartbeat records, transactional output plus checkpoint recovery, and restart-safe supervision.Schema-aware transforms/routing, secured standalone clients, an operator CRD, and the explicitly deferred audit/erasure/key-residency surfaces remain future slices.

3. In scope but not yet implemented (❌)

No finite repository-local KIP outcome is currently classified here. New work belongs in this section only when it has a bounded behavior and acceptance gate.

Tracked horizons (not ❌ implementation commitments)

  • krabka-client-streams is a Kafka Streams-inspired Rust API. Full drop-in JVM Kafka Streams library parity has no bounded feature list or acceptance gate; only separately scoped client features are implementation commitments.
  • KIP-1150 is an accepted umbrella proposal that deliberately defines no code, public interface, documentation, or test changes. Its concrete follow-up KIPs are evaluated separately rather than treating KIP-1150 itself as unfinished code.

4. Deliberately out of scope (⛔)

KIP(s) / areaReason
KIP-866 + all ZooKeeper-mode / ZK→KRaft migration KIPs (incl. KIP-590 controller forwarding)Krabka is KRaft-only. An explicit non-goal. Greenfield, no production users, no migration burden.
Kafka Connect framework + connectors + EOS source + REST/offsets APIs (KIP-26, 145, 158, 208, 215, 238, 298, 305, 558, 610, 611, 618, 745, 875, 980, …)Krabka provides its own Rust connector SPI, a managed Postgres CDC worker with durable Kafka-backed offsets, and a KafkaConnector operator CRD. JVM plugin loading, the distributed Connect worker protocol, the Connect REST API, multi-task execution, initial snapshots, and exactly-once source delivery remain out of scope for this first managed vertical slice.
Kafka Bridge (HTTP)Superseded in Krabka by the native gRPC / Connect-RPC + HTTP gateway; KafkaBridge CRD ❌.
JVM-client-library-internal KIPs (e.g. KIP-235/302 DNS bootstrap, KIP-266 consumer block fix, KIP-289 default group.id, KIP-421 dynamic client config, KIP-580 client exponential backoff, KIP-91 producer delivery.timeout.ms)Not applicable to a broker. Where relevant, equivalent behavior lives in Krabka’s native Rust clients rather than as a tracked broker KIP.

5. Wire-level note

Several KIPs in §1 include byte-exact codec support generated from the Apache Kafka message schemas in krabka-protocol. Schema presence alone is not treated as full feature parity: entries that require broker behavior are listed as complete only when their handler semantics and behavioral tests are present as well.


6. Attribution caveat

The repo historically labeled the UnregisterBroker admin API (api_key 64) as “KIP-185”. Canonical KIP-185 is “Make exactly-once in-order delivery per partition the default producer setting” — unrelated. The UnregisterBroker feature itself is implemented and JVM-validated; only the cited KIP number was wrong.

This has been corrected throughout the source and README to KIP-919 (“Allow AdminClient to Talk Directly with the KRaft Controller Quorum and add Controller Registration”), which is the KIP that adds unregisterBroker support to the AdminClient (Apache JIRA KAFKA-17039). The underlying RPC originates with the KRaft controller surface (KIP-631). Release-managed CHANGELOG.md files were left untouched as historical record.


7. The long tail

Kafka has ~1300 KIP numbers. This matrix does not invent a row per integer, because a large share are unassigned/never-used, discarded/withdrawn/rejected, folded into another KIP, or JVM-client / Connect / Streams-library-internal with no broker or wire surface. Those are covered categorically in §3 (tracked Streams-library boundary) and §4 (out-of-scope ecosystems and client-library internals). Every KIP that defines Krabka’s actual compatibility contract — protocol, storage, replication, KRaft, security, authorization, quotas, queues, and the streams protocol — is enumerated in §1–§3 and grounded in the repo.