Bid emails arrive at bids@ai-globalfoodsolutions.co. src/email.ts (entrypoint handleBidIntake, augmented by augmentBidCenterIntake per R570 / Agent N) parses the headers and body, the document converter (PDF / XLSX) normalizes attachments to markdown, and we attempt to match the sender to a known customer via name_synonyms.json. A proposed_actions row is staged with action_type='bid_inbound_review', entity_type='bid_email', status='pending', risk_level=2, idempotent on entity_ref='bid_inbound:<email_uuid>'. The row surfaces on the new Bid Intake tab (R632) at gfs-pricing.pages.dev/#bids-intake — one row per inbound email with sender, subject, classification, received-at, status (Pending / Approved / Dismissed), and a deep-link to admin-dashboard.html#hitl/<action_id>. On approve, a chat session opens with the bid PDF, the customer's customer.json, and the customer's latest bid_quote_versions row already in context, the standardized 11-skill review runs, and the event lands on the Pipeline tab (R624) chronological feed. Customer + SY-version is the trace thread.
bid_inbound_review (not the older bid_email_intake label). Confirmed in src/email.ts lines 934-996. Sibling action_types on the platform: log_external_bid, send_customer_quote_email. The Bid Intake dashboard pulls via apiFetch('bid-center/proposed-actions?type=bid_inbound_review&limit=100'); approved rows graduate to the Pipeline feed (R624).| kind | name | purpose |
|---|---|---|
| Mailbox | bids@ai-globalfoodsolutions.co | Path 1 inbound (CF Email Routing -> handleBidIntake) |
| Code path | src/email.ts · handleBidIntake @ L839 | email parser + router (R570 / Agent N) |
| Code path | src/email.ts · augmentBidCenterIntake @ L880 | bid-center-specific augmentation; idempotent on entity_ref |
| Code path | src/document_converter.ts | PDF / XLSX -> Markdown |
| R2 bucket | bid-attachments | source attachment audit |
| D1 table | proposed_actions | HITL gate · action_type='bid_inbound_review' · entity_type='bid_email' · risk_level=2 |
| D1 table | inbound_email_log | idempotency on message_id |
| D1 table | bid_customers | customer match |
| D1 table | bid_quote_versions | SY-version source-of-truth |
| D1 table | bid_price_snapshots | line-level snapshot |
| D1 table | bid_external_pipeline | if external bid logged |
| D1 table | bid_reviews | 23 review .md analyses |
| Dashboard | gfs-pricing.pages.dev/#bids-intake | NEW (R632, 2026-05-27) Bid Intake tab · apiFetch('bid-center/proposed-actions?type=bid_inbound_review&limit=100') |
| Dashboard | gfs-pricing.pages.dev Pipeline tab | R624 chronological feed of approved bid events (downstream of approval) |
| Dashboard | admin-dashboard.html#hitl/<action_id> | deep-link from Bid Intake row to HITL decision |
| Endpoint | GET /api/bid-center/proposed-actions?type=bid_inbound_review | Bid Intake tab feed |
| Endpoint | POST /api/proposed-actions/decide | Mike approve / reject / reassign |
| Sibling action_types | log_external_bid · send_customer_quote_email | other Bid Center actions on same proposed_actions table |
| Event | bid.inbound_received | fires on intake |
| Event | bid.email_intake_completed | fires after approval + review |