# state_store

key: bug_change_log
updated_at: 2026-04-02T21:16:40
payload_json:
{
  "change_log": [
    {
      "changes": [
        "Restored the daily merged apparel inventory pull so the Pi runner creates a new dated On_Hand_Non_Footwear CSV again instead of reusing the old March 25, 2026 file forever.",
        "Changed the merged apparel verification step to require today's dated CSV, so the daily run now fails clearly if the apparel export does not actually produce fresh merged data."
      ],
      "date": "2026-04-02",
      "version": "V172"
    },
    {
      "changes": [
        "Clarified the Apparel header date so the old March 25 value is shown as the quantity overlay date, not the full dataset date.",
        "Added the newer non-footwear catalog scrape freshness to the Apparel metadata so the tab shows both source dates instead of looking stuck on the old inventory overlay."
      ],
      "date": "2026-04-02",
      "version": "V171"
    },
    {
      "changes": [
        "Extended the mobile Filters swipe opener so a left swipe inside the workspace content, including result/style cards, can open the drawer instead of only swipes that start near the right edge.",
        "Kept the swipe guardrails for controls like inputs, buttons, links, tabs, and headers so normal taps and form interactions do not trigger the drawer."
      ],
      "date": "2026-04-01",
      "version": "V170"
    },
    {
      "changes": [
        "Fixed the mobile Filters drawer so Inventory, Apparel, Vouchers, and Incoming Stock can all open it from the Filters button on phone-sized layouts.",
        "Added right-edge swipe opening for the shared mobile sidebar and aligned the sidebar breakpoint logic so mobile search and filters stay reachable."
      ],
      "date": "2026-04-01",
      "version": "V169"
    },
    {
      "changes": [
        "Restored the shared Bug/Change log popup button to the header area on the main tabs so bug reporting and version history are back in their older placement.",
        "Kept the Admin tab as the full-page operations view while bringing back the older popup access point for the shared bug log."
      ],
      "date": "2026-03-31",
      "version": "V168"
    },
    {
      "changes": [
        "Retired the legacy daily non-footwear Power BI scrape from the Pi runner and replaced it with a merged-apparel source check that uses the existing combined apparel inventory CSV plus the non-footwear scrape markdown.",
        "Closed the Power BI background session immediately after the footwear pull so Incoming Stock runs without the extra headless Firefox load from the old apparel automation path."
      ],
      "date": "2026-03-31",
      "version": "V167"
    },
    {
      "changes": [
        "Changed Incoming Stock style aggregation to sort the Incoming Styles list by numeric style code instead of quantity, so styles now render in ascending style order.",
        "Cleared the two open bug-log entries for stale Incoming Stock data and the Incoming Styles sort order after verifying the live Pi data refreshed on March 31, 2026."
      ],
      "date": "2026-03-31",
      "version": "V166"
    },
    {
      "changes": [
        "Kept the Pi Incoming Stock timeout fix in place, but restored the original UPS ETA wording so labels like Tomorrow and Today are preserved when the carrier provides them.",
        "Confirmed the real issue was stale Incoming Stock data on Pi-Justin, not the relative ETA wording itself."
      ],
      "date": "2026-03-31",
      "version": "V165"
    },
    {
      "changes": [
        "Tracked the Pi rw-current-inventory systemd timer and service in the repo, updated their descriptions to reflect the full inventory plus incoming-stock run, and raised the service timeout to 60 minutes.",
        "Fixed stale Incoming Stock refreshes on Pi-Justin by preventing systemd from killing the daily run before Pull_Incoming_Stock.py can finish after the footwear and non-footwear steps."
      ],
      "date": "2026-03-31",
      "version": "V164"
    },
    {
      "changes": [
        "Fixed the Pi local-control status helper so Admin Pi status now returns a real systemctl result on the Pi instead of dropping the connection.",
        "Redeployed and restarted rw-site.service on Pi-Justin, then verified the live Pi API reports local mode with active / running service state."
      ],
      "date": "2026-03-30",
      "version": "V163"
    },
    {
      "changes": [
        "Fixed Admin Pi service parsing against the live Pi by switching systemctl status reads to key=value parsing instead of assuming a stable --value output order.",
        "Verified the Pi now reports local control mode correctly while rw-site.service is running under the justin account on Pi-Justin."
      ],
      "date": "2026-03-30",
      "version": "V162"
    },
    {
      "changes": [
        "Changed Admin Pi controls to support local systemctl management when the app is running on the Pi, instead of always trying SSH back into the same host.",
        "Added automatic local-vs-SSH Pi control mode detection, clearer Pi status messages, and a local restart error that tells you when rw-site.service still needs a passwordless sudoers rule."
      ],
      "date": "2026-03-30",
      "version": "V161"
    },
    {
      "changes": [
        "Added SQLite FTS-backed voucher search, optimized the voucher reindex to bootstrap missing FTS rows from the existing voucher index, and verified live voucher FTS queries now return folder and file matches.",
        "Added parser fixture tests for inventory quantity parsing, mixed footwear/non-footwear merge safety, incoming-stock size alignment, and voucher markdown price parsing, and wired them to npm run test:parsers.",
        "Expanded Admin with app-state backup/export tools, live task progress/output, Pi status panels, and stale-data refresh banners across the main tabs, plus a mobile layout polish pass for the new shared UI blocks."
      ],
      "date": "2026-03-30",
      "version": "V160"
    },
    {
      "changes": [
        "Made the voucher SQLite reindex incremental by default, added file-signature tracking, and added SQLite busy-timeout handling so warm rebuilds only reparse changed voucher files.",
        "Added short-lived server payload caching for Inventory, Apparel, Incoming Stock, and voucher index metadata, and split shared frontend detail-image and voucher-storage helpers out of the larger page scripts.",
        "Expanded the browser smoke suite to verify preset deletion survives reloads, voucher recent-folder and URL restore behavior, and incoming-stock order/detail URL consistency, then archived the old synced JSON conflict files."
      ],
      "date": "2026-03-30",
      "version": "V159"
    },
    {
      "changes": [
        "Moved shared site state and the bug / change log out of synced JSON files into a local SQLite app-state store with automatic migration from the old files.",
        "Added a shared frontend helper module, no-store asset caching, deep-link URL state on Inventory, Apparel, Vouchers, Incoming Stock, and Inventory Diff, plus graceful image placeholders across the detail dialogs.",
        "Expanded the Admin tab with manual rebuild/scrape actions, recent task history, voucher index metadata, and dataset validation warnings for Inventory, Apparel, Incoming Stock, and Vouchers."
      ],
      "date": "2026-03-30",
      "version": "V158"
    },
    {
      "changes": [
        "Added a dedicated Admin tab to the left of User, moved the shared Bug / Change log into that page, and removed the old header-injected admin button from the other tabs.",
        "Added a repeatable browser smoke suite with npm run ui:smoke that boots the local server if needed and checks Inventory, Apparel, Vouchers, Incoming Stock, and Admin."
      ],
      "date": "2026-03-29",
      "version": "V157"
    },
    {
      "changes": [
        "Fixed Incoming Stock size parsing for order-detail tables that do not have a separate row-label column, so size quantities no longer shift one column to the right.",
        "Regenerated incoming_stock.json and verified style 96425 now shows the correct breakdown from its two orders: 10 x10, 12 x4, and 13 x3."
      ],
      "date": "2026-03-29",
      "version": "V156"
    },
    {
      "changes": [
        "Added an Open order button to Incoming Stock order details so the selected order can be opened directly on the Red Wing order page.",
        "Used the existing scraped order detail URL from the incoming-stock payload instead of adding any new scrape or API path."
      ],
      "date": "2026-03-29",
      "version": "V155"
    },
    {
      "changes": [
        "Swapped the Incoming Stock page layout so Orders now sits in the left sidebar and Incoming Styles now sits in the main workspace beside Order Details.",
        "Kept the same Incoming Stock data bindings while moving only the visible panel locations."
      ],
      "date": "2026-03-29",
      "version": "V154"
    },
    {
      "changes": [
        "Fixed preset deletion and renaming so presets are removed or renamed across both the shared preset list and any legacy per-user preset copies that could bring them back.",
        "Stopped legacy user preset copies from auto-promoting back into shared presets when a real shared preset list already exists, so deleted presets stay gone after reload."
      ],
      "date": "2026-03-29",
      "version": "V153"
    },
    {
      "changes": [
        "Fixed the Pi incoming-stock automation path so the Incoming Stock scraper still runs even when the non-footwear Power BI export fails earlier in the daily job.",
        "Verified the live Pi Incoming Stock page after repairing the Pi runtime dependencies, and it refreshed to 9 incoming orders with a generated time of Mar 29, 2026 3:53 PM."
      ],
      "date": "2026-03-29",
      "version": "V152"
    },
    {
      "changes": [
        "Changed Voucher All Info so the Open voucher button now opens the original Red Wing portal program page stored in the scrape, instead of the local scanned markdown file.",
        "Kept the old local voucher-file path only as a fallback when a scraped Program URL or Account URL is missing from a voucher markdown file."
      ],
      "date": "2026-03-29",
      "version": "V151"
    },
    {
      "changes": [
        "Reworked the Voucher desktop top layout so Files in folder and Recent folders share one stacked column, removing the large dead gap caused by the taller search box.",
        "Tightened the Voucher top-stack spacing while keeping the right-side Filters and All Info buttons in their own column."
      ],
      "date": "2026-03-29",
      "version": "V150"
    },
    {
      "changes": [
        "Moved the version badge to the shared bug/change log data so every tab resolves the same current app version instead of hardcoding separate values.",
        "Updated all tabs to load the shared version-badge script at the same cache-busted revision so Inventory, Apparel, Vouchers, Inventory Diff, Incoming Stock, and User stay in sync."
      ],
      "date": "2026-03-29",
      "version": "V149"
    },
    {
      "changes": [
        "Adjusted the Voucher top layout so Recent folders sits directly under Files in folder in the desktop view.",
        "Gave Filters and All Info their own right-side column so the Recent folders box stops short instead of running underneath those buttons."
      ],
      "date": "2026-03-29",
      "version": "V148"
    },
    {
      "changes": [
        "Changed the Voucher recent box to track the last 3 selected folders instead of individual voucher files.",
        "The Recent folders box now lists only folder names and reopens that folder when clicked, while staying directly under Files in folder."
      ],
      "date": "2026-03-29",
      "version": "V147"
    },
    {
      "changes": [
        "Fixed the Voucher Recent files box placement so it is inserted directly under Files in folder in the visible layout on both desktop and narrow screens.",
        "The Recent files panel now renders in the same top stack as Files in folder instead of being left out of the active voucher layout container."
      ],
      "date": "2026-03-29",
      "version": "V146"
    },
    {
      "changes": [
        "Stopped the Voucher search boxes from auto-focusing on mobile-sized layouts, so the on-screen keyboard does not pop open during load or selection changes.",
        "Desktop Voucher behavior still keeps the search focus flow for fast keyboard use."
      ],
      "date": "2026-03-29",
      "version": "V145"
    },
    {
      "changes": [
        "Fixed Voucher Recent files for single-file folders by recording the auto-opened voucher file as soon as the folder resolves, instead of waiting for the detail request to finish.",
        "Clear now shows the recent file reliably for both manual file clicks and folders that auto-open their only voucher file."
      ],
      "date": "2026-03-29",
      "version": "V144"
    },
    {
      "changes": [
        "Voucher Clear now resets the right-side selection state immediately before the async folder search reruns, so the Recent files box appears right away instead of waiting for the search response.",
        "This fixes the blank gap after Clear where Files in folder could momentarily render without the new Recent files box."
      ],
      "date": "2026-03-29",
      "version": "V143"
    },
    {
      "changes": [
        "Voucher files are now added to the Recent files list immediately when clicked instead of waiting for the detail request to finish.",
        "This makes the Recent files box reliably reappear after Clear even if the voucher file was cleared very quickly after selection."
      ],
      "date": "2026-03-29",
      "version": "V142"
    },
    {
      "changes": [
        "Moved the Voucher recent-file list into its own Recent files box directly under Files in folder instead of reusing the Files in folder panel.",
        "The Files in folder panel now stays focused on the selected folder, while the recent-file box only appears for the blank-search, no-selection empty state."
      ],
      "date": "2026-03-29",
      "version": "V141"
    },
    {
      "changes": [
        "When Voucher search is blank and no folder or file is selected, the Files in folder panel now shows the last 3 voucher files opened instead of an empty placeholder.",
        "Recent voucher files reopen directly into their real folder and file selection flow from the Files in folder panel."
      ],
      "date": "2026-03-29",
      "version": "V140"
    },
    {
      "changes": [
        "Added Footwear and Non-Footwear buttons under the Voucher Special feature filters so voucher matches can be narrowed by catalog type.",
        "The Voucher detail panel now shows whether the selected voucher allows non-footwear, using the voucher summary rules and matched non-footwear styles instead of false positives from the raw product table."
      ],
      "date": "2026-03-29",
      "version": "V139"
    },
    {
      "changes": [
        "Changed the Voucher Preview action into an All Info popup that shows the full selected voucher file text instead of the old inline preview panel.",
        "The All Info popup now includes an Open voucher button that opens the selected voucher file directly."
      ],
      "date": "2026-03-29",
      "version": "V138"
    },
    {
      "changes": [
        "Fixed doubled footwear size counts caused by merging duplicate `Category=Footwear` rows from the non-footwear export into styles that were already present in the real footwear inventory file.",
        "Mixed non-footwear footwear rows now only fill missing boot size-width gaps instead of stacking on top of the main footwear counts."
      ],
      "date": "2026-03-29",
      "version": "V137"
    },
    {
      "changes": [
        "Changed the Inventory result flags column to use the real Red Wing feature symbol images instead of the old text badges.",
        "Inventory rows now show the actual safety and performance icons such as Non-Metallic Toe, Waterproof, Electrical Hazard, Slip Resistant, and related symbols."
      ],
      "date": "2026-03-29",
      "version": "V136"
    },
    {
      "changes": [
        "Added automatic SQLite voucher indexes for folder-first search so the Vouchers page no longer spends several seconds grouping folders on load.",
        "Aligned voucher folder queries with the new case-insensitive folder and file indexes to speed up the initial folder list and folder file ordering."
      ],
      "date": "2026-03-29",
      "version": "V135"
    },
    {
      "changes": [
        "Apparel detail popups now have an Edit details flow with the same save-in-place behavior as the footwear popup.",
        "Apparel detail edits now persist name, brand, cost, links, image, category, class, descriptions, and product-detail lines through a dedicated apparel override file."
      ],
      "date": "2026-03-29",
      "version": "V134"
    },
    {
      "changes": [
        "Added a new Incoming Stock tab backed by a read-only Red Wing order-history scraper and daily warehouse JSON output.",
        "Incoming Stock now shows pending and in-transit orders with ETA summaries, tracker links, and full item breakdowns by order."
      ],
      "date": "2026-03-29",
      "version": "V133"
    },
    {
      "changes": [
        "Apparel feature filters now keep the rest of the available options visible after a feature is selected.",
        "Apparel feature selection is now single-select, so choosing a second feature replaces the first instead of stacking."
      ],
      "date": "2026-03-29",
      "version": "V132"
    },
    {
      "changes": [
        "Changed Apparel feature filters to group child options under their real parent category headers such as Apparel & Gear and Footwear Accessories.",
        "Parent category headers remain clickable filters, while duplicate and zero-result child options stay hidden."
      ],
      "date": "2026-03-29",
      "version": "V131"
    },
    {
      "changes": [
        "Flattened Apparel feature filters into one deduplicated chip list instead of separate Category and Class sections.",
        "Apparel feature chips now hide duplicate labels and any options with zero matching results in the current apparel filter context."
      ],
      "date": "2026-03-29",
      "version": "V130"
    },
    {
      "changes": [
        "Fixed Apparel feature chips so category and class filters apply even when no text search is active.",
        "Renamed the second Apparel feature group label from Category to Class to match the actual filter."
      ],
      "date": "2026-03-28",
      "version": "V129"
    },
    {
      "changes": [
        "Enriched the Apparel tab with scraped non-footwear PDP descriptions and product details similar to the footwear detail flow.",
        "Apparel detail dialogs now show short description, full description, and product details such as Fabric / Material without adding new material filter buttons."
      ],
      "date": "2026-03-28",
      "version": "V128"
    },
    {
      "changes": [
        "Fixed the boot inventory data path so the latest footwear exports load again even when Power BI quantities use values like (1).",
        "Bug / Change log reports can now include an optional screenshot attachment with inline preview and open-in-new-tab support.",
        "Inventory, Vouchers, and Apparel detail images are now clickable so the full image can be opened directly."
      ],
      "date": "2026-03-28",
      "version": "V127"
    },
    {
      "changes": [
        "Apparel filters no longer show the Brand group.",
        "Removed the All option from Apparel category chips and renamed the Class group label to Category."
      ],
      "date": "2026-03-26",
      "version": "V126"
    },
    {
      "changes": [
        "Apparel now has Inventory-style grouped filter chips for category, class, and brand.",
        "Show 0 qty items is now off by default on the Apparel tab."
      ],
      "date": "2026-03-26",
      "version": "V125"
    },
    {
      "changes": [
        "Added the mixed Category=Footwear rows from the combined non-footwear inventory export back into the main Inventory data, so boots like the stray apparel-export rows now show on the boot inventory tab too."
      ],
      "date": "2026-03-26",
      "version": "V124"
    },
    {
      "changes": [
        "Changed the non-footwear Power BI pull to keep the per-category exports temporary and only save the combined non-footwear CSV into Pulled_Info/Inventory/Non-Footwear.",
        "The Apparel data loader now ignores header-only non-footwear CSVs so a blank export cannot become the live inventory source."
      ],
      "date": "2026-03-26",
      "version": "V123"
    },
    {
      "changes": [
        "Filtered stray Footwear rows out of the non-footwear inventory parser so the Apparel tab only uses true non-footwear inventory data.",
        "This fixes Apparel when the Power BI Apparel & Gear export still contains mixed Footwear rows."
      ],
      "date": "2026-03-26",
      "version": "V122"
    },
    {
      "changes": [
        "Fixed the Apparel tab to prefer the latest combined non-footwear inventory CSV instead of accidentally using a newer partial per-category export.",
        "This restores real non-footwear inventory quantities in Apparel after the new two-pass Power BI pull."
      ],
      "date": "2026-03-26",
      "version": "V121"
    },
    {
      "changes": [
        "Fixed bug report loss by making bug log updates thread-safe and writing the shared bug log file atomically.",
        "Verified concurrent bug submissions no longer overwrite each other."
      ],
      "date": "2026-03-26",
      "version": "V120"
    },
    {
      "changes": [
        "Fixed the Apparel data API to parse real Power BI currency and quantity strings from the non-footwear CSV exports.",
        "Updated the non-footwear Power BI pull so it saves separate Apparel & Gear and Footwear Accessories exports and rebuilds the combined CSV the Apparel tab uses."
      ],
      "date": "2026-03-25",
      "version": "V119"
    },
    {
      "changes": [
        "Added a new Apparel tab between Inventory and Vouchers.",
        "Apparel mirrors the inventory layout for non-footwear items using the non-footwear scrape as the base catalog and overlaying non-footwear inventory quantities when present."
      ],
      "date": "2026-03-25",
      "version": "V118"
    },
    {
      "changes": [
        "Changed the Red Wing scraper merge so Resoleable stays on when either scrape source reports 1.",
        "Fixed style 2440 and similar mixed-source cases where the merged app data was incorrectly downgrading Resoleable to 0."
      ],
      "date": "2026-03-25",
      "version": "V117"
    },
    {
      "changes": [
        "Changed the Red Wing scraper merge so Resoleable prefers the Orders scrape when both sources disagree.",
        "This was the first merge pass toward fixing style 2440 and similar Resoleable downgrade cases."
      ],
      "date": "2026-03-25",
      "version": "V116"
    },
    {
      "changes": [
        "Inventory quick search now allows normal style name and brand text searches again when the typed text matches style data.",
        "Truly unmatched quick search text still flashes 0 results and leaves the current results unchanged."
      ],
      "date": "2026-03-25",
      "version": "V115"
    },
    {
      "changes": [
        "Bumped both Red Wing scraper checkpoint versions so the new Resoleable schema forces fresh rows instead of silently reusing pre-change checkpoint data.",
        "Verified targeted Resoleable scraping against live product pages before the local and Pi server restarts."
      ],
      "date": "2026-03-24",
      "version": "V114"
    },
    {
      "changes": [
        "Added Resoleable to the Red Wing product scrapers and to the app feature list so it can appear as a filter button."
      ],
      "date": "2026-03-23",
      "version": "V113"
    },
    {
      "changes": [
        "Moved the tall Inventory detail buttons into a top row and added more side backdrop space so click-out is easier there."
      ],
      "date": "2026-03-23",
      "version": "V112"
    },
    {
      "changes": [
        "Made the Bug/Change log popup fall back to the static JSON file if the API route misses, so it keeps loading in tall layouts too."
      ],
      "date": "2026-03-23",
      "version": "V111"
    },
    {
      "changes": [
        "Changed the tall tab bar to horizontal-only scrolling so the vertical browser scrollbar arrows no longer show there."
      ],
      "date": "2026-03-23",
      "version": "V110"
    },
    {
      "changes": [
        "Removed the per-style Details and Open buttons from tall Inventory cards.",
        "Added a clearer Close button and more edge spacing for the tall Inventory details dialog."
      ],
      "date": "2026-03-23",
      "version": "V109"
    },
    {
      "changes": [
        "Changed the Vouchers style-search empty state from No voucher loaded to No voucher selected."
      ],
      "date": "2026-03-23",
      "version": "V108"
    },
    {
      "changes": [
        "Fixed the User page color controls by adding synced color pickers and reset-to-theme-default behavior.",
        "Added more built-in appearance themes so users have more usable color options across all tabs."
      ],
      "date": "2026-03-23",
      "version": "V107"
    },
    {
      "changes": [
        "Inventory quick search now accepts close-match misspellings for quick-fill commands, features, and presets.",
        "Exact style numbers still stay exact-only, while unmatched quick search text still flashes 0 results without changing the current list."
      ],
      "date": "2026-03-23",
      "version": "V106"
    },
    {
      "changes": [
        "Inventory quick search now ignores unmatched text instead of applying it as a live filter.",
        "When a quick search does not match a quick fill or exact style number, the page flashes 0 results and keeps the current results unchanged."
      ],
      "date": "2026-03-23",
      "version": "V105"
    },
    {
      "changes": [
        "Voucher search now keeps partial matches visible under exact spaced-token matches.",
        "Exact company token matches like R & F still rank above broader substring results."
      ],
      "date": "2026-03-23",
      "version": "V104"
    },
    {
      "changes": [
        "Improved voucher folder ranking for spaced token searches like R & F.",
        "Single-letter voucher search tokens now match word tokens instead of loose character substrings."
      ],
      "date": "2026-03-23",
      "version": "V103"
    },
    {
      "changes": [
        "Inventory now focuses Style Search on load.",
        "Vouchers now focus Voucher Search until a file is selected, then switch focus to Style Search."
      ],
      "date": "2026-03-23",
      "version": "V102"
    },
    {
      "changes": [
        "Removed the Sort By and Direction controls from the Inventory Actions section."
      ],
      "date": "2026-03-23",
      "version": "V101"
    },
    {
      "changes": [
        "Renamed the special no-data filter label from Heritage to No details.",
        "Added a Heritage feature under Brand so it can be selected and saved from boot details."
      ],
      "date": "2026-03-23",
      "version": "V100"
    },
    {
      "changes": [
        "Fixed the inventory detail editor so dialog clicks no longer clear the selected style before save.",
        "Editing and saving an inventory-only style now posts correctly through the UI."
      ],
      "date": "2026-03-23",
      "version": "V99"
    },
    {
      "changes": [
        "Added a Fixed button to bug entries so resolved bugs can be checked off from the popup.",
        "Verified inventory-only style detail edits save correctly and cleared the stale bug report."
      ],
      "date": "2026-03-23",
      "version": "V98"
    },
    {
      "changes": [
        "Made the selected user local to each browser instead of synced across everyone.",
        "User-specific saves now target the browser's selected user without switching other people on the site."
      ],
      "date": "2026-03-23",
      "version": "V97"
    },
    {
      "changes": [
        "Added a bug entry form to the popup.",
        "New bug entries now show which user added them."
      ],
      "date": "2026-03-23",
      "version": "V96"
    },
    {
      "changes": [
        "Added a shared Bug/Change log popup to all pages.",
        "Added a shared data file for current bugs and recent version history."
      ],
      "date": "2026-03-23",
      "version": "V95"
    },
    {
      "changes": [
        "Removed the visible Filters button from the wide Inventory header.",
        "Stacked Open boot info page under Show selected style details."
      ],
      "date": "2026-03-23",
      "version": "V94"
    },
    {
      "changes": [
        "Made presets shared across users.",
        "Fixed Save, Rename, Apply, and Delete preset actions."
      ],
      "date": "2026-03-23",
      "version": "V93"
    },
    {
      "changes": [
        "Inventory Diff days-back preference now saves in user state."
      ],
      "date": "2026-03-22",
      "version": "V91"
    },
    {
      "changes": [
        "Moved Should Change up in the Inventory Diff sidebar."
      ],
      "date": "2026-03-21",
      "version": "V90"
    }
  ],
  "open_bugs": []
}


key: site_state
updated_at: 2026-04-02T10:37:39
payload_json:
{
  "current_user": "Derek",
  "shared_presets": {
    "6-8\";WP;SFT": {
      "features": [
        "Any Safety Toe",
        "6\"",
        "7\"",
        "8\"",
        "Waterproof"
      ],
      "search_text": "",
      "show_zero_qty": false,
      "size_exact_enabled": false,
      "size_filter_enabled": false,
      "size_value": 11.0,
      "width_and_wider": false,
      "width_key": ""
    },
    "El Justino": {
      "features": [
        "Soft Toe",
        "Male",
        "BOA\u00ae Lacing System"
      ],
      "search_text": "",
      "show_zero_qty": false,
      "size_exact_enabled": false,
      "size_filter_enabled": true,
      "size_value": 9.5,
      "width_and_wider": false,
      "width_key": ""
    },
    "MUrICA": {
      "features": [
        "Steel Toe",
        "Male",
        "Built in USA",
        "Made in USA"
      ],
      "search_text": "",
      "show_zero_qty": false,
      "size_exact_enabled": false,
      "size_filter_enabled": false,
      "size_value": 10.0,
      "width_and_wider": false,
      "width_key": ""
    },
    "MetGuard": {
      "features": [
        "Metatarsal Guard"
      ],
      "search_text": "",
      "show_zero_qty": false,
      "size_exact_enabled": false,
      "size_filter_enabled": false,
      "size_value": 10.0,
      "width_and_wider": false,
      "width_key": ""
    }
  },
  "users": {
    "Default": {
      "appearance": {
        "font_family": "Segoe UI",
        "font_size": 10,
        "primary_hex": "",
        "secondary_hex": "",
        "theme_name": "Forest Night"
      },
      "diff_preferences": {
        "days_back": 7
      },
      "presets": {},
      "voucher_favorites": [
        "Charles City County Public Works_218988",
        "Charles County Emergency Services_232870/CHARLES COUNTY EMERGENCY SERVICES.md",
        "WMATA_100321"
      ]
    },
    "Derek": {
      "appearance": {
        "font_family": "Noto Sans",
        "font_size": 12,
        "primary_hex": "#444444",
        "secondary_hex": "",
        "theme_name": "Solarized"
      },
      "diff_preferences": {
        "days_back": 1
      },
      "presets": {
        "MetGuard": {
          "features": [
            "Metatarsal Guard"
          ],
          "search_text": "",
          "show_zero_qty": false,
          "size_exact_enabled": false,
          "size_filter_enabled": false,
          "size_value": 10.0,
          "width_and_wider": false,
          "width_key": ""
        }
      },
      "voucher_favorites": [
        "Charles City County Public Works_218988",
        "Charles County Emergency Services_232870/CHARLES COUNTY EMERGENCY SERVICES.md",
        "R & F Metals, Inc_210404",
        "Reworld Alexandria_Arlington, LLC - ALEXA_201051_Reworld Waste, LLC (Parent)/ALEXA $250 Handpicked.md",
        "Ronald Reagan Washington National Airport_222044_METRO WASHINGTON AIRPORT",
        "Utiliquest, LLC_100480_Dycom Industries (Ultimate Parent)",
        "WMATA_100321"
      ]
    },
    "Hunter": {
      "appearance": {
        "font_family": "Noto Sans",
        "font_size": 12,
        "primary_hex": "#444444",
        "secondary_hex": "",
        "theme_name": "Solarized"
      },
      "diff_preferences": {
        "days_back": 7
      },
      "presets": {},
      "voucher_favorites": [
        "Charles City County Public Works_218988",
        "Charles County Emergency Services_232870/CHARLES COUNTY EMERGENCY SERVICES.md",
        "WMATA_100321",
        "WMATA_100321/100% RAIL_GEN MAINT-Safety Toe, 6_ Min, ALU, NO ESD-SEE PROGRAM NOTES.md"
      ]
    },
    "Justin": {
      "appearance": {
        "font_family": "Noto Sans",
        "font_size": 10,
        "primary_hex": "",
        "secondary_hex": "",
        "theme_name": "Dracula"
      },
      "diff_preferences": {
        "days_back": 3
      },
      "presets": {
        "6-8\";WP;SFT": {
          "features": [
            "Any Safety Toe",
            "6\"",
            "7\"",
            "8\"",
            "Waterproof"
          ],
          "search_text": "",
          "show_zero_qty": false,
          "size_exact_enabled": false,
          "size_filter_enabled": false,
          "size_value": 11.0,
          "width_and_wider": false,
          "width_key": ""
        },
        "El Justino": {
          "features": [
            "Soft Toe",
            "Male",
            "BOA\u00ae Lacing System"
          ],
          "search_text": "",
          "show_zero_qty": false,
          "size_exact_enabled": false,
          "size_filter_enabled": true,
          "size_value": 9.5,
          "width_and_wider": false,
          "width_key": ""
        },
        "MUrICA": {
          "features": [
            "Steel Toe",
            "Male",
            "Built in USA",
            "Made in USA"
          ],
          "search_text": "",
          "show_zero_qty": false,
          "size_exact_enabled": false,
          "size_filter_enabled": false,
          "size_value": 10.0,
          "width_and_wider": false,
          "width_key": ""
        }
      },
      "voucher_favorites": [
        "Charles City County Public Works_218988",
        "Charles County Emergency Services_232870/CHARLES COUNTY EMERGENCY SERVICES.md",
        "WMATA_100321"
      ]
    },
    "Sam": {
      "appearance": {
        "font_family": "Noto Sans",
        "font_size": 12,
        "primary_hex": "#444444",
        "secondary_hex": "",
        "theme_name": "Solarized"
      },
      "diff_preferences": {
        "days_back": 7
      },
      "presets": {},
      "voucher_favorites": [
        "Charles City County Public Works_218988",
        "Charles County Emergency Services_232870/CHARLES COUNTY EMERGENCY SERVICES.md",
        "R & F Metals, Inc_210404",
        "Reworld Alexandria_Arlington, LLC - ALEXA_201051_Reworld Waste, LLC (Parent)/ALEXA $250 Handpicked.md",
        "Ronald Reagan Washington National Airport_222044_METRO WASHINGTON AIRPORT",
        "Utiliquest, LLC_100480_Dycom Industries (Ultimate Parent)",
        "WMATA_100321"
      ]
    }
  },
  "version": 1
}


# admin_task_runs

task_key: voucher_index
task_label: Rebuild Voucher Index
status: completed
started_at: 2026-03-31T13:14:25
finished_at: 2026-03-31T13:15:07
summary: }
updated_at: 2026-03-31T13:15:07
last_output_line: }
output_text:
{
  "generatedAt": "2026-03-31T13:15:02",
  "mode": "incremental",
  "scannedFiles": 44754,
  "changedFiles": 0,
  "deletedFiles": 0,
  "skippedFiles": 44754,
  "folderCount": 27327,
  "fileCount": 44754,
  "stylePriceCount": 40196462,
  "ftsEnabled": true,
  "validation": {
    "warningCount": 0,
    "warnings": []
  },
  "elapsedSeconds": 37.0
}


task_key: incoming_stock
task_label: Run Incoming Stock Scrape
status: failed
started_at: 2026-04-02T21:27:36
finished_at: 2026-04-02T21:27:36
summary: Exited with code 1.
updated_at: 2026-04-02T21:27:36
last_output_line: ModuleNotFoundError: No module named 'selenium'
output_text:
Traceback (most recent call last):
  File "/media/justin/syncPi/Shared/61_RW_Site/Pulled_Info/Warehouse/Pull_Incoming_Stock.py", line 16, in <module>
    from selenium.webdriver.common.by import By
ModuleNotFoundError: No module named 'selenium'


