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() { @@ -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.

@@ -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.

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. -

- -
-
- -

Test EPCIS preview

-

- Uses the same lot and date filters for interoperability testing. It is not production evidence. -

- -
-
-
- )} - {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 - - - - - - - - )}