{
 "number": 36597,
 "input_hash": "5b8ed912367b78fd",
 "model": "ledger",
 "prompt_hash": null,
 "created": "2026-10-24T01:18:31+00:00",
 "result": {
  "summary": "Updates wallet commit and transaction broadcast interfaces to return an `Expected<void, TransactionBroadcastError>` instead of `void` or error codes with separate output strings. Introduces `TransactionBroadcastError` pairing a `TransactionError` code with an untranslated message, removes `TransactionError::OK`, and adds a `SUBMISSION_SKIPPED` code for transactions that the wallet chooses not to relay. Existing callers such as RPCs and the Qt widgets interface currently discard the result to preserve existing behavior.",
  "problem": "Frontends relying on `interfaces::Wallet::commitTransaction` cannot know if a transaction was accepted into the mempool because `CWallet::CommitTransaction()` only logged errors and returned `void`. Consequently, interfaces such as the QML GUI report 'Transaction sent' even when the node rejected the transaction.",
  "card": "Changes CWallet::CommitTransaction and interfaces::Wallet::commitTransaction to return broadcast errors via util::Expected instead of returning void. This allows interfaces such as the QML GUI to inform users when a transaction has been rejected instead of falsely claiming 'Transaction sent' (bitcoin-core/gui-qml#1008). Existing wallet RPC and Qt widget callers ignore the returned error to maintain existing behavior.",
  "evidence": [
   "PR description: 'The QML GUI shows \"Transaction sent\" even when the node rejected the transaction, because CWallet::CommitTransaction() only logs the rejection and returns void' (bitcoin-core/gui-qml#1008)"
  ],
  "scope_notes": "Modifies public interfaces across `interfaces::Wallet`, `interfaces::Chain`, and `interfaces::Node`, refactoring `BroadcastTransaction` signatures and updating all internal invocation sites.",
  "changed_since_previous": "Initial description was evaluated without patch data; the full patch confirms the signature refactoring across interfaces and the addition of unit tests in `wallet_interfaces_tests.cpp` and `wallet_tests.cpp`.",
  "thread": {
   "last_event_at": "2026-10-23T18:56:56Z",
   "events": 6,
   "head_sha": "4e3d1675597173075a7efd9b3905c928b2be8de5",
   "schema_floor": 2,
   "schema": 2
  },
  "waiting_on": [
   {
    "at": "2026-10-23",
    "id": "c:6372466862",
    "on": "author",
    "url": "https://github.com/bitcoin/bitcoin/pull/36597#issuecomment-6372466862",
    "what": "respond to ViniciusCestarii's test coverage observation"
   },
   {
    "at": "2026-10-23",
    "id": "c:6371422769",
    "on": "reviewer",
    "url": "https://github.com/bitcoin/bitcoin/pull/36597#issuecomment-6371422769",
    "what": "maflcko to review author's explanation of use cases"
   }
  ],
  "risk": {
   "level": "medium",
   "touches": [
    "wallet",
    "gui",
    "rpc_api"
   ],
   "why": "A mistake in transaction submission error handling or mempool state tracking in CWallet could cause wallet transactions to incorrectly fail or become desynchronized from the node."
  },
  "discussion": {
   "author_status": "last statement processed 2026-10-23",
   "open_concerns": [
    "ViniciusCestarii: Add test coverage for MEMPOOL_REJECTED in interfaces::Wallet commit_transaction test to kill surviving mutant"
   ],
   "resolved_concerns": [
    "Naomi-Gift: Will the QML GUI treat SUBMISSION_SKIPPED with -walletbroadcast=0 as saved rather than failure? (answered by pseudoramdom 2026-10-22)",
    "maflcko: Explain why returning broadcast errors is needed rather than fixing creation bugs, warning about fees before creation, or reporting asynchronously (answered by pseudoramdom 2026-10-23)"
   ]
  },
  "reviewability": {
   "state": "Paused",
   "label": "Waiting on author",
   "reason": "Open objection from ViniciusCestarii with no author reply for 9 days; review would repeat what has been asked."
  },
  "agreement": {
   "state": "Positive",
   "summary": "Positive: support without stated reasons, no open objection (w0xlt, Naomi-Gift)",
   "reason": "Added maflcko's inquiry questioning the rationale for CommitTransaction errors (answered by pseudoramdom) and ViniciusCestarii's mutation test observation indicating missing test coverage in interface tests.",
   "evidence": [
    "ViniciusCestarii (suggestion, maintenance, must be answered, open): Add test coverage for MEMPOOL_REJECTED in interfaces::Wallet commit_transaction test to kill surviving mutant",
    "w0xlt: Concept ACK",
    "Naomi-Gift: Concept ACK"
   ],
   "objections": [
    {
     "reviewer": "Naomi-Gift",
     "association": "NONE",
     "type": "question",
     "kind": "interface",
     "harm": "",
     "request": "",
     "question": "Will the QML GUI treat SUBMISSION_SKIPPED with -walletbroadcast=0 as saved rather than failure?",
     "text": "Will the QML GUI treat SUBMISSION_SKIPPED with -walletbroadcast=0 as saved rather than failure?",
     "clears_with": "answer",
     "blocking": false,
     "status": "answered",
     "status_note": "author confirmed that SUBMISSION_SKIPPED is intended to allow callers to differentiate skipped submissions from rejections",
     "cleared": true,
     "author_replied": true,
     "others_replied": false,
     "fix_pushed": false,
     "replies": [
      "c:6347331724"
     ],
     "evidence": "2026-10-22: 'Will the QML GUI treat that as \"saved, not broadcast\" rather than as a failure?'",
     "url": "https://github.com/bitcoin/bitcoin/pull/36597#issuecomment-6342169509",
     "id": "c:6342169509",
     "at": "2026-10-22",
     "status_at": "2026-10-22",
     "status_by": "pseudoramdom",
     "resolution_evidence": "2026-10-22: pseudoramdom: 'Yes, that's the intent. `SUBMISSION_SKIPPED` is a separate code precisely so a caller can differentiate'",
     "pin": null,
     "from_schema": 2
    },
    {
     "reviewer": "maflcko",
     "association": "MEMBER",
     "type": "suggestion",
     "kind": "usefulness",
     "harm": "",
     "request": "Explain why returning broadcast errors is needed rather than fixing creation bugs, warning about fees before creation, or reporting asynchronously",
     "question": "",
     "text": "Explain why returning broadcast errors is needed rather than fixing creation bugs, warning about fees before creation, or reporting asynchronously",
     "clears_with": "answer",
     "blocking": false,
     "status": "answered",
     "status_note": "author explained that imported PSBTs bypass create checks, and sync errors complement async notifications",
     "cleared": true,
     "author_replied": true,
     "others_replied": false,
     "fix_pushed": false,
     "replies": [
      "c:6371422769"
     ],
     "evidence": "2026-10-23: 'Can you explain why this would be needed? If the wallet creates a consensus-invalid (permanently invalid) transaction, that seems like a severe bug that should be fixed instead.'",
     "url": "https://github.com/bitcoin/bitcoin/pull/36597#issuecomment-6368597702",
     "id": "c:6368597702",
     "at": "2026-10-23",
     "status_at": "2026-10-23",
     "status_by": "pseudoramdom",
     "resolution_evidence": "2026-10-23: pseudoramdom: 'The GUI can import a PSBT that spends the wallet's coins, sign it with the wallet and commit it. Its inputs and fee were chosen elsewhere and none of `createTransaction()`'s checks ran'",
     "pin": null,
     "from_schema": 2
    },
    {
     "reviewer": "ViniciusCestarii",
     "association": "CONTRIBUTOR",
     "type": "suggestion",
     "kind": "maintenance",
     "harm": "",
     "request": "Add test coverage for MEMPOOL_REJECTED in interfaces::Wallet commit_transaction test to kill surviving mutant",
     "question": "",
     "text": "Add test coverage for MEMPOOL_REJECTED in interfaces::Wallet commit_transaction test to kill surviving mutant",
     "clears_with": "answer",
     "blocking": false,
     "status": "open",
     "status_note": "",
     "cleared": false,
     "author_replied": false,
     "others_replied": false,
     "fix_pushed": false,
     "replies": [],
     "evidence": "2026-10-23: 'returning success on `MEMPOOL_REJECTED` survives. `CommitTransactionErrors` covers the rejection on `CWallet`, but the interface test `commit_transaction` (the path gui-qml#1008 uses) only covers `SUBMISSION_SKIPPED` and success.'",
     "url": "https://github.com/bitcoin/bitcoin/pull/36597#issuecomment-6372466862",
     "id": "c:6372466862",
     "at": "2026-10-23",
     "status_at": null,
     "status_by": null,
     "resolution_evidence": "",
     "pin": null,
     "from_schema": 2
    }
   ],
   "support": [
    {
     "reviewer": "w0xlt",
     "reason": "",
     "substantive": false,
     "verdict": "Concept ACK",
     "id": "c:6327592527",
     "url": "https://github.com/bitcoin/bitcoin/pull/36597#issuecomment-6327592527",
     "at": "2026-10-21",
     "association": "CONTRIBUTOR",
     "evidence": "none",
     "areas": []
    },
    {
     "reviewer": "Naomi-Gift",
     "reason": "",
     "substantive": false,
     "verdict": "Concept ACK",
     "id": "c:6342169509",
     "url": "https://github.com/bitcoin/bitcoin/pull/36597#issuecomment-6342169509",
     "at": "2026-10-22",
     "association": "NONE",
     "evidence": "none",
     "areas": []
    }
   ],
   "participants": [
    {
     "login": "w0xlt",
     "stance": "support",
     "note": "gave Concept ACK",
     "association": "CONTRIBUTOR",
     "comments": 1,
     "first": "2026-10-21",
     "last": "2026-10-21"
    },
    {
     "login": "Naomi-Gift",
     "stance": "support",
     "note": "Concept ACK; asked how QML GUI handles SUBMISSION_SKIPPED",
     "association": "NONE",
     "comments": 1,
     "first": "2026-10-22",
     "last": "2026-10-22"
    },
    {
     "login": "ViniciusCestarii",
     "stance": "neutral",
     "note": "pointed out surviving mutant from missing test coverage for MEMPOOL_REJECTED",
     "association": "CONTRIBUTOR",
     "comments": 1,
     "first": "2026-10-23",
     "last": "2026-10-23"
    },
    {
     "login": "maflcko",
     "stance": "question",
     "note": "asked why broadcast errors are needed instead of fixing wallet bugs or using async feedback",
     "association": "MEMBER",
     "comments": 1,
     "first": "2026-10-23",
     "last": "2026-10-23"
    }
   ],
   "derivation": "support without stated reasons, no open objection (w0xlt, Naomi-Gift)",
   "model_state": null,
   "corrections": [],
   "notes": "Added maflcko's inquiry questioning the rationale for CommitTransaction errors (answered by pseudoramdom) and ViniciusCestarii's mutation test observation indicating missing test coverage in interface tests."
  },
  "dependencies": {
   "depends_on": [],
   "enables": [
    "bitcoin-core/gui-qml update to report broadcast errors to users (gui-qml#1008)",
    "Follow-up PR propagating errors from commitBumpTransaction"
   ]
  },
  "categories": [
   {
    "name": "ipc",
    "member": true,
    "evidence": "Modifies public interfaces in src/interfaces/wallet.h, src/interfaces/chain.h, and src/interfaces/node.h to propagate broadcast errors across process boundaries.",
    "band": "P3",
    "reason_tag": "unblocks #1008",
    "score": 0.4,
    "factors": {
     "bug_severity": 1,
     "leverage": 2,
     "performance": 0,
     "security_stability": 0,
     "user_value": 2
    },
    "rationale": "Extends node and wallet interface methods to return structured broadcast errors needed by multiprocess consumers like the QML GUI. The PR description notes that frontends relying on `interfaces::Wallet::commitTransaction` could not detect rejected transactions because the method returned `void`, unblocking gui-qml#1008."
   },
   {
    "name": "p2p",
    "member": false,
    "evidence": "Changes to src/net_processing.cpp and .h are mechanical signature adaptations for transaction broadcast helpers and do not alter P2P protocol or relay behavior.",
    "band": "Unranked",
    "reason_tag": "cleanup",
    "score": 0.0,
    "factors": {
     "bug_severity": 1,
     "leverage": 2,
     "performance": 0,
     "security_stability": 0,
     "user_value": 2
    },
    "rationale": ""
   },
   {
    "name": "rpc",
    "member": false,
    "evidence": "Edits in src/rpc/mempool.cpp and src/rpc/util.cpp only update call sites to match the new return type without changing RPC interface behavior or outputs.",
    "band": "Unranked",
    "reason_tag": "cleanup",
    "score": 0.0,
    "factors": {
     "bug_severity": 1,
     "leverage": 2,
     "performance": 0,
     "security_stability": 0,
     "user_value": 2
    },
    "rationale": ""
   },
   {
    "name": "tests",
    "member": false,
    "evidence": "Touches src/test/fuzz/kitchen_sink.cpp solely to adapt an existing caller to the updated broadcast interface signature.",
    "band": "Unranked",
    "reason_tag": "test coverage",
    "score": 0.0,
    "factors": {
     "bug_severity": 1,
     "leverage": 2,
     "performance": 0,
     "security_stability": 0,
     "user_value": 2
    },
    "rationale": ""
   },
   {
    "name": "utils",
    "member": false,
    "evidence": "Changes in src/common/messages.cpp are mechanical updates adjusting to the refactored transaction error types.",
    "band": "Unranked",
    "reason_tag": "cleanup",
    "score": 0.0,
    "factors": {
     "bug_severity": 1,
     "leverage": 2,
     "performance": 0,
     "security_stability": 0,
     "user_value": 2
    },
    "rationale": ""
   },
   {
    "name": "wallet",
    "member": true,
    "evidence": "Labeled 'Wallet' and modifies CWallet::CommitTransaction() alongside wallet spend and bump fee interfaces.",
    "band": "P2",
    "reason_tag": "bug fix",
    "score": 0.65,
    "factors": {
     "bug_severity": 1,
     "leverage": 2,
     "performance": 0,
     "security_stability": 0,
     "user_value": 2
    },
    "rationale": "Prevents wallet frontends from falsely displaying 'Transaction sent' when the node rejects a transaction. The PR description highlights that `CWallet::CommitTransaction()` previously discarded rejections by returning `void`, masking broadcast failures from the user."
   }
  ],
  "confidence": "high",
  "uncertainties": [],
  "needs": []
 },
 "cost_usd": 0.0,
 "source": {
  "record": "2026-10-24T01:18:31+00:00",
  "code": "2026-10-23T01:20:39+00:00",
  "judgments": 6
 }
}