{
 "number": 36280,
 "input_hash": "0cb9d8e680a22b3d",
 "model": "openrouter/google/gemini-3.8-flash",
 "batch": false,
 "created": "2026-09-17T16:24:22+00:00",
 "provider": "Google",
 "stop_reason": "end_turn",
 "usage": {
  "input_tokens": 13215,
  "cache_creation_input_tokens": 0,
  "cache_read_input_tokens": 0,
  "output_tokens": 1734
 },
 "cost_usd": 0.01094355,
 "error": null,
 "result": {
  "display": {
   "goal": [
    "Prevent silent script corruption when deserializing compressed UTXO scripts",
    "Throw an exception on decompression failure rather than returning an empty anyone-can-spend script"
   ],
   "reviewability": [
    "Ready",
    "Small, self-contained diff with dedicated unit and fuzz test coverage"
   ],
   "agreement": [
    "Positive with initial approach approval (sedited)"
   ],
   "categories": [
    {
     "name": "validation",
     "why": [
      "P3 because it hardens UTXO deserialization against corruption",
      "Without this fix, an un-decompressible script silently unpacks to an anyone-can-spend script instead of failing cleanly"
     ]
    },
    {
     "name": "tests",
     "why": [
      "Not a member because test changes pin compressor behavior rather than framework machinery"
     ]
    }
   ]
  },
  "summary": "This pull request modifies `ScriptCompression::Unser` to throw `std::ios_base::failure` when `DecompressScript` fails, rather than ignoring the failure and leaving the output script empty. It also adds unit tests covering off-curve and invalid-pubkey P2PK decompression failure modes, plus an assertion round-trip in the script fuzz harness.",
  "problem": "When deserializing compressed scripts from the UTXO database or undo data, decompression failures are currently ignored. If a compressed record is corrupted or improperly formed, it silently yields an empty script (anyone-can-spend) instead of signaling deserialization failure to the caller.",
  "discussion": {
   "open_concerns": [],
   "resolved_concerns": [],
   "author_status": "active"
  },
  "reviewability": {
   "state": "Ready",
   "label": "Ready",
   "reason": "The patch is small, passes CI, and includes unit and fuzz tests with no pending requests."
  },
  "agreement": {
   "state": "Positive",
   "summary": "Positive with early Approach ACK from sedited",
   "reason": "Reviewer sedited provided an Approach ACK, with no objections raised.",
   "evidence": [
    "sedited left an Approach ACK on 2026-09-16"
   ]
  },
  "dependencies": {
   "depends_on": [],
   "enables": []
  },
  "categories": [
   {
    "name": "validation",
    "member": true,
    "evidence": "Touches `src/compressor.h`, which handles UTXO script compression for the coins database and undo storage, carrying the Validation label.",
    "band": "P3",
    "reason_tag": "bug fix",
    "score": 0.35,
    "factors": {
     "security_stability": 1,
     "bug_severity": 1,
     "performance": 0,
     "user_value": 0,
     "leverage": 0
    },
    "rationale": "Hardens UTXO deserialization error handling against corrupted or non-decodable data. As noted by furszy, the bug requires data corruption to trigger today, but ignoring failure produces an empty anyone-can-spend script instead of raising an error."
   },
   {
    "name": "tests",
    "member": false,
    "evidence": "Changes to `src/test/compress_tests.cpp` and `src/test/fuzz/script.cpp` test script compression logic rather than test runner or framework infrastructure.",
    "band": "Unranked",
    "reason_tag": "",
    "score": 0.0,
    "factors": {
     "security_stability": 0,
     "bug_severity": 0,
     "performance": 0,
     "user_value": 0,
     "leverage": 0
    },
    "rationale": "Area-specific unit and fuzz tests belong to the area under test (validation), not test infrastructure."
   }
  ],
  "confidence": "high",
  "uncertainties": [],
  "needs": [],
  "card": "PR 36280 fixes error handling in ScriptCompression::Unser so that decompression failures throw std::ios_base::failure instead of silently leaving the script empty. Currently, a corrupted compressed record can deserialize into an empty script, which consensus evaluates as anyone-can-spend. While only reachable via corruption today, the change ensures clean deserialization failure and adds explicit test coverage for uncompressed off-curve pubkey scripts. Review is ready and has an initial Approach ACK."
 },
 "raw_text": null
}