rdkafka-hs-1.1.0.0: docs/testing/callback-ownership-inventory.json
{
"schema_version": 1,
"owner": 11,
"status": "accepted",
"allocations": [
{
"allocator": "mkRebalanceCallback",
"setter": "rdKafkaConfSetRebalanceCb",
"route": "rebalanceCallback",
"publicly_installable": true,
"owner": "Kafka.Internal.CallbackOwner.installCallback",
"release": "releaseCallbackOwner after native client destruction"
},
{
"allocator": "mkDeliveryCallback",
"setter": "rdKafkaConfSetDrMsgCb",
"route": "deliveryCallback and producer default",
"publicly_installable": true,
"owner": "Kafka.Internal.CallbackOwner.installCallback",
"release": "releaseCallbackOwner after native client destruction"
},
{
"allocator": "mkConsumeCallback",
"setter": "rdKafkaConfSetConsumeCb",
"route": "internal binding only",
"publicly_installable": false,
"owner": "Kafka.Internal.CallbackOwner.installCallback",
"release": "releaseCallbackOwner after native client destruction",
"rationale": "No call site reachable from an exposed module; the internal setter still requires an owner."
},
{
"allocator": "mkOffsetCommitCallback",
"setter": "rdKafkaConfSetOffsetCommitCb",
"route": "offsetCommitCallback",
"publicly_installable": true,
"owner": "Kafka.Internal.CallbackOwner.installCallback",
"release": "releaseCallbackOwner after native client destruction"
},
{
"allocator": "mkErrorCallback",
"setter": "rdKafkaConfSetErrorCb",
"route": "errorCallback",
"publicly_installable": true,
"owner": "Kafka.Internal.CallbackOwner.installCallback",
"release": "releaseCallbackOwner after native client destruction"
},
{
"allocator": "mkThrottleCallback",
"setter": "rdKafkaConfSetThrottleCb",
"route": "internal binding only",
"publicly_installable": false,
"owner": "Kafka.Internal.CallbackOwner.installCallback",
"release": "releaseCallbackOwner after native client destruction",
"rationale": "No call site reachable from an exposed module; the internal setter still requires an owner."
},
{
"allocator": "mkLogCallback",
"setter": "rdKafkaConfSetLogCb",
"route": "logCallback",
"publicly_installable": true,
"owner": "Kafka.Internal.CallbackOwner.installCallback",
"release": "releaseCallbackOwner after native client destruction"
},
{
"allocator": "mkStatsCallback",
"setter": "rdKafkaConfSetStatsCb",
"route": "statsCallback",
"publicly_installable": true,
"owner": "Kafka.Internal.CallbackOwner.installCallback",
"release": "releaseCallbackOwner after native client destruction"
},
{
"allocator": "mkSocketCallback",
"setter": "rdKafkaConfSetSocketCb",
"route": "internal binding only",
"publicly_installable": false,
"owner": "Kafka.Internal.CallbackOwner.installCallback",
"release": "releaseCallbackOwner after native client destruction",
"rationale": "No call site reachable from an exposed module; the internal setter still requires an owner."
},
{
"allocator": "mkPartitionerCallback",
"setter": "rdKafkaTopicConfSetPartitionerCb",
"route": "internal binding only",
"publicly_installable": false,
"owner": "Kafka.Internal.CallbackOwner.installCallback",
"release": "releaseCallbackOwner after native client destruction",
"rationale": "No call site reachable from an exposed module; the internal setter still requires an owner."
}
],
"configurations": {
"original": "ForeignPtr owns the native configuration; inspection view remains passive after client creation.",
"duplicate": "Native client consumes it on success; wrapper destroys it on native creation failure.",
"replacements": "All allocated bridges remain owned until final native teardown.",
"borrowed_consumers": "Callback wrappers borrow native pointers and never acquire the native client deallocator."
},
"callback_capable_destruction": [
{
"kind": "client",
"policy": "Haskell finalizer or safe scoped native call; public operations retain the client through child cleanup."
},
{
"kind": "topic",
"policy": "Haskell finalizer or safe scoped native call; public operations retain the client through child cleanup."
},
{
"kind": "partition list with private partition references",
"policy": "Haskell finalizer or safe scoped native call; public operations retain the client through child cleanup."
},
{
"kind": "queue",
"policy": "Haskell finalizer or safe scoped native call; public operations retain the client through child cleanup."
},
{
"kind": "event",
"policy": "Haskell finalizer or safe scoped native call; public operations retain the client through child cleanup."
},
{
"kind": "message",
"policy": "Haskell finalizer or safe scoped native call; public operations retain the client through child cleanup."
}
],
"remaining_c_finalizers": [
{
"kind": "global configuration",
"policy": "Detached allocation/property cleanup; no library-installed Haskell callback invocation."
},
{
"kind": "topic configuration",
"policy": "Detached allocation/property cleanup; no library-installed Haskell callback invocation."
},
{
"kind": "metadata snapshot",
"policy": "Detached allocation/property cleanup; no library-installed Haskell callback invocation."
},
{
"kind": "group list",
"policy": "Detached allocation/property cleanup; no library-installed Haskell callback invocation."
},
{
"kind": "admin options",
"policy": "Detached allocation/property cleanup; no library-installed Haskell callback invocation."
},
{
"kind": "new-topic request",
"policy": "Detached allocation/property cleanup; no library-installed Haskell callback invocation."
}
],
"evidence": {
"before": "/tmp/rdkafka-ep11-before-isolated.log",
"native_cases": "/tmp/rdkafka-ep11-throwing-thread.log",
"registry_cases": "/tmp/rdkafka-ep11-owner-unit4.log",
"tooling_controls": "/tmp/rdkafka-ep11-final-tools.log",
"native_case_count": 55,
"registry_case_count": 8,
"tooling_controls_count": 19,
"fingerprint": "b77c65366fab1dd8d2316d972086e89ca4dfc41ef52bc5987c5b0534ec80f9e9",
"normal": "/tmp/rdkafka-ep11-final-normal.log",
"normal_counts": {
"unit": 29,
"integration": 375
},
"coverage": "docs/testing/coverage-evidence.json",
"coverage_counts": {
"unit": 29,
"integration": 375
},
"normal_integration_seconds": 151.84,
"instrumented_integration_seconds": 158.52,
"mutations": "dist-mutations/20261024T135134Z-callback-6370-0/results.json",
"native_diagnostics": "docs/testing/callback-native-diagnostics.json",
"required_checks": "/tmp/rdkafka-ep11-final-check.log",
"tests": [
"rdkafka-hs.Callback owner.bridge allocation executes masked before ownership is recorded",
"rdkafka-hs.Callback owner.installed and replaced bridges release exactly once",
"rdkafka-hs.Callback owner.failed native install still owns its allocated bridge",
"rdkafka-hs.Callback owner.failed allocation has no release",
"rdkafka-hs.Callback owner.transfer preserves a callable bridge until client release",
"rdkafka-hs.Callback owner.transferred and released owners reject reuse before allocating",
"rdkafka-hs.Callback owner.release retry does not repeat completed releases",
"rdkafka-hs.Callback owner.concurrent releases join before returning",
"rdkafka-hs-integration.callback-lifetime.async throwing error callback preserves native lifecycle",
"rdkafka-hs-integration.callback-lifetime.async throwing log callback preserves native lifecycle",
"rdkafka-hs-integration.callback-lifetime.async throwing stats callback preserves native lifecycle",
"rdkafka-hs-integration.callback-lifetime.async throwing rebalance callback preserves native lifecycle",
"rdkafka-hs-integration.callback-lifetime.async throwing commit callback preserves native lifecycle",
"rdkafka-hs-integration.callback-lifetime.sync throwing error callback preserves native lifecycle",
"rdkafka-hs-integration.callback-lifetime.sync throwing log callback preserves native lifecycle",
"rdkafka-hs-integration.callback-lifetime.sync throwing stats callback preserves native lifecycle",
"rdkafka-hs-integration.callback-lifetime.sync throwing rebalance callback preserves native lifecycle",
"rdkafka-hs-integration.callback-lifetime.sync throwing commit callback preserves native lifecycle",
"rdkafka-hs-integration.callback-lifetime.async error callback releases after destroy with retained wrapper",
"rdkafka-hs-integration.callback-lifetime.sync error callback releases after destroy with retained wrapper",
"rdkafka-hs-integration.callback-lifetime.producer delivery callback releases after native finalization",
"rdkafka-hs-integration.callback-lifetime.noncaptured control is collectible",
"rdkafka-hs-integration.callback-lifetime.async log callback is live then releases",
"rdkafka-hs-integration.callback-lifetime.async stats callback is live then releases",
"rdkafka-hs-integration.callback-lifetime.sync log callback is live then releases",
"rdkafka-hs-integration.callback-lifetime.sync stats callback is live then releases",
"rdkafka-hs-integration.callback-lifetime.async construction failure releases callbacks: topic",
"rdkafka-hs-integration.callback-lifetime.async construction failure releases callbacks: native",
"rdkafka-hs-integration.callback-lifetime.sync construction failure releases callbacks: topic",
"rdkafka-hs-integration.callback-lifetime.sync construction failure releases callbacks: native",
"rdkafka-hs-integration.callback-lifetime.producer native construction failure releases callbacks",
"rdkafka-hs-integration.callback-lifetime.async rebalance callback releases captured borrowed configuration",
"rdkafka-hs-integration.callback-lifetime.async commit callback releases captured borrowed configuration",
"rdkafka-hs-integration.callback-lifetime.sync rebalance callback releases captured borrowed configuration",
"rdkafka-hs-integration.callback-lifetime.sync commit callback releases captured borrowed configuration",
"rdkafka-hs-integration.callback-lifetime.replaced producer delivery callbacks both release",
"rdkafka-hs-integration.callback-lifetime.async concurrent destruction joins at native entry",
"rdkafka-hs-integration.callback-lifetime.async concurrent destruction joins at native completion",
"rdkafka-hs-integration.callback-lifetime.async concurrent destruction joins at native shutdown callback",
"rdkafka-hs-integration.callback-lifetime.sync concurrent destruction joins at native entry",
"rdkafka-hs-integration.callback-lifetime.sync concurrent destruction joins at native completion",
"rdkafka-hs-integration.callback-lifetime.sync concurrent destruction joins at native shutdown callback",
"rdkafka-hs-integration.callback-lifetime.async cancellation at native entry preserves exactly-once teardown",
"rdkafka-hs-integration.callback-lifetime.async cancellation at native completion preserves exactly-once teardown",
"rdkafka-hs-integration.callback-lifetime.async cancellation at native shutdown callback preserves exactly-once teardown",
"rdkafka-hs-integration.callback-lifetime.sync cancellation at native entry preserves exactly-once teardown",
"rdkafka-hs-integration.callback-lifetime.sync cancellation at native completion preserves exactly-once teardown",
"rdkafka-hs-integration.callback-lifetime.sync cancellation at native shutdown callback preserves exactly-once teardown",
"rdkafka-hs-integration.callback-lifetime.async cancellation after poll stop and queue detachment preserves teardown",
"rdkafka-hs-integration.callback-lifetime.producer constructor cancellation at partial registration releases its owner",
"rdkafka-hs-integration.callback-lifetime.producer constructor cancellation at native acceptance releases its owner",
"rdkafka-hs-integration.callback-lifetime.consumer-async constructor cancellation at partial registration releases its owner",
"rdkafka-hs-integration.callback-lifetime.consumer-async constructor cancellation at native acceptance releases its owner",
"rdkafka-hs-integration.callback-lifetime.consumer-sync constructor cancellation at partial registration releases its owner",
"rdkafka-hs-integration.callback-lifetime.consumer-sync constructor cancellation at native acceptance releases its owner",
"rdkafka-hs-integration.callback-lifetime.async cancellation while waiting for active callback permits retry",
"rdkafka-hs-integration.callback-lifetime.sync cancellation while waiting for active callback permits retry",
"rdkafka-hs-integration.callback-lifetime.async closed consumer GC releases its registrations once",
"rdkafka-hs-integration.callback-lifetime.sync closed consumer GC releases its registrations once",
"rdkafka-hs-integration.callback-lifetime.producer error callback remains live through close and releases on GC",
"rdkafka-hs-integration.callback-lifetime.producer log callback remains live through close and releases on GC",
"rdkafka-hs-integration.callback-lifetime.producer stats callback remains live through close and releases on GC",
"rdkafka-hs-integration.callback-lifetime.failed native construction releases the caller-owned duplicate config"
]
},
"remaining": [],
"separate_obligations": "EP-15 still owns native leak diagnostics and remaining supported environment tuples. EP-14 owns the recorded batch-conversion interruption and cooperative-rebalance error-object defects; neither changes the persistent callback release boundary."
}