rdkafka-hs-1.1.0.0: docs/testing/legacy-seek-evidence.json
{
"status": "Accepted causal historical reproduction and isolated scoped-lifetime differential; original failure retained",
"fingerprint": "060dade4e8a9c764dabee54df3030fa6d857be3ea1404a2bc680a45ddadd5e4e",
"runs": {
"normal": {
"log": "/tmp/rdkafka-ep14-legacy-fixtures-normal.log",
"sha256": "1488d6d69c6e2f897b3ff2577846eaf1ab6a0d1d947a5fa75f2798fcc0375575",
"passed": 54
},
"instrumented-haskell": {
"log": "/tmp/rdkafka-ep14-legacy-fixtures-hpc.log",
"sha256": "d5b7cb13f31913f5820f2905e79e9d0bcc8699552222b8eaec3a82c2d0defb91",
"passed": 54
},
"instrumented-native": {
"log": "/tmp/rdkafka-ep14-legacy-fixtures-asan.log",
"sha256": "2e4ea314d564e9484263e06f21fd22c19dc3c688ef23088cf43170227dc43fd8",
"passed": 54
}
},
"mutations": "dist-mutations/20261024T230850Z-legacy-seek-88557-0/results.json",
"compiled_mutations_caught": 2,
"controls": 1,
"inherited_positive_cases_retained": 10,
"historical_failure": {
"log": "dist-coverage/failures/ep8-sync-seek-state.log",
"sha256": "2c45980cc04be4e3579487dd66c991d48769255ac109ae257ff61581abf0cc2b",
"observed": "Sync consumer previously read fourteen records and reported assignment partition zero. Several blocking metadata/group/time calls intervened before seek returned State. The other four seek cases were skipped by the group dependency.",
"native_diagnosis": "At native release 2.15.0 rd_kafka_seek waits for the fetcher result. rd_kafka_toppar_seek returns State for a fetch state below OFFSET_QUERY, excluding STOPPING, which returns PrevInProgress. Thus the assignment snapshot did not establish the later active-fetcher precondition.",
"limit": "The saved log alone does not identify the native transition. The new native-only reproduction shows duplicate topic/partition identity; parent lifetime and late finalizer ordering are under investigation. No max-poll or broker event is asserted as the cause."
},
"fixture_change": "All five inherited positive offset scenarios run in both modes on fresh run-owned topics and unique grouped consumers. Each confirms exact record zero immediately before seeking, then verifies exact next identity/offset/value or documented EOF/timeout. Unassignment/State/reassignment and repeated replay remain separate tests. State is not suppressed or retried into success.",
"native_source": {
"project": "mori://confluentinc/librdkafka",
"release": "2.15.0",
"commit": "9a94e11452cdeb0a844db44ee5dd01ccbe17d3ab",
"paths": [
"src/rdkafka.c:4727",
"src/rdkafka_partition.c:1950",
"src/rdkafka_partition.h:301"
],
"source_artifact_uri_pending": true
},
"rejected_hypothesis": {
"log": "/tmp/rdkafka-ep14-stale-assignment.log",
"sha256": "1f400cce426bb905b24efc6fbb5dc71258bab1e474e9d1dad5affc01dd0626a2",
"description": "A deliberately short max-poll interval produced MAXPOLL and a stale assignment query, but seek still succeeded. This does not reproduce or explain the historical trigger."
},
"required_checks": "/tmp/rdkafka-ep14-legacy-fixtures-check.log",
"adr_checks": "/tmp/rdkafka-ep14-legacy-fixtures-adr.log",
"leak_instrumentation": false,
"scope_decision": {
"at": "2026-10-25",
"user_choice": "Keep the historical investigation required",
"completion_requirement": "Identify a reproducible supported transition that accounts for the saved condition, with concrete native/operation evidence; passing reruns and an unknown-cause limitation do not close this requirement."
},
"continued_forensics": {
"historical_checkout": "fc5892d",
"checkout_receipt": "dist-compatibility/seek-historical-fc5892d/forensic-receipt.json",
"archive_crosscheck": "Historical mutation archive retains byte-identical ConsumerTest.hs, TestEnv.hs, Consumer.hs and ConsumerProperties.hs relative to fc5892d. The native/admin source hashes also match the preserved subject manifest. The whole failed-run fingerprint differs, so no exact whole-candidate reconstruction is claimed.",
"traced_replay": {
"tests": 182,
"seconds": 100.61,
"result": "pass; sync fetcher remains active through metadata/group/time queries and first seek is served in active state"
},
"forced_gc_replay": {
"tests": 182,
"seconds": 100.79,
"options": [
"-G1",
"-A32k"
],
"result": "pass with explicit performGC before every inherited consumer operation; not a reconstruction"
},
"broker_log": "Read-only retained primary broker logs establish the exact historical topic was created at 2026-10-24 07:33:31.078 UTC and deleted at 07:34:47.721 UTC after the suite teardown. No intervening deletion of that exact topic occurs. Default INFO logs contain no matching group/fetch-state transition, so they cannot identify the inactive-fetcher cause.",
"accepted_cause": "A managed legacy-seek topic may outlive its native client. Its late C finalizer accesses the freed parent; when that address is reused by the next consumer, TAILQ_REMOVE writes through the old topic link into the new client topic-list head. Metadata/name lookup then constructs a second topic/partition in fetch state none while the real assigned partition remains active. Legacy seek resolves that second partition and returns State.",
"artifacts": {
"rdkafka-mp3-historical-trace7.log": {
"path": "dist-compatibility/expanded-recovery-checkpoint/rdkafka-mp3-historical-trace7.log",
"sha256": "445c86226e5c49b469933b1be9fbd18a3958d350bbaff3f976991054893c5c12"
},
"rdkafka-mp3-historical-gc7.log": {
"path": "dist-compatibility/expanded-recovery-checkpoint/rdkafka-mp3-historical-gc7.log",
"sha256": "9c0521941eae17709a7b4f504344facdf99da7c3842fb7b7c990c84dcfdc20b6"
},
"rdkafka-mp3-historical-broker7.log": {
"path": "dist-compatibility/expanded-recovery-checkpoint/rdkafka-mp3-historical-broker7.log",
"sha256": "f20d9eda2095d6564ca1dafa6640ed07d4dde43417efd3f531d22e7ab5d78634"
}
}
},
"native_trace_reproduction": {
"status": "Native State reproduced; exact object divergence under investigation",
"tests_failed": 5,
"real_failure_count": 1,
"dependency_skips": 4,
"seconds": 99.16,
"native_project": "mori://confluentinc/librdkafka",
"native_revision": "9a94e11452cdeb0a844db44ee5dd01ccbe17d3ab",
"native_change": "C-only fetch-state transitions and seek-entry trace, with stop-state backtraces; no behavior/layout change. ConsumerTest restored to original with no Haskell debug or forced GC.",
"observed": "Consumer 73 delivers records on an active partition; first seek later enters with state none. No active-to-none transition is logged; the original active partition reaches stopping/stopped only during final teardown. Distinguish object identity before attributing the result to lost assignment or a stopped fetcher.",
"artifacts": {
"rdkafka-mp3-historical-native-trace9.log": {
"path": "dist-compatibility/expanded-source9/rdkafka-mp3-historical-native-trace9.log",
"sha256": "5c787df34cea6516047d39e72a4a327864bf83ec560fef3f8f829b0c51a08979"
}
},
"identity_probe": {
"observed": "The reproduced failing sync consumer delivers on rkt 0xba7a2c500 / partition 0xba7328500. During all-topics metadata a second rkt 0xba7a2ca00 / partition 0xba7328f00 is created for the same topic. Seek uses the second partition in state none. The original remains active until teardown. A separate native lifetime trace aborts when the preceding async consumer topic finalizer accesses its already destroyed parent mutex; parent-address reuse is under investigation.",
"artifacts": {
"historical-identities-pass.log": {
"path": "dist-compatibility/expanded-source9/historical-identities-pass.log",
"sha256": "7db8174078eac3b4efc9e1018186f2632c8e495cf9e4dc847da22054d433b798"
},
"historical-identities-state.log": {
"path": "dist-compatibility/expanded-source9/historical-identities-state.log",
"sha256": "e1717a0b11937edd5dacd526a0008ddeae4db60d3bb323db72d0e286d6b55ebb"
},
"historical-late-topic-finalizer-abort.log": {
"path": "dist-compatibility/expanded-source9/historical-late-topic-finalizer-abort.log",
"sha256": "bd5a9d023a1be7917028f3b0ba55a995932d81203837fba8dd818bad306a2f69"
}
},
"limit": "Do not yet assert that the precise old saved event was a late finalizer. The observed duplicate object and separate invalid-parent destructor motivate a direct address/order probe."
}
},
"causal_acceptance": {
"historical_subject": "fc5892d core Consumer/Metadata/native API sources with original ConsumerTest and GHC coverage; no Haskell debug/forced GC in the reproducing run. Core source bytes match the original preserved mutation archive; whole failed-candidate fingerprint was not reconstructable.",
"native_trace": "Tagged librdkafka 2.15.0 with C-only pointer/state/finalizer logging; no native behavior or opaque layout change.",
"timeline": [
"Async consumer 72 uses parent 0xbff0b8000, topic 0xbfee2de00 and active partition 0xbfee2e800.",
"Sync consumer 73 reuses native parent address 0xbff0b8000 and delivers fourteen records using a different topic 0xbfee2e800 and partition 0xbfee2d900.",
"During watermark lookup two delayed application-reference releases finalize old topic 0xbfee2de00. Its parent now reports consumer-73; the stack is runSomeFinalizers -> rd_kafka_topic_destroy_final.",
"Native by-name lookup now reports topic count zero, while the original assigned partition has not stopped.",
"Metadata/topic lookup constructs topic 0xbfee2de00 again with a new never-started partition 0xbfee2ca00. Seek enters that partition in state none and returns State; four dependent cases skip.",
"A separate explicit client-lifetime trace, with no address reuse, records destruction/free of parent consumer 72 before its topic finalizer and aborts on the destroyed parent mutex. This corroborates the invalid lifetime independently of topic-list corruption."
],
"mechanism_source": {
"project": "mori://confluentinc/librdkafka",
"version": "2.15.0",
"commit": "9a94e11452cdeb0a844db44ee5dd01ccbe17d3ab",
"project_relative_paths": [
"src/rdkafka_topic.c:rd_kafka_topic_destroy_final (TAILQ_REMOVE)",
"src/rdkafka_topic.c:rd_kafka_topic_find_fl",
"src/rdkafka.c:rd_kafka_seek",
"src/rdkafka_partition.c:rd_kafka_toppar_seek"
],
"artifact_uri_pending": true
},
"minimal_differential": {
"change": "Only legacy seek in the historical checkout is changed to retain its parent with withForeignPtr and bracket/finalize every acquired topic before returning, mirroring the already implemented current lifetime fix. No offsets, errors, waits, topic fixtures or callback mode is changed.",
"passed": 182,
"seconds": 99.41,
"finalizer_order": "Both historical consumer topics finalize while their original parent is still alive; no State and no duplicate topic object."
},
"current_repair": {
"commit": "2d8be3574b395cbd995b23fff09e06da03c95ae8",
"source": "src/Kafka/Consumer.hs",
"source_sha256": "170ea8259f8b0279db807c48799f323a268e7636efcbc929ade003cd4e4bb70a",
"behavior": "Legacy seek retains the native client and explicitly finalizes scoped topics; current native-child Haskell finalizers also retain the parent. Existing ten fresh positive scenarios, native State propagation/recovery tests, full primary normal/mapped runs and current native diagnostic cohorts remain accepted."
},
"scope_limit": "This is a causal reproduction of the saved failure condition with the preserved historical core, not a claim that the untraced original process event can be observed retrospectively. The stopped-fetcher and max-poll explanations are not asserted.",
"artifacts": {
"historical-causal-identity.log": {
"path": "dist-compatibility/expanded-source9/historical-causal-identity.log",
"sha256": "7d71250fd32bf8b5773099504fe6e5a8c57ca3aa18fb435ec8c0e091964a3314"
},
"historical-trace-v4.dylib": {
"path": "dist-compatibility/expanded-source9/historical-trace-v4.dylib",
"sha256": "d43912f91b6100e52da2985ed25f812e6c4f313e6325784222c43010402c75d5"
},
"historical-scoped-binary": {
"path": "dist-compatibility/expanded-source9/historical-scoped-binary",
"sha256": "159997f6bd528ebcf7a61790ed0e3b9b0a548edfacc9250d9096de08c985eed8"
},
"historical-scoped-replay.log": {
"path": "dist-compatibility/expanded-source9/historical-scoped-replay.log",
"sha256": "d467c5510499003864488f66fb7272f327b85c5713caabf698dfdae6ed601f33"
},
"historical-Consumer-original.hs": {
"path": "dist-compatibility/expanded-source9/historical-Consumer-original.hs",
"sha256": "302dc7b476e90ec031a6a28f4dd96a0307028fa8b67889724f276ff7a77d734a"
},
"historical-Consumer-scoped.hs": {
"path": "dist-compatibility/expanded-source9/historical-Consumer-scoped.hs",
"sha256": "7c61dc0a193e3ca6250312176c6964ed21663bef609fe4b7b1eb821fbbefeb42"
},
"historical-client-destruction-order.log": {
"path": "dist-compatibility/expanded-source9/historical-client-destruction-order.log",
"sha256": "949173d4205d89c5831e0015cfe616b16656d2061f9a38e90ebaf4a2b75ec2ab"
},
"historical-trace-v5.dylib": {
"path": "dist-compatibility/expanded-source9/historical-trace-v5.dylib",
"sha256": "b1819973bc434e9a8ccb6af66697a3a53446d9d256e4ac2f1e2af87d62b8b673"
},
"historical-trace-v5-rdkafka.c": {
"path": "dist-compatibility/expanded-source9/historical-trace-v5-rdkafka.c",
"sha256": "3bbb03d7743debdcc065a173056523c221ffaedd15b38f989927568467c69a48"
},
"historical-trace-v5-rdkafka_topic.c": {
"path": "dist-compatibility/expanded-source9/historical-trace-v5-rdkafka_topic.c",
"sha256": "7bad08c3ec3c35ff819b27c0e73e0849d72999f3865a176939242443d69b27dd"
},
"historical-trace-v5-rdkafka_partition.c": {
"path": "dist-compatibility/expanded-source9/historical-trace-v5-rdkafka_partition.c",
"sha256": "c3a522c87cfc323f93ef5531f48988e738bec4dc50ded6aea4e382b98329b264"
},
"historical-native-trace-v5.diff": {
"path": "dist-compatibility/expanded-source9/historical-native-trace-v5.diff",
"sha256": "59a800395bd40922e7796458e37a08b94d65f37ac94e344fec19e693c322e101"
}
},
"native_v5_sha256": "b1819973bc434e9a8ccb6af66697a3a53446d9d256e4ac2f1e2af87d62b8b673"
}
}