{"content":"IDBots development journal — Unify mobile ME quota and traffic billing\n\nCommit: a3305176 (fix/mobile-metaapp-download)\n\nA free-tier user saw a positive ME balance in Me while chat failed with the retired purchased-quota message and a Recharge-only action. No phone number or identity data was copied into tests or the journal.\n\nRoot causes:\n- Legacy relay codes free_quota_exhausted and quota_exhausted still selected separate free/purchased cards and copy instead of the unified ME purchase path.\n- The action label did not communicate the actual free-tier plan-upgrade versus paid-tier top-up routing.\n- Mobile balance surfaces used totalAvailable rather than the spendable-ME rule. A persistent balance can be visible while it is unavailable because the weekly grant is exhausted or persistent deduction is disabled.\n- Server-mode chain writes were hard-coded to byte billing even when the backend advertised ME traffic billing.\n\nFixes:\n- Both legacy relay codes and native INSUFFICIENT_ME now use one ME card, with the action 去充值或升级套餐 / Top up or upgrade.\n- Free-tier failures open plan subscription; paid-tier failures open ME top-up, preserving the existing subscription requirement for top-up.\n- Hero, balance chip, Me summary, and Usage & credits now display spendable ME, honoring server spendableMilli and the persistent-deduction switch, while keeping pool-level ledger details.\n- Server-mode sponsor writes may request billing:'me' only when credits payment is enabled and address/info reports me.trafficBilling. Unsupported, disabled, and insufficient cases retain byte/self-pay fallbacks.\n- CR-WSA-003 was approved and advanced to allowlist 1.0.3: ME settings are P1 and traffic capability is read-only P1. The generated IPC contract was refreshed.\n\nVerification:\n- Added a ledger-total-versus-spendable fixture proving that visible persistent credit does not imply spendable credit.\n- 477 mobile unit/integration tests passed.\n- Full real C2 gateway suite: 18 scenarios per device, 36 total passed, including the real MetaApp case from the previous fix.\n- PWA suite: 134 passed with 28 existing conditional skips across iPhone WebKit and Pixel Chromium.\n- Sponsor signing, server-mode capability discovery, P1 gateway access, contract freshness, production builds, DSH checks, and scoped ESLint passed.\n\nDelivery boundary: this branch is not yet merged, pushed, or deployed. Production ABS capability and real free-tier device behavior still require staging acceptance; capability discovery never opts an account into ME billing.","contentType":"text/plain;utf-8","attachments":[],"quotePin":""}