KIP index
All KIPs the codebase references, split honestly: implemented, partial, or deliberate non-goal.
KIP numbers are how Kafka names its own evolution, which makes them the natural vocabulary for the question every evaluator asks: which Kafka do I actually get? This index answers in three buckets, and the split is source-verified, not aspirational: implemented means the behaviour ships and is exercised by tests or the shell-tool suite; partial pages lead with what's missing; non-goals get a rationale in Non-goals, not silence. Wire-facing KIPs also appear per key in the generated API matrix's KIPs column. The scope is Apache Kafka 3.7, with one deliberate post-3.7 exception: DescribeCluster v2 (KIP-1073) is served, because kaas has a real fenced broker state and no other way to report it — see KIP-700.
Three corrections relative to earlier planning documents, all found by source-verifying during the book build: KIP-516, KIP-32, KIP-58, and KIP-354 are partial, not implemented. Topic IDs are minted but not propagated to the wire (KIP-516); LogAppendTime and timestamp lookup don't exist (KIP-32); and the two compaction knobs (KIP-58, KIP-354) remain config plumbing without an enforcing compactor — though the delete-policy retention cleaner now runs (gh #250).
Implemented (14)
| KIP | What it is | kaas page |
|---|---|---|
| KIP-13 | Per-broker client quotas (byte-rate throttling) | KIP-13 |
| KIP-98 | Exactly-once: idempotent producer + transactions | KIP-98 |
| KIP-107 | DeleteRecords admin API (key 21) | KIP-107 |
| KIP-195 | CreatePartitions admin API (key 37) | KIP-195 |
| KIP-255 | SASL/OAUTHBEARER — OIDC JWTs validated against the issuer's JWKS | KIP-255 |
| KIP-290 | Prefixed ACL resource patterns | KIP-290 |
| KIP-339 | IncrementalAlterConfigs (key 44) | KIP-339 |
| KIP-360 | Producer epoch bump on re-initialization | KIP-360 |
| KIP-371 | mTLS principal mapping (ssl.principal.mapping.rules) | KIP-371 |
| KIP-447 | EOS v2: producer-scalable transactional offsets | KIP-447 |
| KIP-482 | Flexible versions + tagged fields | KIP-482 |
| KIP-546 | Client-quota admin APIs (keys 48/49) | KIP-546 |
| KIP-700 | DescribeCluster admin API (key 60) | KIP-700 |
| KIP-800 | Join/leave reason strings | KIP-800 |
Partial (10)
Each page leads with the "what's missing" block — these are the book's credibility test.
| KIP | Landed | Missing | kaas page |
|---|---|---|---|
| KIP-32 | CreateTime timestamps round-trip byte-identically; batch MaxTimestamp tracked per segment | LogAppendTime entirely; timestamp→offset ListOffsets lookup ((-1,-1) sentinel) | KIP-32 |
| KIP-58 | min.compaction.lag.ms config plumbing (CR → .config.json → DescribeConfigs) | the compactor that would enforce it; the delete-policy retention cleaner does run | KIP-58 |
| KIP-101 | segment filenames carry the leader epoch | leader-epoch cache + lookup (offset_for_leader_epoch returns the (-1,-1) sentinel); wire key 23 unregistered | KIP-101 |
| KIP-219 | throttle_time_ms computed (debt-carry) and returned | the broker never mutes the channel after responding — throttling relies on client cooperation | KIP-219 |
| KIP-345 | group.instance.id plumbed through join/sync; static members survive the eviction sweep | FENCED_INSTANCE_ID fencing of duplicate static members | KIP-345 |
| KIP-354 | delete.retention.ms config plumbing | tombstone-expiry enforcement (same missing compactor); upstream's max.compaction.lag.ms doesn't exist anywhere | KIP-354 |
| KIP-368 | re-auth on a live connection; session_lifetime_ms advertised + deadline enforced on oauth listeners; same-principal guard | a broker-wide connections.max.reauth.ms for SCRAM/PLAIN sessions; disconnect (vs in-band 58) past the deadline | KIP-368 |
| KIP-394 | MEMBER_ID_REQUIRED error code defined | the v4+ two-step join handshake — join() still takes the legacy assign-inline path | KIP-394 |
| KIP-516 | operator mints Status.TopicID (v4 UUID, never rotated) | broker-side wire propagation — the production topic watch inserts the all-zero sentinel, so Metadata serves nil topic IDs | KIP-516 |
| KIP-554 | wire keys 50/51 served — describe answers from the live credential store, alter rotates via the KafkaUser CR | SCRAM-SHA-256 (kaas is SHA-512-only); wire-side credential deletion (refused — the lifecycle stays on the CR) | KIP-554 |
Deliberate non-goals (8)
Rationale for each in Non-goals.
| KIP | What it is | Why not |
|---|---|---|
| KIP-48 | Delegation tokens | no token-based auth surface; SCRAM/mTLS cover the deployment model |
| KIP-227 | Incremental fetch sessions | stateless by contract: SessionID=0 on every response |
| KIP-405 | Tiered storage | deferred, not refused — the NFS substrate is already a near-tier |
| KIP-664 | Describe/ListTransactions tooling | follow-up; slot files are directly inspectable meanwhile |
| KIP-714 | Client metrics push | out of scope for the preview line |
| KIP-848 | Next-gen consumer rebalance protocol | post-3.7 |
| KIP-932 | Share groups (queues) | Kafka 4.0+ |
| KIP-1071 | Streams rebalance protocol | post-3.7 |
Implementation notes (for contributors)
The missing compactor behind the KIP-58 and KIP-354 rows is tracked as
gh #158 — which now covers only the compactor: size- and time-based
retention are wired and enforced by the RetentionCleaner
(gh #250). The corrections in the note above come
from the 2026-07-19 source sweep, recorded on the affected KIP pages.