GFS Platform
Admin dashboard
Internal: APIs, services, integrations, data health, sync status, infra
Worker
…
api.ai-globalfoodsolutions.co
D1 rows
185,500+
18 tables
Last sync
…
every 15 min
Integrations
22 active
16 inactive
Service health
Live checks against the Worker. If api.ai-globalfoodsolutions.co is unreachable, the page falls back to the workers.dev URL.
| Service | Endpoint | Status |
|---|---|---|
| Worker — health | api.ai-globalfoodsolutions.co/api/health | … |
| Worker — sync-status | api.ai-globalfoodsolutions.co/api/sync-status | … |
| D1 database | gfs-netsuite | Provisioned |
| KV namespace | CACHE (e880e40b…) | Provisioned |
| R2 bucket | gfs-files | Provisioned |
| Custom domain | api.ai-globalfoodsolutions.co | … |
Risk register
Strategic risks (separate from per-item GAPS tracker). Source: data/risk-register.json.
| Risk | Description | Mitigation |
|---|---|---|
| Chartstone SPOF | Entire sync pipeline depends on Chartstone Pro running on a single Mac. If machine is off/asleep/broken, D1 stops updating. No monitoring, no alerting, no failover. | Move to Worker-based sync via SuiteAPI RESTlet (eliminates localhost dependency) |
| Single Admin | Only Michael Levine can deploy Workers, manage D1, rotate secrets, and access all CF/NS admin. Bus factor = 1. | Document all procedures (done in runbook). Cross-train second admin. Share CF access. |
| No Backups | No D1 backup strategy, no NS data export schedule, no disaster recovery plan. If CF account compromised, D1 data could be lost. | D1 has point-in-time recovery (paid plan). Schedule regular wrangler d1 export. |
| 48 Public Suitelets | Internal ops portal, all broker portals, and product program portals accessible without NS login. Data exposure risk. | Audit each isonline=T deployment. Restrict internal ops immediately. Broker portals may need to stay public. |
Known issues
Operational truth board — current bugs and limitations with status. Source: data/known-issues.json.
| Issue | Status | Impact | Fix |
|---|---|---|---|
| sync.sh had macOS quarantine (com.apple.provenance) | FIXED | launchd sync was failing with "Operation not permitted" | xattr -d com.apple.provenance sync.sh |
| Custom domain SSL | PENDING | api.ai-globalfoodsolutions.co not yet serving HTTPS | Check CF dashboard Edge Certificates |
| Worker sync cron is stub | TODO | handleSync() only writes sync_log, doesn't call SuiteAPI | Implement RESTlet delta sync in Worker |
| Worker daily report email | TODO | handleDailyReport() only logs to console | Implement via Cloudflare Email |
| KV and R2 bound but unused | FUTURE | No endpoints read/write KV or R2 | Phase 4: KV caching, R2 file storage |
| vb_lines coverage | RESOLVED | 100% of bills with inventory items (11,631/11,631). 11,285 expense-only bills have no item lines by design. | No action needed |
| No DKIM TXT record found | CHECK | Email deliverability may be affected | Verify in CF dashboard Email Routing |
Build status
Live snapshot of platform component readiness.
| Component | Status | Notes |
|---|---|---|
| Worker — REST endpoints | Complete | 20+ endpoints, CORS, security headers, Bearer auth |
| D1 — schema + initial load | Complete | 18 tables, 185K rows loaded via 45 SQL files |
| KV — namespace provisioned | Provisioned, not used | Bound to Worker but no endpoints read/write to it |
| R2 — bucket provisioned | Provisioned, not used | Bound to Worker, only File Upload RESTlet writes to it via SuiteAttach |
| Sync — local launchd | Running | sync.sh every 15 min via launchd |
| Sync — Worker scheduled() handler | Stub | Cron declared in wrangler.jsonc but no handler in src/index.ts |
| Pages — gfs-netsuite | Deployed | Consolidated platform live |
| Pages — legacy gfs-system-guide | Deprecated | Pre-consolidation deploy, kept until migration confirmed |
| Cloudflare Access on Pages | Not configured | Tier 1 GAP — Pages site is wide-open |
| Period close (NS) | Open | All 154 periods open since 2018; Tier 1 GAP |
| Custom domain SSL | Pending | api.ai-globalfoodsolutions.co not yet serving HTTPS |
| DKIM record | Check | Email deliverability may be affected |
| git baseline commit | Not committed | Repo init'd, zero commits |
| Backup strategy (D1) | Not configured | No scheduled export; rely on initial-load SQL only |
Sync status
15-min NetSuite-to-D1 sync runs locally via launchd. Worker scheduled() is stub. See Tier 2 → Infrastructure.
| Job | Source | Cadence | Function | Currently |
|---|---|---|---|---|
| NS → D1 sync | sync.sh | every 15 min | Chartstone delta query → D1 upsert | Local (launchd) |
| Worker cron */15 | wrangler.jsonc | every 15 min | Declared but no handler | Stub |
| Worker cron 0 19 | wrangler.jsonc | 7pm daily | Declared but no handler | Stub |
Integrations
Full inventory at NetSuite reference → integrations.
| Integration | Internal ID | Status |
|---|---|---|
| SuiteAttach File Upload RESTlet | tba:11/app:318 | active |
| NetSuite Analytics Warehouse | tba:2/app:11 | active |
| Atlas Agent (Read Only) - 315 | tba:10/app:315 | inactive |
| Atlas Agent (Read Only) - 314 | tba:9/app:314 | inactive |
| Twin Agent | tba:8/app:313 | inactive |
| integrator.io (Celigo) 1 | tba:7/app:112 | inactive |
| integrator.io (Celigo) 2 | tba:6/app:112 | inactive |
| integrator.io (Celigo) 3 | tba:5/app:112 | inactive |
| Zapier 1 | tba:4/app:12 | inactive |
| Zapier 2 | tba:3/app:12 | inactive |
| Tray.IO | tba:1/app:4 | inactive |
| Chartstone Toolkit RESTlet | restlet:2949 | active |
| SuiteAPI RESTlet | restlet:2948 | active |
| File Upload RESTlet (SuiteAttach) | restlet:2512 | active |
| Attach File - Zapier RESTlet | restlet:989 | active |
| Celigo IO RESTlets (5) | restlet:1805-1811 | active |
| Zapier Suite (13 RESTlets) | restlet:990-2747 | active |
| ECOB Bill of Lading Integration | bundle:312584 | active |
| Cash 360 Bundle | bundle:cash360 | active |
| Costed BOM Bundle | bundle:costedbom | active |
| APM Bundle | bundle:apm | active |
| Last Sales Activity Bundle | bundle:lsa | active |
| Allergen Statement Bundle | bundle:allergen | inactive |
| Dashboard Tiles Bundle (185219) | bundle:185219 | active |
| Dunning Bundle (392827) | bundle:392827 | active |
| Electronic Payments Bundle (533070) | bundle:533070 | active |
| Supply Chain Management Bundle (47193) | bundle:47193 | active |
| Tax Audit Files Bundle (4599) | bundle:4599 | active |
| Prompt Payment Discount Bundle (STC) | bundle:stc | active |
| NetSuite PS/PM Bundle (39609) | bundle:39609 | active |
| Vendor Bill Bundle (240841) | bundle:240841 | inactive |
| Client Audit Trail | bundle:cat | active |
| File Drag and Drop | bundle:filedragdrop | active |
| SII (Spain) Bundle | bundle:sii | inactive |
| Intrastat Bundle | bundle:intrastat | inactive |
| Norway SAF-T Bundle | bundle:saftno | inactive |
| UAE Emirate Bundle | bundle:uae | inactive |
| France Tax Bundle | bundle:fr | inactive |
Data quality
Grades reflect coverage of mandatory or important fields per entity.
| Entity | Rows | Grade | Notes |
|---|---|---|---|
| Customers | 283 | B | 71% have terms set (28 missing), category gaps on ~10% |
| Vendors | 484 | F | 93% missing payment terms (451), 70% missing emails (341) |
| Items | 1,148 | F | 78% missing GTIN/UPC (765), 71% missing case weight (694), 75% missing storage temp |
| Transactions | 102,367 | A | Full coverage 2018-2027, all 20 types, sync running |
| Customer pricing | 1,264 | C | Stale-price alert exists, manual refresh |
| Employees | 116 | B | All active employees, some role assignments incomplete |
| GL accounts | 152 | A | Full chart of accounts |
| Contacts | 490 | B | Coverage adequate, email/phone gaps on some entities |