{
 "number": 36540,
 "input_hash": "caf317488d264181",
 "model": "ledger",
 "prompt_hash": null,
 "created": "2026-10-28T01:23:32+00:00",
 "result": {
  "summary": "Removes time-based transaction expiry (-mempoolexpiry) and deletes the entry_time multi-index from the mempool. Transactions will now only leave the mempool due to size limiting (-maxmempool), block inclusion, replacement, or conflict. The -mempoolexpiry startup argument is retained as a hidden no-op that logs an initialization warning if set.",
  "problem": "Evicting transactions based purely on age (previously defaulting to two weeks) is incentive-incompatible: it can drop transactions that could still be mined, such as a low-feerate parent awaiting a fee-bumping child. Maintaining the entry_time index also incurs an ordered-tree node of memory overhead per mempool entry.",
  "card": "Removes time-based transaction expiry (-mempoolexpiry) and drops the mempool's entry_time index. Age-based eviction is incentive-incompatible because it discards transactions that are still mineable, such as low-feerate parents waiting for CPFP bumps. Dropping the index also saves memory overhead per transaction entry, fitting slightly more transactions into the configured -maxmempool budget. The -mempoolexpiry option is kept as a hidden no-op that logs a warning.",
  "evidence": [
   "Fixes issue #33510: 'Mempool Expiry eviction might remove txs that could be mined in the next block'.",
   "PR description and commit d40e511d9d note that age-based eviction 'can drop still-mineable transactions, such as a low-feerate parent waiting on a fee-bumping child.'",
   "PR description notes that dropping the index removes one ordered-tree node per entry, lowering per-entry DynamicMemoryUsage() overhead so the mempool fits more transactions within the same -maxmempool budget."
  ],
  "scope_notes": "Deletes test/functional/mempool_expiry.py and updates existing tests (interface_usdt_mempool.py, wallet_resendwallettransactions.py) and mempool fuzz targets to remove dependence on expiry.",
  "changed_since_previous": "",
  "thread": {
   "last_event_at": "2026-10-27T12:58:15Z",
   "events": 7,
   "head_sha": "1556184fbdd5fda5a21371872ed0265176d854da",
   "schema_floor": 2,
   "schema": 2
  },
  "waiting_on": [
   {
    "at": "2026-10-27",
    "id": "r:5667388831",
    "on": "author",
    "url": "https://github.com/bitcoin/bitcoin/pull/36540#pullrequestreview-5667388831",
    "what": "response to review feedback on unminable transactions, deprecation, and test coverage loss"
   }
  ],
  "risk": {
   "level": "medium",
   "touches": [
    "mempool_policy"
   ],
   "why": "Mistakes in mempool eviction rules can alter mempool consistency across nodes or lead to unintended transaction retention and memory pressure."
  },
  "discussion": {
   "author_status": "last statement processed 2026-10-27",
   "open_concerns": [
    "ajtowns: removing expiry entirely prevents node operators and miners from reverting to previous default behavior if the change turns out harmful",
    "tumutech: whether MallocUsage() should be updated to account for 6 pointers now that entry_time index is removed",
    "fametrano: wallet_resendwallettransactions.py no longer verifies that a parent transaction is resubmitted before its child",
    "fametrano: update DynamicMemoryUsage() to use 6 pointers per entry or drop the claim from the PR description",
    "fametrano: document in the release notes that abandontransaction now fails for transactions older than two weeks",
    "musaHaruna: Removing expiry entirely could cause outdated nodes to retain high-feerate transactions rejected by miners, displacing minable transactions under memory pressure and raising the minimum mempool feerate.",
    "musaHaruna: Deprecate `-mempoolexpiry` with age expiry disabled by default rather than removing its functionality immediately.",
    "musaHaruna: Whether there is existing evidence that the protection expiry provides against persistent policy disagreement is negligible enough to justify removing the mechanism entirely."
   ],
   "resolved_concerns": [
    "ajtowns: phase in the change by setting DEFAULT_MEMPOOL_EXPIRY_HOURS to a large value (e.g. 4 years) rather than removing it entirely (answered by stickies-v 2026-10-16)"
   ]
  },
  "reviewability": {
   "state": "Ready",
   "label": "Ready",
   "reason": "Nothing known that would invalidate a review now."
  },
  "agreement": {
   "state": "Blocked",
   "summary": "Blocked: objection that needs a change, nobody has replied (fametrano)",
   "reason": "Added musaHaruna to participants with an objection and suggestions from r:5667388831 regarding the retention of unminable high-feerate transactions and deprecating expiry instead of removing it.",
   "evidence": [
    "ajtowns (objection, approach, must be changed, answered): removing expiry entirely prevents node operators and miners from reverting to previous default behavior if the change turns out harmful",
    "tumutech (question, maintenance, must be answered, open): whether MallocUsage() should be updated to account for 6 pointers now that entry_time index is removed",
    "fametrano (objection, correctness, must be changed, open): wallet_resendwallettransactions.py no longer verifies that a parent transaction is resubmitted before its child",
    "fametrano (suggestion, maintenance, must be answered, open): update DynamicMemoryUsage() to use 6 pointers per entry or drop the claim from the PR description",
    "fametrano (suggestion, maintenance, must be answered, open): document in the release notes that abandontransaction now fails for transactions older than two weeks",
    "musaHaruna (objection, approach, must be answered, open): Removing expiry entirely could cause outdated nodes to retain high-feerate transactions rejected by miners, displacing minable transactions under memory pressure and raising the minimum mempool feerate.",
    "musaHaruna (suggestion, approach, must be answered, open): Deprecate `-mempoolexpiry` with age expiry disabled by default rather than removing its functionality immediately.",
    "musaHaruna (question, approach, must be answered, open): Whether there is existing evidence that the protection expiry provides against persistent policy disagreement is negligible enough to justify removing the mechanism entirely.",
    "stickies-v: Concept ACK \u2014 operators should assume mempool usage up to -maxmempool, historical reasons for expiry no longer hold, and immediate cleanup is beneficial",
    "maflcko: Concept ACK \u2014 supports per historical PR #16409",
    "tumutech: Concept ACK"
   ],
   "objections": [
    {
     "reviewer": "ajtowns",
     "association": "MEMBER",
     "type": "objection",
     "kind": "approach",
     "harm": "removing expiry entirely prevents node operators and miners from reverting to previous default behavior if the change turns out harmful",
     "request": "",
     "question": "",
     "text": "removing expiry entirely prevents node operators and miners from reverting to previous default behavior if the change turns out harmful",
     "clears_with": "change",
     "blocking": true,
     "status": "answered",
     "status_note": "stickies-v argued immediate code cleanup is preferable unless someone provides good reasons to keep the setting",
     "cleared": false,
     "author_replied": false,
     "others_replied": true,
     "fix_pushed": false,
     "replies": [
      "c:6216612525"
     ],
     "evidence": "2026-10-16: 'I don't think it's a good idea to change the node's behaviour in a way that doesn't allow users/miners to revert to the previous default in case the change turns out to be undesirable or harmful for s'",
     "url": "https://github.com/bitcoin/bitcoin/pull/36540#issuecomment-6206090292",
     "id": "c:6206090292",
     "at": "2026-10-16",
     "status_at": "2026-10-16",
     "status_by": "stickies-v",
     "resolution_evidence": "2026-10-16: stickies-v: 'I think it's nice that we can clean up the code right away. If people can come up with good reasons to use this setting,'",
     "pin": null,
     "from_schema": 2
    },
    {
     "reviewer": "ajtowns",
     "association": "MEMBER",
     "type": "suggestion",
     "kind": "approach",
     "harm": "",
     "request": "phase in the change by setting DEFAULT_MEMPOOL_EXPIRY_HOURS to a large value (e.g. 4 years) rather than removing it entirely",
     "question": "",
     "text": "phase in the change by setting DEFAULT_MEMPOOL_EXPIRY_HOURS to a large value (e.g. 4 years) rather than removing it entirely",
     "clears_with": "answer",
     "blocking": false,
     "status": "answered",
     "status_note": "stickies-v answered that cleaning up the code right away is preferable unless concrete use cases exist",
     "cleared": true,
     "author_replied": false,
     "others_replied": true,
     "fix_pushed": false,
     "replies": [
      "c:6216612525"
     ],
     "evidence": "2026-10-16: 'Is there any reason why this change shouldn't be phased in via setting `DEFAULT_MEMPOOL_EXPIRY_HOURS` to a large value, such as 35040 (4 years), instead?'",
     "url": "https://github.com/bitcoin/bitcoin/pull/36540#issuecomment-6206090292",
     "id": "c:6206090292#2",
     "at": "2026-10-16",
     "status_at": "2026-10-16",
     "status_by": "stickies-v",
     "resolution_evidence": "2026-10-16: stickies-v: 'If people can come up with good reasons to use this setting, it might make sense to keep it, or deprecate rather than re'",
     "pin": null,
     "from_schema": 2
    },
    {
     "reviewer": "tumutech",
     "association": "NONE",
     "type": "question",
     "kind": "maintenance",
     "harm": "",
     "request": "",
     "question": "whether MallocUsage() should be updated to account for 6 pointers now that entry_time index is removed",
     "text": "whether MallocUsage() should be updated to account for 6 pointers now that entry_time index is removed",
     "clears_with": "answer",
     "blocking": false,
     "status": "open",
     "status_note": "",
     "cleared": false,
     "author_replied": false,
     "others_replied": false,
     "fix_pushed": false,
     "replies": [],
     "evidence": "2026-10-16: 'would it be fine to use 6 in MallocUsage() so that the same -maxmempool budget can hold extra txn you talked about in the nice side-effect?'",
     "url": "https://github.com/bitcoin/bitcoin/pull/36540#discussion_r4297923468",
     "id": "rc:4297923468",
     "at": "2026-10-16",
     "status_at": null,
     "status_by": null,
     "resolution_evidence": "",
     "pin": null,
     "from_schema": 2
    },
    {
     "reviewer": "fametrano",
     "association": "NONE",
     "type": "objection",
     "kind": "correctness",
     "harm": "wallet_resendwallettransactions.py no longer verifies that a parent transaction is resubmitted before its child",
     "request": "",
     "question": "",
     "text": "wallet_resendwallettransactions.py no longer verifies that a parent transaction is resubmitted before its child",
     "clears_with": "change",
     "blocking": true,
     "status": "open",
     "status_note": "",
     "cleared": false,
     "author_replied": false,
     "others_replied": false,
     "fix_pushed": false,
     "replies": [],
     "evidence": "2026-10-25: 'wallet_resendwallettransactions.py no longer checks that a parent is resubmitted before its child.'",
     "url": "https://github.com/bitcoin/bitcoin/pull/36540#issuecomment-6394943202",
     "id": "c:6394943202",
     "at": "2026-10-25",
     "status_at": null,
     "status_by": null,
     "resolution_evidence": "",
     "pin": null,
     "from_schema": 2
    },
    {
     "reviewer": "fametrano",
     "association": "NONE",
     "type": "suggestion",
     "kind": "maintenance",
     "harm": "",
     "request": "update DynamicMemoryUsage() to use 6 pointers per entry or drop the claim from the PR description",
     "question": "",
     "text": "update DynamicMemoryUsage() to use 6 pointers per entry or drop the claim from the PR description",
     "clears_with": "answer",
     "blocking": false,
     "status": "open",
     "status_note": "",
     "cleared": false,
     "author_replied": false,
     "others_replied": false,
     "fix_pushed": false,
     "replies": [],
     "evidence": "2026-10-25: 'Could this PR use 6 pointers, as tumutech suggests, or drop the \"fits slightly more transactions\" sentence?'",
     "url": "https://github.com/bitcoin/bitcoin/pull/36540#issuecomment-6394943202",
     "id": "c:6394943202#2",
     "at": "2026-10-25",
     "status_at": null,
     "status_by": null,
     "resolution_evidence": "",
     "pin": null,
     "from_schema": 2
    },
    {
     "reviewer": "fametrano",
     "association": "NONE",
     "type": "suggestion",
     "kind": "maintenance",
     "harm": "",
     "request": "document in the release notes that abandontransaction now fails for transactions older than two weeks",
     "question": "",
     "text": "document in the release notes that abandontransaction now fails for transactions older than two weeks",
     "clears_with": "answer",
     "blocking": false,
     "status": "open",
     "status_note": "",
     "cleared": false,
     "author_replied": false,
     "others_replied": false,
     "fix_pushed": false,
     "replies": [],
     "evidence": "2026-10-25: 'One change may deserve a line in the note: `abandontransaction` on a wallet transaction older than two weeks now fails with \"Transaction not eligible for abandonment\".'",
     "url": "https://github.com/bitcoin/bitcoin/pull/36540#issuecomment-6394943202",
     "id": "c:6394943202#3",
     "at": "2026-10-25",
     "status_at": null,
     "status_by": null,
     "resolution_evidence": "",
     "pin": null,
     "from_schema": 2
    },
    {
     "reviewer": "musaHaruna",
     "association": "CONTRIBUTOR",
     "type": "objection",
     "kind": "approach",
     "harm": "Removing expiry entirely could cause outdated nodes to retain high-feerate transactions rejected by miners, displacing minable transactions under memory pressure and raising the minimum mempool feerate.",
     "request": "",
     "question": "",
     "text": "Removing expiry entirely could cause outdated nodes to retain high-feerate transactions rejected by miners, displacing minable transactions under memory pressure and raising the minimum mempool feerate.",
     "clears_with": "answer",
     "blocking": false,
     "status": "open",
     "status_note": "",
     "cleared": false,
     "author_replied": false,
     "others_replied": false,
     "fix_pushed": false,
     "replies": [],
     "evidence": "2026-10-27: 'Under memory pressure, they could displace lower-feerate transactions that miners would actually include, potentially causing more `SIZELIMIT` removals and raising the minimum mempool feerate.'",
     "url": "https://github.com/bitcoin/bitcoin/pull/36540#pullrequestreview-5667388831",
     "id": "r:5667388831",
     "at": "2026-10-27",
     "status_at": null,
     "status_by": null,
     "resolution_evidence": "",
     "pin": null,
     "from_schema": 2
    },
    {
     "reviewer": "musaHaruna",
     "association": "CONTRIBUTOR",
     "type": "suggestion",
     "kind": "approach",
     "harm": "",
     "request": "Deprecate `-mempoolexpiry` with age expiry disabled by default rather than removing its functionality immediately.",
     "question": "",
     "text": "Deprecate `-mempoolexpiry` with age expiry disabled by default rather than removing its functionality immediately.",
     "clears_with": "answer",
     "blocking": false,
     "status": "open",
     "status_note": "",
     "cleared": false,
     "author_replied": false,
     "others_replied": false,
     "fix_pushed": false,
     "replies": [],
     "evidence": "2026-10-27: 'I'm leaning toward deprecating `-mempoolexpiry` rather than removing its functionality immediately, with age expiry disabled by default but still available explicitly during the deprecation period.'",
     "url": "https://github.com/bitcoin/bitcoin/pull/36540#pullrequestreview-5667388831",
     "id": "r:5667388831#2",
     "at": "2026-10-27",
     "status_at": null,
     "status_by": null,
     "resolution_evidence": "",
     "pin": null,
     "from_schema": 2
    },
    {
     "reviewer": "musaHaruna",
     "association": "CONTRIBUTOR",
     "type": "question",
     "kind": "approach",
     "harm": "",
     "request": "",
     "question": "Whether there is existing evidence that the protection expiry provides against persistent policy disagreement is negligible enough to justify removing the mechanism entirely.",
     "text": "Whether there is existing evidence that the protection expiry provides against persistent policy disagreement is negligible enough to justify removing the mechanism entirely.",
     "clears_with": "answer",
     "blocking": false,
     "status": "open",
     "status_note": "",
     "cleared": false,
     "author_replied": false,
     "others_replied": false,
     "fix_pushed": false,
     "replies": [],
     "evidence": "2026-10-27: 'Is there already evidence that the protection expiry provides against persistent policy disagreement is negligible enough to justify removing the mechanism entirely, rather than just changing the default?'",
     "url": "https://github.com/bitcoin/bitcoin/pull/36540#pullrequestreview-5667388831",
     "id": "r:5667388831#3",
     "at": "2026-10-27",
     "status_at": null,
     "status_by": null,
     "resolution_evidence": "",
     "pin": null,
     "from_schema": 2
    }
   ],
   "support": [
    {
     "reviewer": "stickies-v",
     "reason": "operators should assume mempool usage up to -maxmempool, historical reasons for expiry no longer hold, and immediate cleanup is beneficial",
     "substantive": true,
     "verdict": "Concept ACK",
     "id": "c:6216612525",
     "url": "https://github.com/bitcoin/bitcoin/pull/36540#issuecomment-6216612525",
     "at": "2026-10-16",
     "association": "MEMBER",
     "evidence": "read",
     "areas": []
    },
    {
     "reviewer": "maflcko",
     "reason": "supports per historical PR #16409",
     "substantive": true,
     "verdict": "Concept ACK",
     "id": "c:6219869245",
     "url": "https://github.com/bitcoin/bitcoin/pull/36540#issuecomment-6219869245",
     "at": "2026-10-16",
     "association": "MEMBER",
     "evidence": "none",
     "areas": []
    },
    {
     "reviewer": "tumutech",
     "reason": "",
     "substantive": false,
     "verdict": "Concept ACK",
     "id": "c:6221116492",
     "url": "https://github.com/bitcoin/bitcoin/pull/36540#issuecomment-6221116492",
     "at": "2026-10-16",
     "association": "NONE",
     "evidence": "none",
     "areas": []
    }
   ],
   "participants": [
    {
     "login": "ajtowns",
     "stance": "objection",
     "note": "argues against removing the ability to revert to expiry and suggests phasing it in by increasing the default hours instead",
     "association": "MEMBER",
     "comments": 1,
     "first": "2026-10-16",
     "last": "2026-10-16"
    },
    {
     "login": "maflcko",
     "stance": "support",
     "note": "Concept ACK citing previous PR #16409",
     "association": "MEMBER",
     "comments": 1,
     "first": "2026-10-16",
     "last": "2026-10-16"
    },
    {
     "login": "stickies-v",
     "stance": "support",
     "note": "Concept ACK; argues historical justifications for expiry no longer hold and immediate cleanup is sensible",
     "association": "MEMBER",
     "comments": 1,
     "first": "2026-10-16",
     "last": "2026-10-16"
    },
    {
     "login": "tumutech",
     "stance": "support",
     "note": "Concept ACK; asked whether MallocUsage pointer calculation should be updated",
     "association": "NONE",
     "comments": 2,
     "first": "2026-10-16",
     "last": "2026-10-16"
    },
    {
     "login": "fametrano",
     "stance": "objection",
     "note": "objects to test coverage loss in wallet_resendwallettransactions.py and suggests updating memory calculation and release notes",
     "association": "NONE",
     "comments": 1,
     "first": "2026-10-25",
     "last": "2026-10-25"
    },
    {
     "login": "musaHaruna",
     "stance": "objection",
     "note": "concerned that removing expiry could retain unminable high-feerate transactions that displace minable ones under memory pressure; suggests deprecating instead",
     "association": "CONTRIBUTOR",
     "comments": 1,
     "first": "2026-10-27",
     "last": "2026-10-27"
    }
   ],
   "derivation": "objection that needs a change, nobody has replied (fametrano)",
   "model_state": null,
   "corrections": [],
   "notes": "Added musaHaruna to participants with an objection and suggestions from r:5667388831 regarding the retention of unminable high-feerate transactions and deprecating expiry instead of removing it."
  },
  "dependencies": {
   "depends_on": [],
   "enables": []
  },
  "categories": [
   {
    "name": "docs",
    "member": false,
    "evidence": "Touches only doc/release-notes-xxxxx.md to document the removal of the -mempoolexpiry option.",
    "band": "Unranked",
    "reason_tag": "cleanup",
    "score": 0.0,
    "factors": {
     "bug_severity": 1,
     "leverage": 1,
     "performance": 1,
     "security_stability": 1,
     "user_value": 1
    },
    "rationale": "Release note updates that accompany code changes are excluded from the documentation category."
   },
   {
    "name": "kernel",
    "member": false,
    "evidence": "Touches src/kernel/mempool_options.h and src/kernel/mempool_removal_reason.* only to remove expiry-related options and removal reasons.",
    "band": "Unranked",
    "reason_tag": "cleanup",
    "score": 0.0,
    "factors": {
     "bug_severity": 1,
     "leverage": 1,
     "performance": 1,
     "security_stability": 1,
     "user_value": 1
    },
    "rationale": "Edits to kernel header options and enums are purely mechanical updates following the removal of mempool expiry."
   },
   {
    "name": "mempool",
    "member": true,
    "evidence": "Mempool label; deletes entry_time index from txmempool and removes time-based eviction logic across mempool files.",
    "band": "P2",
    "reason_tag": "cleanup",
    "score": 0.65,
    "factors": {
     "bug_severity": 1,
     "leverage": 1,
     "performance": 1,
     "security_stability": 1,
     "user_value": 1
    },
    "rationale": "Removing time-based mempool eviction fixes an incentive-incompatibility where still-mineable transactions are evicted and eliminates per-entry index memory overhead. As noted in issue #33510 and the description, age-based eviction 'can drop still-mineable transactions, such as a low-feerate parent waiting on a fee-bumping child' while deleting the index lowers per-entry memory usage."
   },
   {
    "name": "tests",
    "member": false,
    "evidence": "Touches test runners and fuzz harnesses only to update tests for the removed expiry behavior.",
    "band": "Unranked",
    "reason_tag": "cleanup",
    "score": 0.0,
    "factors": {
     "bug_severity": 1,
     "leverage": 1,
     "performance": 1,
     "security_stability": 1,
     "user_value": 1
    },
    "rationale": "Modifications to tests and fuzz targets directly follow from the mempool feature removal rather than changes to test infrastructure."
   },
   {
    "name": "utils",
    "member": false,
    "evidence": "Touches src/init.cpp to handle -mempoolexpiry as a deprecated no-op option.",
    "band": "Unranked",
    "reason_tag": "cleanup",
    "score": 0.0,
    "factors": {
     "bug_severity": 1,
     "leverage": 1,
     "performance": 1,
     "security_stability": 1,
     "user_value": 1
    },
    "rationale": "Argument handling changes whose sole purpose is one subsystem's configuration belong to that subsystem rather than utils."
   },
   {
    "name": "validation",
    "member": false,
    "evidence": "Touches src/validation.cpp to drop expiry check calls from validation loops.",
    "band": "Unranked",
    "reason_tag": "cleanup",
    "score": 0.0,
    "factors": {
     "bug_severity": 1,
     "leverage": 1,
     "performance": 1,
     "security_stability": 1,
     "user_value": 1
    },
    "rationale": "Changes to validation files that simply remove mempool eviction calls belong to mempool rather than validation."
   },
   {
    "name": "wallet",
    "member": false,
    "evidence": "Touches test/functional/wallet_resendwallettransactions.py to adapt to transactions not being expired from the mempool.",
    "band": "Unranked",
    "reason_tag": "cleanup",
    "score": 0.0,
    "factors": {
     "bug_severity": 1,
     "leverage": 1,
     "performance": 1,
     "security_stability": 1,
     "user_value": 1
    },
    "rationale": "Test updates adjusting wallet functional tests to account for transactions staying in the mempool do not constitute wallet changes."
   }
  ],
  "confidence": "high",
  "uncertainties": [],
  "needs": []
 },
 "cost_usd": 0.0,
 "source": {
  "record": "2026-10-28T01:23:32+00:00",
  "code": "2026-10-17T01:21:36+00:00",
  "judgments": 7
 }
}