{"id":"stripe-confirm-and-capture-payment","version":"1.0.0","primitive":"code_execution","description":"Stripe secret key (sk_test_... for test mode)","registry_refs":["stripe"],"tags":[],"solves":[],"auth_required":true,"verified":false,"last_verified":"null","next_check":"2026-07-30","eval_result":"null","eval_env":"null","mast":[],"ref":"https://arxiv.org/abs/2503.13657","inputs":[{"name":"STRIPE_SECRET_KEY","required":true,"description":"Stripe secret key (sk_test_... for test mode)"}],"executable":"# ============================================\n# checklist:     stripe-confirm-and-capture-payment\n# version:       1.0.0\n# primitive:     code_execution\n# description:   Confirm a Stripe PaymentIntent with a test card and capture with manual capture_method\n# registry_refs: stripe\n# auth_required: true\n# verified:      false\n# last_verified: null\n# next_check:    2026-07-30\n# eval_result:   null\n# eval_env:      null\n#\n# inputs:\n#   - name: STRIPE_SECRET_KEY\n#     required: true\n#     description: Stripe secret key (sk_test_... for test mode)\n#\n# OUTPUTS:\n#   payment_intent_id — PaymentIntent ID\n#   confirmed_status  — status after confirm (requires_capture)\n#   captured_status   — status after capture (succeeded)\n#   amount_captured   — amount captured in cents\n#\n# MAST FAILURE MODES ADDRESSED:\n# FM-1.1 Disobey Task Specification        — capture_method=manual enables separate capture step\n# FM-3.3 Incorrect Verification            — status verified at each step, not just final\n#\n# ref: https://arxiv.org/abs/2503.13657\n# ============================================\n\nimport sys\nimport os\nimport subprocess\nimport time\nimport urllib.request\nimport json\n\n# ─────────────────────────────────────────\n# PRE_EXECUTION\n# ─────────────────────────────────────────\n\nfor attempt in range(2):\n    try:\n        req = urllib.request.Request(\n            \"https://checklist.day/api/registry/stripe\",\n            headers={\"User-Agent\": \"checklist-agent/1.0\"}\n        )\n        with urllib.request.urlopen(req, timeout=10) as resp:\n            registry = json.loads(resp.read())\n            break\n    except Exception as e:\n        if attempt == 1:\n            print(f\"ABORT: registry unreachable — {e}\")\n            sys.exit(1)\n        time.sleep(2)\n\nwarnings = registry.get(\"warnings\", [])\nif warnings:\n    print(\"[stripe] WARNINGS:\")\n    for w in warnings if isinstance(warnings, list) else [warnings]:\n        print(f\"  ⚠ {w}\")\n\n# ─────────────────────────────────────────\n# EXECUTION\n# ─────────────────────────────────────────\n\nsubprocess.check_call([sys.executable, \"-m\", \"pip\", \"install\", \"-q\", \"stripe>=7.0.0\"])\n\nimport stripe\n\nSTRIPE_SECRET_KEY = os.environ.get(\"STRIPE_SECRET_KEY\")\nif not STRIPE_SECRET_KEY:\n    print(\"ABORT: STRIPE_SECRET_KEY not set\"); sys.exit(1)\nif not STRIPE_SECRET_KEY.startswith(\"sk_test_\"):\n    print(\"ABORT: use test mode key (sk_test_...)\"); sys.exit(1)\n\nstripe.api_key = STRIPE_SECRET_KEY\n\nAMOUNT_CENTS = 2000\n\n# 1. Create PaymentIntent with manual capture\n# FOOTGUN: capture_method=\"manual\" required for separate authorize + capture flow\nintent = stripe.PaymentIntent.create(\n    amount=AMOUNT_CENTS,\n    currency=\"usd\",\n    capture_method=\"manual\",\n    payment_method_types=[\"card\"],\n    idempotency_key=f\"checklist-confirm-{int(time.time())}\",\n)\npayment_intent_id = intent.id\nprint(f\"  created: {payment_intent_id} (capture_method=manual)\")\n\n# 2. Confirm with test card\n# FOOTGUN: pm_card_visa is the standard test card token — works without 3DS\nintent = stripe.PaymentIntent.confirm(\n    payment_intent_id,\n    payment_method=\"pm_card_visa\",\n    return_url=\"https://checklist.day\",\n)\nconfirmed_status = intent.status\nprint(f\"  confirmed: status={confirmed_status}\")\n\n# 3. Capture\n# FOOTGUN: capture only works when status is \"requires_capture\"\nintent = stripe.PaymentIntent.capture(payment_intent_id)\ncaptured_status  = intent.status\namount_captured  = intent.amount_received\nprint(f\"  captured: status={captured_status} amount={amount_captured}\")\n\n# ─────────────────────────────────────────\n# POST_EXECUTION\n# ─────────────────────────────────────────\n\nassert confirmed_status == \"requires_capture\", f\"FAIL: expected requires_capture, got {confirmed_status}\"\nassert captured_status == \"succeeded\", f\"FAIL: expected succeeded, got {captured_status}\"\nassert amount_captured == AMOUNT_CENTS, f\"FAIL: expected {AMOUNT_CENTS}, got {amount_captured}\"\n\nresult = {\n    \"payment_intent_id\": payment_intent_id,\n    \"confirmed_status\":  confirmed_status,\n    \"captured_status\":   captured_status,\n    \"amount_captured\":   amount_captured,\n}\nprint(json.dumps(result, indent=2))\nprint(\"PASS\")\n"}