{
  "source": "Read-only original filtered SHS ZIP",
  "source_runtime_executed": false,
  "files": {
    "backend/routers/portfolio.py": {
      "sha256": "84cacfdb582b061fdae052e1722cbc0e674f2cbfb23cb68f1f04bd13b3a90d12",
      "lines": 274
    },
    "backend/storage.py": {
      "sha256": "4bee13701c2883ce561f57f98e533af8aa8cda6810e6aa71a49b2dbcb1e471d6",
      "lines": 135
    },
    "frontend/src/components/admin/PortfolioTab.jsx": {
      "sha256": "66f74d429543077f94e96d44314ac5f0f8eea0192b89cb286eff1d4f692244fd",
      "lines": 505
    },
    "frontend/src/components/ServiceGalleryDialog.jsx": {
      "sha256": "8ed7c369c662d5a9b3b4b4cd42a799dabb6bbfce2344a5ef4ea251f903b12c5d",
      "lines": 99
    },
    "frontend/src/pages/GalleryIndexPage.jsx": {
      "sha256": "839e4bdbb97c24aeac869a389516506acf7482a3d62d99b85ad98de14ef208c0",
      "lines": 162
    },
    "frontend/src/pages/GalleryDetailPage.jsx": {
      "sha256": "b0968a4d2a49daaa5919a15382c8dacdc1b5a0b683c62fbf384347369f27a6b3",
      "lines": 255
    }
  },
  "source_journey": {
    "private_job_photos": "portfolio.py:237-260 collects job and linked customer images",
    "promotion": "portfolio.py:181-218 promotes chosen job images and generates customer-based captions; new product uses separate text",
    "admin_management": "PortfolioTab.jsx:64-110 combines standalone and featured job photos; 141-191 uploads/removes/unfeatures",
    "public_index": "GalleryIndexPage.jsx:33-41 fetch/filter; 103-140 linked cards",
    "public_detail": "GalleryDetailPage.jsx:39-47 fetch/not-found; 55-92 metadata; 139-203 image navigation/description; 220-248 related",
    "service_images": "ServiceGalleryDialog.jsx:6-97 public image viewer and project link",
    "source_format_gaps": "storage.py:79-119 names HEIC/HEIF/TIFF/BMP conversion and GIF passthrough; not evidence of all deployed variants",
    "gallery_routes": "site_editor.py:193-224 published index/detail/related; 238-299 admin CRUD; 302-367 job/photo promotion; 399-437 bulk move",
    "original_automatic_publication": "site_editor.py:320-349 collects site-log/enquiry photos, generates copy from the private enquiry message and publishes immediately when photos exist. Independent product requires separate public copy, owner review and deliberate permission acknowledgement.",
    "sitemap": "seo.py:69-113 published-gallery sitemap selection and image metadata"
  },
  "current_boundaries": [
    "Independent publication acknowledgement, exact job sources, separate public captions/alt and snapshot publication",
    "Public enquiry permits five PNG/JPEG/WebP/HEIF at 10 MiB each; authenticated uploads remain PNG/JPEG/WebP at 2 MiB",
    "GIF/TIFF/BMP, higher pixel counts, sequence/multi-main/AVIF/phone/HDR variants remain gaps, not agreed exclusions"
  ],
  "original_gallery_routes": [
    {
      "archive_path": "backend/routers/site_editor.py",
      "sha256": "d1eb432b9b43f7e057d773d67df413f57febbd819d4b020ebda73b41a5831888",
      "ranges": [
        [
          193,
          224
        ],
        [
          238,
          367
        ],
        [
          399,
          437
        ]
      ]
    },
    {
      "archive_path": "backend/routers/seo.py",
      "sha256": "85806951833d3d0f13039d4706717ca36083bcc5b1abffa739fd2b1415e44e74",
      "ranges": [
        [
          69,
          113
        ]
      ]
    }
  ],
  "comparison_limit": "Read-only source evidence is not a deployed-system test. Bulk cross-job moves, generated copy and other missing source functions remain tracked decisions/gaps; no original code or tests executed."
}
