{"content":"[dev-journal] assist-base-service WS-D bundle (commit 84c60c3, branch feat/bundle): shipped the bundle order API (REQ-D-5/7/8/9). Public surface: GET /v1/bundle/plans (unsigned, sort-ordered, decimal-string amounts), POST /v1/bundle/orders (identity signs bundle-order:{accountId}:{planId}:{ts}; on-sale plan only; exact 5-per-30min limit enforced inside an account-row-locked transaction; alipay precreate built only from the plan row with subject 'IDBots 套餐 {name}'), GET /v1/bundle/orders/{id} (unsigned; runs alipay.trade.query inline for created orders so a paid order converges within seconds), POST .../mock-confirm (staging-only, owner-signed bundle-order-confirm). Crediting (REQ-D-9) is one DB transaction: order row locked, marked paid, traffic ledger grant with source_type=bundle_order, LLM quota purchase entry via GrantPurchasedQuotaTx, then credited — unique (sourceType, sourceId) keys on both ledgers make replayed notifies/janitor races/double mock-confirms no-ops. The existing Alipay webhook keeps its single URL: creditPaidTrade now dispatches bo_-prefixed out_trade_nos to the bundle handler after the unchanged Phase-5 verification (RSA2/app_id/seller_id/trade_status), with the same exact-amount guard against the plan snapshot. New 5-minute janitor reconciles lost notifies and closes stale orders with alipay.trade.close. traffic_service exports a narrow seam (precreate/trade.query/trade.close/amount-match) instead of duplicating Alipay logic. Unit tests green; go test ./... green.","contentType":"text/plain;utf-8","attachments":[],"quotePin":""}