{
 "number": 36699,
 "input_hash": "5dc2792da050b6f4",
 "model": "ledger",
 "prompt_hash": null,
 "created": "2026-11-01T01:16:00+00:00",
 "result": {
  "summary": "Adds 0-of-0 OP_CHECKMULTISIG and OP_CHECKMULTISIGVERIFY test cases for tapscript in feature_taproot.py to verify that failure is triggered specifically by the opcode ban rather than DER signature validation errors. Also dumps the expected error string for failure cases into the test assets and verifies in script_assets_tests that evaluation fails with the exact expected script error code under the declared flags.",
  "problem": "Existing tapscript test cases for disabled CHECKMULTISIG opcodes supplied Schnorr signatures, which fail DER signature validation when the opcode is executed. As a result, an implementation that incorrectly executes CHECKMULTISIG in tapscript still passed all tests. Additionally, the script asset test runner only verified that a test failed, without ensuring it failed for the correct reason.",
  "card": "Adds 0-of-0 OP_CHECKMULTISIG and OP_CHECKMULTISIGVERIFY test vectors for tapscript to feature_taproot.py, and records expected error strings in the generated test asset dump for script_assets_tests to verify. Existing test cases used Schnorr signatures that failed DER validation, allowing an implementation that failed to disable CHECKMULTISIG in tapscript to pass all existing asset tests. The asset test runner also previously only verified that negative test cases failed, rather than verifying they failed with the expected error code. The author identified the issue after discovering a third-party tapscript implementation executing CHECKMULTISIG passed the test suite.",
  "evidence": [
   "The author found this flaw against external software: \"This came up while running script_assets_test.json against a third-party implementation which executed OP_CHECKMULTISIG in tapscript and passed every case... it accepts the new failure case while its fixed version rejects it with SCRIPT_ERR_TAPSCRIPT_CHECKMULTISIG\" (PR description)."
  ],
  "scope_notes": "",
  "changed_since_previous": "",
  "thread": {
   "last_event_at": "2026-10-30T09:25:09Z",
   "events": 1,
   "head_sha": "420decb1701b192cb8d40252df227a11401a313c",
   "schema_floor": 2,
   "schema": 2
  },
  "waiting_on": [
   {
    "at": "2026-10-30",
    "id": "c:6519427719",
    "on": "reviewer",
    "url": "https://github.com/bitcoin/bitcoin/pull/36699#issuecomment-6519427719",
    "what": "review from instagibbs or others"
   },
   {
    "at": "2026-10-30",
    "id": "c:6519427719",
    "on": "reviewer",
    "url": "https://github.com/bitcoin/bitcoin/pull/36699#issuecomment-6519427719",
    "what": "review of the PR"
   }
  ],
  "risk": {
   "level": "low",
   "touches": [
    "tests"
   ],
   "why": "Changes are strictly confined to functional test script generation and test harness assertions."
  },
  "discussion": {
   "author_status": "last statement processed 2026-10-30",
   "open_concerns": [],
   "resolved_concerns": []
  },
  "reviewability": {
   "state": "Ready",
   "label": "Ready",
   "reason": "Nothing known that would invalidate a review now."
  },
  "agreement": {
   "state": "Crickets",
   "summary": "Crickets: no substantive comment either way",
   "reason": "Initial record. fanquake pinged instagibbs; awaiting review. / Initial record. fanquake only pinged instagibbs.",
   "evidence": [],
   "objections": [],
   "support": [],
   "participants": [
    {
     "login": "fanquake",
     "stance": "neutral",
     "note": "pinged instagibbs",
     "association": "MEMBER",
     "comments": 1,
     "first": "2026-10-30",
     "last": "2026-10-30"
    }
   ],
   "derivation": "no substantive comment either way",
   "model_state": null,
   "corrections": [],
   "notes": "Initial record. fanquake pinged instagibbs; awaiting review. / Initial record. fanquake only pinged instagibbs."
  },
  "dependencies": {
   "depends_on": [],
   "enables": []
  },
  "categories": [
   {
    "name": "tests",
    "member": true,
    "evidence": "Labeled Tests; modifies test runner verification in src/test/script_assets_tests.cpp and tapscript test generation in test/functional/feature_taproot.py",
    "band": "P3",
    "reason_tag": "test coverage",
    "score": 0.35,
    "factors": {
     "bug_severity": 0,
     "leverage": 0,
     "performance": 0,
     "security_stability": 1,
     "user_value": 0
    },
    "rationale": "Tightens tapscript test vectors and enhances the script asset test runner to verify exact failure error codes rather than generic failure. The author discovered that prior tests allowed \"a third-party implementation which executed OP_CHECKMULTISIG in tapscript and passed every case\" because failure was inadvertently masked by DER signature errors rather than the tapscript opcode ban."
   }
  ],
  "confidence": "high",
  "uncertainties": [],
  "needs": []
 },
 "cost_usd": 0.0,
 "source": {
  "record": "2026-11-01T01:16:00+00:00",
  "code": "2026-11-01T01:20:09+00:00",
  "judgments": 1
 }
}