Key findings:
- Buy::Index() POST/GET dual-path: submit() uses GET (fails) instead of POST
- Field name mismatch: goods_params vs goods_data
- ShopXO spec matches by type:value, not spec_base_id direct
- Recommend: hidden form POST, plugin API for sold-seats
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>