From 5651b03b87318d3d89c6f7de7c89f4f7697daf75 Mon Sep 17 00:00:00 2001 From: Christopher <131207452+PetrefiedThunder@users.noreply.github.com> Date: Fri, 23 Oct 2026 14:42:49 -0700 Subject: [PATCH 1/7] chore(frontend): remove synthetic sample files Signed-off-by: Christopher <131207452+PetrefiedThunder@users.noreply.github.com> --- frontend/public/proof/epcis-sample.jsonld | 88 ------------------- frontend/public/proof/fsma-204-sample.csv | 11 --- .../public/samples/sandbox_sample_ftl.csv | 9 -- frontend/src/app/proof/page.tsx | 36 ++------ frontend/src/app/sandbox/SandboxClient.tsx | 24 ----- scripts/build_audit_bundle.sh | 3 +- 6 files changed, 9 insertions(+), 162 deletions(-) delete mode 100644 frontend/public/proof/epcis-sample.jsonld delete mode 100644 frontend/public/proof/fsma-204-sample.csv delete mode 100644 frontend/public/samples/sandbox_sample_ftl.csv diff --git a/frontend/public/proof/epcis-sample.jsonld b/frontend/public/proof/epcis-sample.jsonld deleted file mode 100644 index c107be48a..000000000 --- a/frontend/public/proof/epcis-sample.jsonld +++ /dev/null @@ -1,88 +0,0 @@ -{ - "_comment": "SYNTHETIC — Sample EPCIS 2.0 JSON-LD payload for the RegEngine /proof page. Three Critical Tracking Events covering harvesting, initial packing, and shipping for a single lot of romaine lettuce. Modeled on services/ingestion/app/epcis/. Not a real grower, lot, or shipment.", - "@context": [ - "https://ref.gs1.org/standards/epcis/2.0.0/epcis-context.jsonld", - { - "fsma": "urn:fsma:traceability:" - } - ], - "type": "EPCISDocument", - "schemaVersion": "2.0", - "creationDate": "2026-02-08T17:00:10Z", - "epcisBody": { - "eventList": [ - { - "type": "ObjectEvent", - "eventTime": "2026-02-05T13:42:00Z", - "eventTimeZoneOffset": "-08:00", - "epcList": [ - "urn:epc:id:sgtin:0614141.107346.SV-20240115-001" - ], - "action": "ADD", - "bizStep": "urn:fsma:traceability:harvesting", - "disposition": "urn:epcglobal:cbv:disp:active", - "readPoint": { - "id": "urn:epc:id:sgln:0614141.00001.0" - }, - "bizLocation": { - "id": "urn:epc:id:sgln:0614141.00001.0" - }, - "fsma:traceabilityLotCode": "SV-20240115-001", - "fsma:foodCommodity": "Romaine Lettuce, fresh-cut", - "fsma:harvestDate": "2026-02-05", - "fsma:growingArea": "Field 7B, Salinas Valley, CA" - }, - { - "type": "ObjectEvent", - "eventTime": "2026-02-06T08:15:00Z", - "eventTimeZoneOffset": "-08:00", - "epcList": [ - "urn:epc:id:sgtin:0614141.107346.SV-20240115-001" - ], - "action": "OBSERVE", - "bizStep": "urn:fsma:traceability:initial_packing", - "disposition": "urn:epcglobal:cbv:disp:in_progress", - "readPoint": { - "id": "urn:epc:id:sgln:0614141.00002.0" - }, - "bizLocation": { - "id": "urn:epc:id:sgln:0614141.00002.0" - }, - "fsma:traceabilityLotCode": "SV-20240115-001", - "fsma:packDate": "2026-02-06", - "fsma:packingFacility": "Salinas Valley Cooling & Pack, Salinas, CA", - "fsma:quantity": { - "value": 480, - "uom": "case" - } - }, - { - "type": "ObjectEvent", - "eventTime": "2026-02-07T05:30:00Z", - "eventTimeZoneOffset": "-08:00", - "epcList": [ - "urn:epc:id:sgtin:0614141.107346.SV-20240115-001" - ], - "action": "OBSERVE", - "bizStep": "urn:fsma:traceability:shipping", - "disposition": "urn:epcglobal:cbv:disp:in_transit", - "readPoint": { - "id": "urn:epc:id:sgln:0614141.00002.0" - }, - "bizLocation": { - "id": "urn:epc:id:sgln:0614141.00002.0" - }, - "destinationList": [ - { - "type": "urn:epcglobal:cbv:sdt:location", - "destination": "urn:epc:id:sgln:0614141.00099.0" - } - ], - "fsma:traceabilityLotCode": "SV-20240115-001", - "fsma:shipDate": "2026-02-07", - "fsma:shipToEntity": "DC-099, Tracy, CA", - "fsma:carrier": "Reefer Logistics Inc." - } - ] - } -} diff --git a/frontend/public/proof/fsma-204-sample.csv b/frontend/public/proof/fsma-204-sample.csv deleted file mode 100644 index daa15cd42..000000000 --- a/frontend/public/proof/fsma-204-sample.csv +++ /dev/null @@ -1,11 +0,0 @@ -Traceability Lot Code (TLC),Product Description,Quantity,Unit of Measure,Event Type,Event Date,Event Time,Facility Name,Facility GLN,Facility Address,Confidence Score -SV-20240115-001,Romaine Lettuce,500,cases,SHIPPING,2024-01-15,14:00:00,Sunny Valley Farms,1234567890128,"123 Farm Road, Salinas CA",0.98 -SV-20240115-001,Romaine Lettuce,500,cases,RECEIVING,2024-01-16,08:00:00,Fresh Cut Co,2345678901234,"456 Processing Lane, Fresno CA",0.97 -FC-20240116-A,Chopped Romaine,250,cases,TRANSFORMATION,2024-01-16,10:00:00,Fresh Cut Co,2345678901234,"456 Processing Lane, Fresno CA",0.95 -FC-20240116-B,Romaine Hearts,250,cases,TRANSFORMATION,2024-01-16,11:00:00,Fresh Cut Co,2345678901234,"456 Processing Lane, Fresno CA",0.95 -FC-20240116-A,Chopped Romaine,100,cases,SHIPPING,2024-01-17,06:00:00,Fresh Cut Co,2345678901234,"456 Processing Lane, Fresno CA",0.96 -FC-20240116-A,Chopped Romaine,100,cases,RECEIVING,2024-01-17,10:00:00,Metro Foods,3456789012340,"789 Distribution Dr, Oakland CA",0.94 -FC-20240116-B,Romaine Hearts,150,cases,SHIPPING,2024-01-17,07:00:00,Fresh Cut Co,2345678901234,"456 Processing Lane, Fresno CA",0.96 -FC-20240116-B,Romaine Hearts,150,cases,RECEIVING,2024-01-17,11:00:00,Valley Wholesale,4567890123456,"321 Wholesale Ave, Stockton CA",0.93 -FC-20240116-A,Chopped Romaine,50,cases,SHIPPING,2024-01-18,05:00:00,Metro Foods,3456789012340,"789 Distribution Dr, Oakland CA",0.95 -FC-20240116-A,Chopped Romaine,50,cases,RECEIVING,2024-01-18,08:00:00,SuperMart #42,5678901234562,"100 Retail St, San Jose CA",0.92 diff --git a/frontend/public/samples/sandbox_sample_ftl.csv b/frontend/public/samples/sandbox_sample_ftl.csv deleted file mode 100644 index ad98aa051..000000000 --- a/frontend/public/samples/sandbox_sample_ftl.csv +++ /dev/null @@ -1,9 +0,0 @@ -cte_type,traceability_lot_code,product_description,quantity,unit_of_measure,location_name,location_gln,timestamp,ship_from_location,ship_to_location,ship_from_gln,ship_to_gln,reference_document,harvest_date,harvester_business_name,harvest_location_ref,field_name,cooling_date,temperature_celsius,packing_date,ship_date,receive_date,receiving_location,immediate_previous_source,tlc_source_reference,transformation_date,input_tlcs -harvesting,SV-20260115-001,Romaine Lettuce,500,cases,Sunny Valley Farms,1234567890128,2026-01-15T06:30:00Z,,,,,HRV-88421,2026-01-15,Sunny Valley Farms,FARM-SV-04,Block 12 North,,,,,,,,Sunny Valley Farms,, -cooling,SV-20260115-001,Romaine Lettuce,500,cases,Sunny Valley Farms,1234567890128,2026-01-15T09:10:00Z,,,,,COOL-88421,2026-01-15,Sunny Valley Farms,FARM-SV-04,Block 12 North,2026-01-15,1.5,,,,,,Sunny Valley Farms,, -initial_packing,SV-20260115-001,Romaine Lettuce,500,cases,Sunny Valley Farms,1234567890128,2026-01-15T11:45:00Z,,,,,PACK-88421,2026-01-15,Sunny Valley Farms,FARM-SV-04,Block 12 North,2026-01-15,1.5,2026-01-15,,,,,Sunny Valley Farms,, -shipping,SV-20260115-001,Romaine Lettuce,500,cases,Sunny Valley Farms,1234567890128,2026-01-15T14:00:00Z,Sunny Valley Farms,Fresh Cut Co,1234567890128,2345678901234,BOL-44190,2026-01-15,Sunny Valley Farms,FARM-SV-04,Block 12 North,2026-01-15,1.5,2026-01-15,2026-01-15,,,,Sunny Valley Farms,, -receiving,SV-20260115-001,Romaine Lettuce,500,cases,Fresh Cut Co,2345678901234,2026-01-16T08:00:00Z,Sunny Valley Farms,Fresh Cut Co,1234567890128,2345678901234,BOL-44190,,,,,,,,,2026-01-16,Fresh Cut Co Dock 3,Sunny Valley Farms,Sunny Valley Farms,, -transformation,FC-20260116-A,Chopped Romaine,250,cases,Fresh Cut Co,2345678901234,2026-01-16T10:30:00Z,,,,,,,,,,,,,,,,,Fresh Cut Co,2026-01-16, -shipping,FC-20260116-A,Chopped Romaine,250,cases,Fresh Cut Co,2345678901234,2026-01-16T16:20:00Z,Fresh Cut Co,Metro Grocery DC,2345678901234,3456789012341,BOL-44207,,,,,,,,2026-01-16,,,,,, -receiving,FC-20260116-A,Chopped Romaine,250,cases,Metro Grocery DC,3456789012341,2026-01-17T07:15:00Z,Fresh Cut Co,Metro Grocery DC,2345678901234,3456789012341,BOL-44207,,,,,,,,,2026-01-17,Metro Grocery DC Bay 7,Fresh Cut Co,Fresh Cut Co,, diff --git a/frontend/src/app/proof/page.tsx b/frontend/src/app/proof/page.tsx index 5b4235333..b1060b492 100644 --- a/frontend/src/app/proof/page.tsx +++ b/frontend/src/app/proof/page.tsx @@ -1,6 +1,6 @@ import type { Metadata } from "next"; import Link from "next/link"; -import { ArrowRight, Download, FileJson, FileSpreadsheet, Hash, Terminal } from "lucide-react"; +import { ArrowRight, Download, 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"; @@ -10,11 +10,11 @@ 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, and a Merkle-rooted audit bundle) without signing up.", + "Download a Merkle-rooted audit bundle and verify it without signing up.", openGraph: { title: "Verify RegEngine without signing up", description: - "Three downloadable artifacts: FSMA 204 spreadsheet, EPCIS 2.0 JSON-LD, and a Merkle-rooted audit bundle.", + "A downloadable Merkle-rooted audit bundle with a Python verifier.", url: "https://regengine.co/proof", type: "website", }, @@ -32,28 +32,6 @@ type Artifact = { }; 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", - href: "/proof/epcis-sample.jsonld", - filename: "epcis-sample.jsonld", - sizeBytes: 3039, - icon: FileJson, - formatLabel: "EPCIS 2.0 JSON-LD", - 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", @@ -102,7 +80,7 @@ export default function ProofPage() { size="hero" eyebrow={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." + description="One audit bundle. No email gate, no demo call. Download it, open it 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" />
@@ -131,9 +109,9 @@ export default function ProofPage() { id="artifacts" width="marketing" eyebrow={Downloads} - title="Three artifacts. Open them in your own tools." + title="The audit bundle. Open it in your own tools." > -
+
{ARTIFACTS.map(({ name, href, filename, sizeBytes, icon: Icon, summary, why, formatLabel }) => (
@@ -188,7 +166,7 @@ export default function ProofPage() {

# 2. Run it

python verify_chain.py audit-bundle.zip

# 3. (Optional) Recompute the leaf yourself

-

shasum -a 256 fsma-204-sample.csv

+

unzip audit-bundle.zip && shasum -a 256 fsma-204-sample.csv

diff --git a/frontend/src/app/sandbox/SandboxClient.tsx b/frontend/src/app/sandbox/SandboxClient.tsx index a5c6b32d0..0b46eef90 100644 --- a/frontend/src/app/sandbox/SandboxClient.tsx +++ b/frontend/src/app/sandbox/SandboxClient.tsx @@ -13,7 +13,6 @@ import { usePostHog } from '@/lib/posthog-provider'; import { SandboxResultView, type SandboxResult } from '@/components/marketing/sandbox-grid/SandboxResultView'; const EVALUATE_URL = '/api/ingestion/api/v1/sandbox/evaluate'; -const SAMPLE_URL = '/samples/sandbox_sample_ftl.csv'; /** Backend rejects >2 MB with a 413; fail locally so the user isn't waiting on a round trip. */ const MAX_CSV_BYTES = 2_000_000; @@ -126,18 +125,6 @@ export function SandboxClient() { [evaluate], ); - const onSample = useCallback(async () => { - setBusy(true); - try { - const res = await fetch(SAMPLE_URL); - const csv = await res.text(); - await evaluate(csv, 'sandbox_sample_ftl.csv'); - } catch { - setBusy(false); - setError('Could not load the sample file. Try uploading your own CSV.'); - } - }, [evaluate]); - function reset() { setResult(null); setError(null); @@ -183,17 +170,6 @@ export function SandboxClient() { }} className="mt-4 mx-auto block text-[0.8rem] text-[var(--re-text-muted)] file:mr-3 file:rounded-lg file:border-0 file:bg-[var(--re-brand)] file:px-4 file:py-2 file:text-[0.8rem] file:font-semibold file:text-[var(--re-brand-foreground)] hover:file:bg-[var(--re-brand-dark)] disabled:opacity-50" /> -
- No file handy?{' '} - -
{busy && ( diff --git a/scripts/build_audit_bundle.sh b/scripts/build_audit_bundle.sh index 97f61042d..c49b10b3c 100755 --- a/scripts/build_audit_bundle.sh +++ b/scripts/build_audit_bundle.sh @@ -2,7 +2,8 @@ # Build the public /proof audit bundle ZIP. # # Packages: -# - fsma-204-sample.csv (the FSMA 204 sortable sample) +# - fsma-204-sample.csv (source CSV; removed from frontend/public/proof, so this +# script now exits with "not found" until a real export is placed there) # - manifest.json (per-file SHA-256 + Merkle root over those leaves) # # Merkle algorithm matches services/shared/merkle_tree.py: From 39ac1a5d100deb203a945fd684465024a5295075 Mon Sep 17 00:00:00 2001 From: Christopher <131207452+PetrefiedThunder@users.noreply.github.com> Date: Fri, 23 Oct 2026 14:49:00 -0700 Subject: [PATCH 2/7] chore(frontend): remove synthetic proof bundles and audit bundle script Delete audit-bundle.zip and audit-bundle-tampered.zip (approved by C.Lee) and scripts/build_audit_bundle.sh, which only packaged the deleted CSV. /proof now shows an honest empty state and links to /verify; /verify and /docs reference the user's own bundle. Backend tests build their bundle in-test instead of reading the deleted fixtures. Add a data-free /proof test. Signed-off-by: Christopher <131207452+PetrefiedThunder@users.noreply.github.com> --- .gitignore | 6 +- .../public/proof/audit-bundle-tampered.zip | Bin 2268 -> 0 bytes frontend/public/proof/audit-bundle.zip | Bin 2266 -> 0 bytes frontend/public/sdk/verify_chain.py | 4 +- .../__tests__/pages/proof-no-sample.test.tsx | 18 ++ frontend/src/app/docs/page.tsx | 2 +- frontend/src/app/proof/page.tsx | 232 +++--------------- frontend/src/app/verify/page.tsx | 6 +- scripts/build_audit_bundle.sh | 95 ------- .../tests/test_proof_verify_router.py | 52 ++-- 10 files changed, 81 insertions(+), 334 deletions(-) delete mode 100644 frontend/public/proof/audit-bundle-tampered.zip delete mode 100644 frontend/public/proof/audit-bundle.zip create mode 100644 frontend/src/__tests__/pages/proof-no-sample.test.tsx delete mode 100755 scripts/build_audit_bundle.sh diff --git a/.gitignore b/.gitignore index 5a28737a2..e68ab4b72 100644 --- a/.gitignore +++ b/.gitignore @@ -85,10 +85,8 @@ secrets.json # Artifacts that should never be tracked *.zip -# ...except the public proof/sample bundles the frontend serves. These are -# intentionally tracked fixtures (the audit-bundle pair backs the public -# /api/v1/proof/verify demo, including the deliberately tampered one), and -# the bare *.zip rule above was silently covering them (#2873). +# ...except any public bundles the frontend serves from these folders (#2873). +# None are published at the moment. !frontend/public/proof/*.zip !frontend/public/samples/*.zip login_resp.json diff --git a/frontend/public/proof/audit-bundle-tampered.zip b/frontend/public/proof/audit-bundle-tampered.zip deleted file mode 100644 index 50e02e82f5fe6c9b744d8a0f252415bd0232fa59..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2268 zcmZ{mXHXN`62}t}39@Oo16`WaYybcN1n_Juw-gxM(%Aq4 z0N-c<0M?URoVyc7S`I2N?T&GBb+nhkx_i~9lU+#Ab0OqiNxe_@X^8_&!jJriPT{k6 z>cgMjxzfy3*@bv&9CI9m6B3z*uhL{3yo+<%9r9lJ(^OFG-X&c;6*>*MZFMfd61k+` z^u)t(1%j~K()sdailO6;I;xQ)SR8*{wKG1vT$1>e^&+_PusS<2Jn%@OF+Aqw@mo2L z&#PW=Ra!$s6FbH}wDQaQCVI&qT8i`_#lN21szRZ%W;koN`$U zNW##-0fc$qKc3o@6tEc~dj(pVLFz`Qi+mPfnSRYr-J?FW_aha|dW7%@BSo z-H4v%-jwE#UC~xX;vdN#JV{~{4q@Q4P3_dC<9RhpzHltKP_?rf+}S*qPhTF?Wg@Pw z$Yam~Vg_>> z3pc51yXN3K$CuIsp1p&!b>&{PE>C%X@e=G=Mx+LXXv=*c^9G3#PN-TA4D`u_R-A(@ zK4q)83#D7xCLY$wL~guaWbC0x5yyU08Zsv+BgVYxe5!q2E2RC zwcf%O!%Z(Qs%l+IPMC}X1{^K1-kK>&2NhGgdQX!ur^))&GPz3v>5kIuL$;;zGfKp> zABzP!Xw@sHbVfkQSkRiK5K#>*shF1R&=(BRWGZHlfOSqY)W0ZzwW(wATp{8hD1v*)0DWwJzZjnq5%(|_A~^&h zSZ0}lGM7U`5wV$neV1JCR5}|{)RdfIEt7J}ee6K%|!o88?H zR{b{Wo>I$Y$0CN0W}FCYK*t zY1`YaFgjOc^Sa>RA=wC+%T|eUZPkv7fhQHPhR7qiA@bnMXF}z|j(pYj^Vn!%u0xM{ zJON>KPBCM&?Pip=^kr`E;}7T#ctO0gvzAQ>)uB7+@#Rl79BtyftK%=ryFMnQlaI90 zk2Py*4BN4v)mqw$p@LMJC6y3rs~DP7Tx5ZM_pBxB57aB`;Y)3Y&+H-=nr4@5dzUBe zCw)0+{UwaS94W9c1-iF>8hiLDq+apy`)EfSo1@o`$z}Ilk4Gk69^71Q<6T24>mU`P zEVG71-EysJT};7WIq>blHu~;m?+(p6a5+}R%%#o2Y=nvlFFNk->uIUr1Mt?~YL8oK zz1rs_L=Tq(XJsCUeZEt(t9xa8@c3;()AXx>f?qo|%{0A+?Gyk&cNzdVdoszLFwS_K zy}O6Z&n~SpM!L*F8QZAlAeAdI?N0Xng=*fj7>d0ONIXX8IlKX*)YT$$9GE&M)jN(& zS{5qc(h#qej;uYnWO{p#*OnVlpE@s^(vwJnz=_~n1SB+)&^DNhbqPO?a z5(DMuy2krxM_ScZN?d2;>#r!#u3w9Ih|8I8?q$--8h5e%vXV}rH3cI!9-}4e2#b_v zuO5g1=3=fEDle|Q+^rXH*3kd8y*Ez&ZsQ?m*+TpCk_)aSV*%OHj*%=k4oo}GA1Pt2 zHtwalhDcTOfe)Df=-i)i(jDcCyxbxcJfWUry~!(Ue=x_x!9tK+rvcLiI{C0(+ZI=T zH7c&-52m2PJ(${lZ=7v^v%(>4l%F3up6Vc~{05!V$%Xax)jQ*) znZFyp68k2hp0pizD9~^T5qxck*OrtKrB1qGoogvP!@PTB3Ae`Se)UH27+YGq>2v?t z5gG;iu(s!kQEbW@tq3Y@A6hx=fL@RA)ts4ovh4A_m9Ry=9j(Y`#kucH9Ic5A8_8_Y zISNu(V&-lPn~{!+T3`RhVW0~<#YXf0t-uLG|A~+jd+@Ku;CF%Fcf~*70e}!7{|T4> jvN?Vi_#NT@2@IatlV5-~(50pO`AlZl` diff --git a/frontend/public/proof/audit-bundle.zip b/frontend/public/proof/audit-bundle.zip deleted file mode 100644 index 062a233a63cd5305ecec8b9dd247ee857a07e63b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2266 zcmZ{mc{mh$7sqGPXfh!?*RH}P8V!YzEF-+4vW>ND7h<621sdZSI0tJpJE6-(h7P=in)TZyE&~NKHr*rxco;5p9xrpmFi`lSp(J}|P_T7qEy>R(B~oGsL9|ca zrzlcl-)b!LEi;n&%kF{m`l&R=XBg@5_?j81es}5|Qa&C7LC<4YptnC zGJ>kp#FQ}0DPmkKcs74#kxmp52s;=1$g&tqc{ptTB)ft_5bxJ)6E?uCZ`^0!G{g2y z+O35bZk5Lele@u)5UHf4KG72+FXr>IK;u@XMS)`7~Z96)(# zk)`Ov^EP7UZENnhGa*yiF%)>_#^KGl&7+1es{6ij&s=*?2uW&oaVv7}3@pk3c+J4K z#@QV$eNbEZEUJ{1I-CrQ*qIgi*H{r5T+D6h*gt{Z&$6x5%$-#vdufRExR+{=>9z8I zELM^LnUs%M^?@@mU=H#~t1(1f_jZP7XSBGvK(Santa+5L=2-!((FB8+BC3LI-ulP# z6UC&c4XV}&*MU-!E|*Z35QWYz8dQkJ(8MuX_1Oo9j^PUVpbwmG6yr1FlM9o?)qBJ# zNU9?^iyadKPs;l3oBBet9zU_DJ|pc;wU91}`Jt?OE%yjVG-6H{0J+HgIWv{fL9cE_x--joGR+o0v6bQ=hl`0`cLp7p6F zNe|Sn>abEKlbRUss^zY$MHM(7Z<;F4r*d)G(2|o^xldkdWqH2zXr-061BE35;{(qu zAc8953i`Xk?kJV7kB_JYm%zW?<5t$vwuL*B7;0H{D`Cy;&f`FvB9v^ol+#&C>Y&jpCJ~0~(^I0h|tgcuyvI|@VaNv0p{_s3~_JNp_u{)v0n|Y!jm~YSh z_CP=^gK%pA#B}5~lG)P1yB}Pd^b1nFy)E2IRz2II9-R7ACDEuVH$V7--tsY(%-XRa z@0wRtU1VZD8$WFOIl8{n#UZx_*4ty@NfB z9S)TMg{xhLNMyodb$DmO%r@{NHW!L_-z9pvx$V66%Anow-R&ECv1K{mD95oew6f7j zKvH{^{c~NbeH;J=+3SVu?Rb|6=Y?gIdL_X7a@dvlzC z_QvC|0oOHubZNz98=pz&p~h7wu+iyTOaiv+o^kLvnu~PxkZPzlhBU$@e-L@ocn)#$e*0*FJB3r}jrjY5DL$mOX z9>#Ui@3t@Tc%?jKOYoQG%`t*?zx>TpPmf0rndG3BBp_wEZu~d(m@q6_OPLJMseiXX971aXJakPJY)M66rh77Pi4b5E;-Fon9$G* z2MFf*>v3~QZ&GU}z9ere)}DYz8}!JzPuxi`nJ`7=B9D#D}62bu+dv ztJZ2KN@rG3x-NE1BOzg7;j4t5HE^FO&;K_9dkp>O+>iMYeqsy$De%u-@#l8{;C_tU o9+yAa9RDluGlc&VAOc_PnUlW(ZD$SQ{qfARcN_QO0q~FP4;NVxx&QzG diff --git a/frontend/public/sdk/verify_chain.py b/frontend/public/sdk/verify_chain.py index 48bbf2ad7..5daf64d6c 100644 --- a/frontend/public/sdk/verify_chain.py +++ b/frontend/public/sdk/verify_chain.py @@ -17,7 +17,7 @@ odd-node padding: duplicate the last node Usage: - python verify_chain.py audit-bundle.zip + python verify_chain.py your-bundle.zip Copyright (c) 2024-2026 RegEngine LLC License: Apache License 2.0 (https://www.apache.org/licenses/LICENSE-2.0) — @@ -260,7 +260,7 @@ def verify_bundle(zip_path: str) -> int: def main() -> int: parser = argparse.ArgumentParser(description="Verify a RegEngine audit bundle (zip with manifest.json).") - parser.add_argument("bundle", help="Path to audit-bundle.zip") + parser.add_argument("bundle", help="Path to an exported audit bundle ZIP") args = parser.parse_args() return verify_bundle(args.bundle) diff --git a/frontend/src/__tests__/pages/proof-no-sample.test.tsx b/frontend/src/__tests__/pages/proof-no-sample.test.tsx new file mode 100644 index 000000000..c9fc20177 --- /dev/null +++ b/frontend/src/__tests__/pages/proof-no-sample.test.tsx @@ -0,0 +1,18 @@ +import { render, screen } from '@testing-library/react'; +import { describe, expect, it } from 'vitest'; +import ProofPage from '@/app/proof/page'; + +// /proof must not offer synthetic downloads or made-up hashes and sizes. +describe('/proof without sample data', () => { + it('shows an empty state and no artifact downloads', () => { + const { container } = render(); + const text = container.textContent ?? ''; + + expect(screen.getByText(/no public artifacts are published yet/i)).toBeInTheDocument(); + expect(text).not.toMatch(/fsma-204-sample|epcis-sample|audit-bundle/i); + expect(text).not.toMatch(/\b[0-9a-f]{12,}\b/i); + expect(container.querySelector('a[download]')).toBeNull(); + expect(container.querySelector('a[href^="/proof/"]')).toBeNull(); + expect(container.querySelector('a[href="/verify"]')).not.toBeNull(); + }); +}); diff --git a/frontend/src/app/docs/page.tsx b/frontend/src/app/docs/page.tsx index 902a669fe..435eaf62b 100644 --- a/frontend/src/app/docs/page.tsx +++ b/frontend/src/app/docs/page.tsx @@ -306,7 +306,7 @@ export default function DocsHomePage() {