diff --git a/frontend/src/app/api/inflow-lab/[...path]/route.ts b/frontend/src/app/api/inflow-lab/[...path]/route.ts
index f7b998cd3..21258c860 100644
--- a/frontend/src/app/api/inflow-lab/[...path]/route.ts
+++ b/frontend/src/app/api/inflow-lab/[...path]/route.ts
@@ -13,7 +13,7 @@ const AUTH_SESSION_COOKIE = "__Host-regengine_session";
const ALLOWED_METHODS = new Set(["GET", "POST"]);
const JSON_CONTENT_TYPES = ["application/json", "application/problem+json"];
-type BoundaryMode = "simulator" | "mock-export" | "live-export";
+type BoundaryMode = "simulator" | "live-export";
type EndpointContract = {
name: "health" | "status" | "records" | "lineage" | "run" | "reset" | "fixture" | "export";
boundary: BoundaryMode;
@@ -118,12 +118,6 @@ function endpointContract(path: string, method: string): EndpointContract | null
if (method === "POST" && path === "/api/simulate/reset") {
return { name: "reset", boundary: "simulator", stream: false };
}
- if (method === "GET" && path === "/api/mock/regengine/export/fda-request") {
- return { name: "export", boundary: "mock-export", stream: true };
- }
- if (method === "GET" && path === "/api/mock/regengine/export/epcis") {
- return { name: "export", boundary: "mock-export", stream: true };
- }
if (method === "GET" && path === "/api/regengine/export/fda-request") {
return { name: "export", boundary: "live-export", stream: true };
}
diff --git a/frontend/src/app/proof/page.tsx b/frontend/src/app/proof/page.tsx
index 5b4235333..553b91646 100644
--- a/frontend/src/app/proof/page.tsx
+++ b/frontend/src/app/proof/page.tsx
@@ -112,7 +112,7 @@ export default function ProofPage() {
- Get the verifier
+ Get the verifier
@@ -176,9 +176,9 @@ export default function ProofPage() {
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.
-
+
Open verify_chain.py
-
+
@@ -204,9 +204,9 @@ export default function ProofPage() {
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.
-
+
Download audit-bundle-tampered.zip
-
+
diff --git a/frontend/src/app/tools/inflow-lab/components/InflowLabClient.tsx b/frontend/src/app/tools/inflow-lab/components/InflowLabClient.tsx
index 6a39b8d4a..acea666b9 100644
--- a/frontend/src/app/tools/inflow-lab/components/InflowLabClient.tsx
+++ b/frontend/src/app/tools/inflow-lab/components/InflowLabClient.tsx
@@ -6,11 +6,9 @@ import { useCallback, useEffect, useLayoutEffect, useMemo, useRef, useState } fr
import {
AlertTriangle,
ArrowDownToLine,
- CalendarDays,
CheckCircle2,
ClipboardList,
Database,
- FileJson,
FileSpreadsheet,
GitBranch,
GraduationCap,
@@ -21,6 +19,7 @@ import {
RotateCcw,
Search,
SlidersHorizontal,
+ Tag,
Truck,
Upload,
} from "lucide-react";
@@ -586,8 +585,8 @@ function getLotFixGuidance(lot: {
};
}
-const standaloneTabs = ["Control room", "Data feeder", "Fix queue", "Scenarios", "Suppliers", "Lots", "Lineage", "Test previews", "Event log", "Diagnostics"];
-const dashboardTabs = ["Overview", "Data feeder", "Fix queue", "Lots", "Lineage", "Test previews", "Record log", "Diagnostics"];
+const standaloneTabs = ["Control room", "Data feeder", "Fix queue", "Scenarios", "Suppliers", "Lots", "Lineage", "Event log", "Diagnostics"];
+const dashboardTabs = ["Overview", "Data feeder", "Fix queue", "Lots", "Lineage", "Record log", "Diagnostics"];
const lotCodes = [
"00614141000012-20260426-000001",
@@ -830,9 +829,6 @@ export function InflowLabClient({ mode = "standalone" }: InflowLabClientProps) {
const [fixture, setFixture] = useState("leafy_greens_trace");
const [deliveryMode, setDeliveryMode] = useState("mock");
const [source, setSource] = useState("codex-simulator");
- const [exportPreset, setExportPreset] = useState("all_records");
- const [startDate, setStartDate] = useState("2026-04-26");
- const [endDate, setEndDate] = useState("2026-04-27");
const [feederCsv, setFeederCsv] = useState(FEEDER_SAMPLE_CSV);
const [feederResult, setFeederResult] = useState(null);
const [feederError, setFeederError] = useState(null);
@@ -1249,7 +1245,7 @@ export function InflowLabClient({ mode = "standalone" }: InflowLabClientProps) {
const prepareExport = () => {
setRunStage("exported");
- setActiveTab("Test previews");
+ setActiveTab("Lots");
};
const startMachineDemo = async () => {
@@ -1279,8 +1275,6 @@ export function InflowLabClient({ mode = "standalone" }: InflowLabClientProps) {
setIsTutorialOpen(true);
};
- const csvExportHref = `${servicePath(`/api/mock/regengine/export/fda-request?preset=${exportPreset}&traceability_lot_code=${encodeURIComponent(traceInput)}&start_date=${startDate}&end_date=${endDate}`)}`;
- const epcisExportHref = `${servicePath(`/api/mock/regengine/export/epcis?traceability_lot_code=${encodeURIComponent(traceInput)}&start_date=${startDate}&end_date=${endDate}`)}`;
const engineConnected = Boolean(health?.ok && !serviceError);
const connectionLabel = engineConnected ? "Connection ready" : serviceError ? "Connection needs attention" : "Checking connection";
const connectionTone = engineConnected ? "border-emerald-200 bg-emerald-50 text-emerald-700" : "border-amber-200 bg-amber-50 text-amber-800";
@@ -1708,7 +1702,7 @@ export function InflowLabClient({ mode = "standalone" }: InflowLabClientProps) {
{exportReadinessLabel}
- Test previews use the selected lot and date window. Formal production records come later from signed-in imports.
+ Test completeness uses the selected lot. Formal production records come later from signed in imports.
@@ -1805,24 +1799,6 @@ export function InflowLabClient({ mode = "standalone" }: InflowLabClientProps) {
)}
-
-
-
Test handoff preview
-
- Preview test CSV or EPCIS JSON-LD filters. Formal production records are generated only from imported production data.
-
-
-
@@ -2341,50 +2317,14 @@ export function InflowLabClient({ mode = "standalone" }: InflowLabClientProps) {
-
-
Export filters
+
+
Lot code
-
-
-
-
Test handoff preview
-
- {exportReadyCount} lots are test complete. {exceptionLots.length} exception lots remain visible. Formal production records require signed-in imports.
-
-
@@ -2572,38 +2512,6 @@ export function InflowLabClient({ mode = "standalone" }: InflowLabClientProps) {
)}
- {activeTab === "Test previews" && (
-
- {!selectedIsExportReady && (
-
- Selected lot is an exception. Test-complete counts include only complete mock lots; this lot stays visible until missing CTE/KDE evidence or delivery issues are resolved.
-
- )}
-
-
-
-
Test CSV preview
-
- Includes {exportReadyCount} test-complete lots. {exceptionLots.length} exception lots are flagged for review. Formal production records are generated only from imported production data.
-
-
- Preview test CSV
-
-
-
-
-
Test EPCIS preview
-
- Uses the same lot and date filters for interoperability testing. It is not production evidence.
-
-
- Preview test EPCIS
-
-
-
-
- )}
-
{activeTab === "Diagnostics" && (
{!isStandalone && (
@@ -2825,7 +2733,7 @@ export function InflowLabClient({ mode = "standalone" }: InflowLabClientProps) {
- {isStandalone ? (
+ {isStandalone && (
<>
@@ -2849,35 +2757,6 @@ export function InflowLabClient({ mode = "standalone" }: InflowLabClientProps) {
>
- ) : (
-
-
-
-
- Test preview filters
-
-
-
-
- Preset
- setExportPreset(event.target.value)} className="mt-1 h-9 w-full rounded-md border border-slate-300 bg-white px-3 text-sm text-slate-900">
- All records
- Lot trace
- Shipment handoff
- Receiving log
- Transformation batches
-
-
-
- Start date
- setStartDate(event.target.value)} className="mt-1 h-9 bg-white" />
-
-
- End date
- setEndDate(event.target.value)} className="mt-1 h-9 bg-white" />
-
-
-
)}