- 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).
@@ -249,8 +250,18 @@ export default function ExportJobsPage() {
+ Upload a CSV
+
+ }
+ secondaryAction={
+
+ JSON events API docs
+
+ }
/>
{exportPrereqs.map((step) => (
diff --git a/frontend/src/app/dashboard/integrations/page.tsx b/frontend/src/app/dashboard/integrations/page.tsx
index 3a3449785..82b5b538f 100644
--- a/frontend/src/app/dashboard/integrations/page.tsx
+++ b/frontend/src/app/dashboard/integrations/page.tsx
@@ -62,6 +62,7 @@ const STATUS_TONES: Record = {
export_supported: 'info',
file_import_supported: 'info',
pilot: 'warning',
+ preview: 'warning',
design_partner: 'warning',
custom_scoped: 'neutral',
preparation: 'neutral',
diff --git a/frontend/src/app/dashboard/settings/page.tsx b/frontend/src/app/dashboard/settings/page.tsx
index 503ae28d6..96474c7f1 100644
--- a/frontend/src/app/dashboard/settings/page.tsx
+++ b/frontend/src/app/dashboard/settings/page.tsx
@@ -48,7 +48,7 @@ const INTEGRATIONS = [
{ id: 'netsuite', name: 'Oracle NetSuite', category: 'ERP', status: 'available', desc: 'Cloud ERP and financials' },
{ id: 'walmart', name: 'Walmart GDSN', category: 'Retailer', status: 'coming_soon', desc: 'Global Data Synchronization' },
{ id: 'kroger', name: 'Kroger 84.51\u00b0', category: 'Retailer', status: 'coming_soon', desc: 'Retailer data exchange' },
- { id: 'epcis', name: 'EPCIS 2.0 Gateway', category: 'Standards', status: 'epcis_preview', desc: 'GS1 event format bridge; ingest in Preview' },
+ { id: 'epcis', name: 'EPCIS 2.0 Gateway (Preview)', category: 'Standards', status: 'epcis_preview', desc: 'GS1 event format bridge; ingest in Preview' },
{ id: 'webhook', name: 'Custom Webhooks', category: 'Custom', status: 'preview', desc: 'Push events to your endpoints' },
];
/**
diff --git a/frontend/src/app/docs/api/ApiReferenceClient.tsx b/frontend/src/app/docs/api/ApiReferenceClient.tsx
index 49d0a6870..89fc0b50e 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/docs/authentication/page.tsx b/frontend/src/app/docs/authentication/page.tsx
index a253ba9f4..8f7746fde 100644
--- a/frontend/src/app/docs/authentication/page.tsx
+++ b/frontend/src/app/docs/authentication/page.tsx
@@ -134,7 +134,7 @@ export default function AuthenticationDocsPage() {
Scopes limit which of the endpoints above a key can call. They are not a read-only guarantee: some other
operations on the RegEngine backend, for example compliance snapshots, SLA request updates, onboarding steps
- and the EPCIS intake endpoint (in Preview), accept any valid tenant key without checking a named scope. Treat every key as
+ and the EPCIS intake endpoint (Preview), accept any valid tenant key without checking a named scope. Treat every key as
read-write for its workspace. Keep it on your server, never in client-side code, and ask RegEngine to
revoke it if it leaks.
diff --git a/frontend/src/app/fsma-204/[cte]/page.tsx b/frontend/src/app/fsma-204/[cte]/page.tsx
index 14b56a21f..ff1f534d6 100644
--- a/frontend/src/app/fsma-204/[cte]/page.tsx
+++ b/frontend/src/app/fsma-204/[cte]/page.tsx
@@ -425,17 +425,9 @@ export default async function CTELandingPage({
title="How RegEngine Helps"
description={
<>
- {cta.enabled ? (
- <>
- Upload your {data.name.toLowerCase()} data to the sandbox and
- RegEngine surfaces these issues before they become audit findings during a §1.1455 records request.
- >
- ) : (
- <>
- RegEngine surfaces these issues in your {data.name.toLowerCase()}{" "}
- data before they become audit findings during a §1.1455 records request.
- >
- )}
+ Upload your {data.name.toLowerCase()} data to{" "}
+ RegEngine and
+ RegEngine surfaces these issues before they become audit findings during a §1.1455 records request.
>
}
>
diff --git a/frontend/src/app/fsma-204/page.tsx b/frontend/src/app/fsma-204/page.tsx
index 3b8e9a9e8..bda6844df 100644
--- a/frontend/src/app/fsma-204/page.tsx
+++ b/frontend/src/app/fsma-204/page.tsx
@@ -372,8 +372,6 @@ export default function FSMA204BusinessGuidePage() {
Try it:{" "}
- /proof
- {" "}→{" "}
/verify.
diff --git a/frontend/src/app/fsma/page.tsx b/frontend/src/app/fsma/page.tsx
index dd599e907..8776c96e7 100644
--- a/frontend/src/app/fsma/page.tsx
+++ b/frontend/src/app/fsma/page.tsx
@@ -95,8 +95,9 @@ function FSMADashboardContent() {
}
};
- const handleStartDrill = async (type: RecallDrillType = 'FORWARD', fallbackTlc = 'TLC1001') => {
- const tlc = activeTlc || fallbackTlc;
+ const handleStartDrill = async (type: RecallDrillType = 'FORWARD') => {
+ const tlc = activeTlc;
+ if (!tlc) return;
try {
await createDrill.mutateAsync({
type,
@@ -157,8 +158,8 @@ function FSMADashboardContent() {
}
>
- 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
- Sample Data (first {csvPreview.sampleRows.length} rows)
+ First {csvPreview.sampleRows.length} rows of your file
diff --git a/frontend/src/app/proof/opengraph-image.tsx b/frontend/src/app/proof/opengraph-image.tsx
deleted file mode 100644
index 1d60dfe75..000000000
--- a/frontend/src/app/proof/opengraph-image.tsx
+++ /dev/null
@@ -1,10 +0,0 @@
-import { renderOgCard, OG_SIZE, OG_CONTENT_TYPE } from '@/lib/og-image';
-
-export const runtime = 'edge';
-export const alt = 'Verifiable evidence, not screenshots';
-export const size = OG_SIZE;
-export const contentType = OG_CONTENT_TYPE;
-
-export default function Image() {
- return renderOgCard({ eyebrow: 'Proof', title: 'Verifiable evidence, not screenshots' });
-}
diff --git a/frontend/src/app/proof/page.tsx b/frontend/src/app/proof/page.tsx
index d6ef18bcc..7c9b63613 100644
--- a/frontend/src/app/proof/page.tsx
+++ b/frontend/src/app/proof/page.tsx
@@ -1,250 +1,6 @@
-import type { Metadata } from "next";
-import Link from "next/link";
-import { ArrowRight, Download, FileJson, FileSpreadsheet, Hash, Terminal } from "lucide-react";
-import { Container } from "@/components/layout/container";
-import { PageHeader } from "@/components/layout/page-header";
-import { Section } from "@/components/layout/section";
-import { Button } from "@/components/ui/button";
-import { Card, CardHeader } from "@/components/ui/card";
-
-export const metadata: Metadata = {
- title: "Proof | RegEngine",
- description:
- "Download three verifiable sample artifacts generated by production code (FSMA 204 sortable spreadsheet, EPCIS 2.0 JSON-LD export (Preview), and a Merkle-rooted audit bundle) without signing up.",
- openGraph: {
- title: "Verify RegEngine without signing up",
- description:
- "Three downloadable artifacts: FSMA 204 spreadsheet, EPCIS 2.0 JSON-LD (Preview), and a Merkle-rooted audit bundle.",
- url: "https://regengine.co/proof",
- type: "website",
- },
-};
-
-type Artifact = {
- name: string;
- href: string;
- filename: string;
- sizeBytes: number;
- icon: typeof FileSpreadsheet;
- summary: string;
- why: string;
- formatLabel: string;
-};
-
-const ARTIFACTS: Artifact[] = [
- {
- name: "FSMA 204 sortable spreadsheet",
- href: "/proof/fsma-204-sample.csv",
- filename: "fsma-204-sample.csv",
- sizeBytes: 1524,
- icon: FileSpreadsheet,
- formatLabel: "CSV · sortable",
- summary:
- "A recall-lookback sample for one leafy-greens lot, exported in an FDA-oriented sortable layout.",
- why: "FDA records requests may require records, including an electronic sortable spreadsheet under 21 CFR 1.1455(c)(3), unless an exemption or agreed alternative applies. This sample shows RegEngine's current column mapping and should be reviewed against the specific FDA request.",
- },
- {
- name: "EPCIS 2.0 JSON-LD export (Preview)",
- href: "/proof/epcis-sample.jsonld",
- filename: "epcis-sample.jsonld",
- sizeBytes: 3039,
- icon: FileJson,
- formatLabel: "EPCIS 2.0 JSON-LD (Preview)",
- summary:
- "A three-event payload covering harvesting, initial packing, and shipping for one traceability lot code.",
- why: "Several major buyers are standardizing on EPCIS 2.0 for supplier ingest. Confirm that what RegEngine emits validates against your retailer's onboarding tests before you sign a contract.",
- },
- {
- name: "Merkle-rooted audit bundle",
- href: "/proof/audit-bundle.zip",
- filename: "audit-bundle.zip",
- sizeBytes: 2266,
- icon: Hash,
- formatLabel: "ZIP · SHA-256 + Merkle root",
- summary:
- "The CSV and EPCIS (Preview) payload plus a manifest.json with per-file SHA-256 hashes and a Merkle root computed by production code.",
- why: "Compare each declared file's SHA-256 hash and the bundle's Merkle root with its included manifest. These checks establish internal consistency; they do not authenticate the issuer or establish that the source data is accurate.",
- },
-];
-
-function formatSize(bytes: number): string {
- if (bytes < 1024) return `${bytes} B`;
- if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;
- return `${(bytes / (1024 * 1024)).toFixed(2)} MB`;
-}
-
-/**
- * A terminal transcript. SPEC §5.1: code is a well - one surface step below the
- * card, bounded by a hairline rather than an inverted ink block. Result lines
- * keep a status colour, but never alone: each one carries its own word ("ok",
- * "matched", "FAILED"), so the meaning survives greyscale.
- */
-function Transcript({ title, meta, children }: { title: string; meta?: string; children: React.ReactNode }) {
- return (
-
-
-
{title}
- {meta &&
{meta}
}
-
-
- {children}
-
-
- );
-}
+import { notFound } from 'next/navigation';
+// Hidden until /proof can publish artifacts built from a real export.
export default function ProofPage() {
- return (
-
-
-
- Proof}
- title="Verify RegEngine without signing up."
- description="Three artifacts. No email gate, no demo call. Download the files, open them in your tools, and check the hashes yourself. If the output does not match the claim, the product fails, and you have the receipts."
- className="mb-0 border-b-0 pb-0"
- />
-
- verify_chain.py reads the manifest, recomputes each declared file's SHA-256, and rebuilds the Merkle root using the same algorithm RegEngine ships in services/shared/merkle_tree.py. If those values disagree with the included manifest, the script exits non-zero.
-
- A tampered bundle is published next to the real one.
-
-
- audit-bundle-tampered.zip contains a changed CSV while the manifest's declared hash remains unchanged. Run the verifier against it and watch it exit non-zero. This demonstrates detection of changed file bytes against an unchanged manifest; replacing both the file and manifest is outside this check.
-
- A reader running the recipe on this page got an argparse error instead of a verification. The verifier we'd shipped didn't match the bundle we'd shipped. The hashes were correct, but the script next to them read JSON, not the zip the page describes.
-
-
- Replaced with a verifier that opens the zip, recomputes every per-file SHA-256, and rebuilds the Merkle root using the same algorithm RegEngine ships in services/shared/merkle_tree.py. Added the EPCIS payload to manifest.json, added a build block (commit, generated_at, release), and published audit-bundle-tampered.zip so anyone can watch the new verifier fail closed.
-
-
- If you found the original bug before we did, thank you. That's the system working.
-
-
-
-
-
-
-
- All artifacts are synthetic. They are regenerated by production code on every release.
-
-
- python verify_chain.py audit-bundle.zip
-
-
-
-
- );
+ notFound();
}
diff --git a/frontend/src/app/proof/transformation/opengraph-image.tsx b/frontend/src/app/proof/transformation/opengraph-image.tsx
deleted file mode 100644
index 78ee3ea14..000000000
--- a/frontend/src/app/proof/transformation/opengraph-image.tsx
+++ /dev/null
@@ -1,10 +0,0 @@
-import { renderOgCard, OG_SIZE, OG_CONTENT_TYPE } from '@/lib/og-image';
-
-export const runtime = 'edge';
-export const alt = 'CSV to CTE to FDA row, verified end to end';
-export const size = OG_SIZE;
-export const contentType = OG_CONTENT_TYPE;
-
-export default function Image() {
- return renderOgCard({ eyebrow: 'Proof', title: 'CSV to CTE to FDA row, verified end to end' });
-}
diff --git a/frontend/src/app/proof/transformation/page.tsx b/frontend/src/app/proof/transformation/page.tsx
index 601e1286f..88330c0f3 100644
--- a/frontend/src/app/proof/transformation/page.tsx
+++ b/frontend/src/app/proof/transformation/page.tsx
@@ -1,80 +1,6 @@
-import type { Metadata } from "next";
-import Link from "next/link";
-import { ArrowRight } from "lucide-react";
-import { Container } from "@/components/layout/container";
-import { PageHeader } from "@/components/layout/page-header";
-import { Section } from "@/components/layout/section";
-import { Button } from "@/components/ui/button";
-import { Card } from "@/components/ui/card";
+import { notFound } from 'next/navigation';
-export const metadata: Metadata = {
- title: "Proof: CSV to FDA row | RegEngine",
- description:
- "How a supplier CSV becomes an FDA-oriented sortable record in RegEngine. No worked example is published yet.",
- openGraph: {
- title: "How a supplier CSV becomes an FDA-oriented sortable record | RegEngine",
- description: "No worked example is published yet.",
- url: "https://regengine.co/proof/transformation",
- type: "website",
- },
-};
-
-export default function TransformationProofPage() {
- return (
-
- {/* Hero */}
-
-
-
- ← Proof
-
-
-
- The pipeline is: raw supplier CSV, canonical TraceabilityEvent, then
- the FDA-oriented sortable row. The canonical event shape lives in{" "}
-
- services/shared/canonical_event.py
- {" "}
- and the export columns in{" "}
-
- services/ingestion/app/fda_export_service.py
-
- .
-
-
-
-
-
-
-
Worked example
-
No data yet
-
- There is no worked example with real data to show here. Run the pipeline on your
- own records and verify the resulting export bundle yourself.
-
))}
diff --git a/frontend/src/app/walkthrough/page.tsx b/frontend/src/app/walkthrough/page.tsx
index 9c9aa4939..dba6e898b 100644
--- a/frontend/src/app/walkthrough/page.tsx
+++ b/frontend/src/app/walkthrough/page.tsx
@@ -265,10 +265,6 @@ export default function WalkthroughPage() {
See Security Details
-
- See the underlying transformation step by step at{' '}
- /proof/transformation.
-
diff --git a/frontend/src/app/why-regengine/page.tsx b/frontend/src/app/why-regengine/page.tsx
index 7d6bd3587..e9848a492 100644
--- a/frontend/src/app/why-regengine/page.tsx
+++ b/frontend/src/app/why-regengine/page.tsx
@@ -588,7 +588,7 @@ HTTP 201
EPCIS 2.0 (Preview) can support trading-partner interoperability. RegEngine treats EPCIS 2.0 as a preview schema where the enabled workflow and source data allow it.
- Verify EPCIS coverage with each vendor; some platforms layer EPCIS over legacy schemas, which can introduce conversion edges.
+ Verify EPCIS (Preview) coverage with each vendor; some platforms layer EPCIS over legacy schemas, which can introduce conversion edges.