{"id":"stripe-create-payment-intent","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-create-payment-intent\n# version:       1.0.0\n# primitive:     code_execution\n# description:   Create a Stripe PaymentIntent with correct amount/currency handling and verify the client_secret is returned\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 (pi_...)\n#   status            — initial status (requires_payment_method)\n#   client_secret_ok  — true if client_secret returned for frontend use\n#   amount_cents      — amount in smallest currency unit\n#\n# MAST FAILURE MODES ADDRESSED:\n# FM-1.1 Disobey Task Specification        — amount in cents not dollars (footgun documented)\n# FM-3.2 No or Incomplete Verification     — status and client_secret verified after creation\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\n# FOOTGUN: amount is in smallest currency unit (cents for USD) — NOT dollars\n# $19.99 = 1999 cents, NOT 19.99\nAMOUNT_CENTS = 1999\nCURRENCY     = \"usd\"\n\nintent = stripe.PaymentIntent.create(\n    amount=AMOUNT_CENTS,\n    currency=CURRENCY,\n    # FOOTGUN: automatic_payment_methods required in newer Stripe API versions\n    automatic_payment_methods={\"enabled\": True},\n    metadata={\"source\": \"checklist.day\"},\n    idempotency_key=f\"checklist-pi-{int(time.time())}\",\n)\n\npayment_intent_id = intent.id\nstatus            = intent.status\nclient_secret_ok  = intent.client_secret is not None and \"_secret_\" in intent.client_secret\n\nprint(f\"  created: {payment_intent_id}\")\nprint(f\"  status:  {status}\")\nprint(f\"  amount:  {AMOUNT_CENTS} {CURRENCY.upper()} ({AMOUNT_CENTS/100:.2f})\")\nprint(f\"  client_secret: {'present' if client_secret_ok else 'MISSING'}\")\n\n# Cleanup — cancel the intent\nstripe.PaymentIntent.cancel(payment_intent_id)\nprint(f\"  cancelled: {payment_intent_id}\")\n\n# ─────────────────────────────────────────\n# POST_EXECUTION\n# ─────────────────────────────────────────\n\nassert payment_intent_id.startswith(\"pi_\"), f\"FAIL: expected pi_... ID, got {payment_intent_id}\"\nassert status == \"requires_payment_method\", f\"FAIL: unexpected status '{status}'\"\nassert client_secret_ok, \"FAIL: client_secret missing or malformed\"\n\nresult = {\n    \"payment_intent_id\": payment_intent_id,\n    \"status\":            status,\n    \"client_secret_ok\":  client_secret_ok,\n    \"amount_cents\":      AMOUNT_CENTS,\n}\nprint(json.dumps(result, indent=2))\nprint(\"PASS\")\n"}