GFS Bid Center — master

Email / chat / Jul 1 rollover intake → standardized 11-skill review → D1 + .docx + dashboard → ★ July 1 NS write-back as named price lists

High-altitude master view of the Bid Center — the system that runs between annual NetSuite pricing locks. NS holds locked annual prices; bid season runs all year between annual rolls. The Bid Center accumulates customer-specific pricing work (127 commercial items × 8 brands, 14 USDA commodity items, 69 active customers, 4 regions, 44 external bids). Three intake paths feed it: Path 1 email intake at bids@ai-globalfoodsolutions.co; Path 2 direct chat where Mike kicks off a review in chat; Path 3 July 1 rollover which converts a year of accumulated work into NS named price lists, customer by customer. The trace thread across the entire pillar is customer + SY-version (e.g. ACC Distributors / SY2627-v2.5) — analogous to the SO PO# thread. Live tool: gfs-pricing.pages.dev.

D1-mirrored (8 new tables, migration 136) HITL on every NS write (ADR-031) Path 1 · email Path 2 · chat Path 3 · Jul 1 rollover Live tool: gfs-pricing.pages.dev

Pipeline — 3 intake paths → standardized 11-skill review → outputs → ★ NS rollover

idle
Bid Center lifecycle - email/chat/Jul1 intake - normalize customer + SY-version - dispatch to one of 11 skill workflows - read data sources (commercial_items, regional_prices, per-customer JSON, bids_log) - write 8 D1 bid_* tables - regenerate .docx quote - refresh gfs-pricing.pages.dev dashboard - on Jul 1 batch-HITL 69 named price lists - push to NS via NS_PUSH_QUEUE LANE 1 / Intake (3 paths) LANE 2 / Normalize customer + SY-version (the trace thread) LANE 3 / Dispatch to one of 11 skill workflows LANE 4 / Read data sources (folder-sourced + D1 mirror) LANE 5 / Write D1 bid_* mirror (8 tables, migration 136) LANE 6 / Outputs · .docx regen · STATUS.json · gfs-pricing.pages.dev LANE 7 / ★ JULY 1 ROLLOVER · batch-HITL · NS_PUSH_QUEUE · named price lists WHAT THIS DOES: A bid email arrives at bids@. The system parses attachments (PDF or XLSX), matches the sender to a known customer, and stages a proposed action for Mike to approve before opening a chat session. D1 TABLE: bid_external_pipeline (staged row, status='proposed') TECHNICAL DETAILS: PATH 1 - EMAIL INTAKE MAILBOX bids@ai-globalfoodsolutions.co ACTION src/email.ts parses headers, body, attachments document_converter handles PDF + XLSX to Markdown customer match via name_synonyms.json proposed_actions row staged HITL Mike approves "New bid inbound - customer match X - run review?" STATUS: REAL (intake) - STUB (auto-customer-match accuracy under bake) SEE: ns-bid-center-path-1-email-intake.html Path 1 · email intake bids@ai-globalfoodsolutions.co PDF / XLSX parsed · src/email.ts customer match via name_synonyms EXTERNAL · EMAIL ROUTING i WHAT THIS DOES: Mike opens chat (or admin dashboard chat) and pastes/uploads a bid PDF plus the customer name. No email intake step; workflow opens with documents preloaded into context. D1 TABLE: chat_session (with attached docs); no proposed_action needed yet because Mike is in-the-loop already. TECHNICAL DETAILS: PATH 2 - DIRECT CHAT TRIGGER Mike types: "load bid PDF + run review for ACC Distributors" OR drag-drop PDF into chat ACTION chat_session opened with preloaded docs customer name resolved on first turn workflow runner picks the right skill (LOG_EXTERNAL_BID / ADD_UPDATE_CUSTOMER_PRICING / etc.) HITL Mike is the loop step - no separate approval needed for intake STATUS: REAL SEE: ns-bid-center-path-2-direct-chat.html Path 2 · direct chat Mike kicks off in chat "load bid PDF + run review for X" no proposed_action wait EXTERNAL · CHAT UI i WHAT THIS DOES: Once a year, on July 1, the accumulated Bid Center work BECOMES next school year's NS named price lists. For each of 69 customers, the latest SY-version is selected and a proposed NS named price list is generated. All 69 are staged as a single batch HITL. D1 TABLE: bid_quote_versions WHERE is_latest=1 - drives the rollover. TECHNICAL DETAILS: PATH 3 - JULY 1 ROLLOVER (ANNUAL FLIP) TRIGGER cron: 0 5 1 7 * (Jul 1 05:00 UTC) OR manual /api/bid/rollover/start ACTION workflow: prepare_next_school_year for each of 69 active customers: select latest SY-version from bid_quote_versions generate proposed NS named price list payload stage single batch proposed_action with 69 line items HITL Mike approves the cohort (or partial subset) in admin-dashboard ON APPROVE NS_PUSH_QUEUE drains writes per customer (PushMutexDO prevents overlap) STATUS: REAL (workflow shell + contract) - in flight (NS_PUSH_QUEUE batched-cohort UI) SEE: ns-bid-center-path-3-july-rollover.html Path 3 · ★ JULY 1 ROLLOVER cron: 0 5 1 7 * · OR manual trigger prepare_next_school_year workflow 69 customers × latest SY-version → batch HITL FINANCE-KEY · ANNUAL FLIP · NS write-back gate i WHAT THIS DOES: Whatever the intake path was, the next step normalizes the customer name (handles partial matches via name_synonyms.json) and identifies the SY-version. The pair (customer + SY-version) is the trace thread carried through every record - like otherrefnum (customer PO#) on a Sales Order. D1 TABLES: bid_customers (customer normalized identity) bid_quote_versions (sy_version per customer) TECHNICAL DETAILS: NORMALIZE CUSTOMER + SY-VERSION (THE TRACE THREAD) LOGIC customer_id = resolveCustomer(name, name_synonyms.json) sy_version = currentSchoolYearVersion(customer_id) or new version on update thread_key = customer_id + '/' + sy_version example = 'ACC Distributors / SY2627-v2.5' TABLES read: customers, name_synonyms.json, bid_customers, bid_quote_versions INVARIANT every downstream row carries customer_id + sy_version STATUS: REAL normalize customer + SY-version (trace thread) name_synonyms.json · bid_customers · bid_quote_versions example: ACC Distributors / SY2627-v2.5 DATABASE · PO#-equivalent thread for the Bid Center pillar i WHAT THIS DOES: Onboards a brand-new customer into the Bid Center - creates the per-customer folder structure and seeds defaults. D1 TABLE: bid_customers (INSERT) TECHNICAL DETAILS: SKILL: CREATE_NEW_CUSTOMER WHEN brand new customer responds to an outreach or is added by Mike ACTION scaffold Customer-Pricing/<customer>/ folder + customer.json INSERT bid_customers row default region from address STATUS: REAL CREATE_NEW_CUSTOMER new customer scaffold SKILL 1 / 11 i WHAT THIS DOES: Adds or updates pricing for one customer for a specific school-year version. This is the most common bid-center action - keeping customer-specific quotes current as commodity costs move. D1 TABLES: bid_quote_versions (new version row), bid_price_snapshots (line snapshots) TECHNICAL DETAILS: SKILL: ADD_UPDATE_CUSTOMER_PRICING WHEN customer requests update, market moves, new bid arrives ACTION bump SY-version (v2.5 -> v2.6) diff vs prior version snapshot price lines STATUS: REAL - most-used skill ADD_UPDATE_CUSTOMER_PRICING version bump · line diff SKILL 2 / 11 · most-used i WHAT THIS DOES: Adds a new item to the commercial item catalog or updates an existing item's metadata (pack/UOM/brand). D1 TABLE: bid_items (UPSERT) TECHNICAL DETAILS: SKILL: ADD_UPDATE_ITEM SCOPE 127 commercial items x 8 brands + 14 commodity items x 3 sections (USDA Melt Mates) ACTION UPSERT bid_items row refresh commercial_items.json mirror STATUS: REAL ADD_UPDATE_ITEM 127 items · 8 brands SKILL 3 / 11 i WHAT THIS DOES: Fills regional prices for items across 4 regions (Northeast, Southeast, Midwest, West Coast). Drives the regional grid that anchors customer-specific quotes. D1 TABLE: bid_regional_prices (DELETE + INSERT per region + item) TECHNICAL DETAILS: SKILL: FILL_REGIONAL_PRICES SCOPE 4 regions, 127 items, 8 brands SOURCE commercial_regional_prices.json STATUS: REAL FILL_REGIONAL_PRICES 4 regions x 127 items SKILL 4 / 11 i WHAT THIS DOES: Rebuilds the per-region Excel/JSON sheets after a fill or correction. Ensures the human-facing regional sheets and the D1 mirror agree. D1 TABLE: bid_regional_prices (verify) + STATUS.json (refresh) TECHNICAL DETAILS: SKILL: REBUILD_REGIONAL_SHEETS ACTION regenerate Customer-Pricing/Commercial/regional-* files refresh STATUS.json STATUS: REAL REBUILD_REGIONAL_SHEETS human-readable regen SKILL 5 / 11 i WHAT THIS DOES: Compares customer quotes across versions (or across customers in the same region) to surface drift and outliers. D1 TABLE: bid_quote_versions + bid_price_snapshots (READ) TECHNICAL DETAILS: SKILL: COMPARE_CUSTOMER_QUOTES ACTION diff v2.4 vs v2.5 per customer cross-customer comparison within region STATUS: REAL COMPARE_CUSTOMER_QUOTES version diff · outliers SKILL 6 / 11 i WHAT THIS DOES: Logs an external bid (one of the 44 third-party RFPs we've responded to or are tracking). 30 submitted, 3 pending review. HITL because the bid log is the source of truth for forecasting. D1 TABLE: bid_external_pipeline (INSERT/UPDATE) TECHNICAL DETAILS: SKILL: LOG_EXTERNAL_BID SCOPE 44 external bids tracked 30 submitted, 3 pending review, 23 review .md analyses ACTION INSERT bid_external_pipeline row optional: kick off BID_PIPELINE HITL proposed_action gate STATUS: REAL LOG_EXTERNAL_BID 44 bids tracked SKILL 7 / 11 · HITL i WHAT THIS DOES: Surfaces the bid pipeline view - what is in flight, what was submitted, what is awaiting buyer response, what won/lost. D1 TABLE: bid_external_pipeline (READ) TECHNICAL DETAILS: SKILL: BID_PIPELINE ACTION read bid_external_pipeline group by status render dashboard tile STATUS: REAL BID_PIPELINE status rollup SKILL 8 / 11 i WHAT THIS DOES: Archives a customer that has churned or gone inactive. Preserves history but removes from active 69-customer cohort. D1 TABLE: bid_customers (status='archived') TECHNICAL DETAILS: SKILL: ARCHIVE_CUSTOMER ACTION set bid_customers.status='archived' STATUS.json regen STATUS: REAL ARCHIVE_CUSTOMER inactive cohort move SKILL 9 / 11 i WHAT THIS DOES: Verifies the Bid Center data system is healthy: file <-> D1 parity, stale customers, missing regional prices, broken JSON. D1 TABLE: all bid_* tables + STATUS.json (READ + verify) TECHNICAL DETAILS: SKILL: SYSTEM_HEALTH_CHECK ACTION parity check folder vs D1 report stale customer.json flag missing regional prices STATUS: REAL SYSTEM_HEALTH_CHECK parity audit SKILL 10 / 11 i WHAT THIS DOES: The Jul 1 anchor - converts the latest SY-version for every customer into a proposed NS named price list. This is the skill that the rollover path calls; it can also be run mid-year for one-off named-list refreshes. D1 TABLE: bid_quote_versions (latest per customer) -> NS PriceList (write via NS_PUSH_QUEUE) TECHNICAL DETAILS: SKILL: PREPARE_NEXT_SCHOOL_YEAR ACTION for each active customer select latest SY-version build NS named-price-list payload stage batch proposed_action HITL Mike approves cohort or subset STATUS: REAL (workflow shell) - July 1 first live deploy ★ PREPARE_NEXT_SCHOOL_YEAR (Jul 1 anchor) latest SY-version per 69 customers → NS named price list batch SKILL 11 / 11 · THE rollover anchor i WHAT THIS DOES: Programs are compliance-linked sidecars (HPS MAP GPO allowance for SY2526 and SY2627). They are not skills per se - they read alongside the 11 skills to ensure customer pricing respects program rules. D1 TABLE: bid_programs TECHNICAL DETAILS: PROGRAMS SIDECAR (NOT A SKILL) SCOPE HPS MAP GPO allowance SY2526, SY2627 ACTION every customer quote checks bid_programs for applicable allowance STATUS: REAL programs sidecar · HPS MAP GPO allowance SY2526 / SY2627 · compliance read alongside every skill MESSAGEBUS · bid_programs i WHAT THIS DOES: The catalog of commercial items - 127 SKUs across 8 brands. Source of truth lives in the file system; D1 mirror in bid_items. FILE: Customer-Pricing/commercial_items.json D1 TABLE: bid_items TECHNICAL DETAILS: DATA SOURCE: commercial_items.json SHAPE 127 items x 8 brands FIELDS sku, brand, pack, UOM, default_price, brand_prefix USE read by ADD_UPDATE_ITEM, FILL_REGIONAL_PRICES, COMPARE_CUSTOMER_QUOTES STATUS: REAL commercial_items.json 127 items × 8 brands -> bid_items mirror DATABASE · folder-sourced i WHAT THIS DOES: The regional pricing grid - 4 regions, all items. Anchors customer-specific quotes (which apply customer overrides on top of regional defaults). FILE: Customer-Pricing/commercial_regional_prices.json D1 TABLE: bid_regional_prices TECHNICAL DETAILS: DATA SOURCE: commercial_regional_prices.json REGIONS Northeast, Southeast, Midwest, West Coast USE read by FILL_REGIONAL_PRICES, REBUILD_REGIONAL_SHEETS, ADD_UPDATE_CUSTOMER_PRICING STATUS: REAL commercial_regional_prices.json 4 regions (NE / SE / MW / WC) -> bid_regional_prices mirror DATABASE · folder-sourced i WHAT THIS DOES: Per-customer config + quote state - one customer.json per customer folder. Holds region, terms, current SY-version, override notes. FILE: Customer-Pricing/<customer>/customer.json D1 TABLE: bid_customers + bid_quote_versions TECHNICAL DETAILS: DATA SOURCE: per-customer customer.json SCOPE 69 active customers USE read by every skill that touches a customer STATUS: REAL per-customer customer.json 69 active customers -> bid_customers + bid_quote_versions DATABASE · per-folder i WHAT THIS DOES: External bid pipeline log - tracks the 44 third-party bids we've touched. 30 submitted, 3 pending review. 23 review .md analyses live alongside. FILE: External_Bids/bids_log.json + External_Bids/reviews/*.md D1 TABLE: bid_external_pipeline + bid_reviews TECHNICAL DETAILS: DATA SOURCE: External_Bids/bids_log.json SCOPE 44 bids tracked 30 submitted, 3 pending review 23 review .md analyses USE read by LOG_EXTERNAL_BID, BID_PIPELINE STATUS: REAL External_Bids/bids_log.json 44 bids (30 submitted · 3 pending) -> bid_external_pipeline + bid_reviews DATABASE · pipeline log i WHAT THIS DOES: Skill output lands in the 8 new D1 bid_* tables (migration 136, Agent M owns). Mirror is the source-of-truth for the live dashboard. Writes that cross into NetSuite still go through ADR-031 HITL. D1 TABLES (8, migration 136): bid_customers bid_items bid_regional_prices bid_external_pipeline bid_reviews bid_programs bid_price_snapshots bid_quote_versions TECHNICAL DETAILS: WRITE D1 bid_* mirror ACTION UPSERT bid_customers UPSERT bid_items DELETE+INSERT bid_regional_prices per (customer, region, sy_version) INSERT bid_external_pipeline INSERT bid_reviews UPSERT bid_programs INSERT bid_price_snapshots INSERT bid_quote_versions (sets is_latest=1 + flips prior is_latest=0) HITL any write that originates from auto-classified email staging is gated via proposed_actions STATUS: REAL - migration 136 in flight (Agent M) D1 bid_* mirror writes · 8 new tables (migration 136 - Agent M) bid_customers · bid_items · bid_regional_prices · bid_external_pipeline bid_reviews · bid_programs · bid_price_snapshots · bid_quote_versions customer + SY-version threading in every row BACKEND · D1 SOURCE-OF-TRUTH FOR DASHBOARD · HITL on NS-bound writes i WHAT THIS DOES: Per-customer .docx quote is regenerated whenever the customer's pricing changes. Versioned by SY-version - prior versions retained for audit. FILE: Customer-Pricing/<customer>/quotes/SY2627-v2.5.docx TECHNICAL DETAILS: .docx QUOTE REGEN TRIGGER any write to bid_quote_versions OR bid_price_snapshots for the customer ACTION render .docx from template + latest snapshot archive prior version STATUS: REAL .docx quote regen per-customer / per SY-version archived on bump CLOUD · document render i WHAT THIS DOES: STATUS.json is the dashboard's metadata feed - last-touched-at, parity flag, per-customer freshness. Refreshed on every write. FILE: Customer-Pricing/STATUS.json TECHNICAL DETAILS: STATUS.json REFRESH SHAPE { customers: { <name>: { last_sy_version, last_touched_at, parity_ok } }, generated_at } USE read by gfs-pricing.pages.dev STATUS: REAL STATUS.json refresh per-customer freshness metadata feeds the dashboard CLOUD · metadata snapshot i WHAT THIS DOES: gfs-pricing.pages.dev is the live, human-facing Bid Center dashboard. Renders from D1 (bid_* tables) and STATUS.json. Refreshes per request, never cached stale. URL: https://gfs-pricing.pages.dev TECHNICAL DETAILS: LIVE DASHBOARD HOST Cloudflare Pages DATA reads bid_customers, bid_items, bid_external_pipeline, bid_quote_versions reads STATUS.json as a freshness header USE Mike opens daily, customer service opens during quote conversations STATUS: REAL - live live dashboard · gfs-pricing.pages.dev renders from D1 bid_* tables + STATUS.json · never cached stale customer-service-facing during quote conversations CLOUD · Cloudflare Pages · the visual tool itself i WHAT THIS DOES: On Jul 1 (or manual trigger), the Bid Center builds 69 proposed NS named-price-list payloads (one per active customer). All 69 are staged together as a single batch proposed_action so Mike can scan, approve subsets, or approve the cohort in one shot. D1 TABLE: proposed_actions (status='pending', kind='ns_named_price_list', batch_id='jul1-2026') TECHNICAL DETAILS: BATCH-HITL: 69 NAMED PRICE LISTS PROPOSED STAGE for each active customer latest = bid_quote_versions WHERE customer_id=? ORDER BY sy_version DESC LIMIT 1 payload = buildNamedPriceList(latest) proposed_actions row (batch_id shared) SURFACE admin-dashboard / batch HITL UI shows 69 line items Mike can: approve-all, approve-subset, reject, or send back per customer INVARIANT ADR-031: no NS write without an approval row STATUS: REAL (contract) - first live deploy Jul 1 2026 ★ batch-HITL: 69 named price lists proposed single batch proposed_action with 69 line items Mike can approve-all / subset / reject per customer ADR-031: no NS write without approval FINANCE-KEY · HITL GATE · first live Jul 1 2026 i WHAT THIS DOES: On approval, NS_PUSH_QUEUE drains the 69 writes. PushMutexDO prevents two concurrent writes to the same NS customer. Each named-list write is independently retried; failures land in a partial-failure queue Mike can re-approve. D1 TABLE: ns_pending_pushes (drained) TECHNICAL DETAILS: NS_PUSH_QUEUE DRAIN ENDPOINT POST /api/ns/push/named-price-list?preview=false&confirm=true GUARDS PushMutexDO per customer_id X-Edit-Token header ACTION per customer: transform bid_quote_versions row into NS PriceList write payload POST to NS RESTlet on 2xx: mark proposed_action done, fire events.bid.namedlist_pushed on fail: requeue with backoff, surface in partial-failure UI STATUS: REAL (contract) - first live deploy Jul 1 2026 NS_PUSH_QUEUE drain · 69 customer named-list writes POST /api/ns/push/named-price-list (preview=false · confirm=true) PushMutexDO per customer · retry-on-fail events.bid.namedlist_pushed on success MESSAGEBUS · durable queue + mutex i WHAT THIS DOES: NetSuite now holds the new named price lists. Customer service sees the new pricing the moment they open the customer in NS for the next school year. The Bid Center loop closes. NS RECORDS UPDATED: customer.pricelevel + custom NS named price list records. TECHNICAL DETAILS: NS RECORDS UPDATED · LOOP CLOSED WRITE NS PriceList record per customer (custom record type) customer.pricelevel set to the new named list OUTCOMES customer service opens customer in NS -> sees new SY-version prices next SO entered for that customer reads the new list events.bid.rollover_completed fires (cohort-level) HEALTH customer_health watcher recomputes (price stability signal) STATUS: REAL on successful drain NS records updated · CS sees new named list customer.pricelevel + custom named-list records next SO for customer reads new list events.bid.rollover_completed (cohort) BACKEND · LOOP CLOSED FOR THE YEAR i customer match customer name Jul 1 · 69 customers dispatch by skill (1 of 11) writes bid_* via skill output data sources -> D1 mirror parity .docx STATUS.json dashboard rerender Jul 1 · cohort of 69 approve cohort NS write-back partial-failure loop · re-approve subset LEGEND Path 1 email Path 2 chat Path 3 Jul 1 rollover ★ NS write-back gate (HITL) HITL / escalation CUSTOMER + SY-VERSION THREADING · the trace thread across the Bid Center (sample: ACC Distributors / SY2627-v2.5) bid_customers customer_id (normalized) "ACC Distributors" name_synonyms-normalized bid_quote_versions customer_id + sy_version "SY2627-v2.5" is_latest=1 bid_price_snapshots customer_id + sy_version + sku "ACC / SY2627-v2.5 / SKU-419" line-level snapshot proposed_actions batch_id + customer_id + sy_version "jul1-2026 / ACC / SY2627-v2.5" cohort row in batch HITL NS PriceList customer_id + named_list_name "ACC SY2627 v2.5" written via NS_PUSH_QUEUE
Glossary · cluster colors + thread terms
Database / folder-sourced JSON
Backend (skill, D1 mirror, NS push)
Cloud (.docx render, dashboard)
Messagebus (proposed_actions, programs, NS_PUSH_QUEUE)
HITL / escalation
★ NS write-back gate
customer + SY-version: the PO#-equivalent thread across the Bid Center pillar (e.g. ACC Distributors / SY2627-v2.5)
SY-version: school-year version, bumped per pricing update (SY2627-v2.5 -> v2.6)
bid_*: the 8 new D1 tables (migration 136, Agent M)
NS_PUSH_QUEUE: durable queue for NS writes, gated by PushMutexDO per customer

Phase detail — the 7-lane pipeline

L1 Intake — 3 paths REAL

Path 1 email at bids@ai-globalfoodsolutions.co (HITL on auto-customer-match). Path 2 direct chat (Mike kicks off). Path 3 July 1 rollover (annual flip).
Path 1
email → src/email.ts parses → proposed_actions row
Path 2
chat session opened with PDF preloaded
Path 3
cron 0 5 1 7 * or manual /api/bid/rollover/start

L2 Normalize customer + SY-version REAL

name_synonyms.json handles partial matches. SY-version is bumped per update. Pair becomes the trace thread.
Thread key
customer_id + sy_version (e.g. ACC Distributors / SY2627-v2.5)
Tables read
customers · name_synonyms.json · bid_customers · bid_quote_versions

L3 Dispatch to one of 11 skill workflows REAL

Standardized library of named skills lives in Customer-Pricing/Prompts/. Each is a contract.
Skills
CREATE_NEW_CUSTOMER · ADD_UPDATE_CUSTOMER_PRICING · ADD_UPDATE_ITEM · FILL_REGIONAL_PRICES · REBUILD_REGIONAL_SHEETS · COMPARE_CUSTOMER_QUOTES · LOG_EXTERNAL_BID · BID_PIPELINE · ARCHIVE_CUSTOMER · SYSTEM_HEALTH_CHECK · PREPARE_NEXT_SCHOOL_YEAR
Sidecar
HPS MAP GPO allowance program (SY2526 / SY2627) read alongside

L4 Read data sources REAL

Folder-sourced today; D1 mirror is updated by skill writes.
Files
commercial_items.json (127 items × 8 brands) · commercial_regional_prices.json (4 regions) · per-customer customer.json · External_Bids/bids_log.json (44 bids)

L5 Write D1 bid_* mirror migration 136 in flight (Agent M)

Eight new tables hold the Bid Center system of record (folder is still authoritative for content; D1 is the queryable mirror for the dashboard and NS push).
Tables
bid_customers · bid_items · bid_regional_prices · bid_external_pipeline · bid_reviews · bid_programs · bid_price_snapshots · bid_quote_versions

L6 Outputs REAL

Per-customer .docx regenerated; STATUS.json refreshed; dashboard re-renders.
Surfaces
.docx per customer / SY-version · STATUS.json · gfs-pricing.pages.dev

L7 ★ July 1 rollover — NS write-back batch HITL first live Jul 1 2026

69 proposed named-price-list payloads staged as a single batch HITL. NS_PUSH_QUEUE drains with PushMutexDO per customer. Partial-failure loop re-stages remaining customers.
Endpoint
POST /api/ns/push/named-price-list?preview=false&confirm=true
Guard
PushMutexDO per customer_id · X-Edit-Token
Event
events.bid.namedlist_pushed per customer · events.bid.rollover_completed for the cohort

Tables, files, endpoints, code paths

kindnamepurpose
Mailboxbids@ai-globalfoodsolutions.coPath 1 inbound bid intake
File (folder)Customer-Pricing/commercial_items.json127 commercial items × 8 brands
File (folder)Customer-Pricing/commercial_regional_prices.json4-region pricing grid
File (folder)Customer-Pricing/<customer>/customer.jsonper-customer config + SY-version state (69 customers)
File (folder)Customer-Pricing/External_Bids/bids_log.jsonexternal bid pipeline log (44 bids)
File (folder)Customer-Pricing/Prompts/11 skill workflow definitions
File (output)Customer-Pricing/<customer>/quotes/<sy_version>.docxper-customer per-SY quote
File (output)Customer-Pricing/STATUS.jsonper-customer freshness metadata
D1 tablebid_customersnormalized customer identity (69 active)
D1 tablebid_items127 items × 8 brands mirror
D1 tablebid_regional_prices4-region grid
D1 tablebid_external_pipeline44 external bids tracked
D1 tablebid_reviews23 .md analyses linked
D1 tablebid_programsHPS MAP GPO allowance program (SY2526 / SY2627)
D1 tablebid_price_snapshotsline-level price snapshot per (customer, SY-version)
D1 tablebid_quote_versionsSY-version per customer · is_latest=1 drives rollover
EndpointPOST /api/bid/rollover/startmanual trigger for the Jul 1 path
EndpointPOST /api/ns/push/named-price-listNS write-back per customer (preview + confirm)
EndpointPOST /api/proposed-actions/bulk-decidecohort approve / reject / subset
Workflowprepare_next_school_yearPath 3 driver
Durable ObjectPushMutexDOprevents concurrent NS writes per customer
Code pathsrc/email.tsPath 1 inbound email pipeline (incl. bids@)
Live toolhttps://gfs-pricing.pages.devthe visual Bid Center dashboard

Open gaps — honest punch list

Path detail docs