// One-off script: freeze the current 74-image product-scan Validation Set into // a dedicated, stable folder (sources/product-test-images-fixed/) so re-running // the accuracy harness always scores the exact same images, independent of // whatever new photos get dropped into the live-intake folder // (sources/product-test-images/, still fed by the /manual-label-scan page). // Renames each image " ." (index = its stable position, // 1-based) and updates product_manual_labels.json's flat-filename entries to // match. Run once from backend/: node scripts/freeze-validation-set.mjs import fs from "fs"; import path from "path"; const LIVE_DIR = path.join("sources", "product-test-images"); const FIXED_DIR = path.join("sources", "product-test-images-fixed"); const LABELS_PATH = path.join("sources", "product_manual_labels.json"); const labels = JSON.parse(fs.readFileSync(LABELS_PATH, "utf8")); const flatEntries = labels.filter((l) => !l.filename.includes("/")); if (!fs.existsSync(FIXED_DIR)) fs.mkdirSync(FIXED_DIR, { recursive: true }); // Resolve by SKU prefix (not entry.filename directly) so this script is // idempotent/rerunnable even after a previous run already renamed // entry.filename to " ." — the live-intake folder always // keeps its original " __." names. const liveFiles = fs.readdirSync(LIVE_DIR); function findSourceFile(no_sku) { const match = liveFiles.find((f) => f.startsWith(`${no_sku} `) || f.startsWith(`${no_sku}__`)); if (!match) return null; return path.join(LIVE_DIR, match); } let copied = 0; flatEntries.forEach((entry, i) => { const index = i + 1; const srcPath = findSourceFile(entry.no_sku); if (!srcPath) { throw new Error(`Missing source image for ${entry.no_sku} in ${LIVE_DIR}`); } const ext = path.extname(srcPath); const newFilename = `${index} ${entry.no_sku}${ext}`; fs.copyFileSync(srcPath, path.join(FIXED_DIR, newFilename)); entry.filename = newFilename; copied++; }); fs.writeFileSync(LABELS_PATH, JSON.stringify(labels, null, 2), "utf8"); console.log(`Copied ${copied} images into ${FIXED_DIR} and updated ${LABELS_PATH}.`);