{
 "number": 36500,
 "input_hash": "b8c5f6b2f1a9e625",
 "model": "ledger",
 "prompt_hash": null,
 "created": "2026-10-26T01:22:07+00:00",
 "result": {
  "summary": "Validates the announced coin count in AssumeUTXO snapshot metadata against the unique UTXO count produced during import, and rejects transaction groups specifying zero coins during deserialization. Content hash checks take precedence over coin count errors.",
  "problem": "AssumeUTXO snapshot loading verifies content hash but does not check the metadata's announced coin count against the unique UTXOs imported into the chainstate. A malformed snapshot with duplicate records collapses outpoints into single entries, matching the serialized UTXO hash while reporting an inflated count in `loadtxoutset`. Furthermore, empty transaction groups (zero coins) pass deserialization without advancing the coin counter, which bypasses the loop interrupt check and can delay node shutdown.",
  "card": "Validates AssumeUTXO snapshot metadata coin counts against unique coins imported and disallows empty transaction groups during snapshot deserialization. Previously, snapshots with duplicated records could match the committed UTXO hash while reporting an inflated coin count, and zero-coin transaction groups could bypass loop interrupt checks to delay node shutdown. Legitimate snapshots generated by dumptxoutset already only produce non-empty groups, preserving compatibility.",
  "evidence": [
   "PR description: 'Repeated outpoints collapse into one coin, so a snapshot can repeat every record, announce the doubled count, and still match the committed UTXO hash. loadtxoutset then reports the inflated count as coins_loaded.'",
   "Commit e8e8cbcaa2: 'Snapshots generated by dumptxoutset already contain only nonempty groups.'"
  ],
  "scope_notes": "",
  "changed_since_previous": "The implementation and tests are now separated into characterization test commits and implementation commits, with no substantive changes to the validation logic.",
  "thread": {
   "last_event_at": "2026-10-25T11:37:57Z",
   "events": 2,
   "head_sha": "e8e8cbcaa25ba75ad04cbacea2ca3d4254bf23d0",
   "schema_floor": 2,
   "schema": 2
  },
  "waiting_on": [
   {
    "at": "2026-10-15",
    "id": "c:6186482161",
    "on": "author",
    "url": "https://github.com/bitcoin/bitcoin/pull/36500#issuecomment-6186482161",
    "what": "response to cyb3ralbert's suggestion to reuse nodes[1]"
   }
  ],
  "risk": {
   "level": "medium",
   "touches": [
    "validation"
   ],
   "why": "A flaw in snapshot validation could falsely reject valid AssumeUTXO snapshots or prevent users from loading them via RPC."
  },
  "discussion": {
   "author_status": "last statement processed 2026-10-25",
   "open_concerns": [
    "cyb3ralbert: Use the existing node (nodes[1]) instead of adding a fifth node to avoid test conflicts with #35307"
   ],
   "resolved_concerns": []
  },
  "reviewability": {
   "state": "Paused",
   "label": "Waiting on author",
   "reason": "Open objection from cyb3ralbert with no author reply for 7 days; review would repeat what has been asked."
  },
  "agreement": {
   "state": "Strong",
   "summary": "Strong: substantive support, no open objection (cyb3ralbert, fametrano)",
   "reason": "Added fametrano's tested ACK; cyb3ralbert's suggestion on test node reuse remains open.",
   "evidence": [
    "cyb3ralbert (suggestion, maintenance, must be answered, open): Use the existing node (nodes[1]) instead of adding a fifth node to avoid test conflicts with #35307",
    "cyb3ralbert: support \u2014 verified on regtest that duplicate records and empty groups are properly rejected and fuzz targets ran with no crashes",
    "fametrano: Tested ACK \u2014 verified on regtest and functional tests that duplicate records are rejected by coin count on head while passing on base"
   ],
   "objections": [
    {
     "reviewer": "cyb3ralbert",
     "association": "CONTRIBUTOR",
     "type": "suggestion",
     "kind": "maintenance",
     "harm": "",
     "request": "Use the existing node (nodes[1]) instead of adding a fifth node to avoid test conflicts with #35307",
     "question": "",
     "text": "Use the existing node (nodes[1]) instead of adding a fifth node to avoid test conflicts with #35307",
     "clears_with": "answer",
     "blocking": false,
     "status": "open",
     "status_note": "",
     "cleared": false,
     "author_replied": false,
     "others_replied": false,
     "fix_pushed": false,
     "replies": [],
     "evidence": "2026-10-15: 'Could the new cases use the existing `node` (`nodes[1]`) instead of adding a fifth node?'",
     "url": "https://github.com/bitcoin/bitcoin/pull/36500#issuecomment-6186482161",
     "id": "c:6186482161",
     "at": "2026-10-15",
     "status_at": null,
     "status_by": null,
     "resolution_evidence": "",
     "pin": null,
     "from_schema": 2
    }
   ],
   "support": [
    {
     "reviewer": "cyb3ralbert",
     "reason": "verified on regtest that duplicate records and empty groups are properly rejected and fuzz targets ran with no crashes",
     "substantive": true,
     "verdict": "",
     "id": "c:6186482161",
     "url": "https://github.com/bitcoin/bitcoin/pull/36500#issuecomment-6186482161",
     "at": "2026-10-15",
     "association": "CONTRIBUTOR",
     "evidence": "tested",
     "areas": []
    },
    {
     "reviewer": "fametrano",
     "reason": "verified on regtest and functional tests that duplicate records are rejected by coin count on head while passing on base",
     "substantive": true,
     "verdict": "Tested ACK",
     "id": "c:6397148633",
     "url": "https://github.com/bitcoin/bitcoin/pull/36500#issuecomment-6397148633",
     "at": "2026-10-25",
     "association": "CONTRIBUTOR",
     "evidence": "both",
     "areas": [
      "feature_assumeutxo.py"
     ]
    }
   ],
   "participants": [
    {
     "login": "cyb3ralbert",
     "stance": "support",
     "note": "tested on regtest and fuzz targets; suggested reusing nodes[1] in the functional test",
     "association": "CONTRIBUTOR",
     "comments": 1,
     "first": "2026-10-15",
     "last": "2026-10-15"
    },
    {
     "login": "fametrano",
     "stance": "support",
     "note": "tested ACK; verified rejection of duplicate coin records on head vs base",
     "association": "CONTRIBUTOR",
     "comments": 1,
     "first": "2026-10-25",
     "last": "2026-10-25"
    }
   ],
   "derivation": "substantive support, no open objection (cyb3ralbert, fametrano)",
   "model_state": null,
   "corrections": [],
   "notes": "Added fametrano's tested ACK; cyb3ralbert's suggestion on test node reuse remains open."
  },
  "dependencies": {
   "depends_on": [],
   "enables": []
  },
  "categories": [
   {
    "name": "mempool",
    "member": false,
    "evidence": "Touches src/validation.cpp solely for AssumeUTXO snapshot import validation, with no connection to unconfirmed transaction acceptance, eviction, or mempool policy.",
    "band": "Unranked",
    "reason_tag": "cleanup",
    "score": 0.0,
    "factors": {
     "bug_severity": 1,
     "leverage": 0,
     "performance": 0,
     "security_stability": 1,
     "user_value": 0
    },
    "rationale": "Not a mempool change."
   },
   {
    "name": "validation",
    "member": true,
    "evidence": "Has the Validation label, edits src/validation.cpp and src/node/utxo_snapshot.h, and modifies AssumeUTXO snapshot validation logic.",
    "band": "P3",
    "reason_tag": "bug fix",
    "score": 0.35,
    "factors": {
     "bug_severity": 1,
     "leverage": 0,
     "performance": 0,
     "security_stability": 1,
     "user_value": 0
    },
    "rationale": "Tightens AssumeUTXO snapshot validation by ensuring imported unique UTXOs match announced counts and preventing empty groups from delaying node shutdown. Because snapshot content hashes are already verified prior to this change, this is a modest sanity-check fix rather than a critical consensus or chainstate corruption issue."
   }
  ],
  "confidence": "high",
  "uncertainties": [],
  "needs": []
 },
 "cost_usd": 0.0,
 "source": {
  "record": "2026-10-26T01:22:07+00:00",
  "code": "2026-10-17T01:21:16+00:00",
  "judgments": 2
 }
}