{
 "number": 36405,
 "input_hash": "072f6636ed67e74a",
 "model": "ledger",
 "prompt_hash": null,
 "created": "2026-10-27T01:27:10+00:00",
 "result": {
  "summary": "Fixes an assertion in `test/functional/p2p_blocksonly.py` to check for a transaction's wtxid rather than its txid when verifying that RPC-submitted transactions are not announced to block-relay-only peers. It also adds an outbound full-relay peer connection to positively assert receipt of the wtxid announcement.",
  "problem": "The test peer negotiates `wtxidrelay` and the test transaction contains a witness, meaning announcements use the wtxid instead of the txid. Because the test previously asserted the absence of the txid, the check passed vacuously even if the node improperly announced the transaction.",
  "card": "Fixes an assertion in functional test p2p_blocksonly.py by checking for the transaction wtxid instead of txid. Because the test peer negotiates wtxidrelay and the transaction has a witness, any announcement uses the wtxid, causing the previous txid absence check to pass vacuously even if the transaction was announced. The PR also adds an outbound-full-relay peer to positively assert that the wtxid was broadcast.",
  "evidence": [
   "PR description: \"The peer is a P2PTxInvStore, which negotiates wtxidrelay, so an announcement would carry the wtxid. The MiniWallet transaction has a witness, so its txid and wtxid differ, and the check passes whether or not the node announces it.\"",
   "Commit message: \"With the connection opened as outbound-full-relay rather than block-relay-only, the old assertion still passes and the new one fails.\""
  ],
  "scope_notes": "",
  "changed_since_previous": "Added an outbound-full-relay peer to the functional test to positively assert that the wtxid is announced, ensuring the absence check on the block-relay connection cannot pass vacuously.",
  "thread": {
   "last_event_at": "2026-10-26T01:42:04Z",
   "events": 7,
   "head_sha": "22535b460568be47e57aadfbe50d489becb77577",
   "schema_floor": 2,
   "schema": 2
  },
  "waiting_on": [
   {
    "at": null,
    "id": "",
    "on": "nothing",
    "url": null,
    "what": "PR has multiple ACKs and all comments are resolved"
   }
  ],
  "risk": {
   "level": "low",
   "touches": [
    "tests"
   ],
   "why": "Modifies only functional test assertions and adds a test peer connection."
  },
  "discussion": {
   "author_status": "last statement processed 2026-10-26",
   "open_concerns": [],
   "resolved_concerns": [
    "maflcko: Add another peer to check that the transaction is received, to prevent future silent test breakage. (accepted by maflcko 2026-10-14)",
    "maflcko: Use sync_with_ping instead of waiting for a broadcast when mocktime is used without the unbroadcast set. (accepted by maflcko 2026-10-14)"
   ]
  },
  "reviewability": {
   "state": "Ready",
   "label": "Ready",
   "reason": "Nothing known that would invalidate a review now."
  },
  "agreement": {
   "state": "Strong",
   "summary": "Strong: substantive support, no open objection (AndreaDiazCorreia)",
   "reason": "Added an ACK from AndreaDiazCorreia with substantive testing and code review rationale. All claims remain settled and nothing is pending.",
   "evidence": [
    "mercie-ux: Concept ACK",
    "maflcko: ACK \u2014 lgtm",
    "AndreaDiazCorreia: ACK \u2014 Ran p2p_blocksonly.py with v1 and v2 transport. With conn changed to outbound-full-relay, the new assertion fails while the old txid check still passes. Using txid in both assertions also fails at the positive control."
   ],
   "objections": [
    {
     "reviewer": "maflcko",
     "association": "MEMBER",
     "type": "suggestion",
     "kind": "correctness",
     "harm": "",
     "request": "Add another peer to check that the transaction is received, to prevent future silent test breakage.",
     "question": "",
     "text": "Add another peer to check that the transaction is received, to prevent future silent test breakage.",
     "clears_with": "answer",
     "blocking": false,
     "status": "accepted",
     "status_note": "author adjusted the peer check and maflcko ACKed",
     "cleared": true,
     "author_replied": true,
     "others_replied": false,
     "fix_pushed": true,
     "replies": [
      "rc:4257533456",
      "rc:4267090004"
     ],
     "evidence": "2026-10-12: 'maybe there should be another peer to check it is received for it? Otherwise the test will likely silently break again in the future?'",
     "url": "https://github.com/bitcoin/bitcoin/pull/36405#discussion_r4248035821",
     "id": "rc:4248035821",
     "at": "2026-10-12",
     "status_at": "2026-10-14",
     "status_by": "maflcko",
     "resolution_evidence": "2026-10-14: maflcko: 'lgtm ACK 22535b460568be47e57aadfbe50d489becb77577'",
     "pin": null,
     "from_schema": 2
    },
    {
     "reviewer": "maflcko",
     "association": "MEMBER",
     "type": "suggestion",
     "kind": "approach",
     "harm": "",
     "request": "Use sync_with_ping instead of waiting for a broadcast when mocktime is used without the unbroadcast set.",
     "question": "",
     "text": "Use sync_with_ping instead of waiting for a broadcast when mocktime is used without the unbroadcast set.",
     "clears_with": "answer",
     "blocking": false,
     "status": "accepted",
     "status_note": "author dropped the wait and used sync_with_ping in 22535b4, and maflcko ACKed",
     "cleared": true,
     "author_replied": true,
     "others_replied": false,
     "fix_pushed": true,
     "replies": [
      "rc:4267090004"
     ],
     "evidence": "2026-10-13: 'There is no need to wait for a broadcast, when not using the unbroadcast set for this test. Also, with mocktime, this should probably be a sync_with_ping instead?'",
     "url": "https://github.com/bitcoin/bitcoin/pull/36405#discussion_r4257661531",
     "id": "rc:4257661531",
     "at": "2026-10-13",
     "status_at": "2026-10-14",
     "status_by": "maflcko",
     "resolution_evidence": "2026-10-14: maflcko: 'lgtm ACK 22535b460568be47e57aadfbe50d489becb77577'",
     "pin": null,
     "from_schema": 2
    }
   ],
   "support": [
    {
     "reviewer": "mercie-ux",
     "reason": "",
     "substantive": false,
     "verdict": "Concept ACK",
     "id": "c:6040022214",
     "url": "https://github.com/bitcoin/bitcoin/pull/36405#issuecomment-6040022214",
     "at": "2026-10-07",
     "association": "CONTRIBUTOR",
     "evidence": "none",
     "areas": []
    },
    {
     "reviewer": "maflcko",
     "reason": "lgtm",
     "substantive": false,
     "verdict": "ACK",
     "id": "c:6161642824",
     "url": "https://github.com/bitcoin/bitcoin/pull/36405#issuecomment-6161642824",
     "at": "2026-10-14",
     "association": "MEMBER",
     "evidence": "none",
     "areas": []
    },
    {
     "reviewer": "AndreaDiazCorreia",
     "reason": "Ran p2p_blocksonly.py with v1 and v2 transport. With conn changed to outbound-full-relay, the new assertion fails while the old txid check still passes. Using txid in both assertions also fails at the positive control.",
     "substantive": true,
     "verdict": "ACK",
     "id": "r:5646511712",
     "url": "https://github.com/bitcoin/bitcoin/pull/36405#pullrequestreview-5646511712",
     "at": "2026-10-26",
     "association": "NONE",
     "evidence": "both",
     "areas": [
      "p2p_blocksonly.py"
     ]
    }
   ],
   "participants": [
    {
     "login": "mercie-ux",
     "stance": "support",
     "note": "Concept ACK without rationale",
     "association": "CONTRIBUTOR",
     "comments": 1,
     "first": "2026-10-07",
     "last": "2026-10-07"
    },
    {
     "login": "maflcko",
     "stance": "support",
     "note": "ACKed after author addressed suggestions on self-checking assert and sync_with_ping",
     "association": "MEMBER",
     "comments": 3,
     "first": "2026-10-12",
     "last": "2026-10-14"
    },
    {
     "login": "AndreaDiazCorreia",
     "stance": "support",
     "note": "ACK with testing of failure and control cases across v1 and v2 transport",
     "association": "NONE",
     "comments": 1,
     "first": "2026-10-26",
     "last": "2026-10-26"
    }
   ],
   "derivation": "substantive support, no open objection (AndreaDiazCorreia)",
   "model_state": null,
   "corrections": [],
   "notes": "Added an ACK from AndreaDiazCorreia with substantive testing and code review rationale. All claims remain settled and nothing is pending."
  },
  "dependencies": {
   "depends_on": [],
   "enables": []
  },
  "categories": [
   {
    "name": "p2p",
    "member": true,
    "evidence": "Touches `test/functional/p2p_blocksonly.py` to fix the verification of transaction announcement suppression to block-relay-only peers.",
    "band": "P3",
    "reason_tag": "test coverage",
    "score": 0.35,
    "factors": {
     "bug_severity": 0,
     "leverage": 0,
     "performance": 0,
     "security_stability": 0,
     "user_value": 0
    },
    "rationale": "Fixes a vacuous test assertion where checking for txid instead of wtxid allowed the test to pass even if the node improperly announced the transaction to block-relay-only peers. The underlying node relay behavior is not reported broken, but fixing the negative test assertion ensures future regressions in transaction privacy and relay filtering are caught."
   },
   {
    "name": "tests",
    "member": false,
    "evidence": "Tests category covers testing framework and infrastructure; area-specific tests like p2p relay tests belong to that area.",
    "band": "Unranked",
    "reason_tag": "test coverage",
    "score": 0.0,
    "factors": {
     "bug_severity": 0,
     "leverage": 0,
     "performance": 0,
     "security_stability": 0,
     "user_value": 0
    },
    "rationale": "This PR modifies an area test (`test/functional/p2p_blocksonly.py`) rather than the shared test framework or infrastructure."
   }
  ],
  "confidence": "high",
  "uncertainties": [],
  "needs": []
 },
 "cost_usd": 0.0,
 "source": {
  "record": "2026-10-27T01:27:10+00:00",
  "code": "2026-10-15T01:20:35+00:00",
  "judgments": 2
 }
}