packages feed

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."
}