From 897804cbb25b8ad2363d7fa573009dcc48f75213 Mon Sep 17 00:00:00 2001 From: Christopher <131207452+PetrefiedThunder@users.noreply.github.com> Date: Fri, 23 Oct 2026 15:35:17 -0700 Subject: [PATCH 1/9] style(frontend): use Inter for headings and drop the Outfit font load --- frontend/src/app/globals.css | 4 ++-- frontend/src/app/layout.tsx | 2 +- frontend/src/design-system/design-tokens.json | 2 +- frontend/src/styles/DESIGN_SYSTEM.md | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/frontend/src/app/globals.css b/frontend/src/app/globals.css index d83358fa7..ca6031af9 100644 --- a/frontend/src/app/globals.css +++ b/frontend/src/app/globals.css @@ -391,9 +391,9 @@ body[data-inflow-lab="true"] { --re-shadow-glow: 0 0 0 3px var(--re-brand-muted); --re-shadow-glow-strong: 0 0 0 3px var(--re-brand-muted); - /* ── Type families. Marketing wears Outfit; the product wears Inter. ── */ + /* Type families. Marketing and product both wear Inter. */ --re-font-sans: "Inter", system-ui, -apple-system, "Segoe UI", sans-serif; - --re-font-display: "Outfit", "Inter", system-ui, -apple-system, sans-serif; + --re-font-display: "Inter", system-ui, -apple-system, sans-serif; --re-font-serif: Georgia, "Times New Roman", serif; --re-font-mono: "JetBrains Mono", ui-monospace, "SF Mono", Menlo, monospace; diff --git a/frontend/src/app/layout.tsx b/frontend/src/app/layout.tsx index 9d8bc43e2..b1765c4e0 100644 --- a/frontend/src/app/layout.tsx +++ b/frontend/src/app/layout.tsx @@ -56,7 +56,7 @@ export default async function RootLayout({ {/* PWA manifest (#568) */} diff --git a/frontend/src/design-system/design-tokens.json b/frontend/src/design-system/design-tokens.json index 2ae07c3d4..cd3d8b054 100644 --- a/frontend/src/design-system/design-tokens.json +++ b/frontend/src/design-system/design-tokens.json @@ -77,7 +77,7 @@ "typography": { "fontFamily": { "sans": "'Inter', system-ui, -apple-system, sans-serif", - "display": "'Outfit', system-ui, -apple-system, sans-serif", + "display": "'Inter', system-ui, -apple-system, sans-serif", "serif": "'Fraunces', Georgia, serif", "mono": "'JetBrains Mono', 'Fira Code', monospace" }, diff --git a/frontend/src/styles/DESIGN_SYSTEM.md b/frontend/src/styles/DESIGN_SYSTEM.md index 1c3638538..c32cc7255 100644 --- a/frontend/src/styles/DESIGN_SYSTEM.md +++ b/frontend/src/styles/DESIGN_SYSTEM.md @@ -76,7 +76,7 @@ All colors use CSS custom properties defined in `globals.css` and mapped to Tail | Class | Font | Use For | |----------------|-------------|--------------------------------------------| -| `font-display` | Outfit | All headings (h1-h4), hero text | +| `font-display` | Inter | All headings (h1-h4), hero text | | `font-sans` | Inter | Body text, UI labels, descriptions (default) | | `font-serif` | Fraunces | Accent quotes, testimonials | | `font-mono` | JetBrains Mono | Code, technical values, API references | From 72aa271bdcfc658ba8252dbb9850555c70f16853 Mon Sep 17 00:00:00 2001 From: Christopher <131207452+PetrefiedThunder@users.noreply.github.com> Date: Fri, 23 Oct 2026 18:06:42 -0700 Subject: [PATCH 2/9] fix(frontend): label EPCIS as Preview, remove made-up data, dashes and the EDI label --- .../app/blog/fsma-204-cte-kde-guide/page.tsx | 2 +- .../page.tsx | 2 +- frontend/src/app/dashboard/settings/page.tsx | 2 +- frontend/src/app/docs/authentication/page.tsx | 2 +- frontend/src/app/fsma/page.tsx | 29 ++++++----- .../src/app/onboarding/bulk-upload/page.tsx | 2 +- frontend/src/app/records/page.tsx | 5 +- frontend/src/app/requests/page.tsx | 2 +- frontend/src/app/rules/page.tsx | 2 +- .../src/app/tools/notice-validator/page.tsx | 51 +------------------ frontend/src/app/why-regengine/page.tsx | 21 -------- .../dashboard/metrics-overview-widget.tsx | 2 +- 12 files changed, 26 insertions(+), 96 deletions(-) diff --git a/frontend/src/app/blog/fsma-204-cte-kde-guide/page.tsx b/frontend/src/app/blog/fsma-204-cte-kde-guide/page.tsx index 03b1561de..66128848c 100644 --- a/frontend/src/app/blog/fsma-204-cte-kde-guide/page.tsx +++ b/frontend/src/app/blog/fsma-204-cte-kde-guide/page.tsx @@ -424,7 +424,7 @@ export default function CTEKDEGuidePage() {

- Ready to implement FSMA 204 traceability in your business? See how RegEngine handles CTE/KDE capture, validation, and EPCIS-oriented export workflows. + Ready to implement FSMA 204 traceability in your business? See how RegEngine handles CTE/KDE capture, validation, and EPCIS-oriented export workflows (Preview).

} > - Cookie-backed session auth now powers the live FSMA dashboard. Until you sign in, - demo visualization is shown below. + Cookie-backed session auth powers the live FSMA dashboard. Sign in to see + your live facilities, lots, and recall readiness below. )} @@ -223,14 +224,6 @@ function FSMADashboardContent() { Trace
- - {/* Demo Facilities Hint */} - {!activeTlc && ( -

- Try: LOT-2025-ROMAINE-001 or{' '} - TLC-LETTUCE-BATCH-42 -

- )}
@@ -272,8 +265,16 @@ function FSMADashboardContent() { bare size="sm" icon={Shield} - title="No supply chain path yet" - description="Run a traceability query to draw the chain for a lot code." + title="No supply chain data connected yet" + description="Import your facilities and lots, then run a traceability query to draw the chain for a lot code." + action={ + + } /> )} diff --git a/frontend/src/app/onboarding/bulk-upload/page.tsx b/frontend/src/app/onboarding/bulk-upload/page.tsx index 89f896b1b..04d34ef6e 100644 --- a/frontend/src/app/onboarding/bulk-upload/page.tsx +++ b/frontend/src/app/onboarding/bulk-upload/page.tsx @@ -480,7 +480,7 @@ export default function BulkUploadPage() { {csvPreview.sampleRows.length > 0 && (

- Sample Data (first {csvPreview.sampleRows.length} rows) + First {csvPreview.sampleRows.length} rows of your file

diff --git a/frontend/src/app/records/page.tsx b/frontend/src/app/records/page.tsx index 7a35cb254..ad8625241 100644 --- a/frontend/src/app/records/page.tsx +++ b/frontend/src/app/records/page.tsx @@ -35,9 +35,8 @@ const SOURCE_LABEL: Record = { webhook_api: 'Webhook API', csv_upload: 'CSV Upload', xlsx_upload: 'XLSX Upload', - epcis_api: 'EPCIS API', - epcis_xml: 'EPCIS XML', - edi: 'EDI', + epcis_api: 'EPCIS API (Preview)', + epcis_xml: 'EPCIS XML (Preview)', manual: 'Manual', legacy_v002: 'Legacy', }; diff --git a/frontend/src/app/requests/page.tsx b/frontend/src/app/requests/page.tsx index e4194bedb..a4236ed9a 100644 --- a/frontend/src/app/requests/page.tsx +++ b/frontend/src/app/requests/page.tsx @@ -94,7 +94,7 @@ export default function RequestWorkflowPage() { const pageHeader = ( {ruleList.length} rules : undefined} primaryAction={!rules.error ? ( - - - - - - {/* Scenario Description */} -
- {/* Supply chain flow */} -
-
- - - - - - - - - - {SUPPLY_CHAIN.map((row, i) => ( - - - - - - - ))} - - - - - -
StepEntityCTE TypeRecords
{row.step}{row.entity} - - {row.cte} - - {row.records}
Total1,200
-
-

- All 7 FSMA 204 CTE types represented. Data generated to match real-world - patterns: mixed date formats, inconsistent UoMs, OCR artifacts in lot codes, - abbreviation-heavy location names. -

- - - {/* Metric 1: Time to First Ingest */} -
-
-
-

Metric 1: Time to First Ingest

-

- Clock starts at account creation. Clock stops when the first CTE event - is accepted and validated by the system. -

-
-
- Create account + API key - 2.1 min -
-
- Create facility (POST /facilities) - 0.8 min -
-
- Download CSV template (harvesting) - 0.3 min -
-
- Fill 5 sample rows - 4.2 min -
-
- Upload + validation response - 1.0 min -
-
- Total - 8.4 min -
-
-
- -

What this measures

-

- Guided onboarding speed for an approved design-partner workspace using synthetic - sample data. Timeline, support, and commercial terms are confirmed during scoping. -

-
-

Industry comparison

-
-
- Enterprise platforms (validate directly) - 3-6 months -
-
- Mid-market SaaS (typical) - 1-4 weeks -
-
- RegEngine - 8.4 minutes -
-
-
-
-
-
- - {/* Metric 2: Auto-normalization Rate */} -
-
- - - - - - - - - - - {NORMALIZATION_EXAMPLES.map((ex, i) => ( - - - - - - - ))} - -
Field TypeRaw Input ExamplesNormalized OutputAuto Rate
{ex.field} -
- {ex.raw.map((r) => ( - - {r} - - ))} -
-
- - {ex.normalized} - - {ex.rate}
-
- -
- - - -
- -

- Normalization is deterministic (rule-based pattern matching), not ML. Rules cover 40+ UoM - variants, 13 location abbreviation patterns, 5+ date formats, and CTE type alias mapping. - Lot code integrity checks flag suspicious OCR artifacts (O/0 and I/1 swaps adjacent to digits) - for human review rather than silently normalizing. -

-
- - {/* Metric 3: Manual Touches */} -
-
-
-

Metric 3: Manual Touches per 1,000 Rows

-

- A "manual touch" is any point where a human must review, correct, or - approve a record before it can proceed to an FDA-oriented sortable export. Lower is better. -

-
- -
- Lot code integrity warnings - 0.6 / 1,000 -
-

- OCR artifacts where O/0 or I/1 swap could change lot identity. - System flags but doesn't auto-correct, because lot codes are too critical. -

-
- -
- Missing required KDEs - 0.2 / 1,000 -
-

- Records where a required field (e.g., origin location) was blank. - Cannot be inferred; requires source data correction. -

-
-
- Total manual touches - 0.8 / 1,000 rows -
-
-
- -

Why this matters

-

- Manual data cleaning is a common operational cost in traceability work. A mid-size produce - operation processing 10,000 CTE events/month at assumed error - rates of 5-15% could face 500-1,500 manual corrections monthly. -

-

- At 0.8 touches per 1,000 rows, the same operation needs 8 corrections - per month. The difference: one person spending 2 minutes vs. one person - spending 2 weeks. -

- - We intentionally don't auto-correct lot codes. A wrong lot code - in an FDA trace means tracing the wrong product, and the cost of - a false positive exceeds the cost of a human review. - -
-
-
- - {/* Metric 4: Trace Latency */} -
-
- -

Trace Benchmarks

-
- {[ - { label: 'Forward trace (farm → retail, 5 hops)', value: '340 ms', width: '34%' }, - { label: 'Backward trace (retail → farm, 5 hops)', value: '380 ms', width: '38%' }, - { label: 'Full bidirectional trace', value: '720 ms', width: '72%' }, - { label: 'Transformation trace (salad mix → ingredients)', value: '280 ms', width: '28%' }, - ].map((bench) => ( -
-
- {bench.label} - {bench.value} -
- {/* Decorative: the millisecond figure above carries the value. */} - -
- ))} -
-
- -

How It Works

-

- Tracing uses PostgreSQL recursive CTEs with time-arrow validation. - No graph database required. The query walks the event chain hop-by-hop, - validating temporal ordering at each step (a product can't be received - before it's shipped). -

-
-

-- Trace romaine lot RM-0314-A

-

GET /api/v1/trace/RM-0314-A

-

  ?direction=both

-

  &depth=20

-

→ 5 hops, 12 linked events

-

→ 720ms total latency

-

→ Time-arrow: VALID

-
-

- Measured on PostgreSQL 15 with 1,200 events indexed. Latency scales - with hop depth, not total event count. -

-
-
-
- - {/* Metric 5: Time to FDA-oriented sortable export */} -
-
-
-

Metric 5: Time to FDA-Oriented Sortable Export

-

- End-to-end: from uploading a raw CSV with messy supplier data to - downloading an FDA-oriented sortable spreadsheet aligned to 21 CFR 1.1455 - fields where applicable (date-range filtered, includes chain verification). -

-
-
- CSV upload (1,200 records) - 1.2 min -
-
- Auto-normalization + validation - 3.8 min -
-
- Review flagged records (0.8/1,000) - 2.4 min -
-
- Generate FDA-oriented export package - 0.4 min -
-
- Download + verify - 0.2 min -
-
- Total - 11.6 min -
-
-
- -

The FDA-oriented export package includes

-
    - {[ - 'Sortable CSV aligned to 21 CFR 1.1455 fields where applicable', - 'Date range filtering for targeted FDA requests', - 'Chain verification JSON (SHA-256 + Merkle proof)', - 'KDE completeness validation log', - 'EPCIS 2.0 JSON-LD (GS1 business step mapping)', - 'Package manifest with file checksums', - ].map((item) => ( -
  • -
  • - ))} -
- - FDA requests may require records within 24 hours. This synthetic - workflow generated the package in 11.6 minutes; customer review and - data completeness still matter. - -
-
-
- - {/* Produce-Specific Challenges */} -
-
- {[ - { - title: 'Transformation Complexity', - description: 'Salad mixes blend 3-5 input lots into one output product. Each input lot must trace back to its own harvest, cooling, and packing CTEs.', - metric: '120 transformation events processed', - }, - { - title: 'Short Shelf Life', - description: '7-14 day product life means recall speed is existential. A romaine recall that takes 3 weeks to trace hits empty shelves and the next harvest cycle.', - metric: '< 1 second full trace latency', - }, - { - title: 'Fragmented Suppliers', - description: 'Small growers use handwritten lot codes, mixed date formats, and inconsistent naming. No two farms format data the same way.', - metric: '94.2% auto-normalized without intervention', - }, - { - title: 'Temperature Sensitivity', - description: 'Cooling CTEs are mandatory for leafy greens. Temperature KDEs must be captured at harvest, during transport, and at receiving.', - metric: '180 cooling CTE events validated', - }, - { - title: 'High Recall Frequency', - description: 'Leafy greens account for a disproportionate share of FDA recalls. Romaine alone triggered 4 major recalls in 2018-2020.', - metric: '720ms bidirectional recall trace', - }, - { - title: 'Retailer Pressure', - description: 'Major retailers are signaling traceability expectations ahead of federal enforcement. Specific retailer requirements vary and should be confirmed directly with each buyer.', - metric: 'Retailer-oriented export templates scoped per buyer', - }, - ].map((item) => ( - -

{item.title}

-

{item.description}

-

{item.metric}

-
- ))} -
-
- - {/* Summary */} -
-
- {HERO_METRICS.map((m) => ( - - ))} -
-
- - {/* CTA */} -
- -

Run This Validation on Your Data

-

- Upload a sample CSV. See your auto-normalization rate, KDE completeness score, - and time to FDA-oriented sortable export, measured on your actual supply chain data. -

-
- - -
-
-
- - {/* Methodology */} -
- -

Methodology

-
-
-

Data Source

-

- 1,200 synthetic CTE events modeled on real-world leafy greens supply chain - patterns (Salinas Valley grower → fresh-cut processor → regional distribution). - Data includes realistic noise: mixed date formats, OCR artifacts, abbreviation - variants, missing fields at rates matching industry surveys. -

-
-
-

Measurement

-

- All metrics measured on RegEngine's production codebase running against - PostgreSQL 15. Timings include full validation pipeline (normalization, - KDE completeness checks, lot code integrity, temporal ordering). Human - interaction times (filling CSV rows, reviewing flags) measured with a - stopwatch on a first-time user. -

-
-
-

Disclosure

-

- This is a product validation study, not a customer case study. Data is - synthetic but modeled on real supply chain patterns and industry-reported - data quality assumptions. RegEngine is pre-revenue; self-serve access is in staged rollout. Metrics reflect current system - behavior on representative workloads and are not customer ROI, SLA, or production-performance commitments. -

-
-
-
-
-
- ); + notFound(); } diff --git a/frontend/src/app/compliance/page.tsx b/frontend/src/app/compliance/page.tsx index 7dc5b5266..38177035e 100644 --- a/frontend/src/app/compliance/page.tsx +++ b/frontend/src/app/compliance/page.tsx @@ -257,7 +257,7 @@ export default function CompliancePage() {
FSMA 204 - EPCIS 2.0 export + EPCIS 2.0 export (Preview) GS1 FDA CTEs KDEs diff --git a/frontend/src/app/controls/page.tsx b/frontend/src/app/controls/page.tsx index e4d6324a7..2db9ce1ff 100644 --- a/frontend/src/app/controls/page.tsx +++ b/frontend/src/app/controls/page.tsx @@ -282,7 +282,7 @@ export default function MyControlsPage() { > - + diff --git a/frontend/src/app/dashboard/compliance/page.tsx b/frontend/src/app/dashboard/compliance/page.tsx index be965d0f8..ecc6744e6 100644 --- a/frontend/src/app/dashboard/compliance/page.tsx +++ b/frontend/src/app/dashboard/compliance/page.tsx @@ -141,7 +141,7 @@ const COMPLIANCE_SETUP_STEPS = [ }, { title: 'Preview export readiness', - detail: 'Once records exist, configure FDA and EPCIS export jobs for audit-response workflows.', + detail: 'Once records exist, configure FDA and EPCIS (Preview) export jobs for audit-response workflows.', href: '/dashboard/export-jobs', action: 'Set up exports', icon: Download, @@ -616,7 +616,7 @@ export default function ComplianceDashboardPage() { diff --git a/frontend/src/app/dashboard/export-jobs/page.tsx b/frontend/src/app/dashboard/export-jobs/page.tsx index d4a54ad8a..9acb1e9d0 100644 --- a/frontend/src/app/dashboard/export-jobs/page.tsx +++ b/frontend/src/app/dashboard/export-jobs/page.tsx @@ -182,7 +182,7 @@ export default function ExportJobsPage() { className={`${fieldControlClasses} h-11`} > - + diff --git a/frontend/src/app/dashboard/recall-drills/page.tsx b/frontend/src/app/dashboard/recall-drills/page.tsx index 113b62da5..2754c4a51 100644 --- a/frontend/src/app/dashboard/recall-drills/page.tsx +++ b/frontend/src/app/dashboard/recall-drills/page.tsx @@ -164,7 +164,7 @@ export default function RecallDrillsPage() { diff --git a/frontend/src/app/dashboard/receiving/page.tsx b/frontend/src/app/dashboard/receiving/page.tsx index 0fcd19d80..972beaeb6 100644 --- a/frontend/src/app/dashboard/receiving/page.tsx +++ b/frontend/src/app/dashboard/receiving/page.tsx @@ -210,7 +210,7 @@ export default function ReceivingDockPage() { quantity: item.quantity, unit_of_measure: 'cases', timestamp: item.scannedAt || new Date().toISOString(), - location_name: `Receiving Dock — ${session.supplier}`, + location_name: `Receiving Dock: ${session.supplier}`, kdes: { gtin: item.gtin || undefined, lot_code: item.lotCode || undefined, diff --git a/frontend/src/app/developers/page.tsx b/frontend/src/app/developers/page.tsx index e096f7a1c..352f94893 100644 --- a/frontend/src/app/developers/page.tsx +++ b/frontend/src/app/developers/page.tsx @@ -43,7 +43,7 @@ const capabilities = [ { Icon: FileSpreadsheet, title: 'Records Export', - description: 'Generate FDA-oriented sortable spreadsheet records and EPCIS 2.0 event exports where the enabled workflow and source data support them.', + description: 'Generate FDA-oriented sortable spreadsheet records and EPCIS 2.0 (Preview) event exports where the enabled workflow and source data support them.', }, { Icon: BarChart3, diff --git a/frontend/src/app/docs/api/ApiReferenceClient.tsx b/frontend/src/app/docs/api/ApiReferenceClient.tsx index 09ddf689b..a30315339 100644 --- a/frontend/src/app/docs/api/ApiReferenceClient.tsx +++ b/frontend/src/app/docs/api/ApiReferenceClient.tsx @@ -370,15 +370,15 @@ function EndpointCard({ endpoint }: { endpoint: Endpoint }) { } const ERROR_CODES = [ - { code: '400', desc: 'Bad Request - Missing Idempotency-Key or invalid parameters' }, - { code: '401', desc: 'Unauthorized - Missing or invalid API key, or a missing or wrong ingest signature' }, - { code: '402', desc: 'Payment Required - No active subscription for the workspace' }, - { code: '403', desc: 'Forbidden - Key lacks the required scope, or tenant_id / X-Tenant-ID names a different workspace' }, - { code: '404', desc: "Not Found - Resource doesn't exist" }, - { code: '409', desc: 'Conflict - Idempotency-Key reused with different request bytes' }, - { code: '422', desc: 'Unprocessable - Request body failed validation' }, - { code: '429', desc: 'Too Many Requests - Rate limited' }, - { code: '500', desc: 'Internal Error - Contact support' }, + { code: '400', desc: 'Bad Request: Missing Idempotency-Key or invalid parameters' }, + { code: '401', desc: 'Unauthorized: Missing or invalid API key, or a missing or wrong ingest signature' }, + { code: '402', desc: 'Payment Required: No active subscription for the workspace' }, + { code: '403', desc: 'Forbidden: Key lacks the required scope, or tenant_id / X-Tenant-ID names a different workspace' }, + { code: '404', desc: "Not Found: Resource doesn't exist" }, + { code: '409', desc: 'Conflict: Idempotency-Key reused with different request bytes' }, + { code: '422', desc: 'Unprocessable: Request body failed validation' }, + { code: '429', desc: 'Too Many Requests: Rate limited' }, + { code: '500', desc: 'Internal Error: Contact support' }, ]; const RATE_LIMIT_HEADERS = [ diff --git a/frontend/src/app/fsma/integration/page.tsx b/frontend/src/app/fsma/integration/page.tsx index a3d3611c2..1476ae61e 100644 --- a/frontend/src/app/fsma/integration/page.tsx +++ b/frontend/src/app/fsma/integration/page.tsx @@ -69,7 +69,7 @@ export default function IntegrationHubPage() { {/* API / EPCIS */}