{"id":"stripe-list-and-query-objects","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-list-and-query-objects\n# version:       1.0.0\n# primitive:     code_execution\n# description:   List and paginate Stripe objects using auto-pagination and filter by metadata\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#   list_ok            — true if list_customers returned results\n#   autopagination_ok  — true if auto_paging_iter worked\n#   metadata_filter_ok — true if metadata search returned correct customer\n#   total_fetched      — total customers fetched via auto-pagination\n#\n# MAST FAILURE MODES ADDRESSED:\n# FM-1.3 Step Repetition                   — auto_paging_iter handles pagination automatically\n# FM-3.3 Incorrect Verification            — metadata filter verified by customer ID match\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\"); sys.exit(1)\n\nstripe.api_key = STRIPE_SECRET_KEY\n\nTAG = f\"checklist-list-test-{int(time.time())}\"\n\n# Create 3 test customers with unique metadata tag\ncreated_ids = []\nfor i in range(3):\n    c = stripe.Customer.create(\n        email=f\"checklist-list-{i}@example.com\",\n        metadata={\"test_tag\": TAG},\n    )\n    created_ids.append(c.id)\nprint(f\"  created {len(created_ids)} test customers (tag={TAG})\")\n\ntry:\n    # 1. Basic list\n    listing  = stripe.Customer.list(limit=10)\n    list_ok  = len(listing.data) > 0\n    print(f\"  list: {len(listing.data)} customers returned (list_ok={list_ok})\")\n\n    # 2. Auto-pagination\n    # FOOTGUN: list() returns max 100 per page — use auto_paging_iter() for full dataset\n    # FOOTGUN: auto_paging_iter() makes multiple API calls — set a limit to avoid runaway\n    total_fetched      = 0\n    autopagination_ok  = False\n    for customer in stripe.Customer.list(limit=3).auto_paging_iter():\n        total_fetched += 1\n        if total_fetched >= 10:\n            break\n    autopagination_ok = total_fetched > 0\n    print(f\"  auto_paging_iter: fetched {total_fetched} (autopagination_ok={autopagination_ok})\")\n\n    # 3. Filter by metadata\n    # FOOTGUN: Stripe Search API uses query syntax, not dict filters\n    # FOOTGUN: Stripe Search has indexing delay — newly created objects may not appear immediately\n    time.sleep(5)\n    search_result = stripe.Customer.search(\n        query=f'metadata[\"test_tag\"]:\"{TAG}\"',\n    )\n    found_ids          = [c.id for c in search_result.data]\n    metadata_filter_ok = all(cid in found_ids for cid in created_ids)\n    print(f\"  metadata search: found {len(found_ids)} (metadata_filter_ok={metadata_filter_ok})\")\n    if not metadata_filter_ok:\n        print(f\"  NOTE: Stripe Search indexing delay — search may not reflect just-created objects\")\n\nfinally:\n    for cid in created_ids:\n        stripe.Customer.delete(cid)\n    print(f\"  cleaned up {len(created_ids)} test customers\")\n\n# ─────────────────────────────────────────\n# POST_EXECUTION\n# ─────────────────────────────────────────\n\nassert list_ok, \"FAIL: list_customers returned empty\"\nassert autopagination_ok, \"FAIL: auto_paging_iter returned 0 results\"\n# metadata_filter_ok is informational — Stripe Search indexing delay can cause false negatives\nif not metadata_filter_ok:\n    print(\"  WARN: metadata search incomplete — Stripe Search indexing delay (not a failure)\")\n\nresult = {\n    \"list_ok\":            list_ok,\n    \"autopagination_ok\":  autopagination_ok,\n    \"metadata_filter_ok\": metadata_filter_ok,\n    \"total_fetched\":      total_fetched,\n}\nprint(json.dumps(result, indent=2))\nprint(\"PASS\")\n"}