{"ok":true,"readyForDemo":true,"simSeed":true,"database":{"configured":true,"schemaReady":true,"simAccounts":4,"pricedContracts":3,"productPacks":3,"boxes":5},"missing":[],"defaultsApplied":{"netDays":0,"terms":"Immediate","packs":[{"sku":"ROAST-LIGHT","unitWeightLb":1.05,"unitVolumeIn3":105,"note":"SIM estimate for a 16oz bag. Not weighed."},{"sku":"ROAST-MEDIUM","unitWeightLb":1.05,"unitVolumeIn3":105,"note":"SIM estimate for a 16oz bag. Not weighed."},{"sku":"ROAST-DARK","unitWeightLb":1.05,"unitVolumeIn3":105,"note":"SIM estimate for a 16oz bag. Not weighed."}],"boxTaresLb":{"BB-SB54":0.35,"BB-SB84":0.45,"BB-SB114":0.55,"BB-SB123":0.7,"BB-SB132":0.85},"bank":{"name":"SIM-Bank","accountLabel":"SIM-Operating","email":"bank@sim.roast.local","source":"sim","persisted":false,"netDays":0,"terms":"Immediate","note":"No bank table in this schema. This placeholder is not a real account and is not written anywhere."}},"capture":{"title":"Import client prices","method":"POST","path":"/ops/import-prices","contentTypes":["application/json","text/csv"],"cli":"npm run prices:import -- db/examples/prices.import.csv","account":"POST /ops/accounts","vendorBill":"POST /ops/vendor-bills","intake":"POST /ops/intake","console":"GET /ops","margins":"GET /ops/margins","scrapeHook":"Stub. This process does not crawl OrderSpace. POST the same JSON when a Backend job has a sheet."},"howToSwap":["Boot with SEED_SIM=1 (the compose default). Fake client rows use a SIM- name, source=sim, and an @sim.roast.local email.","Replace prices with POST /ops/import-prices or npm run prices:import. Imported rows are source=import and are kept when the sim seed runs again.","Set SEED_SIM=0 before go-live so migrate stops reloading SIM- rows and stops rewriting estimated tares and bag weights.","If this database was only a demo, drop the volume (docker compose down -v) or delete remaining SIM- rows before real clients land.","UPS carrier account id and Stripe stay in the environment. They are not seeded."],"gaps":[{"id":"bank","blocks":"bank reconciliation","status":"no-schema","detail":"There is no bank account table. The console shows a SIM-Bank placeholder only. Do not invent a live account id here."},{"id":"ups","blocks":"UPS label buy","status":"configured","detail":"Set EASYPOST_API_KEY and EASYPOST_UPS_CARRIER_ACCOUNT_ID outside git. The seed does not invent a carrier account id."},{"id":"stripe","blocks":"card and ACH charges","status":"unwired","detail":"POST /webhooks/stripe returns 501. No Stripe secret belongs in the repo."},{"id":"auth","blocks":"public order and payable routes","status":"closed","detail":"POST /orders, POST /vendor-bills, and GET /payables stay closed. The client path is /ops. Set OPS_IMPORT_TOKEN before the port is reachable."},{"id":"sku-catalog","blocks":"one SKU list for billing and packing","status":"split","detail":"products rows are ROAST-LIGHT, ROAST-MEDIUM, ROAST-DARK. The packer uses ROAST-LIGHT-1LB, ROAST-MEDIUM-1LB, ROAST-DARK-1LB, and ROAST-LIGHT-5LB. product_packs cannot store a packer SKU until that SKU exists on products. POST /ops/intake maps the three house SKUs onto the 1LB packer SKUs."},{"id":"addresses","blocks":"buying a label from a saved client","status":"json-only","detail":"Ship-to is stored on contracts.terms_json.shipTo. There are no address columns. A label buy also needs a phone, which is optional on the client form."},{"id":"payments-entry","blocks":"recording a client payment from the console","status":"seed-only","detail":"ar_payments and ar_payment_allocations are filled by the sim seed. There is no payment POST. The 001 payments table and the 004 ar_payments table are separate."},{"id":"help-desk","blocks":"client tickets","status":"no-schema","detail":"There is no ticket table. /ops is the operator desk."},{"id":"intake-vs-orders","blocks":"one order record","status":"split","detail":"POST /ops/intake writes order_intakes (and an intake invoice). Contract orders in the orders table are created by the sim seed, not by intake."},{"id":"measured-weights","blocks":"accurate parcel weight","status":"estimate","detail":"Box tare in the packer and in boxes, and 1.05 lb / 105 in³ on product_packs, are SIM estimates. Replace them after empty boxes and bags are weighed. SEED_SIM=1 rewrites those estimates on every migrate."},{"id":"orderspace","blocks":"live client price scrape","status":"out-of-process","detail":"This app does not scrape OrderSpace. POST /ops/import-prices (or npm run prices:import) is the hook. A Backend crawler can POST the same JSON later."}],"roastingEnabled":false,"parkedFeatures":["roast-log","batches","roaster-temperature"],"simSeedRewrites":["SIM- rows","boxes.tare_lb","product_packs for ROAST-LIGHT, ROAST-MEDIUM, and ROAST-DARK"]}