{
 "number": 36033,
 "input_hash": "4c149c9b701011be",
 "model": "openrouter/google/gemini-3.8-flash",
 "batch": false,
 "created": "2026-09-17T16:22:21+00:00",
 "provider": "Google",
 "stop_reason": "end_turn",
 "usage": {
  "input_tokens": 27534,
  "cache_creation_input_tokens": 0,
  "cache_read_input_tokens": 0,
  "output_tokens": 4035
 },
 "cost_usd": 0.03578175,
 "error": null,
 "result": {
  "display": {
   "goal": [
    "Require a C++23 compiler and adopt C++23 standard library features.",
    "Retire internal polyfills like util::Expected and custom byteswap helpers."
   ],
   "reviewability": [
    "CI is failing and the branch needs a rebase.",
    "The PR is explicitly marked WIP and RFC by the author."
   ],
   "agreement": [
    "Concept approval without detailed rationale (l0rinc).",
    "No objections raised, though the PR is explicitly marked nomerge."
   ],
   "categories": [
    {
     "name": "build",
     "why": [
      "P3 because bumping to C++23 is deferrable maintenance.",
      "It unblocks modern language features but has no imminent deadline."
     ]
    },
    {
     "name": "utils",
     "why": [
      "P3 because replacing util::Expected and byteswap with standard library equivalents reduces custom utility code.",
      "The internal modernization is worthwhile but carries no urgency."
     ]
    }
   ]
  },
  "summary": "This pull request raises the required C++ standard to C++23 across CMake, depends, and CI, bumping minimum compiler versions to GCC 13 and Clang 19. It replaces Bitcoin Core's custom util::Expected with std::expected, adopts std::byteswap and std::string::contains, and cleans up obsolete template workarounds like ALWAYS_FALSE.",
  "problem": "Workarounds and custom polyfills to avoid C++23 continue to accumulate in the repository, while some parts of the dependency tree already use C++23 language features.",
  "discussion": {
   "open_concerns": [],
   "resolved_concerns": [
    "hebasto noted an include change was caused by include-what-you-use heuristics on function return values."
   ],
   "author_status": "active"
  },
  "reviewability": {
   "state": "Stale",
   "label": "Needs rebase",
   "reason": "The PR has merge conflicts with master and CI is currently failing."
  },
  "agreement": {
   "state": "Positive",
   "summary": "Positive: concept ACK from l0rinc with no objections, though marked RFC and nomerge",
   "reason": "l0rinc offered a Concept ACK, hebasto provided minor review feedback, and no contributors have opposed exploring the compiler bump.",
   "evidence": [
    "l0rinc gave a Concept ACK on 2026-08-21",
    "hebasto commented on commit IWYU heuristics on 2026-08-23"
   ]
  },
  "dependencies": {
   "depends_on": [],
   "enables": [
    "#34979"
   ]
  },
  "categories": [
   {
    "name": "build",
    "member": true,
    "evidence": "Changes CMAKE_CXX_STANDARD to 23 in CMakeLists.txt and depends/Makefile, and bumps CI compiler requirements.",
    "band": "P3",
    "reason_tag": "decision needed",
    "score": 0.35,
    "factors": {
     "security_stability": 0,
     "bug_severity": 0,
     "performance": 0,
     "user_value": 0,
     "leverage": 1
    },
    "rationale": "Bumping the minimum compiler version to C++23 is a non-urgent transition. As maflcko noted in the description, 'C++23 for Bitcoin Core is mostly a style update on top of C++20', making this a deferrable standard upgrade that requires community consensus on supported compiler baselines."
   },
   {
    "name": "docs",
    "member": false,
    "evidence": "Adding a release note stub for a build system change does not make documentation the primary subject.",
    "band": "Unranked",
    "reason_tag": "",
    "score": 0.0,
    "factors": {
     "security_stability": 0,
     "bug_severity": 0,
     "performance": 0,
     "user_value": 0,
     "leverage": 0
    },
    "rationale": "The PR only adds a minimal release note documenting the compiler requirement change."
   },
   {
    "name": "indexes",
    "member": false,
    "evidence": "The diff in src/index/txospenderindex.cpp is solely an include update for std::expected.",
    "band": "Unranked",
    "reason_tag": "",
    "score": 0.0,
    "factors": {
     "security_stability": 0,
     "bug_severity": 0,
     "performance": 0,
     "user_value": 0,
     "leverage": 0
    },
    "rationale": "No index logic, interfaces, or behavior are modified."
   },
   {
    "name": "kernel",
    "member": false,
    "evidence": "Touches src/kernel/bitcoinkernel.cpp only to demonstrate std::views::zip usage in an existing helper function.",
    "band": "Unranked",
    "reason_tag": "",
    "score": 0.0,
    "factors": {
     "security_stability": 0,
     "bug_severity": 0,
     "performance": 0,
     "user_value": 0,
     "leverage": 0
    },
    "rationale": "Does not affect the kernel API, boundary, or library behavior."
   },
   {
    "name": "p2p",
    "member": false,
    "evidence": "Replaces .find() with .contains() in src/i2p.cpp mechanically.",
    "band": "Unranked",
    "reason_tag": "",
    "score": 0.0,
    "factors": {
     "security_stability": 0,
     "bug_severity": 0,
     "performance": 0,
     "user_value": 0,
     "leverage": 0
    },
    "rationale": "Mechanical call-site cleanup following from the new C++ standard."
   },
   {
    "name": "rpc",
    "member": false,
    "evidence": "Replaces .find() with .contains() mechanically in RPC helper files.",
    "band": "Unranked",
    "reason_tag": "",
    "score": 0.0,
    "factors": {
     "security_stability": 0,
     "bug_severity": 0,
     "performance": 0,
     "user_value": 0,
     "leverage": 0
    },
    "rationale": "No RPC interface, behavior, or format changes are introduced."
   },
   {
    "name": "tests",
    "member": false,
    "evidence": "Test adjustments accommodate std::expected exceptions and use .contains() instead of testing the test framework itself.",
    "band": "Unranked",
    "reason_tag": "",
    "score": 0.0,
    "factors": {
     "security_stability": 0,
     "bug_severity": 0,
     "performance": 0,
     "user_value": 0,
     "leverage": 0
    },
    "rationale": "Test harness adjustments merely keep tests compiling with C++23 standard types."
   },
   {
    "name": "tools",
    "member": false,
    "evidence": "Mechanical string find-to-contains edits in src/bitcoin-tx.cpp.",
    "band": "Unranked",
    "reason_tag": "",
    "score": 0.0,
    "factors": {
     "security_stability": 0,
     "bug_severity": 0,
     "performance": 0,
     "user_value": 0,
     "leverage": 0
    },
    "rationale": "Tool logic and CLI behaviors remain unchanged."
   },
   {
    "name": "utils",
    "member": true,
    "evidence": "Replaces util::Expected with std::expected, removes src/util/types.h, and replaces compat byteswap implementations with std::byteswap.",
    "band": "P3",
    "reason_tag": "cleanup",
    "score": 0.35,
    "factors": {
     "security_stability": 0,
     "bug_severity": 0,
     "performance": 0,
     "user_value": 0,
     "leverage": 1
    },
    "rationale": "Adopting standard library replacements for internal utilities like util::Expected and byteswap simplifies common infrastructure and removes custom code, but is non-critical cleanup."
   },
   {
    "name": "validation",
    "member": false,
    "evidence": "Only adds an include for <expected> in src/node/blockstorage.cpp.",
    "band": "Unranked",
    "reason_tag": "",
    "score": 0.0,
    "factors": {
     "security_stability": 0,
     "bug_severity": 0,
     "performance": 0,
     "user_value": 0,
     "leverage": 0
    },
    "rationale": "No consensus or validation behavior is touched."
   },
   {
    "name": "wallet",
    "member": false,
    "evidence": "Only mechanical string .contains() replacements in wallet error check paths.",
    "band": "Unranked",
    "reason_tag": "",
    "score": 0.0,
    "factors": {
     "security_stability": 0,
     "bug_severity": 0,
     "performance": 0,
     "user_value": 0,
     "leverage": 0
    },
    "rationale": "Wallet logic, coin selection, and persistence are unaffected."
   }
  ],
  "confidence": "high",
  "uncertainties": [],
  "needs": [],
  "card": "This PR explores bumping the required C++ standard to C++23, raising compiler requirements to GCC 13 and Clang 19. It eliminates internal polyfills like util::Expected and custom byteswapping in favor of std::expected and std::byteswap, alongside applying string .contains() across the codebase. Marked as an RFC and nomerge by the author, it is currently stale due to merge conflicts and failing CI, but has received an initial Concept ACK from l0rinc."
 },
 "raw_text": null
}